igniteui-angular 17.0.0-alpha.2 → 17.0.0-beta.0

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 (439) hide show
  1. package/esm2022/lib/accordion/accordion.component.mjs +8 -7
  2. package/esm2022/lib/accordion/accordion.module.mjs +4 -4
  3. package/esm2022/lib/action-strip/action-strip.component.mjs +21 -25
  4. package/esm2022/lib/action-strip/action-strip.module.mjs +4 -4
  5. package/esm2022/lib/action-strip/grid-actions/grid-action-button.component.mjs +7 -6
  6. package/esm2022/lib/action-strip/grid-actions/grid-actions-base.directive.mjs +7 -6
  7. package/esm2022/lib/action-strip/grid-actions/grid-editing-actions.component.mjs +13 -9
  8. package/esm2022/lib/action-strip/grid-actions/grid-pinning-actions.component.mjs +3 -3
  9. package/esm2022/lib/avatar/avatar.component.mjs +3 -3
  10. package/esm2022/lib/avatar/avatar.module.mjs +4 -4
  11. package/esm2022/lib/badge/badge.component.mjs +3 -3
  12. package/esm2022/lib/badge/badge.module.mjs +4 -4
  13. package/esm2022/lib/banner/banner.component.mjs +3 -3
  14. package/esm2022/lib/banner/banner.directives.mjs +3 -3
  15. package/esm2022/lib/banner/banner.module.mjs +4 -4
  16. package/esm2022/lib/buttonGroup/buttonGroup.component.mjs +7 -6
  17. package/esm2022/lib/buttonGroup/buttongroup.module.mjs +4 -4
  18. package/esm2022/lib/calendar/calendar-base.mjs +8 -9
  19. package/esm2022/lib/calendar/calendar.component.mjs +11 -8
  20. package/esm2022/lib/calendar/calendar.directives.mjs +15 -15
  21. package/esm2022/lib/calendar/calendar.module.mjs +4 -4
  22. package/esm2022/lib/calendar/days-view/day-item.component.mjs +13 -9
  23. package/esm2022/lib/calendar/days-view/days-view.component.mjs +9 -7
  24. package/esm2022/lib/calendar/days-view/daysview-navigation.service.mjs +3 -3
  25. package/esm2022/lib/calendar/month-picker/month-picker-base.mjs +3 -3
  26. package/esm2022/lib/calendar/month-picker/month-picker.component.mjs +3 -3
  27. package/esm2022/lib/calendar/months-view/months-view.component.mjs +7 -6
  28. package/esm2022/lib/calendar/months-view.pipe.mjs +6 -6
  29. package/esm2022/lib/calendar/years-view/years-view.component.mjs +10 -9
  30. package/esm2022/lib/card/card.component.mjs +37 -33
  31. package/esm2022/lib/card/card.module.mjs +4 -4
  32. package/esm2022/lib/carousel/carousel.component.mjs +18 -13
  33. package/esm2022/lib/carousel/carousel.directives.mjs +9 -9
  34. package/esm2022/lib/carousel/carousel.module.mjs +4 -4
  35. package/esm2022/lib/carousel/slide.component.mjs +10 -8
  36. package/esm2022/lib/checkbox/checkbox.component.mjs +52 -64
  37. package/esm2022/lib/checkbox/checkbox.module.mjs +4 -4
  38. package/esm2022/lib/chips/chip.component.mjs +19 -12
  39. package/esm2022/lib/chips/chips-area.component.mjs +3 -3
  40. package/esm2022/lib/chips/chips.module.mjs +4 -4
  41. package/esm2022/lib/combo/combo-add-item.component.mjs +3 -3
  42. package/esm2022/lib/combo/combo-dropdown.component.mjs +7 -6
  43. package/esm2022/lib/combo/combo-item.component.mjs +7 -6
  44. package/esm2022/lib/combo/combo.api.mjs +3 -3
  45. package/esm2022/lib/combo/combo.common.mjs +27 -38
  46. package/esm2022/lib/combo/combo.component.mjs +28 -27
  47. package/esm2022/lib/combo/combo.directives.mjs +24 -24
  48. package/esm2022/lib/combo/combo.module.mjs +4 -4
  49. package/esm2022/lib/combo/combo.pipes.mjs +6 -6
  50. package/esm2022/lib/core/density.mjs +3 -3
  51. package/esm2022/lib/core/navigation/directives.mjs +6 -6
  52. package/esm2022/lib/core/navigation/nav.service.mjs +3 -3
  53. package/esm2022/lib/core/selection.mjs +3 -3
  54. package/esm2022/lib/core/touch.mjs +3 -3
  55. package/esm2022/lib/core/utils.mjs +3 -3
  56. package/esm2022/lib/date-common/calendar-container/calendar-container.component.mjs +3 -3
  57. package/esm2022/lib/date-common/picker-base.directive.mjs +7 -6
  58. package/esm2022/lib/date-common/picker-icons.common.mjs +9 -9
  59. package/esm2022/lib/date-picker/date-picker.component.mjs +13 -9
  60. package/esm2022/lib/date-picker/date-picker.module.mjs +4 -4
  61. package/esm2022/lib/date-range-picker/date-range-picker-inputs.common.mjs +15 -15
  62. package/esm2022/lib/date-range-picker/date-range-picker.component.mjs +9 -7
  63. package/esm2022/lib/date-range-picker/date-range-picker.module.mjs +4 -4
  64. package/esm2022/lib/dialog/dialog.component.mjs +17 -12
  65. package/esm2022/lib/dialog/dialog.directives.mjs +6 -6
  66. package/esm2022/lib/dialog/dialog.module.mjs +4 -4
  67. package/esm2022/lib/directives/autocomplete/autocomplete.directive.mjs +6 -6
  68. package/esm2022/lib/directives/autocomplete/autocomplete.module.mjs +4 -4
  69. package/esm2022/lib/directives/button/button.directive.mjs +19 -35
  70. package/esm2022/lib/directives/button/button.module.mjs +4 -4
  71. package/esm2022/lib/directives/date-time-editor/date-time-editor.directive.mjs +7 -6
  72. package/esm2022/lib/directives/date-time-editor/date-time-editor.module.mjs +4 -4
  73. package/esm2022/lib/directives/divider/divider.directive.mjs +9 -7
  74. package/esm2022/lib/directives/divider/divider.module.mjs +4 -4
  75. package/esm2022/lib/directives/drag-drop/drag-drop.directive.mjs +16 -15
  76. package/esm2022/lib/directives/drag-drop/drag-drop.module.mjs +4 -4
  77. package/esm2022/lib/directives/filter/filter.directive.mjs +6 -6
  78. package/esm2022/lib/directives/filter/filter.module.mjs +4 -4
  79. package/esm2022/lib/directives/focus/focus.directive.mjs +6 -6
  80. package/esm2022/lib/directives/focus/focus.module.mjs +4 -4
  81. package/esm2022/lib/directives/focus-trap/focus-trap.directive.mjs +6 -6
  82. package/esm2022/lib/directives/focus-trap/focus-trap.module.mjs +4 -4
  83. package/esm2022/lib/directives/for-of/base.helper.component.mjs +3 -3
  84. package/esm2022/lib/directives/for-of/display.container.mjs +3 -3
  85. package/esm2022/lib/directives/for-of/for_of.directive.mjs +12 -10
  86. package/esm2022/lib/directives/for-of/for_of.module.mjs +4 -4
  87. package/esm2022/lib/directives/for-of/for_of.sync.service.mjs +6 -6
  88. package/esm2022/lib/directives/for-of/horizontal.virtual.helper.component.mjs +3 -3
  89. package/esm2022/lib/directives/for-of/virtual.helper.component.mjs +3 -3
  90. package/esm2022/lib/directives/form-control/form-control.directive.mjs +3 -3
  91. package/esm2022/lib/directives/form-control/form-control.module.mjs +4 -4
  92. package/esm2022/lib/directives/hint/hint.directive.mjs +3 -3
  93. package/esm2022/lib/directives/input/input.directive.mjs +11 -9
  94. package/esm2022/lib/directives/label/label.directive.mjs +3 -3
  95. package/esm2022/lib/directives/layout/layout.directive.mjs +9 -9
  96. package/esm2022/lib/directives/layout/layout.module.mjs +4 -4
  97. package/esm2022/lib/directives/mask/mask-parsing.service.mjs +3 -3
  98. package/esm2022/lib/directives/mask/mask.directive.mjs +7 -6
  99. package/esm2022/lib/directives/mask/mask.module.mjs +4 -4
  100. package/esm2022/lib/directives/notification/notifications.directive.mjs +9 -7
  101. package/esm2022/lib/directives/prefix/prefix.directive.mjs +3 -3
  102. package/esm2022/lib/directives/radio/radio-group.directive.mjs +11 -9
  103. package/esm2022/lib/directives/radio/radio-group.module.mjs +4 -4
  104. package/esm2022/lib/directives/ripple/ripple.directive.mjs +7 -7
  105. package/esm2022/lib/directives/ripple/ripple.module.mjs +4 -4
  106. package/esm2022/lib/directives/scroll-inertia/scroll_inertia.directive.mjs +3 -3
  107. package/esm2022/lib/directives/scroll-inertia/scroll_inertia.module.mjs +4 -4
  108. package/esm2022/lib/directives/suffix/suffix.directive.mjs +3 -3
  109. package/esm2022/lib/directives/template-outlet/template_outlet.directive.mjs +3 -3
  110. package/esm2022/lib/directives/text-highlight/text-highlight.directive.mjs +3 -3
  111. package/esm2022/lib/directives/text-highlight/text-highlight.module.mjs +4 -4
  112. package/esm2022/lib/directives/text-selection/text-selection.directive.mjs +26 -46
  113. package/esm2022/lib/directives/text-selection/text-selection.module.mjs +4 -4
  114. package/esm2022/lib/directives/toggle/toggle.directive.mjs +9 -9
  115. package/esm2022/lib/directives/toggle/toggle.module.mjs +4 -4
  116. package/esm2022/lib/directives/tooltip/tooltip-target.directive.mjs +6 -6
  117. package/esm2022/lib/directives/tooltip/tooltip.component.mjs +3 -3
  118. package/esm2022/lib/directives/tooltip/tooltip.directive.mjs +3 -3
  119. package/esm2022/lib/directives/tooltip/tooltip.module.mjs +4 -4
  120. package/esm2022/lib/drop-down/drop-down-group.component.mjs +7 -6
  121. package/esm2022/lib/drop-down/drop-down-item.base.mjs +11 -8
  122. package/esm2022/lib/drop-down/drop-down-item.component.mjs +3 -3
  123. package/esm2022/lib/drop-down/drop-down-navigation.directive.mjs +3 -3
  124. package/esm2022/lib/drop-down/drop-down.base.mjs +3 -3
  125. package/esm2022/lib/drop-down/drop-down.component.mjs +7 -6
  126. package/esm2022/lib/drop-down/drop-down.module.mjs +4 -4
  127. package/esm2022/lib/expansion-panel/expansion-panel-body.component.mjs +3 -3
  128. package/esm2022/lib/expansion-panel/expansion-panel-header.component.mjs +7 -6
  129. package/esm2022/lib/expansion-panel/expansion-panel.common.mjs +3 -3
  130. package/esm2022/lib/expansion-panel/expansion-panel.component.mjs +7 -6
  131. package/esm2022/lib/expansion-panel/expansion-panel.directives.mjs +9 -9
  132. package/esm2022/lib/expansion-panel/expansion-panel.module.mjs +4 -4
  133. package/esm2022/lib/expansion-panel/toggle-animation-component.mjs +3 -3
  134. package/esm2022/lib/grids/api.service.mjs +3 -3
  135. package/esm2022/lib/grids/cell.component.mjs +7 -6
  136. package/esm2022/lib/grids/column-actions/column-actions-base.directive.mjs +3 -3
  137. package/esm2022/lib/grids/column-actions/column-actions.component.mjs +16 -15
  138. package/esm2022/lib/grids/column-actions/column-hiding.directive.mjs +3 -3
  139. package/esm2022/lib/grids/column-actions/column-pinning.directive.mjs +3 -3
  140. package/esm2022/lib/grids/columns/column-group.component.mjs +13 -9
  141. package/esm2022/lib/grids/columns/column-layout.component.mjs +7 -6
  142. package/esm2022/lib/grids/columns/column.component.mjs +37 -21
  143. package/esm2022/lib/grids/columns/templates.directive.mjs +24 -24
  144. package/esm2022/lib/grids/columns/validators.directive.mjs +21 -21
  145. package/esm2022/lib/grids/common/crud.service.mjs +3 -3
  146. package/esm2022/lib/grids/common/pipes.mjs +54 -54
  147. package/esm2022/lib/grids/filtering/advanced-filtering/advanced-filtering-dialog.component.mjs +3 -3
  148. package/esm2022/lib/grids/filtering/base/grid-filtering-cell.component.mjs +3 -3
  149. package/esm2022/lib/grids/filtering/base/grid-filtering-row.component.mjs +3 -3
  150. package/esm2022/lib/grids/filtering/excel-style/base-filtering.component.mjs +3 -3
  151. package/esm2022/lib/grids/filtering/excel-style/excel-style-clear-filters.component.mjs +3 -3
  152. package/esm2022/lib/grids/filtering/excel-style/excel-style-conditional-filter.component.mjs +3 -3
  153. package/esm2022/lib/grids/filtering/excel-style/excel-style-custom-dialog.component.mjs +3 -3
  154. package/esm2022/lib/grids/filtering/excel-style/excel-style-date-expression.component.mjs +3 -3
  155. package/esm2022/lib/grids/filtering/excel-style/excel-style-default-expression.component.mjs +3 -3
  156. package/esm2022/lib/grids/filtering/excel-style/excel-style-filtering.component.mjs +9 -9
  157. package/esm2022/lib/grids/filtering/excel-style/excel-style-header.component.mjs +11 -8
  158. package/esm2022/lib/grids/filtering/excel-style/excel-style-hiding.component.mjs +3 -3
  159. package/esm2022/lib/grids/filtering/excel-style/excel-style-moving.component.mjs +3 -3
  160. package/esm2022/lib/grids/filtering/excel-style/excel-style-pinning.component.mjs +3 -3
  161. package/esm2022/lib/grids/filtering/excel-style/excel-style-search.component.mjs +6 -6
  162. package/esm2022/lib/grids/filtering/excel-style/excel-style-selecting.component.mjs +3 -3
  163. package/esm2022/lib/grids/filtering/excel-style/excel-style-sorting.component.mjs +3 -3
  164. package/esm2022/lib/grids/filtering/grid-filtering.service.mjs +5 -5
  165. package/esm2022/lib/grids/grid/expandable-cell.component.mjs +3 -3
  166. package/esm2022/lib/grids/grid/grid-api.service.mjs +3 -3
  167. package/esm2022/lib/grids/grid/grid-row.component.mjs +3 -3
  168. package/esm2022/lib/grids/grid/grid-validation.service.mjs +3 -3
  169. package/esm2022/lib/grids/grid/grid.component.mjs +11 -8
  170. package/esm2022/lib/grids/grid/grid.details.pipe.mjs +3 -3
  171. package/esm2022/lib/grids/grid/grid.module.mjs +4 -4
  172. package/esm2022/lib/grids/grid/grid.pipes.mjs +12 -12
  173. package/esm2022/lib/grids/grid/grid.summary.pipe.mjs +3 -3
  174. package/esm2022/lib/grids/grid/groupby-row.component.mjs +3 -3
  175. package/esm2022/lib/grids/grid-base.directive.mjs +33 -19
  176. package/esm2022/lib/grids/grid-footer/grid-footer.component.mjs +3 -3
  177. package/esm2022/lib/grids/grid-mrl-navigation.service.mjs +3 -3
  178. package/esm2022/lib/grids/grid-navigation.service.mjs +3 -3
  179. package/esm2022/lib/grids/grid.common.mjs +3 -3
  180. package/esm2022/lib/grids/grid.directives.mjs +33 -33
  181. package/esm2022/lib/grids/grid.rowEdit.directive.mjs +15 -15
  182. package/esm2022/lib/grids/grouping/grid-group-by-area.component.mjs +3 -3
  183. package/esm2022/lib/grids/grouping/group-by-area.directive.mjs +6 -6
  184. package/esm2022/lib/grids/grouping/tree-grid-group-by-area.component.mjs +8 -7
  185. package/esm2022/lib/grids/headers/grid-header-group.component.mjs +3 -3
  186. package/esm2022/lib/grids/headers/grid-header-row.component.mjs +14 -7
  187. package/esm2022/lib/grids/headers/grid-header.component.mjs +3 -3
  188. package/esm2022/lib/grids/headers/pipes.mjs +9 -9
  189. package/esm2022/lib/grids/hierarchical-grid/hierarchical-cell.component.mjs +3 -3
  190. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-api.service.mjs +3 -3
  191. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-base.directive.mjs +7 -6
  192. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid-navigation.service.mjs +3 -3
  193. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.component.mjs +11 -10
  194. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.module.mjs +4 -4
  195. package/esm2022/lib/grids/hierarchical-grid/hierarchical-grid.pipes.mjs +6 -6
  196. package/esm2022/lib/grids/hierarchical-grid/hierarchical-row.component.mjs +3 -3
  197. package/esm2022/lib/grids/hierarchical-grid/row-island-api.service.mjs +3 -3
  198. package/esm2022/lib/grids/hierarchical-grid/row-island.component.mjs +7 -6
  199. package/esm2022/lib/grids/moving/moving.drag.directive.mjs +3 -3
  200. package/esm2022/lib/grids/moving/moving.drop.directive.mjs +3 -3
  201. package/esm2022/lib/grids/moving/moving.service.mjs +3 -3
  202. package/esm2022/lib/grids/pivot-grid/pivot-data-selector.component.mjs +13 -9
  203. package/esm2022/lib/grids/pivot-grid/pivot-filtering.service.mjs +3 -3
  204. package/esm2022/lib/grids/pivot-grid/pivot-grid-navigation.service.mjs +3 -3
  205. package/esm2022/lib/grids/pivot-grid/pivot-grid.component.mjs +25 -15
  206. package/esm2022/lib/grids/pivot-grid/pivot-grid.directives.mjs +3 -3
  207. package/esm2022/lib/grids/pivot-grid/pivot-grid.module.mjs +4 -4
  208. package/esm2022/lib/grids/pivot-grid/pivot-grid.pipes.mjs +30 -30
  209. package/esm2022/lib/grids/pivot-grid/pivot-header-row.component.mjs +3 -3
  210. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-content.component.mjs +3 -3
  211. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header-group.component.mjs +3 -3
  212. package/esm2022/lib/grids/pivot-grid/pivot-row-dimension-header.component.mjs +3 -3
  213. package/esm2022/lib/grids/pivot-grid/pivot-row.component.mjs +3 -3
  214. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resize-handle.directive.mjs +3 -3
  215. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizer.component.mjs +3 -3
  216. package/esm2022/lib/grids/resizing/pivot-grid/pivot-resizing.service.mjs +3 -3
  217. package/esm2022/lib/grids/resizing/resize-handle.directive.mjs +3 -3
  218. package/esm2022/lib/grids/resizing/resizer.component.mjs +3 -3
  219. package/esm2022/lib/grids/resizing/resizer.directive.mjs +3 -3
  220. package/esm2022/lib/grids/resizing/resizing.service.mjs +3 -3
  221. package/esm2022/lib/grids/row-drag.directive.mjs +9 -9
  222. package/esm2022/lib/grids/row.directive.mjs +7 -6
  223. package/esm2022/lib/grids/selection/drag-select.directive.mjs +6 -6
  224. package/esm2022/lib/grids/selection/row-selectors.mjs +9 -9
  225. package/esm2022/lib/grids/selection/selection.service.mjs +3 -3
  226. package/esm2022/lib/grids/state.directive.mjs +3 -3
  227. package/esm2022/lib/grids/summaries/grid-root-summary.pipe.mjs +3 -3
  228. package/esm2022/lib/grids/summaries/grid-summary.service.mjs +10 -8
  229. package/esm2022/lib/grids/summaries/summary-cell.component.mjs +7 -6
  230. package/esm2022/lib/grids/summaries/summary-row.component.mjs +3 -3
  231. package/esm2022/lib/grids/toolbar/common.mjs +15 -15
  232. package/esm2022/lib/grids/toolbar/grid-toolbar-advanced-filtering.component.mjs +3 -3
  233. package/esm2022/lib/grids/toolbar/grid-toolbar-exporter.component.mjs +9 -7
  234. package/esm2022/lib/grids/toolbar/grid-toolbar-hiding.component.mjs +3 -3
  235. package/esm2022/lib/grids/toolbar/grid-toolbar-pinning.component.mjs +3 -3
  236. package/esm2022/lib/grids/toolbar/grid-toolbar.base.mjs +16 -11
  237. package/esm2022/lib/grids/toolbar/grid-toolbar.component.mjs +7 -6
  238. package/esm2022/lib/grids/tree-grid/tree-cell.component.mjs +3 -3
  239. package/esm2022/lib/grids/tree-grid/tree-grid-api.service.mjs +3 -3
  240. package/esm2022/lib/grids/tree-grid/tree-grid-row.component.mjs +3 -3
  241. package/esm2022/lib/grids/tree-grid/tree-grid-selection.service.mjs +3 -3
  242. package/esm2022/lib/grids/tree-grid/tree-grid.component.mjs +7 -6
  243. package/esm2022/lib/grids/tree-grid/tree-grid.directives.mjs +3 -3
  244. package/esm2022/lib/grids/tree-grid/tree-grid.filtering.pipe.mjs +3 -3
  245. package/esm2022/lib/grids/tree-grid/tree-grid.grouping.pipe.mjs +3 -3
  246. package/esm2022/lib/grids/tree-grid/tree-grid.module.mjs +4 -4
  247. package/esm2022/lib/grids/tree-grid/tree-grid.pipes.mjs +21 -21
  248. package/esm2022/lib/grids/tree-grid/tree-grid.summary.pipe.mjs +3 -3
  249. package/esm2022/lib/icon/icon.component.mjs +6 -6
  250. package/esm2022/lib/icon/icon.module.mjs +4 -4
  251. package/esm2022/lib/icon/icon.service.mjs +3 -3
  252. package/esm2022/lib/input-group/input-group.component.mjs +7 -6
  253. package/esm2022/lib/input-group/input-group.module.mjs +4 -4
  254. package/esm2022/lib/list/list-item.component.mjs +9 -7
  255. package/esm2022/lib/list/list.common.mjs +15 -15
  256. package/esm2022/lib/list/list.component.mjs +26 -23
  257. package/esm2022/lib/list/list.module.mjs +4 -4
  258. package/esm2022/lib/navbar/navbar.component.mjs +13 -12
  259. package/esm2022/lib/navbar/navbar.module.mjs +4 -4
  260. package/esm2022/lib/navigation-drawer/navigation-drawer.component.mjs +13 -9
  261. package/esm2022/lib/navigation-drawer/navigation-drawer.directives.mjs +13 -13
  262. package/esm2022/lib/navigation-drawer/navigation-drawer.module.mjs +4 -4
  263. package/esm2022/lib/paginator/paginator-interfaces.mjs +3 -3
  264. package/esm2022/lib/paginator/paginator.component.mjs +12 -12
  265. package/esm2022/lib/paginator/paginator.module.mjs +4 -4
  266. package/esm2022/lib/progressbar/progressbar.common.mjs +6 -6
  267. package/esm2022/lib/progressbar/progressbar.component.mjs +23 -17
  268. package/esm2022/lib/progressbar/progressbar.module.mjs +4 -4
  269. package/esm2022/lib/query-builder/query-builder-header.component.mjs +7 -6
  270. package/esm2022/lib/query-builder/query-builder.component.mjs +6 -6
  271. package/esm2022/lib/query-builder/query-builder.module.mjs +4 -4
  272. package/esm2022/lib/radio/radio.component.mjs +37 -44
  273. package/esm2022/lib/select/select-group.component.mjs +3 -3
  274. package/esm2022/lib/select/select-item.component.mjs +3 -3
  275. package/esm2022/lib/select/select-navigation.directive.mjs +3 -3
  276. package/esm2022/lib/select/select.component.mjs +16 -15
  277. package/esm2022/lib/select/select.module.mjs +4 -4
  278. package/esm2022/lib/services/animation/angular-animation-service.mjs +3 -3
  279. package/esm2022/lib/services/csv/csv-exporter.mjs +3 -3
  280. package/esm2022/lib/services/direction/directionality.mjs +3 -3
  281. package/esm2022/lib/services/excel/excel-exporter.mjs +3 -3
  282. package/esm2022/lib/services/overlay/overlay.mjs +5 -5
  283. package/esm2022/lib/services/transaction/transaction-factory.service.mjs +6 -6
  284. package/esm2022/lib/simple-combo/simple-combo.component.mjs +51 -31
  285. package/esm2022/lib/simple-combo/simple-combo.module.mjs +4 -4
  286. package/esm2022/lib/slider/label/thumb-label.component.mjs +9 -7
  287. package/esm2022/lib/slider/slider.common.mjs +9 -9
  288. package/esm2022/lib/slider/slider.component.mjs +15 -10
  289. package/esm2022/lib/slider/slider.module.mjs +4 -4
  290. package/esm2022/lib/slider/thumb/thumb-slider.component.mjs +11 -8
  291. package/esm2022/lib/slider/ticks/tick.pipe.mjs +3 -3
  292. package/esm2022/lib/slider/ticks/ticks.component.mjs +11 -8
  293. package/esm2022/lib/snackbar/snackbar.component.mjs +3 -3
  294. package/esm2022/lib/snackbar/snackbar.module.mjs +4 -4
  295. package/esm2022/lib/splitter/splitter-pane/splitter-pane.component.mjs +9 -7
  296. package/esm2022/lib/splitter/splitter.component.mjs +6 -6
  297. package/esm2022/lib/splitter/splitter.module.mjs +4 -4
  298. package/esm2022/lib/stepper/step/step.component.mjs +15 -10
  299. package/esm2022/lib/stepper/stepper.component.mjs +9 -7
  300. package/esm2022/lib/stepper/stepper.directive.mjs +21 -21
  301. package/esm2022/lib/stepper/stepper.module.mjs +4 -4
  302. package/esm2022/lib/stepper/stepper.service.mjs +6 -6
  303. package/esm2022/lib/switch/switch.component.mjs +32 -40
  304. package/esm2022/lib/switch/switch.module.mjs +4 -4
  305. package/esm2022/lib/tabs/bottom-nav/bottom-nav-content.component.mjs +3 -3
  306. package/esm2022/lib/tabs/bottom-nav/bottom-nav-header.component.mjs +3 -3
  307. package/esm2022/lib/tabs/bottom-nav/bottom-nav-item.component.mjs +3 -3
  308. package/esm2022/lib/tabs/bottom-nav/bottom-nav.component.mjs +5 -5
  309. package/esm2022/lib/tabs/bottom-nav/bottom-nav.directives.mjs +6 -6
  310. package/esm2022/lib/tabs/bottom-nav/bottom-nav.module.mjs +4 -4
  311. package/esm2022/lib/tabs/tab-content.directive.mjs +3 -3
  312. package/esm2022/lib/tabs/tab-header.directive.mjs +3 -3
  313. package/esm2022/lib/tabs/tab-item.directive.mjs +9 -7
  314. package/esm2022/lib/tabs/tabs/tab-content.component.mjs +3 -3
  315. package/esm2022/lib/tabs/tabs/tab-header.component.mjs +3 -3
  316. package/esm2022/lib/tabs/tabs/tab-item.component.mjs +3 -3
  317. package/esm2022/lib/tabs/tabs/tabs.component.mjs +3 -3
  318. package/esm2022/lib/tabs/tabs/tabs.directives.mjs +6 -6
  319. package/esm2022/lib/tabs/tabs/tabs.module.mjs +4 -4
  320. package/esm2022/lib/tabs/tabs.directive.mjs +11 -17
  321. package/esm2022/lib/time-picker/time-picker.component.mjs +9 -7
  322. package/esm2022/lib/time-picker/time-picker.directives.mjs +6 -6
  323. package/esm2022/lib/time-picker/time-picker.module.mjs +4 -4
  324. package/esm2022/lib/time-picker/time-picker.pipes.mjs +6 -6
  325. package/esm2022/lib/toast/toast.component.mjs +3 -3
  326. package/esm2022/lib/toast/toast.module.mjs +4 -4
  327. package/esm2022/lib/tree/tree-navigation.service.mjs +3 -3
  328. package/esm2022/lib/tree/tree-node/tree-node.component.mjs +18 -13
  329. package/esm2022/lib/tree/tree-selection.service.mjs +3 -3
  330. package/esm2022/lib/tree/tree.component.mjs +13 -12
  331. package/esm2022/lib/tree/tree.module.mjs +4 -4
  332. package/esm2022/lib/tree/tree.service.mjs +3 -3
  333. package/fesm2022/igniteui-angular.mjs +2245 -2106
  334. package/fesm2022/igniteui-angular.mjs.map +1 -1
  335. package/lib/accordion/accordion.component.d.ts +1 -0
  336. package/lib/action-strip/action-strip.component.d.ts +2 -2
  337. package/lib/action-strip/grid-actions/grid-action-button.component.d.ts +1 -0
  338. package/lib/action-strip/grid-actions/grid-actions-base.directive.d.ts +1 -0
  339. package/lib/action-strip/grid-actions/grid-editing-actions.component.d.ts +4 -0
  340. package/lib/buttonGroup/buttonGroup.component.d.ts +1 -0
  341. package/lib/calendar/calendar-base.d.ts +1 -0
  342. package/lib/calendar/calendar.component.d.ts +3 -0
  343. package/lib/calendar/days-view/day-item.component.d.ts +4 -0
  344. package/lib/calendar/days-view/days-view.component.d.ts +2 -0
  345. package/lib/calendar/months-view/months-view.component.d.ts +1 -0
  346. package/lib/calendar/years-view/years-view.component.d.ts +1 -0
  347. package/lib/card/card.component.d.ts +4 -0
  348. package/lib/carousel/carousel.component.d.ts +5 -0
  349. package/lib/carousel/slide.component.d.ts +2 -0
  350. package/lib/checkbox/checkbox.component.d.ts +10 -16
  351. package/lib/chips/chip.component.d.ts +7 -0
  352. package/lib/combo/combo-dropdown.component.d.ts +1 -0
  353. package/lib/combo/combo-item.component.d.ts +1 -0
  354. package/lib/combo/combo.common.d.ts +10 -21
  355. package/lib/combo/combo.component.d.ts +10 -8
  356. package/lib/date-common/picker-base.directive.d.ts +1 -0
  357. package/lib/date-picker/date-picker.component.d.ts +4 -0
  358. package/lib/date-range-picker/date-range-picker.component.d.ts +2 -0
  359. package/lib/dialog/dialog.component.d.ts +5 -0
  360. package/lib/directives/autocomplete/autocomplete.directive.d.ts +1 -0
  361. package/lib/directives/button/button.directive.d.ts +10 -23
  362. package/lib/directives/date-time-editor/date-time-editor.directive.d.ts +1 -0
  363. package/lib/directives/divider/divider.directive.d.ts +2 -0
  364. package/lib/directives/drag-drop/drag-drop.directive.d.ts +1 -0
  365. package/lib/directives/focus/focus.directive.d.ts +1 -0
  366. package/lib/directives/focus-trap/focus-trap.directive.d.ts +1 -0
  367. package/lib/directives/for-of/for_of.directive.d.ts +2 -0
  368. package/lib/directives/input/input.directive.d.ts +2 -2
  369. package/lib/directives/layout/layout.directive.d.ts +1 -0
  370. package/lib/directives/mask/mask.directive.d.ts +1 -0
  371. package/lib/directives/notification/notifications.directive.d.ts +2 -0
  372. package/lib/directives/radio/radio-group.directive.d.ts +2 -2
  373. package/lib/directives/ripple/ripple.directive.d.ts +2 -0
  374. package/lib/directives/text-selection/text-selection.directive.d.ts +2 -17
  375. package/lib/directives/tooltip/tooltip-target.directive.d.ts +1 -0
  376. package/lib/drop-down/drop-down-group.component.d.ts +1 -0
  377. package/lib/drop-down/drop-down-item.base.d.ts +3 -0
  378. package/lib/drop-down/drop-down.component.d.ts +1 -0
  379. package/lib/expansion-panel/expansion-panel-header.component.d.ts +1 -0
  380. package/lib/expansion-panel/expansion-panel.component.d.ts +1 -0
  381. package/lib/grids/cell.component.d.ts +1 -0
  382. package/lib/grids/column-actions/column-actions.component.d.ts +1 -0
  383. package/lib/grids/columns/column-group.component.d.ts +4 -0
  384. package/lib/grids/columns/column-layout.component.d.ts +1 -0
  385. package/lib/grids/columns/column.component.d.ts +16 -0
  386. package/lib/grids/filtering/excel-style/excel-style-header.component.d.ts +3 -0
  387. package/lib/grids/grid/grid.component.d.ts +3 -0
  388. package/lib/grids/grid-base.directive.d.ts +11 -0
  389. package/lib/grids/grouping/tree-grid-group-by-area.component.d.ts +1 -0
  390. package/lib/grids/headers/grid-header-row.component.d.ts +5 -0
  391. package/lib/grids/hierarchical-grid/hierarchical-grid-base.directive.d.ts +1 -0
  392. package/lib/grids/hierarchical-grid/hierarchical-grid.component.d.ts +2 -1
  393. package/lib/grids/hierarchical-grid/row-island.component.d.ts +1 -0
  394. package/lib/grids/pivot-grid/pivot-data-selector.component.d.ts +4 -0
  395. package/lib/grids/pivot-grid/pivot-grid.component.d.ts +10 -0
  396. package/lib/grids/row.directive.d.ts +1 -0
  397. package/lib/grids/selection/drag-select.directive.d.ts +1 -0
  398. package/lib/grids/summaries/summary-cell.component.d.ts +1 -0
  399. package/lib/grids/toolbar/grid-toolbar-exporter.component.d.ts +2 -0
  400. package/lib/grids/toolbar/grid-toolbar.base.d.ts +1 -0
  401. package/lib/grids/toolbar/grid-toolbar.component.d.ts +1 -0
  402. package/lib/grids/tree-grid/tree-grid.component.d.ts +1 -0
  403. package/lib/icon/icon.component.d.ts +1 -0
  404. package/lib/input-group/input-group.component.d.ts +1 -0
  405. package/lib/list/list-item.component.d.ts +2 -0
  406. package/lib/list/list.component.d.ts +3 -0
  407. package/lib/navbar/navbar.component.d.ts +1 -0
  408. package/lib/navigation-drawer/navigation-drawer.component.d.ts +4 -0
  409. package/lib/navigation-drawer/navigation-drawer.directives.d.ts +2 -0
  410. package/lib/progressbar/progressbar.component.d.ts +6 -0
  411. package/lib/query-builder/query-builder-header.component.d.ts +1 -0
  412. package/lib/radio/radio.component.d.ts +5 -4
  413. package/lib/select/select.component.d.ts +1 -0
  414. package/lib/simple-combo/simple-combo.component.d.ts +16 -1
  415. package/lib/slider/label/thumb-label.component.d.ts +2 -0
  416. package/lib/slider/slider.component.d.ts +5 -0
  417. package/lib/slider/thumb/thumb-slider.component.d.ts +4 -1
  418. package/lib/slider/ticks/ticks.component.d.ts +3 -0
  419. package/lib/splitter/splitter-pane/splitter-pane.component.d.ts +2 -0
  420. package/lib/stepper/step/step.component.d.ts +5 -0
  421. package/lib/stepper/stepper.component.d.ts +2 -0
  422. package/lib/switch/switch.component.d.ts +4 -4
  423. package/lib/tabs/bottom-nav/bottom-nav.component.d.ts +1 -1
  424. package/lib/tabs/tab-item.directive.d.ts +2 -0
  425. package/lib/tabs/tabs.directive.d.ts +2 -4
  426. package/lib/time-picker/time-picker.component.d.ts +2 -0
  427. package/lib/tree/tree-node/tree-node.component.d.ts +5 -0
  428. package/lib/tree/tree.component.d.ts +1 -0
  429. package/migrations/common/tsUtils.d.ts +2 -0
  430. package/migrations/common/tsUtils.js +4 -3
  431. package/migrations/update-17_0_0/changes/classes.json +21 -0
  432. package/migrations/update-17_0_0/changes/members.json +21 -0
  433. package/migrations/update-17_0_0/index.js +48 -1
  434. package/package.json +2 -2
  435. package/schematics/tsconfig.tsbuildinfo +1 -1
  436. package/styles/igniteui-indigo-dark.css +1 -1
  437. package/styles/igniteui-indigo-light.css +1 -1
  438. package/styles/maps/igniteui-indigo-dark.css.map +1 -1
  439. package/styles/maps/igniteui-indigo-light.css.map +1 -1
@@ -1,6 +1,6 @@
1
1
  import { __decorate } from "tslib";
2
2
  import { Subject } from 'rxjs';
3
- import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Input, Output, EventEmitter, Inject, Optional, Self, } from '@angular/core';
3
+ import { ChangeDetectionStrategy, Component, ContentChild, ContentChildren, Input, Output, EventEmitter, Inject, Optional, Self, booleanAttribute, } from '@angular/core';
4
4
  import { notifyChanges } from '../watch-changes';
5
5
  import { WatchColumnChanges } from '../watch-changes';
6
6
  import { GridColumnDataType } from '../../data-operations/data-util';
@@ -1985,8 +1985,8 @@ export class IgxColumnComponent {
1985
1985
  this._applySelectableClass = value;
1986
1986
  }
1987
1987
  }
1988
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-rc.1", ngImport: i0, type: IgxColumnComponent, deps: [{ token: IGX_GRID_BASE }, { token: NG_VALIDATORS, optional: true, self: true }, { token: i0.ChangeDetectorRef }, { token: i1.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
1989
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.0-rc.1", type: IgxColumnComponent, isStandalone: true, selector: "igx-column", inputs: { field: "field", header: "header", title: "title", sortable: "sortable", selectable: "selectable", groupable: "groupable", editable: "editable", filterable: "filterable", resizable: "resizable", autosizeHeader: "autosizeHeader", hasSummary: "hasSummary", hidden: "hidden", disableHiding: "disableHiding", disablePinning: "disablePinning", movable: "movable", width: "width", maxWidth: "maxWidth", headerClasses: "headerClasses", headerStyles: "headerStyles", headerGroupClasses: "headerGroupClasses", headerGroupStyles: "headerGroupStyles", cellClasses: "cellClasses", cellStyles: "cellStyles", formatter: "formatter", summaryFormatter: "summaryFormatter", filteringIgnoreCase: "filteringIgnoreCase", sortingIgnoreCase: "sortingIgnoreCase", searchable: "searchable", dataType: "dataType", collapsibleIndicatorTemplate: "collapsibleIndicatorTemplate", rowEnd: "rowEnd", colEnd: "colEnd", rowStart: "rowStart", colStart: "colStart", additionalTemplateContext: "additionalTemplateContext", minWidth: "minWidth", pinned: "pinned", summaries: "summaries", filters: "filters", sortStrategy: "sortStrategy", groupingComparer: "groupingComparer", summaryTemplate: "summaryTemplate", bodyTemplate: ["cellTemplate", "bodyTemplate"], headerTemplate: "headerTemplate", inlineEditorTemplate: ["cellEditorTemplate", "inlineEditorTemplate"], errorTemplate: "errorTemplate", filterCellTemplate: "filterCellTemplate", visibleWhenCollapsed: "visibleWhenCollapsed", pipeArgs: "pipeArgs" }, outputs: { hiddenChange: "hiddenChange", expandedChange: "expandedChange", collapsibleChange: "collapsibleChange", visibleWhenCollapsedChange: "visibleWhenCollapsedChange", columnChange: "columnChange", widthChange: "widthChange", pinnedChange: "pinnedChange" }, queries: [{ propertyName: "filterCellTemplateDirective", first: true, predicate: IgxFilterCellTemplateDirective, descendants: true, read: IgxFilterCellTemplateDirective }, { propertyName: "summaryTemplateDirective", first: true, predicate: IgxSummaryTemplateDirective, descendants: true, read: IgxSummaryTemplateDirective }, { propertyName: "cellTemplate", first: true, predicate: IgxCellTemplateDirective, descendants: true, read: IgxCellTemplateDirective }, { propertyName: "cellValidationErrorTemplate", first: true, predicate: IgxCellValidationErrorDirective, descendants: true, read: IgxCellValidationErrorDirective }, { propertyName: "editorTemplate", first: true, predicate: IgxCellEditorTemplateDirective, descendants: true, read: IgxCellEditorTemplateDirective }, { propertyName: "collapseIndicatorTemplate", first: true, predicate: IgxCollapsibleIndicatorTemplateDirective, descendants: true, read: IgxCollapsibleIndicatorTemplateDirective }, { propertyName: "headTemplate", predicate: IgxCellHeaderTemplateDirective, read: IgxCellHeaderTemplateDirective }], ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1988
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-rc.3", ngImport: i0, type: IgxColumnComponent, deps: [{ token: IGX_GRID_BASE }, { token: NG_VALIDATORS, optional: true, self: true }, { token: i0.ChangeDetectorRef }, { token: i1.PlatformUtil }], target: i0.ɵɵFactoryTarget.Component }); }
1989
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "17.0.0-rc.3", type: IgxColumnComponent, isStandalone: true, selector: "igx-column", inputs: { field: "field", header: "header", title: "title", sortable: ["sortable", "sortable", booleanAttribute], selectable: "selectable", groupable: ["groupable", "groupable", booleanAttribute], editable: ["editable", "editable", booleanAttribute], filterable: ["filterable", "filterable", booleanAttribute], resizable: ["resizable", "resizable", booleanAttribute], autosizeHeader: ["autosizeHeader", "autosizeHeader", booleanAttribute], hasSummary: ["hasSummary", "hasSummary", booleanAttribute], hidden: ["hidden", "hidden", booleanAttribute], disableHiding: ["disableHiding", "disableHiding", booleanAttribute], disablePinning: ["disablePinning", "disablePinning", booleanAttribute], movable: ["movable", "movable", booleanAttribute], width: "width", maxWidth: "maxWidth", headerClasses: "headerClasses", headerStyles: "headerStyles", headerGroupClasses: "headerGroupClasses", headerGroupStyles: "headerGroupStyles", cellClasses: "cellClasses", cellStyles: "cellStyles", formatter: "formatter", summaryFormatter: "summaryFormatter", filteringIgnoreCase: ["filteringIgnoreCase", "filteringIgnoreCase", booleanAttribute], sortingIgnoreCase: ["sortingIgnoreCase", "sortingIgnoreCase", booleanAttribute], searchable: ["searchable", "searchable", booleanAttribute], dataType: "dataType", collapsibleIndicatorTemplate: "collapsibleIndicatorTemplate", rowEnd: "rowEnd", colEnd: "colEnd", rowStart: "rowStart", colStart: "colStart", additionalTemplateContext: "additionalTemplateContext", minWidth: "minWidth", pinned: ["pinned", "pinned", booleanAttribute], summaries: "summaries", filters: "filters", sortStrategy: "sortStrategy", groupingComparer: "groupingComparer", summaryTemplate: "summaryTemplate", bodyTemplate: ["cellTemplate", "bodyTemplate"], headerTemplate: "headerTemplate", inlineEditorTemplate: ["cellEditorTemplate", "inlineEditorTemplate"], errorTemplate: "errorTemplate", filterCellTemplate: "filterCellTemplate", visibleWhenCollapsed: ["visibleWhenCollapsed", "visibleWhenCollapsed", booleanAttribute], pipeArgs: "pipeArgs" }, outputs: { hiddenChange: "hiddenChange", expandedChange: "expandedChange", collapsibleChange: "collapsibleChange", visibleWhenCollapsedChange: "visibleWhenCollapsedChange", columnChange: "columnChange", widthChange: "widthChange", pinnedChange: "pinnedChange" }, queries: [{ propertyName: "filterCellTemplateDirective", first: true, predicate: IgxFilterCellTemplateDirective, descendants: true, read: IgxFilterCellTemplateDirective }, { propertyName: "summaryTemplateDirective", first: true, predicate: IgxSummaryTemplateDirective, descendants: true, read: IgxSummaryTemplateDirective }, { propertyName: "cellTemplate", first: true, predicate: IgxCellTemplateDirective, descendants: true, read: IgxCellTemplateDirective }, { propertyName: "cellValidationErrorTemplate", first: true, predicate: IgxCellValidationErrorDirective, descendants: true, read: IgxCellValidationErrorDirective }, { propertyName: "editorTemplate", first: true, predicate: IgxCellEditorTemplateDirective, descendants: true, read: IgxCellEditorTemplateDirective }, { propertyName: "collapseIndicatorTemplate", first: true, predicate: IgxCollapsibleIndicatorTemplateDirective, descendants: true, read: IgxCollapsibleIndicatorTemplateDirective }, { propertyName: "headTemplate", predicate: IgxCellHeaderTemplateDirective, read: IgxCellHeaderTemplateDirective }], ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1990
1990
  }
1991
1991
  __decorate([
1992
1992
  notifyChanges(),
@@ -2126,7 +2126,7 @@ __decorate([
2126
2126
  notifyChanges(),
2127
2127
  WatchColumnChanges()
2128
2128
  ], IgxColumnComponent.prototype, "pipeArgs", null);
2129
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ngImport: i0, type: IgxColumnComponent, decorators: [{
2129
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.3", ngImport: i0, type: IgxColumnComponent, decorators: [{
2130
2130
  type: Component,
2131
2131
  args: [{
2132
2132
  changeDetection: ChangeDetectionStrategy.OnPush,
@@ -2151,23 +2151,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ng
2151
2151
  }], title: [{
2152
2152
  type: Input
2153
2153
  }], sortable: [{
2154
- type: Input
2154
+ type: Input,
2155
+ args: [{ transform: booleanAttribute }]
2155
2156
  }], selectable: [{
2156
2157
  type: Input
2157
2158
  }], groupable: [{
2158
- type: Input
2159
+ type: Input,
2160
+ args: [{ transform: booleanAttribute }]
2159
2161
  }], editable: [{
2160
- type: Input
2162
+ type: Input,
2163
+ args: [{ transform: booleanAttribute }]
2161
2164
  }], filterable: [{
2162
- type: Input
2165
+ type: Input,
2166
+ args: [{ transform: booleanAttribute }]
2163
2167
  }], resizable: [{
2164
- type: Input
2168
+ type: Input,
2169
+ args: [{ transform: booleanAttribute }]
2165
2170
  }], autosizeHeader: [{
2166
- type: Input
2171
+ type: Input,
2172
+ args: [{ transform: booleanAttribute }]
2167
2173
  }], hasSummary: [{
2168
- type: Input
2174
+ type: Input,
2175
+ args: [{ transform: booleanAttribute }]
2169
2176
  }], hidden: [{
2170
- type: Input
2177
+ type: Input,
2178
+ args: [{ transform: booleanAttribute }]
2171
2179
  }], hiddenChange: [{
2172
2180
  type: Output
2173
2181
  }], expandedChange: [{
@@ -2179,11 +2187,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ng
2179
2187
  }], columnChange: [{
2180
2188
  type: Output
2181
2189
  }], disableHiding: [{
2182
- type: Input
2190
+ type: Input,
2191
+ args: [{ transform: booleanAttribute }]
2183
2192
  }], disablePinning: [{
2184
- type: Input
2193
+ type: Input,
2194
+ args: [{ transform: booleanAttribute }]
2185
2195
  }], movable: [{
2186
- type: Input
2196
+ type: Input,
2197
+ args: [{ transform: booleanAttribute }]
2187
2198
  }], width: [{
2188
2199
  type: Input
2189
2200
  }], maxWidth: [{
@@ -2205,11 +2216,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ng
2205
2216
  }], summaryFormatter: [{
2206
2217
  type: Input
2207
2218
  }], filteringIgnoreCase: [{
2208
- type: Input
2219
+ type: Input,
2220
+ args: [{ transform: booleanAttribute }]
2209
2221
  }], sortingIgnoreCase: [{
2210
- type: Input
2222
+ type: Input,
2223
+ args: [{ transform: booleanAttribute }]
2211
2224
  }], searchable: [{
2212
- type: Input
2225
+ type: Input,
2226
+ args: [{ transform: booleanAttribute }]
2213
2227
  }], dataType: [{
2214
2228
  type: Input
2215
2229
  }], collapsibleIndicatorTemplate: [{
@@ -2252,7 +2266,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ng
2252
2266
  }], minWidth: [{
2253
2267
  type: Input
2254
2268
  }], pinned: [{
2255
- type: Input
2269
+ type: Input,
2270
+ args: [{ transform: booleanAttribute }]
2256
2271
  }], summaries: [{
2257
2272
  type: Input
2258
2273
  }], filters: [{
@@ -2278,8 +2293,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-rc.1", ng
2278
2293
  type: Input,
2279
2294
  args: ['filterCellTemplate']
2280
2295
  }], visibleWhenCollapsed: [{
2281
- type: Input
2296
+ type: Input,
2297
+ args: [{ transform: booleanAttribute }]
2282
2298
  }], pipeArgs: [{
2283
2299
  type: Input
2284
2300
  }] } });
2285
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixLQUFLLEVBR0wsTUFBTSxFQUNOLFlBQVksRUFFWixNQUFNLEVBQ04sUUFBUSxFQUNSLElBQUksR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDckUsT0FBTyxFQUVILDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsdUJBQXVCLEVBQzFCLE1BQU0sMkNBQTJDLENBQUM7QUFDbkQsT0FBTyxFQUFvQixzQkFBc0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxFQUErRyxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl0SyxPQUFPLEVBQ0gsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUscUJBQXFCLEVBQy9DLHFCQUFxQixFQUMxQyxNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsOEJBQThCLEVBQzlC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RUFBRSxJQUFJLEVBQUUsd0NBQXdDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFnRTlHLFFBQVE7c0JBRGxCLEtBQUs7Z0JBNENLLE1BQU07c0JBRGhCLEtBQUs7Z0JBZ0RLLFNBQVM7c0JBRG5CLEtBQUs7Z0JBZ0NLLE9BQU87c0JBRGpCLEtBQUs7Z0JBd0JLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBeUJLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFnREssZUFBZTtzQkFEekIsS0FBSztnQkFtQ0ssWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxjQUFjO2dCQW1DVixjQUFjO3NCQUR4QixLQUFLO2dCQW9DSyxvQkFBb0I7c0JBRDlCLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWdDaEIsYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxlQUFlO2dCQWtDWCxrQkFBa0I7c0JBRDVCLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWtNaEIsb0JBQW9CO3NCQUQ5QixLQUFLO2dCQW1DSyxRQUFRO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBBZnRlckNvbnRlbnRJbml0LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIElucHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIE9uRGVzdHJveSxcbiAgICBJbmplY3QsXG4gICAgT3B0aW9uYWwsXG4gICAgU2VsZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBub3RpZnlDaGFuZ2VzIH0gZnJvbSAnLi4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBXYXRjaENvbHVtbkNoYW5nZXMgfSBmcm9tICcuLi93YXRjaC1jaGFuZ2VzJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHtcbiAgICBJZ3hGaWx0ZXJpbmdPcGVyYW5kLFxuICAgIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLFxuICAgIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4VGltZUZpbHRlcmluZ09wZXJhbmRcbn0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgSVNvcnRpbmdTdHJhdGVneSwgRGVmYXVsdFNvcnRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IElneFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4uL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IENlbGxUeXBlLCBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSWd4Q2VsbFRlbXBsYXRlQ29udGV4dCwgSWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0LCBJZ3hTdW1tYXJ5VGVtcGxhdGVDb250ZXh0LCBJR1hfR1JJRF9CQVNFIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4U3VtbWFyeU9wZXJhbmQsIElneE51bWJlclN1bW1hcnlPcGVyYW5kLCBJZ3hEYXRlU3VtbWFyeU9wZXJhbmQsXG4gICAgSWd4U3VtbWFyeVJlc3VsdCwgSWd4VGltZVN1bW1hcnlPcGVyYW5kXG59IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHtcbiAgICBJZ3hDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Q2VsbEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneENlbGxFZGl0b3JUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hDb2xsYXBzaWJsZUluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hTdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Q2VsbFZhbGlkYXRpb25FcnJvckRpcmVjdGl2ZVxufSBmcm9tICcuL3RlbXBsYXRlcy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTVJMUmVzaXplQ29sdW1uSW5mbywgTVJMQ29sdW1uU2l6ZUluZm8sIElDb2x1bW5QaXBlQXJncyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEcm9wUG9zaXRpb24gfSBmcm9tICcuLi9tb3ZpbmcvbW92aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncywgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGluQ29sdW1uRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBpc0NvbnN0cnVjdG9yLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBOR19WQUxJREFUT1JTLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmNvbnN0IERFRkFVTFRfREFURV9GT1JNQVQgPSAnbWVkaXVtRGF0ZSc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ21lZGl1bVRpbWUnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX0RJR0lUU19JTkZPID0gJzEuMC0zJztcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDb2x1bW4qKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvZ3JpZC9ncmlkI2NvbHVtbnMtY29uZmlndXJhdGlvbilcbiAqXG4gKiBUaGUgSWduaXRlIFVJIENvbHVtbiBpcyB1c2VkIHdpdGhpbiBhbiBgaWd4LWdyaWRgIGVsZW1lbnQgdG8gZGVmaW5lIHdoYXQgZGF0YSB0aGUgY29sdW1uIHdpbGwgc2hvdy4gRmVhdHVyZXMgc3VjaCBhcyBzb3J0aW5nLFxuICogZmlsdGVyaW5nICYgZWRpdGluZyBhcmUgZW5hYmxlZCBhdCB0aGUgY29sdW1uIGxldmVsLiAgWW91IGNhbiBhbHNvIHByb3ZpZGUgYSB0ZW1wbGF0ZSBjb250YWluaW5nIGN1c3RvbSBjb250ZW50IGluc2lkZVxuICogdGhlIGNvbHVtbiB1c2luZyBgbmctdGVtcGxhdGVgIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGNlbGxzIHdpdGhpbiB0aGUgY29sdW1uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1jb2x1bW4nLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneENvbHVtbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgQ29sdW1uVHlwZSB7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgZmllbGRgIHZhbHVlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uRmllbGQgPSB0aGlzLmNvbHVtbi5maWVsZDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2ZpZWxkXSA9IFwiJ0lEJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc05lc3RlZFBhdGggPSB2YWx1ZT8uaW5jbHVkZXMoJy4nKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmaWVsZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaGVhZGVyYCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkhlYWRlciA9IHRoaXMuY29sdW1uLmhlYWRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hlYWRlcl0gPSBcIidJRCdcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlYWRlciA9ICcnO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHRpdGxlYCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRpdGxlID0gdGhpcy5jb2x1bW4udGl0bGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFt0aXRsZV0gPSBcIidTb21lIGNvbHVtbiB0b29sdGlwJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGl0bGUgPSAnJztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzU29ydGFibGUgPSB0aGlzLmNvbHVtbi5zb3J0YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW3NvcnRhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzb3J0YWJsZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGNvbHVtbiBpcyBzZWxlY3RhYmxlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uU2VsZWN0YWJsZSA9IHRoaXMuY29sdW1uLnNlbGVjdGFibGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGFibGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgaWYgdGhlIGNvbHVtbiBpcyBzZWxlY3RhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbc2VsZWN0YWJsZV0gPSBcImZhbHNlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgc2VsZWN0YWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zZWxlY3RhYmxlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBncm91cGFibGUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNHcm91cGFibGUgPSB0aGlzLmNvbHVtbi5ncm91cGFibGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtncm91cGFibGVdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGdyb3VwYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dyb3VwYWJsZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBncm91cGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZ3JvdXBhYmxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZ3JpZC5ncm91cGFibGVQaXBlVHJpZ2dlcisrO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBlZGl0YWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0VkaXRhYmxlID0gdGhpcy5jb2x1bW4uZWRpdGFibGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBVcGRhdGluZyB0aGUgcHJpbWFyeSBrZXkgd2hlbiBncmlkIGhhcyB0cmFuc2FjdGlvbnMgKGluY2wuIHJvdyBlZGl0KVxuICAgICAgICAvLyBzaG91bGQgbm90IGJlIGFsbG93ZWQsIGFzIHRoYXQgY2FuIGNvcnJ1cHQgdHJhbnNhY3Rpb24gc3RhdGUuXG4gICAgICAgIGNvbnN0IHJvd0VkaXRhYmxlID0gdGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5yb3dFZGl0YWJsZTtcbiAgICAgICAgY29uc3QgaGFzVHJhbnNhY3Rpb25zID0gdGhpcy5ncmlkICYmIHRoaXMuZ3JpZC50cmFuc2FjdGlvbnMuZW5hYmxlZDtcblxuICAgICAgICBpZiAodGhpcy5pc1ByaW1hcnlDb2x1bW4gJiYgKHJvd0VkaXRhYmxlIHx8IGhhc1RyYW5zYWN0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcm93RWRpdGFibGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZWRpdGFibGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uLmVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2VkaXRhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGVkaXRhYmxlKGVkaXRhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2VkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZmlsdGVyYWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRmlsdGVyYWJsZSA9IHRoaXMuY29sdW1uLmZpbHRlcmFibGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtmaWx0ZXJhYmxlXSA9IFwiZmFsc2VcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZpbHRlcmFibGUgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcmVzaXphYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUmVzaXphYmxlID0gdGhpcy5jb2x1bW4ucmVzaXphYmxlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbcmVzaXphYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZXNpemFibGUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaGVhZGVyIGlzIGluY2x1ZGVkIGluIGF1dG9zaXplIGxvZ2ljLlxuICAgICAqIFVzZWZ1bCB3aGVuIHRlbXBsYXRlIGZvciBhIGNvbHVtbiBoZWFkZXIgaXMgc2l6ZWQgYmFzZWQgb24gcGFyZW50LCBmb3IgZXhhbXBsZSBhIGRlZmF1bHQgYGRpdmAuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNSZXNpemFibGUgPSB0aGlzLmNvbHVtbi5yZXNpemFibGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtyZXNpemFibGVdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGF1dG9zaXplSGVhZGVyID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN1bW1hcnkgZm9yIHRoZSBjb2x1bW4gaXMgZW5hYmxlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGhhc1N1bW1hcnkgPSB0aGlzLmNvbHVtbi5oYXNTdW1tYXJ5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGhhc1N1bW1hcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oYXNTdW1tYXJ5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBzdW1tYXJ5IGZvciB0aGUgY29sdW1uIGlzIGVuYWJsZWQuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbaGFzU3VtbWFyeV0gPSBcInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBoYXNTdW1tYXJ5KHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2hhc1N1bW1hcnkgPSB2YWx1ZTtcblxuICAgICAgICBpZiAodGhpcy5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVzZXRTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgaGlkZGVuLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNIaWRkZW4gPSB0aGlzLmNvbHVtbi5oaWRkZW47XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXModHJ1ZSlcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faGlkZGVuO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBjb2x1bW4gaGlkZGVuIHByb3BlcnR5LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hpZGRlbl0gPSBcInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBUd28td2F5IGRhdGEgYmluZGluZy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gWyhoaWRkZW4pXSA9IFwibW9kZWwuaXNIaWRkZW5cIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBoaWRkZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX2hpZGRlbiAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZGRlbiA9IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy5oaWRkZW5DaGFuZ2UuZW1pdCh0aGlzLl9oaWRkZW4pO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29sdW1uTGF5b3V0Q2hpbGQgJiYgdGhpcy5wYXJlbnQuaGlkZGVuICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LmhpZGRlbiA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLnN1bW1hcnlTZXJ2aWNlLnJlc2V0U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLnJlZnJlc2hFeHByZXNzaW9ucygpO1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLmhpZGVGaWx0ZXJpbmdSb3dPbkNvbHVtblZpc2liaWxpdHlDaGFuZ2UodGhpcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGNvbHVtbiBpcyBzZWxlY3RlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzU2VsZWN0ZWQgPSB0aGlzLmNvbHVtbi5zZWxlY3RlZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuaXNDb2x1bW5TZWxlY3RlZCh0aGlzLmZpZWxkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3QvZGVzZWxlY3QgYSBjb2x1bW4uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3RlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlICYmIHZhbHVlICE9PSB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5zZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3RoaXMuZmllbGRdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLnNlbGVjdGlvblNlcnZpY2UuZGVzZWxlY3RDb2x1bW5zV2l0aE5vRXZlbnQoW3RoaXMuZmllbGRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JpZC5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGhpZGRlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGV4cGFuZGVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY29sbGFwc2libGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgdmlzaWJsZVdoZW5Db2xsYXBzZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2x1bW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGhpZGluZyBpcyBkaXNhYmxlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzSGlkaW5nRGlzYWJsZWQgPSAgdGhpcy5jb2x1bW4uZGlzYWJsZUhpZGluZztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZUhpZGluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgcGlubmluZyBpcyBkaXNhYmxlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUGlubmluZ0Rpc2FibGVkID0gIHRoaXMuY29sdW1uLmRpc2FibGVQaW5uaW5nO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkaXNhYmxlUGlubmluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGluIHZlcnNpb24gMTMuMS4wLiBVc2UgYElneEdyaWRDb21wb25lbnQubW92aW5nYCBpbnN0ZWFkLlxuICAgICAqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBtb3ZhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNNb3ZhYmxlID0gdGhpcy5jb2x1bW4ubW92YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW21vdmFibGVdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIG1vdmFibGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgd2lkdGhgIG9mIHRoZSBjb2x1bW4uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5XaWR0aCA9IHRoaXMuY29sdW1uLndpZHRoO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGlzQXV0b1dpZHRoID0gdGhpcy5fd2lkdGggJiYgdHlwZW9mIHRoaXMuX3dpZHRoID09PSAnc3RyaW5nJyAmJiB0aGlzLl93aWR0aCA9PT0gJ2F1dG8nO1xuICAgICAgICBpZiAoaXNBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hdXRvU2l6ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnZml0LWNvbnRlbnQnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2l6ZSArICdweCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy53aWR0aFNldEJ5VXNlciA/IHRoaXMuX3dpZHRoIDogdGhpcy5kZWZhdWx0V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYHdpZHRoYCBvZiB0aGUgY29sdW1uLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbd2lkdGhdID0gXCInMjUlJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFR3by13YXkgZGF0YSBiaW5kaW5nLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbKHdpZHRoKV09XCJtb2RlbC5jb2x1bW5zWzBdLndpZHRoXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGNXaWR0aCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmNhbGNQaXhlbFdpZHRoID0gTmFOO1xuICAgICAgICAgICAgdGhpcy53aWR0aFNldEJ5VXNlciA9IHRydWU7XG4gICAgICAgICAgICAvLyB3aWR0aCBjb3VsZCBiZSBwYXNzZWQgYXMgbnVtYmVyIGZyb20gdGhlIHRlbXBsYXRlXG4gICAgICAgICAgICAvLyBob3N0IGJpbmRpbmdzIGFyZSBub3QgcHggYWZmaXhlZCBzbyB3ZSBuZWVkIHRvIGVuc3VyZSB3ZSBhZmZpeCBzaW1wbGUgbnVtYmVyIHN0cmluZ3NcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHZhbHVlKSA9PT0gJ251bWJlcicgfHwgdmFsdWUubWF0Y2goL15bMC05XSokLykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ2ZpdC1jb250ZW50Jykge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gJ2F1dG8nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlQ2FsY1dpZHRoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLndpZHRoQ2hhbmdlLmVtaXQodGhpcy5fd2lkdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBhdXRvU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBtYXhpbXVtIGB3aWR0aGAgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbk1heFdpZHRoID0gdGhpcy5jb2x1bW4ud2lkdGg7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFttYXhXaWR0aF0gPSBcIicxNTBweCdcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgbWF4V2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgY2xhc3Mgc2VsZWN0b3Igb2YgdGhlIGNvbHVtbiBoZWFkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5IZWFkZXJDbGFzcyA9IHRoaXMuY29sdW1uLmhlYWRlckNsYXNzZXM7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtoZWFkZXJDbGFzc2VzXSA9IFwiJ2NvbHVtbi1oZWFkZXInXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoZWFkZXJDbGFzc2VzID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbmRpdGlvbmFsIHN0eWxlIHByb3BlcnRpZXMgb24gdGhlIGNvbHVtbiBoZWFkZXIuXG4gICAgICogU2ltaWxhciB0byBgbmdTdHlsZWAgaXQgYWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCB3aGVyZSB0aGUga2V5cyBhcmVcbiAgICAgKiB0aGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc3R5bGVzID0ge1xuICAgICAqICBiYWNrZ3JvdW5kOiAncm95YWxibHVlJyxcbiAgICAgKiAgY29sb3I6IChjb2x1bW4pID0+IGNvbHVtbi5waW5uZWQgPyAncmVkJzogJ2luaGVyaXQnXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbaGVhZGVyU3R5bGVzXT1cInN0eWxlc1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGVhZGVyU3R5bGVzID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgY2xhc3Mgc2VsZWN0b3Igb2YgdGhlIGNvbHVtbiBncm91cCBoZWFkZXIuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5IZWFkZXJDbGFzcyA9IHRoaXMuY29sdW1uLmhlYWRlckdyb3VwQ2xhc3NlcztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hlYWRlckdyb3VwQ2xhc3Nlc10gPSBcIidjb2x1bW4tZ3JvdXAtaGVhZGVyJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGVhZGVyR3JvdXBDbGFzc2VzID0gJyc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGNvbmRpdGlvbmFsIHN0eWxlIHByb3BlcnRpZXMgb24gdGhlIGNvbHVtbiBoZWFkZXIgZ3JvdXAgd3JhcHBlci5cbiAgICAgKiBTaW1pbGFyIHRvIGBuZ1N0eWxlYCBpdCBhY2NlcHRzIGFuIG9iamVjdCBsaXRlcmFsIHdoZXJlIHRoZSBrZXlzIGFyZVxuICAgICAqIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBzdHlsZXMgPSB7XG4gICAgICogIGJhY2tncm91bmQ6ICdyb3lhbGJsdWUnLFxuICAgICAqICBjb2xvcjogKGNvbHVtbikgPT4gY29sdW1uLnBpbm5lZCA/ICdyZWQnOiAnaW5oZXJpdCdcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtoZWFkZXJHcm91cFN0eWxlc109XCJzdHlsZXNcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlYWRlckdyb3VwU3R5bGVzID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIFNldHMgYSBjb25kaXRpb25hbCBjbGFzcyBzZWxlY3RvciBvZiB0aGUgY29sdW1uIGNlbGxzLlxuICAgICAqIEFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwsIGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzLFxuICAgICAqIHdoZXJlIHRoZSBrZXkgaXMgdGhlIG5hbWUgb2YgdGhlIENTUyBjbGFzcywgd2hpbGUgdGhlXG4gICAgICogdmFsdWUgaXMgZWl0aGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYm9vbGVhbixcbiAgICAgKiBvciBib29sZWFuLCBsaWtlIHNvOlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjYWxsYmFjayA9IChyb3dEYXRhLCBjb2x1bW5LZXksIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHsgcmV0dXJuIHJvd0RhdGFbY29sdW1uS2V5XSA+IDY7IH1cbiAgICAgKiBjZWxsQ2xhc3NlcyA9IHsgJ2NsYXNzTmFtZScgOiB0aGlzLmNhbGxiYWNrIH07XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtjZWxsQ2xhc3Nlc10gPSBcImNlbGxDbGFzc2VzXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIDxpZ3gtY29sdW1uIFtjZWxsQ2xhc3Nlc10gPSBcInsnY2xhc3MxJyA6IHRydWUgfVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY2VsbENsYXNzZXM6IGFueTtcblxuICAgIC8qKlxuICAgICAqIFNldHMgY29uZGl0aW9uYWwgc3R5bGUgcHJvcGVydGllcyBvbiB0aGUgY29sdW1uIGNlbGxzLlxuICAgICAqIFNpbWlsYXIgdG8gYG5nU3R5bGVgIGl0IGFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAgICogdGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogQXMgd2l0aCBgY2VsbENsYXNzZXNgIGl0IGFjY2VwdHMgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogc3R5bGVzID0ge1xuICAgICAqICBiYWNrZ3JvdW5kOiAncm95YWxibHVlJyxcbiAgICAgKiAgY29sb3I6IChyb3dEYXRhLCBjb2x1bW5LZXksIGNlbGxWYWx1ZSwgcm93SW5kZXgpID0+IHZhbHVlLnN0YXJ0c1dpdGgoJ0ltcG9ydGFudCcpID8gJ3JlZCc6ICdpbmhlcml0J1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2NlbGxTdHlsZXNdPVwic3R5bGVzXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjZWxsU3R5bGVzID0gbnVsbDtcbiAgICAvKipcbiAgICAgKiBBcHBsaWVzIGRpc3BsYXkgZm9ybWF0IHRvIGNlbGwgdmFsdWVzIGluIHRoZSBjb2x1bW4uIERvZXMgbm90IG1vZGlmeSB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgICAqXG4gICAgICogQHJlbWFya1xuICAgICAqIE5vdGU6IEFzIHRoZSBmb3JtYXR0ZXIgaXMgdXNlZCBpbiBwbGFjZXMgbGlrZSB0aGUgRXhjZWwgc3R5bGUgZmlsdGVyaW5nIGRpYWxvZywgaW4gY2VydGFpblxuICAgICAqIHNjZW5hcmlvcyAocmVtb3RlIGZpbHRlcmluZyBmb3IgZXhhbXBsZSksIHRoZSByb3cgZGF0YSBhcmd1bWVudCBjYW4gYmUgYHVuZGVmaW5lZGAuXG4gICAgICpcbiAgICAgKlxuICAgICAqIEluIHRoaXMgZXhhbXBsZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb2x1bW4gbmFtZSBpcyBTYWxhcnksIGFuZCB0aGVuIHByb3ZpZGUgYSBtZXRob2QgYXMgdGhlIGNvbHVtbiBmb3JtYXR0ZXJcbiAgICAgKiB0byBmb3JtYXQgdGhlIHZhbHVlIGludG8gYSBjdXJyZW5jeSBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb2x1bW5Jbml0KGNvbHVtbjogSWd4Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICogICBpZiAoY29sdW1uLmZpZWxkID09IFwiU2FsYXJ5XCIpIHtcbiAgICAgKiAgICAgY29sdW1uLmZvcm1hdHRlciA9IChzYWxhcnkgPT4gdGhpcy5mb3JtYXQoc2FsYXJ5KSk7XG4gICAgICogICB9XG4gICAgICogfVxuICAgICAqXG4gICAgICogZm9ybWF0KHZhbHVlOiBudW1iZXIpIDogc3RyaW5nIHtcbiAgICAgKiAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSwgXCJlbi11c1wiLCBcIiRcIik7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgY29sdW1uID0gdGhpcy5ncmlkLmdldENvbHVtbkJ5TmFtZSgnQWRkcmVzcycpO1xuICAgICAqIGNvbnN0IGFkZHJlc3NGb3JtYXR0ZXIgPSAoYWRkcmVzczogc3RyaW5nLCByb3dEYXRhOiBhbnkpID0+IGRhdGEucHJpdmFjeUVuYWJsZWQgPyAndW5rbm93bicgOiBhZGRyZXNzO1xuICAgICAqIGNvbHVtbi5mb3JtYXR0ZXIgPSBhZGRyZXNzRm9ybWF0dGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBmb3JtYXR0ZXI6ICh2YWx1ZTogYW55LCByb3dEYXRhPzogYW55KSA9PiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc3VtbWFyeUZvcm1hdHRlciBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgZGlzcGxheSBvZiB0aGUgY29sdW1uIHN1bW1hcmllcy5cbiAgICAgKlxuICAgICAqIEluIHRoaXMgZXhhbXBsZSwgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBjb2x1bW4gbmFtZSBpcyBPcmRlckRhdGUsIGFuZCB0aGVuIHByb3ZpZGUgYSBtZXRob2QgYXMgdGhlIHN1bW1hcnlGb3JtYXR0ZXJcbiAgICAgKiB0byBjaGFuZ2UgdGhlIGxvY2FsZSBmb3IgdGhlIGRhdGVzIHRvICdmci1GUicuIFRoZSBzdW1tYXJpZXMgd2l0aCB0aGUgY291bnQga2V5IGFyZSBza2lwcGVkIHNvIHRoZXkgYXJlIGRpc3BsYXllZCBhcyBudW1iZXJzLlxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbHVtbkluaXQoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgKiAgIGlmIChjb2x1bW4uZmllbGQgPT0gXCJPcmRlckRhdGVcIikge1xuICAgICAqICAgICBjb2x1bW4uc3VtbWFyeUZvcm1hdHRlciA9IHRoaXMuc3VtbWFyeUZvcm1hdDtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBzdW1tYXJ5Rm9ybWF0KHN1bW1hcnk6IElneFN1bW1hcnlSZXN1bHQsIHN1bW1hcnlPcGVyYW5kOiBJZ3hTdW1tYXJ5T3BlcmFuZCk6IHN0cmluZyB7XG4gICAgICogICBjb25zdCByZXN1bHQgPSBzdW1tYXJ5LnN1bW1hcnlSZXN1bHQ7XG4gICAgICogICBpZihzdW1tYXJ5UmVzdWx0LmtleSAhPT0gJ2NvdW50JyAmJiByZXN1bHQgIT09IG51bGwgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgKiAgICAgIGNvbnN0IHBpcGUgPSBuZXcgRGF0ZVBpcGUoJ2ZyLUZSJyk7XG4gICAgICogICAgICByZXR1cm4gcGlwZS50cmFuc2Zvcm0ocmVzdWx0LCdtZWRpdW1EYXRlJyk7XG4gICAgICogICB9XG4gICAgICogICByZXR1cm4gcmVzdWx0O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc3VtbWFyeUZvcm1hdHRlcjogKHN1bW1hcnk6IElneFN1bW1hcnlSZXN1bHQsIHN1bW1hcnlPcGVyYW5kOiBJZ3hTdW1tYXJ5T3BlcmFuZCkgPT4gYW55O1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBmaWx0ZXJpbmcgc2hvdWxkIGJlIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IHRoaXMuY29sdW1uLmZpbHRlcmluZ0lnbm9yZUNhc2U7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtmaWx0ZXJpbmdJZ25vcmVDYXNlXSA9IFwiZmFsc2VcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBzb3J0aW5nIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHNvcnRpbmdJZ25vcmVDYXNlID0gdGhpcy5jb2x1bW4uc29ydGluZ0lnbm9yZUNhc2U7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtzb3J0aW5nSWdub3JlQ2FzZV0gPSBcImZhbHNlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNvcnRpbmdJZ25vcmVDYXNlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIGBzZWFyY2hhYmxlYC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzU2VhcmNoYWJsZSA9ICB0aGlzLmNvbHVtbi5zZWFyY2hhYmxlJztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtY29sdW1uIFtzZWFyY2hhYmxlXSA9IFwiZmFsc2VcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNlYXJjaGFibGUgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBjb2x1bW4gdmFsdWVzLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYHN0cmluZ2AuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5EYXRhVHlwZSA9IHRoaXMuY29sdW1uLmRhdGFUeXBlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbZGF0YVR5cGVdID0gXCInbnVtYmVyJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBkYXRhVHlwZTogR3JpZENvbHVtbkRhdGFUeXBlID0gR3JpZENvbHVtbkRhdGFUeXBlLlN0cmluZztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sbGFwc2libGVJbmRpY2F0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0PjtcblxuICAgIC8qKlxuICAgICAqIFJvdyBpbmRleCB3aGVyZSB0aGUgY3VycmVudCBmaWVsZCBzaG91bGQgZW5kLlxuICAgICAqIFRoZSBhbW91bnQgb2Ygcm93cyBiZXR3ZWVuIHJvd1N0YXJ0IGFuZCByb3dFbmQgd2lsbCBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBzcGFubmluZyByb3dzIHRvIHRoYXQgZmllbGRcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4tbGF5b3V0PlxuICAgICAqICAgPGlneC1jb2x1bW4gW3Jvd0VuZF09XCIyXCIgW3Jvd1N0YXJ0XT1cIjFcIiBbY29sU3RhcnRdPVwiMVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiA8L2lneC1jb2x1bW4tbGF5b3V0PlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd0VuZDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ29sdW1uIGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGZpZWxkIHNob3VsZCBlbmQuXG4gICAgICogVGhlIGFtb3VudCBvZiBjb2x1bW5zIGJldHdlZW4gY29sU3RhcnQgYW5kIGNvbEVuZCB3aWxsIGRldGVybWluZSB0aGUgYW1vdW50IG9mIHNwYW5uaW5nIGNvbHVtbnMgdG8gdGhhdCBmaWVsZFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogICA8aWd4LWNvbHVtbiBbY29sRW5kXT1cIjNcIiBbcm93U3RhcnRdPVwiMVwiIFtjb2xTdGFydF09XCIxXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIDwvaWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sRW5kOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBSb3cgaW5kZXggZnJvbSB3aGljaCB0aGUgZmllbGQgaXMgc3RhcnRpbmcuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiAgIDxpZ3gtY29sdW1uIFtyb3dTdGFydF09XCIxXCIgW2NvbFN0YXJ0XT1cIjFcIj48L2lneC1jb2x1bW4+XG4gICAgICogPC9pZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByb3dTdGFydDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQ29sdW1uIGluZGV4IGZyb20gd2hpY2ggdGhlIGZpZWxkIGlzIHN0YXJ0aW5nLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogICA8aWd4LWNvbHVtbiBbY29sU3RhcnRdPVwiMVwiIFtyb3dTdGFydF09XCIxXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIDwvaWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29sU3RhcnQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyBjdXN0b20gcHJvcGVydGllcyBwcm92aWRlZCBpbiBhZGRpdGlvbmFsIHRlbXBsYXRlIGNvbnRleHQuXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2FkZGl0aW9uYWxUZW1wbGF0ZUNvbnRleHRdPVwiY29udGV4dE9iamVjdFwiPlxuICAgICAqICAgPG5nLXRlbXBsYXRlIGlneENlbGwgbGV0LWNlbGw9XCJjZWxsXCIgbGV0LXByb3BzPVwiYWRkaXRpb25hbFRlbXBsYXRlQ29udGV4dFwiPlxuICAgICAqICAgICAge3sgcHJvcHMgfX1cbiAgICAgKiAgIDwvbmctdGVtcGxhdGU+XG4gICAgICogPC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFkZGl0aW9uYWxUZW1wbGF0ZUNvbnRleHQ6IGFueTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgd2lkdGhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcGlubmVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hGaWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZmlsdGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlOiBJZ3hGaWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4U3VtbWFyeVRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneFN1bW1hcnlUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBzdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmU6IElneFN1bW1hcnlUZW1wbGF0ZURpcmVjdGl2ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQHNlZSB7QGxpbmsgYm9keVRlbXBsYXRlfVxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q2VsbFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneENlbGxUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBjZWxsVGVtcGxhdGU6IElneENlbGxUZW1wbGF0ZURpcmVjdGl2ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDZWxsVmFsaWRhdGlvbkVycm9yRGlyZWN0aXZlLCB7IHJlYWQ6IElneENlbGxWYWxpZGF0aW9uRXJyb3JEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgY2VsbFZhbGlkYXRpb25FcnJvclRlbXBsYXRlOiBJZ3hDZWxsVmFsaWRhdGlvbkVycm9yRGlyZWN0aXZlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkcmVuKElneENlbGxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hDZWxsSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmUsIGRlc2NlbmRhbnRzOiBmYWxzZSB9KVxuICAgIHByb3RlY3RlZCBoZWFkVGVtcGxhdGU6IFF1ZXJ5TGlzdDxJZ3hDZWxsSGVhZGVyVGVtcGxhdGVEaXJlY3RpdmU+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENlbGxFZGl0b3JUZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hDZWxsRWRpdG9yVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgZWRpdG9yVGVtcGxhdGU6IElneENlbGxFZGl0b3JUZW1wbGF0ZURpcmVjdGl2ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDb2xsYXBzaWJsZUluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneENvbGxhcHNpYmxlSW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsIHN0YXRpYzogZmFsc2UgfSlcbiAgICBwcm90ZWN0ZWQgY29sbGFwc2VJbmRpY2F0b3JUZW1wbGF0ZTogSWd4Q29sbGFwc2libGVJbmRpY2F0b3JUZW1wbGF0ZURpcmVjdGl2ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjYWxjV2lkdGgoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2FsY1dpZHRoKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBjYWxjUGl4ZWxXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4V2lkdGhQeCgpIHtcbiAgICAgICAgY29uc3QgZ3JpZEF2YWlsYWJsZVNpemUgPSB0aGlzLmdyaWQuY2FsY1dpZHRoO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IHRoaXMubWF4V2lkdGggJiYgdHlwZW9mIHRoaXMubWF4V2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMubWF4V2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICAgICAgcmV0dXJuIGlzUGVyY2VudGFnZVdpZHRoID8gcGFyc2VGbG9hdCh0aGlzLm1heFdpZHRoKSAvIDEwMCAqIGdyaWRBdmFpbGFibGVTaXplIDogcGFyc2VGbG9hdCh0aGlzLm1heFdpZHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhXaWR0aFBlcmNlbnQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRBdmFpbGFibGVTaXplID0gdGhpcy5ncmlkLmNhbGNXaWR0aDtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlV2lkdGggPSB0aGlzLm1heFdpZHRoICYmIHR5cGVvZiB0aGlzLm1heFdpZHRoID09PSAnc3RyaW5nJyAmJiB0aGlzLm1heFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIHJldHVybiBpc1BlcmNlbnRhZ2VXaWR0aCA/IHBhcnNlRmxvYXQodGhpcy5tYXhXaWR0aCkgOiBwYXJzZUZsb2F0KHRoaXMubWF4V2lkdGgpIC8gZ3JpZEF2YWlsYWJsZVNpemUgKiAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWluV2lkdGhQeCgpIHtcbiAgICAgICAgY29uc3QgZ3JpZEF2YWlsYWJsZVNpemUgPSB0aGlzLmdyaWQuY2FsY1dpZHRoO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IHRoaXMubWluV2lkdGggJiYgdHlwZW9mIHRoaXMubWluV2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMubWluV2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICAgICAgcmV0dXJuIGlzUGVyY2VudGFnZVdpZHRoID8gcGFyc2VGbG9hdCh0aGlzLm1pbldpZHRoKSAvIDEwMCAqIGdyaWRBdmFpbGFibGVTaXplIDogcGFyc2VGbG9hdCh0aGlzLm1pbldpZHRoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtaW5XaWR0aFBlcmNlbnQoKSB7XG4gICAgICAgIGNvbnN0IGdyaWRBdmFpbGFibGVTaXplID0gdGhpcy5ncmlkLmNhbGNXaWR0aDtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlV2lkdGggPSB0aGlzLm1pbldpZHRoICYmIHR5cGVvZiB0aGlzLm1pbldpZHRoID09PSAnc3RyaW5nJyAmJiB0aGlzLm1pbldpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIHJldHVybiBpc1BlcmNlbnRhZ2VXaWR0aCA/IHBhcnNlRmxvYXQodGhpcy5taW5XaWR0aCkgOiBwYXJzZUZsb2F0KHRoaXMubWluV2lkdGgpIC8gZ3JpZEF2YWlsYWJsZVNpemUgKiAxMDA7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIG1pbmltdW0gYHdpZHRoYCBvZiB0aGUgY29sdW1uLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYDg4YDtcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbk1pbldpZHRoID0gdGhpcy5jb2x1bW4ubWluV2lkdGg7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFttaW5XaWR0aF0gPSBcIicxMDBweCdcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBtaW5XaWR0aCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1pblZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKG1pblZhbCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWZhdWx0TWluV2lkdGggPSB2YWx1ZTtcblxuICAgIH1cbiAgICBwdWJsaWMgZ2V0IG1pbldpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fZGVmYXVsdE1pbldpZHRoID8gdGhpcy5kZWZhdWx0TWluV2lkdGggOiB0aGlzLl9kZWZhdWx0TWluV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXQgcmVzb2x2ZWRXaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5MYXlvdXRDaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQXV0b1dpZHRoID0gdGhpcy5fd2lkdGggJiYgdHlwZW9mIHRoaXMuX3dpZHRoID09PSAnc3RyaW5nJyAmJiB0aGlzLl93aWR0aCA9PT0gJ2F1dG8nO1xuICAgICAgICByZXR1cm4gaXNBdXRvV2lkdGggPyB0aGlzLndpZHRoIDogdGhpcy5jYWxjUGl4ZWxXaWR0aCArICdweCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGluZGV4LlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uSW5kZXggPSB0aGlzLmNvbHVtbi5pbmRleDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAodGhpcy5ncmlkIGFzIGFueSkuX2NvbHVtbnMuaW5kZXhPZih0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBgcGlubmVkYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUGlubmVkID0gdGhpcy5jb2x1bW4ucGlubmVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIHBpbm5lZC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtwaW5uZWRdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVHdvLXdheSBkYXRhIGJpbmRpbmcuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFsocGlubmVkKV0gPSBcIm1vZGVsLmNvbHVtbnNbMF0uaXNQaW5uZWRcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBwaW5uZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0b1dpZHRoID0gdGhpcy53aWR0aCAmJiB0eXBlb2YgdGhpcy53aWR0aCA9PT0gJ3N0cmluZycgJiYgdGhpcy53aWR0aCA9PT0gJ2ZpdC1jb250ZW50JztcbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy53aWR0aCAmJiAoaXNBdXRvV2lkdGggfHwgIWlzTmFOKHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGluKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnBpbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBObyBncmlkL3dpZHRoIGF2YWlsYWJsZSBhdCBpbml0aWFsaXphdGlvbi4gYGluaXRQaW5uaW5nYCBpbiB0aGUgZ3JpZFxuICAgICAgICAgICAgICAgd2lsbCByZS1pbml0IHRoZSBncm91cCAoaWYgcHJlc2VudClcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLl9waW5uZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucGlubmVkQ2hhbmdlLmVtaXQodGhpcy5fcGlubmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBgc3VtbWFyaWVzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtblN1bW1hcmllcyA9IHRoaXMuY29sdW1uLnN1bW1hcmllcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcyh0cnVlKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcmllcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBzdW1tYXJpZXNgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbi5zdW1tYXJpZXMgPSBJZ3hOdW1iZXJTdW1tYXJ5T3BlcmFuZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHN1bW1hcmllcyhjbGFzc1JlZjogYW55KSB7XG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yKGNsYXNzUmVmKSkge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzID0gbmV3IGNsYXNzUmVmKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVtb3ZlU3VtbWFyaWVzQ2FjaGVQZXJDb2x1bW4odGhpcy5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVzZXRTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGBmaWx0ZXJzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmNvbHVtbi5maWx0ZXJzJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCk6IElneEZpbHRlcmluZ09wZXJhbmQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBmaWx0ZXJzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4uZmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJzKGluc3RhbmNlOiBJZ3hGaWx0ZXJpbmdPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMgPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGBzb3J0U3RyYXRlZ3lgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc29ydFN0cmF0ZWd5ID0gdGhpcy5jb2x1bW4uc29ydFN0cmF0ZWd5XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRTdHJhdGVneSgpOiBJU29ydGluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRTdHJhdGVneTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBzb3J0U3RyYXRlZ3lgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbi5zb3J0U3RyYXRlZ3kgPSBuZXcgQ3VzdG9tU29ydGluZ1N0cmF0ZWd5KCkuXG4gICAgICogY2xhc3MgQ3VzdG9tU29ydGluZ1N0cmF0ZWd5IGV4dGVuZHMgU29ydGluZ1N0cmF0ZWd5IHsuLi59XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0U3RyYXRlZ3koY2xhc3NSZWY6IElTb3J0aW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fc29ydFN0cmF0ZWd5ID0gY2xhc3NSZWY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdmFsdWVzIGZvciBncm91cGluZy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGdyb3VwaW5nQ29tcGFyZXIgPSB0aGlzLmNvbHVtbi5ncm91cGluZ0NvbXBhcmVyJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBncm91cGluZ0NvbXBhcmVyKCk6IChhOiBhbnksIGI6IGFueSwgY3VyclJlYz86IGFueSwgZ3JvdXBSZWM/OiBhbnkpID0+IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cGluZ0NvbXBhcmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdmFsdWVzIGZvciBncm91cGluZy5cbiAgICAgKiBTdWJzZXF1ZW50IHZhbHVlcyBpbiB0aGUgc29ydGVkIGRhdGEgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIGZvciBhcmUgZ3JvdXBlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4uZ3JvdXBpbmdDb21wYXJlciA9IChhOiBhbnksIGI6IGFueSwgY3VyclJlYz86IGFueSwgZ3JvdXBSZWM/OiBhbnkpID0+IHsgcmV0dXJuIGEgPT09IGIgPyAwIDogLTE7IH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGdyb3VwaW5nQ29tcGFyZXIoZnVuY1JlZjogKGE6IGFueSwgYjogYW55LCBjdXJyUmVjPzogYW55LCBncm91cFJlYz86IGFueSkgPT4gbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwaW5nQ29tcGFyZXIgPSBmdW5jUmVmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltdW0gYHdpZHRoYCBvZiB0aGUgY29sdW1uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGVmYXVsdE1pbldpZHRoID0gIHRoaXMuY29sdW1uLmRlZmF1bHRNaW5XaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRNaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgcmV0dXJuICc4MCc7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmdyaWQuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzY0JztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzU2JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICc4MCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYHN1bW1hcnlUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzdW1tYXJ5VGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5zdW1tYXJ5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4U3VtbWFyeVRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdW1tYXJ5IHRlbXBsYXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3N1bW1hcnlUZW1wbGF0ZSBpZ3hTdW1tYXJ5IGxldC1zdW1tYXJ5UmVzdWx0cz5cbiAgICAgKiAgICA8cD57eyBzdW1tYXJ5UmVzdWx0c1swXS5sYWJlbCB9fToge3sgc3VtbWFyeVJlc3VsdHNbMF0uc3VtbWFyeVJlc3VsdCB9fTwvcD5cbiAgICAgKiAgICA8cD57eyBzdW1tYXJ5UmVzdWx0c1sxXS5sYWJlbCB9fToge3sgc3VtbWFyeVJlc3VsdHNbMV0uc3VtbWFyeVJlc3VsdCB9fTwvcD5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3N1bW1hcnlUZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHN1bW1hcnlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmNvbHVtbi5zdW1tYXJ5VGVtcGxhdGUgPSB0aGlzLnN1bW1hcnlUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4U3VtbWFyeVRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYGJvZHlUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBib2R5VGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5ib2R5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgnY2VsbFRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGJvZHlUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ib2R5VGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJvZHkgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlIGlneENlbGwgbGV0LXZhbD5cbiAgICAgKiAgICA8ZGl2IHN0eWxlID0gXCJiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3dncmVlblwiIChjbGljaykgPSBcImNoYW5nZUNvbG9yKHZhbClcIj5cbiAgICAgKiAgICAgICA8c3Bhbj4ge3t2YWx9fSA8L3NwYW4+XG4gICAgICogICAgPC9kaXY+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidib2R5VGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBib2R5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5jb2x1bW4uYm9keVRlbXBsYXRlID0gdGhpcy5ib2R5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBib2R5VGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENlbGxUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgdGVtcGxhdGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBoZWFkZXJUZW1wbGF0ZSA9IHRoaXMuY29sdW1uLmhlYWRlclRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVhZGVyVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGVhZGVyIHRlbXBsYXRlLlxuICAgICAqIE5vdGUgdGhhdCB0aGUgY29sdW1uIGhlYWRlciBoZWlnaHQgaXMgZml4ZWQgYW5kIGFueSBjb250ZW50IGJpZ2dlciB0aGFuIGl0IHdpbGwgYmUgY3V0IG9mZi5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICNoZWFkZXJUZW1wbGF0ZT5cbiAgICAgKiAgIDxkaXYgc3R5bGUgPSBcImJhY2tncm91bmQtY29sb3I6YmxhY2tcIiAoY2xpY2spID0gXCJjaGFuZ2VDb2xvcih2YWwpXCI+XG4gICAgICogICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIiA+e3tjb2x1bW4uZmllbGR9fTwvc3Bhbj5cbiAgICAgKiAgIDwvZGl2PlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCInaGVhZGVyVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmNvbHVtbi5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBoZWFkZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmxpbmUgZWRpdG9yIHRlbXBsYXRlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaW5saW5lRWRpdG9yVGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KCdjZWxsRWRpdG9yVGVtcGxhdGUnKVxuICAgIHB1YmxpYyBnZXQgaW5saW5lRWRpdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5saW5lRWRpdG9yVGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGlubGluZSBlZGl0b3IgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjaW5saW5lRWRpdG9yVGVtcGxhdGUgaWd4Q2VsbEVkaXRvciBsZXQtY2VsbD1cImNlbGxcIj5cbiAgICAgKiAgICAgPGlucHV0IHR5cGU9XCJzdHJpbmdcIiBbKG5nTW9kZWwpXT1cImNlbGwudmFsdWVcIi8+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidpbmxpbmVFZGl0b3JUZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIGlubGluZUVkaXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuY29sdW1uLmlubGluZUVkaXRvclRlbXBsYXRlID0gdGhpcy5pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlubGluZUVkaXRvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9pbmxpbmVFZGl0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhbGlkYXRpb24gZXJyb3IgdGVtcGxhdGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBlcnJvclRlbXBsYXRlID0gdGhpcy5jb2x1bW4uZXJyb3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KCdlcnJvclRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGVycm9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXJyb3IgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSBpZ3hDZWxsVmFsaWRhdGlvbkVycm9yIGxldC1jZWxsPVwiY2VsbFwiICNlcnJvclRlbXBsYXRlID5cbiAgICAgKiAgICAgPGRpdiAqbmdJZj1cImNlbGwudmFsaWRhdGlvbi5lcnJvcnM/LlsnZm9yYmlkZGVuTmFtZSddXCI+XG4gICAgICogICAgICBUaGlzIG5hbWUgaXMgZm9yYmlkZGVuLlxuICAgICAqICAgICA8L2Rpdj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ2Vycm9yVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBlcnJvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuY29sdW1uLmVycm9yVGVtcGxhdGUgPSB0aGlzLmVycm9yVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBlcnJvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9lcnJvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYGZpbHRlckNlbGxUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJDZWxsVGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5maWx0ZXJDZWxsVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgnZmlsdGVyQ2VsbFRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGxUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hDb2x1bW5UZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNlbGxUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcXVpY2sgZmlsdGVyIHRlbXBsYXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI2ZpbHRlckNlbGxUZW1wbGF0ZSBJZ3hGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICAgICAqICAgIDxpbnB1dCAoaW5wdXQpPVwib25JbnB1dCgpXCI+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidmaWx0ZXJDZWxsVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBmaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5jb2x1bW4uZmlsdGVyQ2VsbFRlbXBsYXRlID0gdGhpcy5maWx0ZXJDZWxsVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJDZWxsVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENvbHVtblRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyQ2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY2VsbHMgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkNlbGxzID0gdGhpcy5jb2x1bW4uY2VsbHM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IENlbGxUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGFWaWV3XG4gICAgICAgICAgICAubWFwKChyZWMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyaWQuaXNHcm91cEJ5UmVjb3JkKHJlYykgJiYgIXRoaXMuZ3JpZC5pc1N1bW1hcnlSb3cocmVjKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucGFnaW5nTW9kZSA9PT0gMSAmJiB0aGlzLmdyaWQucGFnZSAhPT0gMCA/IGluZGV4ID0gaW5kZXggKyB0aGlzLmdyaWQucGVyUGFnZSAqIHRoaXMuZ3JpZC5wYWdlIDogaW5kZXggPSB0aGlzLmdyaWQuZGF0YVJvd0xpc3QuZmlyc3QuaW5kZXggKyBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLmdyaWQgYXMgYW55LCBpbmRleCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmZpbHRlcihjZWxsID0+IGNlbGwpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IF9jZWxscygpOiBDZWxsVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yb3dMaXN0LmZpbHRlcigocm93KSA9PiByb3cgaW5zdGFuY2VvZiBJZ3hSb3dEaXJlY3RpdmUpXG4gICAgICAgICAgICAubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93Ll9jZWxscykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93Ll9jZWxscy5maWx0ZXIoKGNlbGwpID0+IGNlbGwuY29sdW1uSW5kZXggPT09IHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gdmlzaWJsZSBpbmRleC5cbiAgICAgKiBJZiB0aGUgY29sdW1uIGlzIG5vdCB2aXNpYmxlLCByZXR1cm5zIGAtMWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB2aXNpYmxlQ29sdW1uSW5kZXggPSAgdGhpcy5jb2x1bW4udmlzaWJsZUluZGV4O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fdkluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGxldCBjb2wgPSB0aGlzO1xuICAgICAgICBsZXQgdkluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgIGNvbCA9IHRoaXMuYWxsQ2hpbGRyZW4uZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXAgJiYgIWMuaGlkZGVuKVswXSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uTGF5b3V0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlblZpc2libGVJbmRleGVzLmZpbmQoeCA9PiB4LmNvbHVtbiA9PT0gdGhpcykuaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleEluQ29sbGVjdGlvbiA9IHVucGlubmVkQ29sdW1ucy5pbmRleE9mKGNvbCk7XG4gICAgICAgICAgICB2SW5kZXggPSBpbmRleEluQ29sbGVjdGlvbiA9PT0gLTEgP1xuICAgICAgICAgICAgICAgIC0xIDpcbiAgICAgICAgICAgICAgICAodGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgP1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLmxlbmd0aCArIGluZGV4SW5Db2xsZWN0aW9uIDpcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhJbkNvbGxlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhJbkNvbGxlY3Rpb24gPSBwaW5uZWRDb2x1bW5zLmluZGV4T2YoY29sKTtcbiAgICAgICAgICAgIHZJbmRleCA9IHRoaXMuZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0ID9cbiAgICAgICAgICAgICAgICBpbmRleEluQ29sbGVjdGlvbiA6XG4gICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLmxlbmd0aCArIGluZGV4SW5Db2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZJbmRleCA9IHZJbmRleDtcbiAgICAgICAgcmV0dXJuIHZJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2x1bW4gaXMgYSBgQ29sdW1uR3JvdXBgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uR3JvdXAgPSAgdGhpcy5jb2x1bW4uY29sdW1uR3JvdXA7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5Hcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2x1bW4gaXMgYSBgQ29sdW1uTGF5b3V0YCBmb3IgbXVsdGktcm93IGxheW91dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkdyb3VwID0gIHRoaXMuY29sdW1uLmNvbHVtbkdyb3VwO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uTGF5b3V0KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29sdW1uIGlzIGEgY2hpbGQgb2YgYSBgQ29sdW1uTGF5b3V0YCBmb3IgbXVsdGktcm93IGxheW91dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkxheW91dENoaWxkID0gIHRoaXMuY29sdW1uLmNvbHVtbkxheW91dENoaWxkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uTGF5b3V0Q2hpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5jb2x1bW5MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXQgYWxsQ2hpbGRyZW4oKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxldmVsIG9mIHRoZSBjb2x1bW4gaW4gYSBjb2x1bW4gZ3JvdXAuXG4gICAgICogUmV0dXJucyBgMGAgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IGhhdmUgYSBgcGFyZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkxldmVsID0gIHRoaXMuY29sdW1uLmxldmVsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIGxldCBwdHIgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgbGV0IGx2bCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHB0cikge1xuICAgICAgICAgICAgbHZsKys7XG4gICAgICAgICAgICBwdHIgPSBwdHIucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdmw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGlubmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgJiZcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zW3RoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmxlbmd0aCAtIDFdID09PSB0aGlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgZ2V0IGlzRmlyc3RQaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHMgPSB0aGlzLmdyaWQucGlubmVkQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIHJldHVybiAhdGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgJiYgcGlubmVkQ29sc1swXSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGdldCByaWdodFBpbm5lZE9mZnNldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWQgJiYgIXRoaXMuZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0ID9cbiAgICAgICAgICAgIC0gdGhpcy5ncmlkLnBpbm5lZFdpZHRoIC0gdGhpcy5ncmlkLmhlYWRlckZlYXR1cmVzV2lkdGggKyAncHgnIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncmlkUm93U3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFbmQgJiYgdGhpcy5yb3dTdGFydCA/IHRoaXMucm93RW5kIC0gdGhpcy5yb3dTdGFydCA6IDE7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZ3JpZENvbHVtblNwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sRW5kICYmIHRoaXMuY29sU3RhcnQgPyB0aGlzLmNvbEVuZCAtIHRoaXMuY29sU3RhcnQgOiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gd2lsbCBiZSB2aXNpYmxlIHdoZW4gaXRzIHBhcmVudCBpcyBjb2xsYXBzZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqICAgPGlneC1jb2x1bW4gW3Zpc2libGVXaGVuQ29sbGFwc2VkXT1cInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogPC9pZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHZpc2libGVXaGVuQ29sbGFwc2VkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX3Zpc2libGVXaGVuQ29sbGFwc2VkID0gdmFsdWU7XG4gICAgICAgIHRoaXMudmlzaWJsZVdoZW5Db2xsYXBzZWRDaGFuZ2UuZW1pdCh0aGlzLl92aXNpYmxlV2hlbkNvbGxhcHNlZCk7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnQuc2V0RXhwYW5kQ29sbGFwc2VTdGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldCB2aXNpYmxlV2hlbkNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2libGVXaGVuQ29sbGFwc2VkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogUGFzcyBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBEYXRlUGlwZSBhbmQvb3IgRGVjaW1hbFBpcGUgdG8gZm9ybWF0IHRoZSBkaXNwbGF5IHZhbHVlIGZvciBkYXRlIGFuZCBudW1lcmljIGNvbHVtbnMuXG4gICAgICogQWNjZXB0cyBhbiBgSUNvbHVtblBpcGVBcmdzYCBvYmplY3Qgd2l0aCBhbnkgb2YgdGhlIGBmb3JtYXRgLCBgdGltZXpvbmVgIGFuZCBgZGlnaXRzSW5mb2AgcHJvcGVydGllcy5cbiAgICAgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2NvbW1vbi9EYXRlUGlwZSBhbmQgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vRGVjaW1hbFBpcGVcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBwaXBlQXJnczogSUNvbHVtblBpcGVBcmdzID0ge1xuICAgICAqICAgICAgZm9ybWF0OiAnbG9uZ0RhdGUnLFxuICAgICAqICAgICAgdGltZXpvbmU6ICdVVEMnLFxuICAgICAqICAgICAgZGlnaXRzSW5mbzogJzEuMS0yJ1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gZGF0YVR5cGU9XCJkYXRlXCIgW3BpcGVBcmdzXT1cInBpcGVBcmdzXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIDxpZ3gtY29sdW1uIGRhdGFUeXBlPVwibnVtYmVyXCIgW3BpcGVBcmdzXT1cInBpcGVBcmdzXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IHBpcGVBcmdzKHZhbHVlOiBJQ29sdW1uUGlwZUFyZ3MpIHtcbiAgICAgICAgdGhpcy5fY29sdW1uUGlwZUFyZ3MgPSBPYmplY3QuYXNzaWduKHRoaXMuX2NvbHVtblBpcGVBcmdzLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMuZ3JpZC5zdW1tYXJ5U2VydmljZS5jbGVhclN1bW1hcnlDYWNoZSgpO1xuICAgICAgICB0aGlzLmdyaWQucGlwZVRyaWdnZXIrKztcbiAgICB9XG4gICAgcHVibGljIGdldCBwaXBlQXJncygpOiBJQ29sdW1uUGlwZUFyZ3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uUGlwZUFyZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sbGFwc2libGUoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBjb2xsYXBzaWJsZShfdmFsdWU6IGJvb2xlYW4pIHsgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZXhwYW5kZWQoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGV4cGFuZGVkKF92YWx1ZTogYm9vbGVhbikgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRlZmF1bHRXaWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB3aWR0aFNldEJ5VXNlcjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzTmVzdGVkUGF0aDogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVmYXVsdFRpbWVGb3JtYXQgPSAnaGg6bW06c3MgdHQnO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBkZWZhdWx0RGF0ZVRpbWVGb3JtYXQgPSAnZGQvTU0veXl5eSBISDptbTpzcyB0dCc7XG5cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSBvZiB0aGUgY29sdW1uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdHJlZSA9ICB0aGlzLmNvbHVtbi5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUoKTogRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5maWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUuZmluZCh0aGlzLmZpZWxkKSBhcyBGaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgcGFyZW50IGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHBhcmVudENvbHVtbiA9IHRoaXMuY29sdW1uLnBhcmVudDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4ucGFyZW50ID0gaGlnaGVyTGV2ZWxDb2x1bW47XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHBhcmVudCA9IG51bGw7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBjaGlsZHJlbiBjb2x1bW5zLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uQ2hpbGRyZW4gPSB0aGlzLmNvbHVtbi5jaGlsZHJlbjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4uY2hpbGRyZW4gPSBjaGlsZHJlbkNvbHVtbnM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50PjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfYXBwbHlTZWxlY3RhYmxlQ2xhc3MgPSBmYWxzZTtcblxuICAgIHByb3RlY3RlZCBfdkluZGV4ID0gTmFOO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Bpbm5lZCA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2JvZHlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZXJyb3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGVhZGVyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENvbHVtblRlbXBsYXRlQ29udGV4dD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc3VtbWFyeVRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hTdW1tYXJ5VGVtcGxhdGVDb250ZXh0PjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9pbmxpbmVFZGl0b3JUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZmlsdGVyQ2VsbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDb2x1bW5UZW1wbGF0ZUNvbnRleHQ+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3N1bW1hcmllcyA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZmlsdGVycyA9IG51bGw7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfc29ydFN0cmF0ZWd5OiBJU29ydGluZ1N0cmF0ZWd5ID0gRGVmYXVsdFNvcnRpbmdTdHJhdGVneS5pbnN0YW5jZSgpO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dyb3VwaW5nQ29tcGFyZXI6IChhOiBhbnksIGI6IGFueSwgY3VyclJlYz86IGFueSwgZ3JvdXBSZWM/OiBhbnkpID0+IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oaWRkZW4gPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9pbmRleDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Rpc2FibGVQaW5uaW5nID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfd2lkdGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0TWluV2lkdGggPSAnJztcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9oYXNTdW1tYXJ5ID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZWRpdGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZ3JvdXBhYmxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3Zpc2libGVXaGVuQ29sbGFwc2VkO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2NvbGxhcHNpYmxlID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZXhwYW5kZWQgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NlbGVjdGFibGUgPSB0cnVlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0IGlzUHJpbWFyeUNvbHVtbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmllbGQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmdyaWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmZpZWxkID09PSB0aGlzLmdyaWQucHJpbWFyeUtleTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9maWVsZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX2NhbGNXaWR0aCA9IG51bGw7XG4gICAgcHJpdmF0ZSBfY29sdW1uUGlwZUFyZ3M6IElDb2x1bW5QaXBlQXJncyA9IHsgZGlnaXRzSW5mbzogREVGQVVMVF9ESUdJVFNfSU5GTyB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0dSSURfQkFTRSkgcHVibGljIGdyaWQ6IEdyaWRUeXBlLFxuICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfVkFMSURBVE9SUykgcHJpdmF0ZSBfdmFsaWRhdG9yczogVmFsaWRhdG9yW10sXG4gICAgICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICAgICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByb3RlY3RlZCBwbGF0Zm9ybTogUGxhdGZvcm1VdGlsLFxuICAgICkge1xuICAgICAgICB0aGlzLnZhbGlkYXRvcnMgID0gX3ZhbGlkYXRvcnM7XG4gICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzZXRDYWNoZXMoKSB7XG4gICAgICAgIHRoaXMuX3ZJbmRleCA9IE5hTjtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5jYWNoZUNhbGNXaWR0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1bW1hcnlUZW1wbGF0ZSA9IHRoaXMuc3VtbWFyeVRlbXBsYXRlRGlyZWN0aXZlLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmNlbGxUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fYm9keVRlbXBsYXRlID0gdGhpcy5jZWxsVGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2VsbFZhbGlkYXRpb25FcnJvclRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9lcnJvclRlbXBsYXRlID0gdGhpcy5jZWxsVmFsaWRhdGlvbkVycm9yVGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaGVhZFRlbXBsYXRlICYmIHRoaXMuaGVhZFRlbXBsYXRlLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZGVyVGVtcGxhdGUgPSB0aGlzLmhlYWRUZW1wbGF0ZS50b0FycmF5KClbMF0udGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWRpdG9yVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2lubGluZUVkaXRvclRlbXBsYXRlID0gdGhpcy5lZGl0b3JUZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5maWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpbHRlckNlbGxUZW1wbGF0ZSA9IHRoaXMuZmlsdGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fY29sdW1uUGlwZUFyZ3MuZm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLl9jb2x1bW5QaXBlQXJncy5mb3JtYXQgPSB0aGlzLmRhdGFUeXBlID09PSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZSA/XG4gICAgICAgICAgICAgICAgREVGQVVMVF9USU1FX0ZPUk1BVCA6IHRoaXMuZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZSA/XG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfREFURV9USU1FX0ZPUk1BVCA6IERFRkFVTFRfREFURV9GT1JNQVQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnN1bW1hcmllcykge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzID0gSWd4TnVtYmVyU3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkRhdGU6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzID0gSWd4RGF0ZVN1bW1hcnlPcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcmllcyA9IElneFRpbWVTdW1tYXJ5T3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcmllcyA9IElneFN1bW1hcnlPcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZmlsdGVycykge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmRhdGFUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gSWd4Qm9vbGVhbkZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuTnVtYmVyOlxuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkN1cnJlbmN5OlxuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlBlcmNlbnQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IElneE51bWJlckZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuVGltZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gSWd4VGltZUZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IElneERhdGVUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5JbWFnZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBJZ3hTdHJpbmdGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRHcmlkVGVtcGxhdGUoaXNSb3c6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgICAgICBpZiAoaXNSb3cpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3NDb3VudCA9ICF0aGlzLmdyaWQuaXNQaXZvdCA/IHRoaXMuZ3JpZC5tdWx0aVJvd0xheW91dFJvd1NpemUgOiB0aGlzLmNoaWxkcmVuLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICByZXR1cm4gYHJlcGVhdCgke3Jvd3NDb3VudH0sMWZyKWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb2x1bW5TaXplc1N0cmluZyh0aGlzLmNoaWxkcmVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgZ2V0SW5pdGlhbENoaWxkQ29sdW1uU2l6ZXMoY2hpbGRyZW46IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KTogQXJyYXk8TVJMQ29sdW1uU2l6ZUluZm8+IHtcbiAgICAgICAgY29uc3QgY29sdW1uU2l6ZXM6IE1STENvbHVtblNpemVJbmZvW10gPSBbXTtcbiAgICAgICAgLy8gZmluZCB0aGUgc21hbGxlc3QgY29sIHNwYW5zXG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goY29sID0+IHtcbiAgICAgICAgICAgIGlmICghY29sLmNvbFN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmV3V2lkdGhTZXQgPSBjb2wud2lkdGhTZXRCeVVzZXIgJiYgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0gJiYgIWNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdLndpZHRoU2V0QnlVc2VyO1xuICAgICAgICAgICAgY29uc3QgbmV3U3BhblNtYWxsZXIgPSBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXSAmJiBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS5jb2xTcGFuID4gY29sLmdyaWRDb2x1bW5TcGFuO1xuICAgICAgICAgICAgY29uc3QgYm90aFdpZHRoc1NldCA9IGNvbC53aWR0aFNldEJ5VXNlciAmJiBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXSAmJiBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS53aWR0aFNldEJ5VXNlcjtcbiAgICAgICAgICAgIGNvbnN0IGJvdGhXaWR0aHNOb3RTZXQgPSAhY29sLndpZHRoU2V0QnlVc2VyICYmIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdICYmICFjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS53aWR0aFNldEJ5VXNlcjtcblxuICAgICAgICAgICAgaWYgKGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBub3RoaW5nIGlzIGRlZmluZWQgeWV0IHRha2UgYW55IGNvbHVtbiBhdCBmaXJzdFxuICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBjb2xFbmQgdG8ga25vdyB3aGVyZSB0aGUgY29sdW1uIGFjdHVhbGx5IGVuZHMsIGJlY2F1c2Ugbm90IGFsd2F5cyBpdCBzdGFydHMgd2hlcmUgd2UgaGF2ZSBpdCBzZXQgaW4gY29sdW1uU2l6ZXMuXG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZjogY29sLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sLndpZHRoID09PSAnZml0LWNvbnRlbnQnID8gY29sLmF1dG9TaXplIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC53aWR0aFNldEJ5VXNlciB8fCB0aGlzLmdyaWQuY29sdW1uV2lkdGhTZXRCeVVzZXIgPyBwYXJzZUludChjb2wuY2FsY1dpZHRoLCAxMCkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiBjb2wuZ3JpZENvbHVtblNwYW4sXG4gICAgICAgICAgICAgICAgICAgIGNvbEVuZDogY29sLmNvbFN0YXJ0ICsgY29sLmdyaWRDb2x1bW5TcGFuLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aFNldEJ5VXNlcjogY29sLndpZHRoU2V0QnlVc2VyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3V2lkdGhTZXQgfHwgKG5ld1NwYW5TbWFsbGVyICYmICgoYm90aFdpZHRoc1NldCkgfHwgKGJvdGhXaWR0aHNOb3RTZXQpKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBhIGNvbHVtbiBpcyBzZXQgYWxyZWFkeSBpdCBzaG91bGQgZWl0aGVyIG5vdCBoYXZlIHdpZHRoIGRlZmluZWQgb3IgaGF2ZSB3aWR0aCB3aXRoIGJpZ2dlciBzcGFuIHRoYW4gdGhlIG5ldyBvbmUuXG5cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgSWYgcmVwbGFjZWQgY29sdW1uIGhhcyBiaWdnZXIgc3Bhbiwgd2Ugd2FudCB0byBmaWxsIHRoZSByZW1haW5pbmcgY29sdW1uc1xuICAgICAgICAgICAgICAgICAqICB0aGF0IHRoZSByZXBsYWNpbmcgY29sdW1uIGRvZXMgbm90IGZpbGwgd2l0aCB0aGUgb2xkIG9uZS5cbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAoYm90aFdpZHRoc1NldCAmJiBuZXdTcGFuU21hbGxlcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBmcm9tIHdoZXJlIHRoZSBuZXcgY29sdW1uIHNldCB3b3VsZCBlbmQgYW5kIGFwcGx5IHRoZSBvbGQgY29sdW1uIHRvIHRoZSByZXN0IGRlcGVuZGluZyBvbiBob3cgbXVjaCBpdCBzcGFucy5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBub3QgeWV0IHJlcGxhY2VkIGl0IHNvIHdlIGNhbiB1c2UgaXQgZGlyZWN0bHkgZnJvbSB0aGUgY29sdW1uU2l6ZXMgY29sbGVjdGlvbi5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB3aGVyZSBjb2xFbmQgaXMgdXNlZCBiZWNhdXNlIHRoZSBjb2xTdGFydCBvZiB0aGUgb2xkIGNvbHVtbiBpcyBub3QgYWN0dWFsbHkgaSArIDEuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBjb2wuY29sU3RhcnQgLSAxICsgY29sLmdyaWRDb2x1bW5TcGFuOyBpIDwgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0uY29sRW5kIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbHVtblNpemVzW2ldIHx8ICFjb2x1bW5TaXplc1tpXS53aWR0aFNldEJ5VXNlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldID0gY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUmVwbGFjZSB0aGUgb2xkIGNvbHVtbiB3aXRoIHRoZSBuZXcgb25lLlxuICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdID0ge1xuICAgICAgICAgICAgICAgICAgICByZWY6IGNvbCxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGNvbC53aWR0aCA9PT0gJ2ZpdC1jb250ZW50JyA/IGNvbC5hdXRvU2l6ZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2wud2lkdGhTZXRCeVVzZXIgfHwgdGhpcy5ncmlkLmNvbHVtbldpZHRoU2V0QnlVc2VyID8gcGFyc2VJbnQoY29sLmNhbGNXaWR0aCwgMTApIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogY29sLmdyaWRDb2x1bW5TcGFuLFxuICAgICAgICAgICAgICAgICAgICBjb2xFbmQ6IGNvbC5jb2xTdGFydCArIGNvbC5ncmlkQ29sdW1uU3BhbixcbiAgICAgICAgICAgICAgICAgICAgd2lkdGhTZXRCeVVzZXI6IGNvbC53aWR0aFNldEJ5VXNlclxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJvdGhXaWR0aHNTZXQgJiYgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0uY29sU3BhbiA8IGNvbC5ncmlkQ29sdW1uU3Bhbikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb2x1bW4gYWxyZWFkeSBpbiB0aGUgY29sdW1uU2l6ZXMgaGFzIHNtYWxsZXIgc3Bhbiwgd2Ugc3RpbGwgbmVlZCB0byBmaWxsIGFueSBlbXB0eSBwbGFjZXMgd2l0aCB0aGUgY3VycmVudCBjb2wuXG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgZnJvbSB3aGVyZSB0aGUgc21hbGxlciBjb2x1bW4gc2V0IHdvdWxkIGVuZCBhbmQgYXBwbHkgdGhlIGJpZ2dlciBjb2x1bW4gdG8gdGhlIHJlc3QgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIGl0IHNwYW5zLlxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIGhlcmUgd2UgZG8gbm90IGhhdmUgaXQgaW4gY29sdW1uU2l6ZXMgd2Ugc2V0IGl0IGFzIGEgbmV3IGNvbHVtbiBrZWVwaW5nIHRoZSBzYW1lIGNvbFNwYW4uXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbC5jb2xTdGFydCAtIDEgKyBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS5jb2xTcGFuOyBpIDwgY29sLmNvbFN0YXJ0IC0gMSArIGNvbC5ncmlkQ29sdW1uU3BhbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uU2l6ZXNbaV0gfHwgIWNvbHVtblNpemVzW2ldLndpZHRoU2V0QnlVc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TaXplc1tpXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IGNvbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sLndpZHRoID09PSAnZml0LWNvbnRlbnQnID8gY29sLmF1dG9TaXplIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLndpZHRoU2V0QnlVc2VyIHx8IHRoaXMuZ3JpZC5jb2x1bW5XaWR0aFNldEJ5VXNlciA/IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogY29sLmdyaWRDb2x1bW5TcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEVuZDogY29sLmNvbFN0YXJ0ICsgY29sLmdyaWRDb2x1bW5TcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoU2V0QnlVc2VyOiBjb2wud2lkdGhTZXRCeVVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRmxhdHRlbiBjb2x1bW5TaXplcyBzbyB0aGVyZSBhcmUgbm90IGNvbHVtbnMgd2l0aCBjb2xTcGFuID4gMVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHVtblNpemVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uU2l6ZXNbaV0gJiYgY29sdW1uU2l6ZXNbaV0uY29sU3BhbiA+IDEpIHtcbiAgICAgICAgICAgICAgICBsZXQgaiA9IDE7XG5cbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGFsbCBlbXB0eSBwbGFjZXMgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHRoZSBjdXJyZW50IGNvbHVtbiBzcGFucyBzdGFydGluZyBmcm9tIG5leHQgY29sLlxuICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgY29sdW1uU2l6ZXNbaV0uY29sU3BhbiAmJiBpICsgaiArIDEgPCBjb2x1bW5TaXplc1tpXS5jb2xFbmQ7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uU2l6ZXNbaSArIGpdICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAoKCFjb2x1bW5TaXplc1tpXS53aWR0aCAmJiBjb2x1bW5TaXplc1tpICsgal0ud2lkdGgpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFjb2x1bW5TaXplc1tpXS53aWR0aCAmJiAhY29sdW1uU2l6ZXNbaSArIGpdLndpZHRoICYmIGNvbHVtblNpemVzW2kgKyBqXS5jb2xTcGFuIDw9IGNvbHVtblNpemVzW2ldLmNvbFNwYW4pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEhY29sdW1uU2l6ZXNbaSArIGpdLndpZHRoICYmIGNvbHVtblNpemVzW2kgKyBqXS5jb2xTcGFuIDw9IGNvbHVtblNpemVzW2ldLmNvbFNwYW4pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2ggYW4gYWxyZWFkeSBkZWZpbmVkIGNvbHVtbiB0aGF0IGhhcyB3aWR0aCBhbmQgdGhlIGN1cnJlbnQgZG9lc24ndCBoYXZlIG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcmVhY2hlZCBjb2x1bW4gaGFzIGJpZ2dlciBjb2xTcGFuIHdlIHN0b3AuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY29sdW1uU2l6ZXNbaV0ud2lkdGhTZXRCeVVzZXIgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldLndpZHRoIC8gY29sdW1uU2l6ZXNbaV0uY29sU3BhbiA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0ud2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TaXplc1tpICsgal0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiBjb2x1bW5TaXplc1tpXS5yZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sU3BhbjogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xFbmQ6IGNvbHVtblNpemVzW2ldLmNvbEVuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aFNldEJ5VXNlcjogY29sdW1uU2l6ZXNbaV0ud2lkdGhTZXRCeVVzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGN1cnJlbnQgY29sdW1uIHdpZHRoIHNvIGl0IGlzIGRpdmlkZWQgYmV0d2VlbiBhbGwgY29sdW1ucyBpdCBzcGFucyBhbmQgc2V0IGl0IHRvIDEuXG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0ud2lkdGggPSBjb2x1bW5TaXplc1tpXS53aWR0aFNldEJ5VXNlciA/XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldLndpZHRoIC8gY29sdW1uU2l6ZXNbaV0uY29sU3BhbiA6XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldLndpZHRoO1xuICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldLmNvbFNwYW4gPSAxO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbmRleCBiYXNlZCBvbiBob3cgbXVjaCB3ZSBoYXZlIHJlcGxhY2VkLiBTdWJ0cmFjdCAxIGJlY2F1c2Ugd2Ugc3RhcnRlZCBmcm9tIDEuXG4gICAgICAgICAgICAgICAgaSArPSBqIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb2x1bW5TaXplcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGdldEZpbGxlZENoaWxkQ29sdW1uU2l6ZXMoY2hpbGRyZW46IFF1ZXJ5TGlzdDxJZ3hDb2x1bW5Db21wb25lbnQ+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGNvbHVtblNpemVzID0gdGhpcy5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhjaGlsZHJlbik7XG5cbiAgICAgICAgLy8gZmlsbCB0aGUgZ2FwcyBpZiB0aGVyZSBhcmUgYW55XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBzaXplIG9mIGNvbHVtblNpemVzKSB7XG4gICAgICAgICAgICBpZiAoc2l6ZSAmJiAhIXNpemUud2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzaXplLndpZHRoICsgJ3B4Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlSW50KHRoaXMuZ3JpZC5nZXRQb3NzaWJsZUNvbHVtbldpZHRoKCksIDEwKSArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXRSZXNpemFibGVDb2xVbmRlckVuZCgpOiBNUkxSZXNpemVDb2x1bW5JbmZvW10ge1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5MYXlvdXQgfHwgIXRoaXMuY29sdW1uTGF5b3V0Q2hpbGQgfHwgdGhpcy5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgcmV0dXJuIFt7IHRhcmdldDogdGhpcywgc3BhblVzZWQ6IDEgfV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW5TaXplZCA9IHRoaXMuZ2V0SW5pdGlhbENoaWxkQ29sdW1uU2l6ZXModGhpcy5wYXJlbnQuY2hpbGRyZW4pO1xuICAgICAgICBjb25zdCB0YXJnZXRzOiBNUkxSZXNpemVDb2x1bW5JbmZvW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29sRW5kID0gdGhpcy5jb2xFbmQgPyB0aGlzLmNvbEVuZCA6IHRoaXMuY29sU3RhcnQgKyAxO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uU2l6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbFN0YXJ0IDw9IGkgKyAxICYmIGkgKyAxIDwgY29sRW5kKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHsgdGFyZ2V0OiBjb2x1bW5TaXplZFtpXS5yZWYsIHNwYW5Vc2VkOiAxIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0c1NxdWFzaGVkOiBNUkxSZXNpemVDb2x1bW5JbmZvW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgICAgICAgaWYgKHRhcmdldHNTcXVhc2hlZC5sZW5ndGggJiYgdGFyZ2V0c1NxdWFzaGVkW3RhcmdldHNTcXVhc2hlZC5sZW5ndGggLSAxXS50YXJnZXQuZmllbGQgPT09IHRhcmdldC50YXJnZXQuZmllbGQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzU3F1YXNoZWRbdGFyZ2V0c1NxdWFzaGVkLmxlbmd0aCAtIDFdLnNwYW5Vc2VkKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldHNTcXVhc2hlZC5wdXNoKHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0c1NxdWFzaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBpbnMgdGhlIGNvbHVtbiBhdCB0aGUgcHJvdmlkZWQgaW5kZXggaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqIERlZmF1bHRzIHRvIGluZGV4IGAwYCBpZiBub3QgcHJvdmlkZWQsIG9yIHRvIHRoZSBpbml0aWFsIGluZGV4IGluIHRoZSBwaW5uZWQgYXJlYS5cbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29sdW1uIGlzIHN1Y2Nlc3NmdWxseSBwaW5uZWQuIFJldHVybnMgYGZhbHNlYCBpZiB0aGUgY29sdW1uIGNhbm5vdCBiZSBwaW5uZWQuXG4gICAgICogQ29sdW1uIGNhbm5vdCBiZSBwaW5uZWQgaWY6XG4gICAgICogLSBJcyBhbHJlYWR5IHBpbm5lZFxuICAgICAqIC0gaW5kZXggYXJndW1lbnQgaXMgb3V0IG9mIHJhbmdlXG4gICAgICogLSBUaGUgcGlubmVkIGFyZWEgZXhjZWVkcyA4MCUgb2YgdGhlIGdyaWQgd2lkdGhcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN1Y2Nlc3MgPSB0aGlzLmNvbHVtbi5waW4oKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcGluKGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIFRPRE86IFByb2JhYmx5IHNob3VsZCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG9sZCBmdW5jdGlvbnNcbiAgICAgICAgLy8gc2hvdWxkIGJlIG1vdmVkIGFzIGEgZXZlbnQgcGFyYW1ldGVyLlxuICAgICAgICBjb25zdCBncmlkID0gKHRoaXMuZ3JpZCBhcyBhbnkpO1xuICAgICAgICBpZiAodGhpcy5fcGlubmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wTGV2ZWxQYXJlbnQucGluKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc0luZGV4ID0gaW5kZXggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGhhc0luZGV4ICYmIChpbmRleCA8IDAgfHwgaW5kZXggPiBncmlkLnBpbm5lZENvbHVtbnMubGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnBhcmVudCAmJiAhdGhpcy5waW5uYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9vdFBpbm5lZENvbHMgPSBncmlkLl9waW5uZWRDb2x1bW5zLmZpbHRlcigoYykgPT4gYy5sZXZlbCA9PT0gMCk7XG4gICAgICAgIGluZGV4ID0gaGFzSW5kZXggPyBpbmRleCA6IHJvb3RQaW5uZWRDb2xzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgYXJnczogSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzID0geyBjb2x1bW46IHRoaXMsIGluc2VydEF0SW5kZXg6IGluZGV4LCBpc1Bpbm5lZDogZmFsc2UsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblBpbi5lbWl0KGFyZ3MpO1xuXG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZCA9IHRydWU7XG4gICAgICAgIHRoaXMucGlubmVkQ2hhbmdlLmVtaXQodGhpcy5fcGlubmVkKTtcbiAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBpbmRleCBpcyB0aGUgbGFzdCBwb3NpdGlvbiwgc28gd2lsbCBuZWVkIHRvIGZpbmQgdGFyZ2V0IGNvbHVtbiBieSBbaW5kZXgtMV1cbiAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYXJncy5pbnNlcnRBdEluZGV4ID09PSBncmlkLl9waW5uZWRDb2x1bW5zLmxlbmd0aCA/XG4gICAgICAgICAgICBncmlkLl9waW5uZWRDb2x1bW5zW2FyZ3MuaW5zZXJ0QXRJbmRleCAtIDFdIDogZ3JpZC5fcGlubmVkQ29sdW1uc1thcmdzLmluc2VydEF0SW5kZXhdO1xuXG4gICAgICAgIGlmIChncmlkLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGhpcykgPT09IC0xKSB7XG4gICAgICAgICAgICBpZiAoIWdyaWQuaGFzQ29sdW1uR3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5fcGlubmVkQ29sdW1ucy5zcGxpY2UoYXJncy5pbnNlcnRBdEluZGV4LCAwLCB0aGlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGJhc2VkIG9ubHkgb24gcm9vdCBjb2xsZWN0aW9uXG4gICAgICAgICAgICAgICAgcm9vdFBpbm5lZENvbHMuc3BsaWNlKGFyZ3MuaW5zZXJ0QXRJbmRleCwgMCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgbGV0IGFsbFBpbm5lZCA9IFtdO1xuICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICByb290UGlubmVkQ29scy5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWxsUGlubmVkLnB1c2goZ3JvdXApO1xuICAgICAgICAgICAgICAgICAgICBhbGxQaW5uZWQgPSBhbGxQaW5uZWQuY29uY2F0KGdyb3VwLmFsbENoaWxkcmVuKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBncmlkLl9waW5uZWRDb2x1bW5zID0gYWxsUGlubmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZ3JpZC5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YodGhpcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Db3VudCA9IHRoaXMuYWxsQ2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGdyaWQuX3VucGlubmVkQ29sdW1ucy5zcGxpY2UoZ3JpZC5fdW5waW5uZWRDb2x1bW5zLmluZGV4T2YodGhpcyksIDEgKyBjaGlsZHJlbkNvdW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNJbmRleCkge1xuICAgICAgICAgICAgaW5kZXggPT09IGdyaWQuX3Bpbm5lZENvbHVtbnMubGVuZ3RoIC0gMSA/IFxuICAgICAgICAgICAgZ3JpZC5fbW92ZUNvbHVtbnModGhpcywgdGFyZ2V0Q29sdW1uLCBEcm9wUG9zaXRpb24uQWZ0ZXJEcm9wVGFyZ2V0KSA6IGdyaWQuX21vdmVDb2x1bW5zKHRoaXMsIHRhcmdldENvbHVtbiwgRHJvcFBvc2l0aW9uLkJlZm9yZURyb3BUYXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMuYWxsQ2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBjaGlsZC5waW4oKSk7XG4gICAgICAgICAgICBncmlkLnJlaW5pdFBpblN0YXRlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5yZXNldENhY2hlcygpO1xuICAgICAgICBncmlkLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uTGF5b3V0Q2hpbGQpIHtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5zLmZpbHRlcih4ID0+IHguY29sdW1uTGF5b3V0KS5mb3JFYWNoKHggPT4geC5wb3B1bGF0ZVZpc2libGVJbmRleGVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZ3JpZC5maWx0ZXJpbmdTZXJ2aWNlLnJlZnJlc2hFeHByZXNzaW9ucygpO1xuICAgICAgICBjb25zdCBldmVudEFyZ3M6IElQaW5Db2x1bW5FdmVudEFyZ3MgPSB7IGNvbHVtbjogdGhpcywgaW5zZXJ0QXRJbmRleDogaW5kZXgsIGlzUGlubmVkOiB0cnVlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5QaW5uZWQuZW1pdChldmVudEFyZ3MpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVW5waW5zIHRoZSBjb2x1bW4gYW5kIHBsYWNlIGl0IGF0IHRoZSBwcm92aWRlZCBpbmRleCBpbiB0aGUgdW5waW5uZWQgYXJlYS5cbiAgICAgKiBEZWZhdWx0cyB0byBpbmRleCBgMGAgaWYgbm90IHByb3ZpZGVkLCBvciB0byB0aGUgaW5pdGlhbCBpbmRleCBpbiB0aGUgdW5waW5uZWQgYXJlYS5cbiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgY29sdW1uIGlzIHN1Y2Nlc3NmdWxseSB1bnBpbm5lZC4gUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBjb2x1bW4gY2Fubm90IGJlIHVucGlubmVkLlxuICAgICAqIENvbHVtbiBjYW5ub3QgYmUgdW5waW5uZWQgaWY6XG4gICAgICogLSBJcyBhbHJlYWR5IHVucGlubmVkXG4gICAgICogLSBpbmRleCBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2VcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHN1Y2Nlc3MgPSB0aGlzLmNvbHVtbi51bnBpbigpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyB1bnBpbihpbmRleD86IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBncmlkID0gKHRoaXMuZ3JpZCBhcyBhbnkpO1xuICAgICAgICBpZiAoIXRoaXMuX3Bpbm5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnBpbm5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9wTGV2ZWxQYXJlbnQudW5waW4oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhc0luZGV4ID0gaW5kZXggIT09IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGhhc0luZGV4ICYmIChpbmRleCA8IDAgfHwgaW5kZXggPiBncmlkLl91bnBpbm5lZENvbHVtbnMubGVuZ3RoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXN0aW1hdGUgdGhlIGV4YWN0IGluZGV4IGF0IHdoaWNoIGNvbHVtbiB3aWxsIGJlIGluc2VydGVkXG4gICAgICAgIC8vIHRha2VzIGludG8gYWNjb3VudCBpbml0aWFsIHVucGlubmVkIGluZGV4IG9mIHRoZSBjb2x1bW5cbiAgICAgICAgaWYgKCFoYXNJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgaW5kaWNlcyA9IGdyaWQudW5waW5uZWRDb2x1bW5zLm1hcChjb2wgPT4gY29sLmluZGV4KTtcbiAgICAgICAgICAgIGluZGljZXMucHVzaCh0aGlzLmluZGV4KTtcbiAgICAgICAgICAgIGluZGljZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICAgICAgaW5kZXggPSBpbmRpY2VzLmluZGV4T2YodGhpcy5pbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmdzOiBJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3MgPSB7IGNvbHVtbjogdGhpcywgaW5zZXJ0QXRJbmRleDogaW5kZXgsIGlzUGlubmVkOiB0cnVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5QaW4uZW1pdChhcmdzKTtcblxuICAgICAgICBpZiAoYXJncy5jYW5jZWwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9waW5uZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5waW5uZWRDaGFuZ2UuZW1pdCh0aGlzLl9waW5uZWQpO1xuXG4gICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIHRoYXQgaW5kZXggaXMgdGhlIGxhc3QgcG9zaXRpb24sIHNvIHdpbGwgbmVlZCB0byBmaW5kIHRhcmdldCBjb2x1bW4gYnkgW2luZGV4LTFdXG4gICAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IGFyZ3MuaW5zZXJ0QXRJbmRleCA9PT0gZ3JpZC5fdW5waW5uZWRDb2x1bW5zLmxlbmd0aCA/XG4gICAgICAgICAgICBncmlkLl91bnBpbm5lZENvbHVtbnNbYXJncy5pbnNlcnRBdEluZGV4IC0gMV0gOiBncmlkLl91bnBpbm5lZENvbHVtbnNbYXJncy5pbnNlcnRBdEluZGV4XTtcblxuICAgICAgICBpZiAoIWhhc0luZGV4KSB7XG4gICAgICAgICAgICBncmlkLl91bnBpbm5lZENvbHVtbnMuc3BsaWNlKGluZGV4LCAwLCB0aGlzKTtcbiAgICAgICAgICAgIGlmIChncmlkLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGhpcykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgZ3JpZC5fcGlubmVkQ29sdW1ucy5zcGxpY2UoZ3JpZC5fcGlubmVkQ29sdW1ucy5pbmRleE9mKHRoaXMpLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNJbmRleCkge1xuICAgICAgICAgICAgZ3JpZC5tb3ZlQ29sdW1uKHRoaXMsIHRhcmdldENvbHVtbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5hbGxDaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnVucGluKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3JpZC5yZWluaXRQaW5TdGF0ZXMoKTtcbiAgICAgICAgZ3JpZC5yZXNldENhY2hlcygpO1xuXG4gICAgICAgIGdyaWQubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5MYXlvdXRDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG5cbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblBpbm5lZC5lbWl0KHsgY29sdW1uOiB0aGlzLCBpbnNlcnRBdEluZGV4OiBpbmRleCwgaXNQaW5uZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgY29sdW1uIHRvIHRoZSBzcGVjaWZpZWQgdmlzaWJsZSBpbmRleC5cbiAgICAgKiBJZiBwYXNzZWQgaW5kZXggaXMgaW52YWxpZCwgb3IgaWYgY29sdW1uIHdvdWxkIHJlY2VpdmUgYSBkaWZmZXJlbnQgdmlzaWJsZSBpbmRleCBhZnRlciBtb3ZpbmcsIG1vdmluZyBpcyBub3QgcGVyZm9ybWVkLlxuICAgICAqIElmIHBhc3NlZCBpbmRleCB3b3VsZCBtb3ZlIHRoZSBjb2x1bW4gdG8gYSBkaWZmZXJlbnQgY29sdW1uIGdyb3VwLiBtb3ZpbmcgaXMgbm90IHBlcmZvcm1lZC5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbHVtbi5tb3ZlKGluZGV4KTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIG1vdmUoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBsZXQgdGFyZ2V0O1xuICAgICAgICBsZXQgY29sdW1ucyA9IHRoaXMuZ3JpZC5jb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZUluZGV4ID4gLTEpO1xuICAgICAgICAvLyBncmlkIGxhc3QgdmlzaWJsZSBpbmRleFxuICAgICAgICBjb25zdCBsaSA9IGNvbHVtbnMubWFwKGMgPT4gYy52aXNpYmxlSW5kZXgpLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYikpO1xuICAgICAgICBjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgY29uc3QgaXNQcmVjZWRpbmcgPSB0aGlzLnZpc2libGVJbmRleCA8IGluZGV4O1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy52aXNpYmxlSW5kZXggfHwgaW5kZXggPCAwIHx8IGluZGV4ID4gbGkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjID0+IGMubGV2ZWwgPj0gdGhpcy5sZXZlbCAmJiBjICE9PSB0aGlzICYmIGMucGFyZW50ICE9PSB0aGlzICYmXG4gICAgICAgICAgICAgICAgYy50b3BMZXZlbFBhcmVudCA9PT0gdGhpcy50b3BMZXZlbFBhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuICAgICAgICAvLyBJZiBpc1ByZWNlZGluZywgZmluZCBhIHRhcmdldCBzdWNoIHRoYXQgd2hlbiB0aGUgY3VycmVudCBjb2x1bW4gaXMgcGxhY2VkIGFmdGVyIGl0LCBjdXJyZW50IGNvbHVtbW4gd2lsbCByZWNlaXZlIGEgdmlzaWJsZUluZGV4ID09PSBpbmRleC4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdmlzaWJsZSBjaGlsZHJlbiBvZiB0aGUgY29sdW1ucy5cbiAgICAgICAgLy8gSWYgIWlzUHJlY2VkaW5nLCBmaW5kcyBhIGNvbHVtbiBvZiB0aGUgc2FtZSBsZXZlbCBhbmQgdmlzaWJsZSBpbmRleCB0aGF0IGVxdWFscyB0aGUgcGFzc2VkIGluZGV4IGFndW1lbnQgKGMudmlzaWJsZUluZGV4ID09PSBpbmRleCkuIE5vIG5lZWQgdG8gY29uc2lkZXIgdGhlIGNoaWxkcmVuIGhlcmUuXG4gICAgICAgIC8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuICAgICAgICBpZiAoaXNQcmVjZWRpbmcpIHtcbiAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZUluZGV4ID4gdGhpcy52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgdGFyZ2V0ID0gY29sdW1ucy5maW5kKGMgPT4gYy5sZXZlbCA9PT0gdGhpcy5sZXZlbCAmJiBjLnZpc2libGVJbmRleCArIChjIGFzIGFueSkuY2FsY0NoaWxkcmVuKCkgLSB0aGlzLmNhbGNDaGlsZHJlbigpID09PSBpbmRleCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoYyA9PiBjLnZpc2libGVJbmRleCA8IHRoaXMudmlzaWJsZUluZGV4KTtcbiAgICAgICAgICAgIHRhcmdldCA9IGNvbHVtbnMuZmluZChjID0+IGMubGV2ZWwgPT09IHRoaXMubGV2ZWwgJiYgYy52aXNpYmxlSW5kZXggPT09IGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGFyZ2V0IHx8ICh0YXJnZXQucGlubmVkICYmIHRoaXMuZGlzYWJsZVBpbm5pbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3MgPSBpc1ByZWNlZGluZyA/IERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQgOiBEcm9wUG9zaXRpb24uQmVmb3JlRHJvcFRhcmdldDtcbiAgICAgICAgdGhpcy5ncmlkLm1vdmVDb2x1bW4odGhpcywgdGFyZ2V0IGFzIElneENvbHVtbkNvbXBvbmVudCwgcG9zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBObyBjaGlsZHJlbiBmb3IgdGhlIGNvbHVtbiwgc28gd2lsbCByZXR1cm5zIDEgb3IgMCwgaWYgdGhlIGNvbHVtbiBpcyBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNhbGNDaGlsZHJlbigpOiBudW1iZXIge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuaGlkZGVuID8gMCA6IDE7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGVzIGNvbHVtbiB2aWJpc2lsaXR5IGFuZCBlbWl0cyB0aGUgcmVzcGVjdGl2ZSBldmVudC5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlVmlzaWJpbGl0eSh2YWx1ZT86IGJvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB2YWx1ZSA/PyAhdGhpcy5oaWRkZW47XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncyA9IHsgY29sdW1uOiB0aGlzLCBuZXdWYWx1ZSwgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uVmlzaWJpbGl0eUNoYW5naW5nLmVtaXQoZXZlbnRBcmdzKTtcblxuICAgICAgICBpZiAoZXZlbnRBcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZGVuID0gbmV3VmFsdWU7XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdlZC5lbWl0KHsgY29sdW1uOiB0aGlzLCBuZXdWYWx1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0b3AgbGV2ZWwgcGFyZW50IGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRvcExldmVsUGFyZW50ID0gIHRoaXMuY29sdW1uLnRvcExldmVsUGFyZW50O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdG9wTGV2ZWxQYXJlbnQoKSB7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQucGFyZW50KSB7XG4gICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgaGVhZGVyIG9mIHRoZSBjb2x1bW4uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnSUQnKVswXTtcbiAgICAgKiBsZXQgaGVhZGVyQ2VsbCA9IGNvbHVtbi5oZWFkZXJDZWxsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyQ2VsbCgpOiBJZ3hHcmlkSGVhZGVyQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5oZWFkZXJDZWxsTGlzdC5maW5kKChoZWFkZXIpID0+IGhlYWRlci5jb2x1bW4gPT09IHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGZpbHRlciBjZWxsIG9mIHRoZSBjb2x1bW4uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnSUQnKVswXTtcbiAgICAgKiBsZXQgZmlsdGVyZWxsID0gY29sdW1uLmZpbHRlcmVsbDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGwoKTogSWd4R3JpZEZpbHRlcmluZ0NlbGxDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmZpbHRlckNlbGxMaXN0LmZpbmQoKGZpbHRlckNlbGwpID0+IGZpbHRlckNlbGwuY29sdW1uID09PSB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgZ3JvdXAgb2YgdGhlIGNvbHVtbi5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGhlYWRlckdyb3VwKCk6IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuaGVhZGVyR3JvdXBzTGlzdC5maW5kKGdyb3VwID0+IGdyb3VwLmNvbHVtbiA9PT0gdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXV0b3NpemUgdGhlIGNvbHVtbiB0byB0aGUgbG9uZ2VzdCBjdXJyZW50bHkgdmlzaWJsZSBjZWxsIHZhbHVlLCBpbmNsdWRpbmcgdGhlIGhlYWRlciBjZWxsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCdncmlkJykgZ3JpZDogSWd4R3JpZENvbXBvbmVudDtcbiAgICAgKiBsZXQgY29sdW1uID0gdGhpcy5ncmlkLmNvbHVtbkxpc3QuZmlsdGVyKGMgPT4gYy5maWVsZCA9PT0gJ0lEJylbMF07XG4gICAgICogY29sdW1uLmF1dG9zaXplKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICogQHBhcmFtIGJ5SGVhZGVyT25seSBTZXQgaWYgY29sdW1uIHNob3VsZCBiZSBhdXRvc2l6ZWQgYmFzZWQgb25seSBvbiB0aGUgaGVhZGVyIGNvbnRlbnQuXG4gICAgICovXG4gICAgcHVibGljIGF1dG9zaXplKGJ5SGVhZGVyT25seSA9IGZhbHNlKSB7XG4gICAgICAgIGlmICghdGhpcy5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuZ2V0QXV0b1NpemUoYnlIZWFkZXJPbmx5KTtcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5yZWZsb3coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QXV0b1NpemUoYnlIZWFkZXIgPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHNpemUgPSAhYnlIZWFkZXIgPyB0aGlzLmdldExhcmdlc3RDZWxsV2lkdGgoKSA6XG4gICAgICAgICAgICAoT2JqZWN0LnZhbHVlcyh0aGlzLmdldEhlYWRlckNlbGxXaWR0aHMoKSkucmVkdWNlKChhLCBiKSA9PiBhICsgYikgKyAncHgnKTtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlV2lkdGggPSB0aGlzLndpZHRoICYmIHR5cGVvZiB0aGlzLndpZHRoID09PSAnc3RyaW5nJyAmJiB0aGlzLndpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG5cbiAgICAgICAgbGV0IG5ld1dpZHRoO1xuICAgICAgICBpZiAoaXNQZXJjZW50YWdlV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyaWRBdmFpbGFibGVTaXplID0gdGhpcy5ncmlkLmNhbGNXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnRhZ2VTaXplID0gcGFyc2VGbG9hdChzaXplKSAvIGdyaWRBdmFpbGFibGVTaXplICogMTAwO1xuICAgICAgICAgICAgbmV3V2lkdGggPSBwZXJjZW50YWdlU2l6ZSArICclJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gc2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFdpZHRoID0gaXNQZXJjZW50YWdlV2lkdGggPyB0aGlzLm1heFdpZHRoUGVyY2VudCA6IHRoaXMubWF4V2lkdGhQeDtcbiAgICAgICAgY29uc3QgbWluV2lkdGggPSBpc1BlcmNlbnRhZ2VXaWR0aCA/IHRoaXMubWluV2lkdGhQZXJjZW50IDogdGhpcy5taW5XaWR0aFB4O1xuICAgICAgICBpZiAodGhpcy5tYXhXaWR0aCAmJiAocGFyc2VGbG9hdChuZXdXaWR0aCkgPiBtYXhXaWR0aCkpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gaXNQZXJjZW50YWdlV2lkdGggPyBtYXhXaWR0aCArICclJyA6IG1heFdpZHRoICsgJ3B4JztcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUZsb2F0KG5ld1dpZHRoKSA8IG1pbldpZHRoKSB7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IGlzUGVyY2VudGFnZVdpZHRoID8gbWluV2lkdGggKyAnJScgOiBtaW5XaWR0aCArICdweCc7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3V2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDYWxjV2lkdGgoKTogYW55IHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGNXaWR0aCAmJiAhaXNOYU4odGhpcy5jYWxjUGl4ZWxXaWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxjV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWNoZUNhbGNXaWR0aCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsY1dpZHRoO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFJldHVybnMgdGhlIHdpZHRoIGFuZCBwYWRkaW5nIG9mIGEgaGVhZGVyIGNlbGwuXG4gICAgICovXG4gICAgcHVibGljIGdldEhlYWRlckNlbGxXaWR0aHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZ2V0SGVhZGVyQ2VsbFdpZHRoKHRoaXMuaGVhZGVyQ2VsbC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmV0dXJucyB0aGUgc2l6ZSAoaW4gcGl4ZWxzKSBvZiB0aGUgbG9uZ2VzdCBjdXJyZW50bHkgdmlzaWJsZSBjZWxsLCBpbmNsdWRpbmcgdGhlIGhlYWRlciBjZWxsLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKCdncmlkJykgZ3JpZDogSWd4R3JpZENvbXBvbmVudDtcbiAgICAgKlxuICAgICAqIGxldCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnSUQnKVswXTtcbiAgICAgKiBsZXQgc2l6ZSA9IGNvbHVtbi5nZXRMYXJnZXN0Q2VsbFdpZHRoKCk7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRMYXJnZXN0Q2VsbFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5ncmlkLmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IGxhcmdlc3QgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gICAgICAgIGlmICh0aGlzLl9jZWxscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjZWxsc0NvbnRlbnRXaWR0aHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX2NlbGxzLmZvckVhY2goKGNlbGwpID0+IGNlbGxzQ29udGVudFdpZHRocy5wdXNoKGNlbGwuY2FsY3VsYXRlU2l6ZVRvRml0KHJhbmdlKSkpO1xuXG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IGNlbGxzQ29udGVudFdpZHRocy5pbmRleE9mKE1hdGgubWF4KC4uLmNlbGxzQ29udGVudFdpZHRocykpO1xuICAgICAgICAgICAgY29uc3QgY2VsbFN0eWxlID0gdGhpcy5ncmlkLmRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY2VsbHNbaW5kZXhdLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgY29uc3QgY2VsbFBhZGRpbmcgPSBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nTGVmdCkgKyBwYXJzZUZsb2F0KGNlbGxTdHlsZS5wYWRkaW5nUmlnaHQpICtcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KGNlbGxTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpICsgcGFyc2VGbG9hdChjZWxsU3R5bGUuYm9yZGVyUmlnaHRXaWR0aCk7XG5cbiAgICAgICAgICAgIGxhcmdlc3Quc2V0KE1hdGgubWF4KC4uLmNlbGxzQ29udGVudFdpZHRocyksIGNlbGxQYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmhlYWRlckNlbGwgJiYgdGhpcy5hdXRvc2l6ZUhlYWRlcikge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyQ2VsbFdpZHRocyA9IHRoaXMuZ2V0SGVhZGVyQ2VsbFdpZHRocygpO1xuICAgICAgICAgICAgbGFyZ2VzdC5zZXQoaGVhZGVyQ2VsbFdpZHRocy53aWR0aCwgaGVhZGVyQ2VsbFdpZHRocy5wYWRkaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhcmdlc3RDZWxsID0gTWF0aC5tYXgoLi4uQXJyYXkuZnJvbShsYXJnZXN0LmtleXMoKSkpO1xuICAgICAgICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChsYXJnZXN0Q2VsbCArIGxhcmdlc3QuZ2V0KGxhcmdlc3RDZWxsKSk7XG5cbiAgICAgICAgaWYgKE51bWJlci5pc05hTih3aWR0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHdpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2VsbFdpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2xXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudGFnZVdpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxheW91dENoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sV2lkdGggJiYgIWlzUGVyY2VudGFnZVdpZHRoKSB7XG5cbiAgICAgICAgICAgIGxldCBjZWxsV2lkdGggPSBjb2xXaWR0aDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2VsbFdpZHRoICE9PSAnc3RyaW5nJyB8fCBjZWxsV2lkdGguZW5kc1dpdGgoJ3B4JykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY2VsbFdpZHRoICs9ICdweCc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjZWxsV2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29sV2lkdGg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSB7IH1cblxuICAgIHByb3RlY3RlZCBnZXRDb2x1bW5TaXplc1N0cmluZyhjaGlsZHJlbjogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pOiBzdHJpbmcge1xuICAgICAgICBjb25zdCByZXMgPSB0aGlzLmdldEZpbGxlZENoaWxkQ29sdW1uU2l6ZXMoY2hpbGRyZW4pO1xuICAgICAgICByZXR1cm4gcmVzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNhY2hlQ2FsY1dpZHRoKCk6IGFueSB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlV2lkdGggPSBjb2xXaWR0aCAmJiB0eXBlb2YgY29sV2lkdGggPT09ICdzdHJpbmcnICYmIGNvbFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG4gICAgICAgIGNvbnN0IGlzQXV0b1dpZHRoID0gY29sV2lkdGggJiYgdHlwZW9mIGNvbFdpZHRoID09PSAnc3RyaW5nJyAmJiBjb2xXaWR0aCA9PT0gJ2ZpdC1jb250ZW50JztcbiAgICAgICAgaWYgKGlzUGVyY2VudGFnZVdpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxjV2lkdGggPSBNYXRoLmZsb29yKHBhcnNlRmxvYXQoY29sV2lkdGgpIC8gMTAwICogdGhpcy5ncmlkLmNhbGNXaWR0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNvbFdpZHRoIHx8IGlzQXV0b1dpZHRoICYmICF0aGlzLmF1dG9TaXplKSB7XG4gICAgICAgICAgICAvLyBubyB3aWR0aFxuICAgICAgICAgICAgdGhpcy5fY2FsY1dpZHRoID0gdGhpcy5kZWZhdWx0V2lkdGggfHwgdGhpcy5ncmlkLmdldFBvc3NpYmxlQ29sdW1uV2lkdGgoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGNXaWR0aCA9IHRoaXMud2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYWxjUGl4ZWxXaWR0aCA9IHBhcnNlSW50KHRoaXMuX2NhbGNXaWR0aCwgMTApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgc2V0RXhwYW5kQ29sbGFwc2VTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5maWx0ZXIoY29sID0+IChjb2wudmlzaWJsZVdoZW5Db2xsYXBzZWQgIT09IHVuZGVmaW5lZCkpLmZvckVhY2goYyA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgICAgICBjLmhpZGRlbiA9IHRoaXMuaGlkZGVuOyByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjLmhpZGRlbiA9IHRoaXMuX2V4cGFuZGVkID8gYy52aXNpYmxlV2hlbkNvbGxhcHNlZCA6ICFjLnZpc2libGVXaGVuQ29sbGFwc2VkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjaGVja0NvbGxhcHNpYmxlU3RhdGUoKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGlsZHJlbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbHMgPSB0aGlzLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC52aXNpYmxlV2hlbkNvbGxhcHNlZCk7XG4gICAgICAgIHJldHVybiAoY29scy5zb21lKGMgPT4gYyA9PT0gdHJ1ZSkgJiYgY29scy5zb21lKGMgPT4gYyA9PT0gZmFsc2UpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBwaW5uYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdyaWQgYXMgYW55KS5faW5pdCB8fCAhdGhpcy5waW5uZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYXBwbHlTZWxlY3RhYmxlQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBseVNlbGVjdGFibGVDbGFzcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNldCBhcHBseVNlbGVjdGFibGVDbGFzcyh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLl9hcHBseVNlbGVjdGFibGVDbGFzcyA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
2301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sdW1uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lnbml0ZXVpLWFuZ3VsYXIvc3JjL2xpYi9ncmlkcy9jb2x1bW5zL2NvbHVtbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUdILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixLQUFLLEVBR0wsTUFBTSxFQUNOLFlBQVksRUFFWixNQUFNLEVBQ04sUUFBUSxFQUNSLElBQUksRUFDSixnQkFBZ0IsR0FDbkIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3JFLE9BQU8sRUFFSCwwQkFBMEIsRUFDMUIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2Qix5QkFBeUIsRUFDekIsMkJBQTJCLEVBQzNCLHVCQUF1QixFQUMxQixNQUFNLDJDQUEyQyxDQUFDO0FBQ25ELE9BQU8sRUFBb0Isc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNsRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5ELE9BQU8sRUFBK0csYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJdEssT0FBTyxFQUNILGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLHFCQUFxQixFQUMvQyxxQkFBcUIsRUFDMUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQ0gsd0JBQXdCLEVBQ3hC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QUs7Z0JBd0JLLFlBQVk7c0JBRHRCLEtBQUs7Z0JBeUJLLGdCQUFnQjtzQkFEMUIsS0FBSztnQkFnREssZUFBZTtzQkFEekIsS0FBSztnQkFtQ0ssWUFBWTtzQkFEdEIsS0FBSzt1QkFBQyxjQUFjO2dCQW1DVixjQUFjO3NCQUR4QixLQUFLO2dCQW9DSyxvQkFBb0I7c0JBRDlCLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWdDaEIsYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxlQUFlO2dCQWtDWCxrQkFBa0I7c0JBRDVCLEtBQUs7dUJBQUMsb0JBQW9CO2dCQWtNaEIsb0JBQW9CO3NCQUQ5QixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQW1DM0IsUUFBUTtzQkFEbEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBJbnB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgSW5qZWN0LFxuICAgIE9wdGlvbmFsLFxuICAgIFNlbGYsXG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBub3RpZnlDaGFuZ2VzIH0gZnJvbSAnLi4vd2F0Y2gtY2hhbmdlcyc7XG5pbXBvcnQgeyBXYXRjaENvbHVtbkNoYW5nZXMgfSBmcm9tICcuLi93YXRjaC1jaGFuZ2VzJztcbmltcG9ydCB7IEdyaWRDb2x1bW5EYXRhVHlwZSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9kYXRhLXV0aWwnO1xuaW1wb3J0IHtcbiAgICBJZ3hGaWx0ZXJpbmdPcGVyYW5kLFxuICAgIElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLFxuICAgIElneE51bWJlckZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4RGF0ZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4U3RyaW5nRmlsdGVyaW5nT3BlcmFuZCxcbiAgICBJZ3hEYXRlVGltZUZpbHRlcmluZ09wZXJhbmQsXG4gICAgSWd4VGltZUZpbHRlcmluZ09wZXJhbmRcbn0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1jb25kaXRpb24nO1xuaW1wb3J0IHsgSVNvcnRpbmdTdHJhdGVneSwgRGVmYXVsdFNvcnRpbmdTdHJhdGVneSB9IGZyb20gJy4uLy4uL2RhdGEtb3BlcmF0aW9ucy9zb3J0aW5nLXN0cmF0ZWd5JztcbmltcG9ydCB7IERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vLi4vY29yZS9kZW5zaXR5JztcbmltcG9ydCB7IElneFJvd0RpcmVjdGl2ZSB9IGZyb20gJy4uL3Jvdy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlIH0gZnJvbSAnLi4vLi4vZGF0YS1vcGVyYXRpb25zL2ZpbHRlcmluZy1leHByZXNzaW9ucy10cmVlJztcbmltcG9ydCB7IENlbGxUeXBlLCBDb2x1bW5UeXBlLCBHcmlkVHlwZSwgSWd4Q2VsbFRlbXBsYXRlQ29udGV4dCwgSWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0LCBJZ3hTdW1tYXJ5VGVtcGxhdGVDb250ZXh0LCBJR1hfR1JJRF9CQVNFIH0gZnJvbSAnLi4vY29tbW9uL2dyaWQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJDb21wb25lbnQgfSBmcm9tICcuLi9oZWFkZXJzL2dyaWQtaGVhZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudCB9IGZyb20gJy4uL2ZpbHRlcmluZy9iYXNlL2dyaWQtZmlsdGVyaW5nLWNlbGwuY29tcG9uZW50JztcbmltcG9ydCB7IElneEdyaWRIZWFkZXJHcm91cENvbXBvbmVudCB9IGZyb20gJy4uL2hlYWRlcnMvZ3JpZC1oZWFkZXItZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7XG4gICAgSWd4U3VtbWFyeU9wZXJhbmQsIElneE51bWJlclN1bW1hcnlPcGVyYW5kLCBJZ3hEYXRlU3VtbWFyeU9wZXJhbmQsXG4gICAgSWd4U3VtbWFyeVJlc3VsdCwgSWd4VGltZVN1bW1hcnlPcGVyYW5kXG59IGZyb20gJy4uL3N1bW1hcmllcy9ncmlkLXN1bW1hcnknO1xuaW1wb3J0IHtcbiAgICBJZ3hDZWxsVGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Q2VsbEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneENlbGxFZGl0b3JUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hDb2xsYXBzaWJsZUluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlLFxuICAgIElneEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSxcbiAgICBJZ3hTdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmUsXG4gICAgSWd4Q2VsbFZhbGlkYXRpb25FcnJvckRpcmVjdGl2ZVxufSBmcm9tICcuL3RlbXBsYXRlcy5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTVJMUmVzaXplQ29sdW1uSW5mbywgTVJMQ29sdW1uU2l6ZUluZm8sIElDb2x1bW5QaXBlQXJncyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEcm9wUG9zaXRpb24gfSBmcm9tICcuLi9tb3ZpbmcvbW92aW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgSUNvbHVtblZpc2liaWxpdHlDaGFuZ2luZ0V2ZW50QXJncywgSVBpbkNvbHVtbkNhbmNlbGxhYmxlRXZlbnRBcmdzLCBJUGluQ29sdW1uRXZlbnRBcmdzIH0gZnJvbSAnLi4vY29tbW9uL2V2ZW50cyc7XG5pbXBvcnQgeyBpc0NvbnN0cnVjdG9yLCBQbGF0Zm9ybVV0aWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElneEdyaWRDZWxsIH0gZnJvbSAnLi4vZ3JpZC1wdWJsaWMtY2VsbCc7XG5pbXBvcnQgeyBOR19WQUxJREFUT1JTLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmNvbnN0IERFRkFVTFRfREFURV9GT1JNQVQgPSAnbWVkaXVtRGF0ZSc7XG5jb25zdCBERUZBVUxUX1RJTUVfRk9STUFUID0gJ21lZGl1bVRpbWUnO1xuY29uc3QgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUID0gJ21lZGl1bSc7XG5jb25zdCBERUZBVUxUX0RJR0lUU19JTkZPID0gJzEuMC0zJztcblxuLyoqXG4gKiAqKklnbml0ZSBVSSBmb3IgQW5ndWxhciBDb2x1bW4qKiAtXG4gKiBbRG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly93d3cuaW5mcmFnaXN0aWNzLmNvbS9wcm9kdWN0cy9pZ25pdGUtdWktYW5ndWxhci9hbmd1bGFyL2NvbXBvbmVudHMvZ3JpZC9ncmlkI2NvbHVtbnMtY29uZmlndXJhdGlvbilcbiAqXG4gKiBUaGUgSWduaXRlIFVJIENvbHVtbiBpcyB1c2VkIHdpdGhpbiBhbiBgaWd4LWdyaWRgIGVsZW1lbnQgdG8gZGVmaW5lIHdoYXQgZGF0YSB0aGUgY29sdW1uIHdpbGwgc2hvdy4gRmVhdHVyZXMgc3VjaCBhcyBzb3J0aW5nLFxuICogZmlsdGVyaW5nICYgZWRpdGluZyBhcmUgZW5hYmxlZCBhdCB0aGUgY29sdW1uIGxldmVsLiAgWW91IGNhbiBhbHNvIHByb3ZpZGUgYSB0ZW1wbGF0ZSBjb250YWluaW5nIGN1c3RvbSBjb250ZW50IGluc2lkZVxuICogdGhlIGNvbHVtbiB1c2luZyBgbmctdGVtcGxhdGVgIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGNlbGxzIHdpdGhpbiB0aGUgY29sdW1uLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBzZWxlY3RvcjogJ2lneC1jb2x1bW4nLFxuICAgIHRlbXBsYXRlOiBgYCxcbiAgICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIElneENvbHVtbkNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSwgQ29sdW1uVHlwZSB7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgZmllbGRgIHZhbHVlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uRmllbGQgPSB0aGlzLmNvbHVtbi5maWVsZDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2ZpZWxkXSA9IFwiJ0lEJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZXQgZmllbGQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9maWVsZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLmhhc05lc3RlZFBhdGggPSB2YWx1ZT8uaW5jbHVkZXMoJy4nKTtcbiAgICB9XG4gICAgcHVibGljIGdldCBmaWVsZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmllbGQ7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JbXSA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaGVhZGVyYCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkhlYWRlciA9IHRoaXMuY29sdW1uLmhlYWRlcjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hlYWRlcl0gPSBcIidJRCdcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlYWRlciA9ICcnO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYHRpdGxlYCB2YWx1ZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRpdGxlID0gdGhpcy5jb2x1bW4udGl0bGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFt0aXRsZV0gPSBcIidTb21lIGNvbHVtbiB0b29sdGlwJ1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdGl0bGUgPSAnJztcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIHNvcnRhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzU29ydGFibGUgPSB0aGlzLmNvbHVtbi5zb3J0YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW3NvcnRhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgc29ydGFibGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGlmIHRoZSBjb2x1bW4gaXMgc2VsZWN0YWJsZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtblNlbGVjdGFibGUgPSB0aGlzLmNvbHVtbi5zZWxlY3RhYmxlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzZWxlY3RhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0YWJsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGlmIHRoZSBjb2x1bW4gaXMgc2VsZWN0YWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW3NlbGVjdGFibGVdID0gXCJmYWxzZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0YWJsZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZ3JvdXBhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzR3JvdXBhYmxlID0gdGhpcy5jb2x1bW4uZ3JvdXBhYmxlO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbZ3JvdXBhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcyh0cnVlKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBnZXQgZ3JvdXBhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ3JvdXBhYmxlO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGdyb3VwYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9ncm91cGFibGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ncmlkLmdyb3VwYWJsZVBpcGVUcmlnZ2VyKys7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIGVkaXRhYmxlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRWRpdGFibGUgPSB0aGlzLmNvbHVtbi5lZGl0YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgZ2V0IGVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBVcGRhdGluZyB0aGUgcHJpbWFyeSBrZXkgd2hlbiBncmlkIGhhcyB0cmFuc2FjdGlvbnMgKGluY2wuIHJvdyBlZGl0KVxuICAgICAgICAvLyBzaG91bGQgbm90IGJlIGFsbG93ZWQsIGFzIHRoYXQgY2FuIGNvcnJ1cHQgdHJhbnNhY3Rpb24gc3RhdGUuXG4gICAgICAgIGNvbnN0IHJvd0VkaXRhYmxlID0gdGhpcy5ncmlkICYmIHRoaXMuZ3JpZC5yb3dFZGl0YWJsZTtcbiAgICAgICAgY29uc3QgaGFzVHJhbnNhY3Rpb25zID0gdGhpcy5ncmlkICYmIHRoaXMuZ3JpZC50cmFuc2FjdGlvbnMuZW5hYmxlZDtcblxuICAgICAgICBpZiAodGhpcy5pc1ByaW1hcnlDb2x1bW4gJiYgKHJvd0VkaXRhYmxlIHx8IGhhc1RyYW5zYWN0aW9ucykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9lZGl0YWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZWRpdGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcm93RWRpdGFibGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZWRpdGFibGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uLmVkaXRhYmxlID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2VkaXRhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGVkaXRhYmxlKGVkaXRhYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2VkaXRhYmxlID0gZWRpdGFibGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgZmlsdGVyYWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzRmlsdGVyYWJsZSA9IHRoaXMuY29sdW1uLmZpbHRlcmFibGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtmaWx0ZXJhYmxlXSA9IFwiZmFsc2VcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBmaWx0ZXJhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIHJlc2l6YWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1Jlc2l6YWJsZSA9IHRoaXMuY29sdW1uLnJlc2l6YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW3Jlc2l6YWJsZV0gPSBcInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHJlc2l6YWJsZSA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBoZWFkZXIgaXMgaW5jbHVkZWQgaW4gYXV0b3NpemUgbG9naWMuXG4gICAgICogVXNlZnVsIHdoZW4gdGVtcGxhdGUgZm9yIGEgY29sdW1uIGhlYWRlciBpcyBzaXplZCBiYXNlZCBvbiBwYXJlbnQsIGZvciBleGFtcGxlIGEgZGVmYXVsdCBgZGl2YC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1Jlc2l6YWJsZSA9IHRoaXMuY29sdW1uLnJlc2l6YWJsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW3Jlc2l6YWJsZV0gPSBcInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGF1dG9zaXplSGVhZGVyID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgYSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHN1bW1hcnkgZm9yIHRoZSBjb2x1bW4gaXMgZW5hYmxlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGhhc1N1bW1hcnkgPSB0aGlzLmNvbHVtbi5oYXNTdW1tYXJ5O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBoYXNTdW1tYXJ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGFzU3VtbWFyeTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgc3VtbWFyeSBmb3IgdGhlIGNvbHVtbiBpcyBlbmFibGVkLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hhc1N1bW1hcnldID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgaGFzU3VtbWFyeSh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9oYXNTdW1tYXJ5ID0gdmFsdWU7XG5cbiAgICAgICAgaWYgKHRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLnN1bW1hcnlTZXJ2aWNlLnJlc2V0U3VtbWFyeUhlaWdodCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzSGlkZGVuID0gdGhpcy5jb2x1bW4uaGlkZGVuO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oaWRkZW47XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGNvbHVtbiBoaWRkZW4gcHJvcGVydHkuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbaGlkZGVuXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIFR3by13YXkgZGF0YSBiaW5kaW5nLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbKGhpZGRlbildID0gXCJtb2RlbC5pc0hpZGRlblwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGhpZGRlbih2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5faGlkZGVuICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5faGlkZGVuID0gdmFsdWU7XG4gICAgICAgICAgICB0aGlzLmhpZGRlbkNoYW5nZS5lbWl0KHRoaXMuX2hpZGRlbik7XG4gICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5MYXlvdXRDaGlsZCAmJiB0aGlzLnBhcmVudC5oaWRkZW4gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnQuaGlkZGVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5jcnVkU2VydmljZS5lbmRFZGl0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVzZXRTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UuaGlkZUZpbHRlcmluZ1Jvd09uQ29sdW1uVmlzaWJpbGl0eUNoYW5nZSh0aGlzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY29sdW1uIGlzIHNlbGVjdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNTZWxlY3RlZCA9IHRoaXMuY29sdW1uLnNlbGVjdGVkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5pc0NvbHVtblNlbGVjdGVkKHRoaXMuZmllbGQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbGVjdC9kZXNlbGVjdCBhIGNvbHVtbi5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUgJiYgdmFsdWUgIT09IHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JpZC5zZWxlY3Rpb25TZXJ2aWNlLnNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChbdGhpcy5maWVsZF0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyaWQuc2VsZWN0aW9uU2VydmljZS5kZXNlbGVjdENvbHVtbnNXaXRoTm9FdmVudChbdGhpcy5maWVsZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncmlkLm5vdGlmeUNoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgaGlkZGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjb2xsYXBzaWJsZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB2aXNpYmxlV2hlbkNvbGxhcHNlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNvbHVtbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgaGlkaW5nIGlzIGRpc2FibGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNIaWRpbmdEaXNhYmxlZCA9ICB0aGlzLmNvbHVtbi5kaXNhYmxlSGlkaW5nO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgZGlzYWJsZUhpZGluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgcGlubmluZyBpcyBkaXNhYmxlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzUGlubmluZ0Rpc2FibGVkID0gIHRoaXMuY29sdW1uLmRpc2FibGVQaW5uaW5nO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgZGlzYWJsZVBpbm5pbmcgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBpbiB2ZXJzaW9uIDEzLjEuMC4gVXNlIGBJZ3hHcmlkQ29tcG9uZW50Lm1vdmluZ2AgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbW92YWJsZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlzTW92YWJsZSA9IHRoaXMuY29sdW1uLm1vdmFibGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFttb3ZhYmxlXSA9IFwidHJ1ZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgbW92YWJsZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGB3aWR0aGAgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbldpZHRoID0gdGhpcy5jb2x1bW4ud2lkdGg7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXModHJ1ZSlcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgd2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgaXNBdXRvV2lkdGggPSB0aGlzLl93aWR0aCAmJiB0eXBlb2YgdGhpcy5fd2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMuX3dpZHRoID09PSAnYXV0byc7XG4gICAgICAgIGlmIChpc0F1dG9XaWR0aCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmF1dG9TaXplKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdmaXQtY29udGVudCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dG9TaXplICsgJ3B4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoU2V0QnlVc2VyID8gdGhpcy5fd2lkdGggOiB0aGlzLmRlZmF1bHRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgd2lkdGhgIG9mIHRoZSBjb2x1bW4uXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFt3aWR0aF0gPSBcIicyNSUnXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVHdvLXdheSBkYXRhIGJpbmRpbmcuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFsod2lkdGgpXT1cIm1vZGVsLmNvbHVtbnNbMF0ud2lkdGhcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCB3aWR0aCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FsY1dpZHRoID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY2FsY1BpeGVsV2lkdGggPSBOYU47XG4gICAgICAgICAgICB0aGlzLndpZHRoU2V0QnlVc2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHdpZHRoIGNvdWxkIGJlIHBhc3NlZCBhcyBudW1iZXIgZnJvbSB0aGUgdGVtcGxhdGVcbiAgICAgICAgICAgIC8vIGhvc3QgYmluZGluZ3MgYXJlIG5vdCBweCBhZmZpeGVkIHNvIHdlIG5lZWQgdG8gZW5zdXJlIHdlIGFmZml4IHNpbXBsZSBudW1iZXIgc3RyaW5nc1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnbnVtYmVyJyB8fCB2YWx1ZS5tYXRjaCgvXlswLTldKiQvKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKyAncHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnZml0LWNvbnRlbnQnKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSAnYXV0byc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl93aWR0aCA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGVDYWxjV2lkdGgoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMud2lkdGhDaGFuZ2UuZW1pdCh0aGlzLl93aWR0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGF1dG9TaXplOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIG1heGltdW0gYHdpZHRoYCBvZiB0aGUgY29sdW1uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uTWF4V2lkdGggPSB0aGlzLmNvbHVtbi53aWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW21heFdpZHRoXSA9IFwiJzE1MHB4J1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBtYXhXaWR0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBjbGFzcyBzZWxlY3RvciBvZiB0aGUgY29sdW1uIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkhlYWRlckNsYXNzID0gdGhpcy5jb2x1bW4uaGVhZGVyQ2xhc3NlcztcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hlYWRlckNsYXNzZXNdID0gXCInY29sdW1uLWhlYWRlcidcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGhlYWRlckNsYXNzZXMgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgY29uZGl0aW9uYWwgc3R5bGUgcHJvcGVydGllcyBvbiB0aGUgY29sdW1uIGhlYWRlci5cbiAgICAgKiBTaW1pbGFyIHRvIGBuZ1N0eWxlYCBpdCBhY2NlcHRzIGFuIG9iamVjdCBsaXRlcmFsIHdoZXJlIHRoZSBrZXlzIGFyZVxuICAgICAqIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGV4cHJlc3Npb24gdG8gYmUgZXZhbHVhdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBzdHlsZXMgPSB7XG4gICAgICogIGJhY2tncm91bmQ6ICdyb3lhbGJsdWUnLFxuICAgICAqICBjb2xvcjogKGNvbHVtbikgPT4gY29sdW1uLnBpbm5lZCA/ICdyZWQnOiAnaW5oZXJpdCdcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtoZWFkZXJTdHlsZXNdPVwic3R5bGVzXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoZWFkZXJTdHlsZXMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBjbGFzcyBzZWxlY3RvciBvZiB0aGUgY29sdW1uIGdyb3VwIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkhlYWRlckNsYXNzID0gdGhpcy5jb2x1bW4uaGVhZGVyR3JvdXBDbGFzc2VzO1xuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbaGVhZGVyR3JvdXBDbGFzc2VzXSA9IFwiJ2NvbHVtbi1ncm91cC1oZWFkZXInXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoZWFkZXJHcm91cENsYXNzZXMgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgY29uZGl0aW9uYWwgc3R5bGUgcHJvcGVydGllcyBvbiB0aGUgY29sdW1uIGhlYWRlciBncm91cCB3cmFwcGVyLlxuICAgICAqIFNpbWlsYXIgdG8gYG5nU3R5bGVgIGl0IGFjY2VwdHMgYW4gb2JqZWN0IGxpdGVyYWwgd2hlcmUgdGhlIGtleXMgYXJlXG4gICAgICogdGhlIHN0eWxlIHByb3BlcnRpZXMgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgZXhwcmVzc2lvbiB0byBiZSBldmFsdWF0ZWQuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHN0eWxlcyA9IHtcbiAgICAgKiAgYmFja2dyb3VuZDogJ3JveWFsYmx1ZScsXG4gICAgICogIGNvbG9yOiAoY29sdW1uKSA9PiBjb2x1bW4ucGlubmVkID8gJ3JlZCc6ICdpbmhlcml0J1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2hlYWRlckdyb3VwU3R5bGVzXT1cInN0eWxlc1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGVhZGVyR3JvdXBTdHlsZXMgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBhIGNvbmRpdGlvbmFsIGNsYXNzIHNlbGVjdG9yIG9mIHRoZSBjb2x1bW4gY2VsbHMuXG4gICAgICogQWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCwgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMsXG4gICAgICogd2hlcmUgdGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgQ1NTIGNsYXNzLCB3aGlsZSB0aGVcbiAgICAgKiB2YWx1ZSBpcyBlaXRoZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBib29sZWFuLFxuICAgICAqIG9yIGJvb2xlYW4sIGxpa2Ugc286XG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNhbGxiYWNrID0gKHJvd0RhdGEsIGNvbHVtbktleSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4geyByZXR1cm4gcm93RGF0YVtjb2x1bW5LZXldID4gNjsgfVxuICAgICAqIGNlbGxDbGFzc2VzID0geyAnY2xhc3NOYW1lJyA6IHRoaXMuY2FsbGJhY2sgfTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2NlbGxDbGFzc2VzXSA9IFwiY2VsbENsYXNzZXNcIj48L2lneC1jb2x1bW4+XG4gICAgICogPGlneC1jb2x1bW4gW2NlbGxDbGFzc2VzXSA9IFwieydjbGFzczEnIDogdHJ1ZSB9XCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjZWxsQ2xhc3NlczogYW55O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBjb25kaXRpb25hbCBzdHlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBjb2x1bW4gY2VsbHMuXG4gICAgICogU2ltaWxhciB0byBgbmdTdHlsZWAgaXQgYWNjZXB0cyBhbiBvYmplY3QgbGl0ZXJhbCB3aGVyZSB0aGUga2V5cyBhcmVcbiAgICAgKiB0aGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdGhlIHZhbHVlIGlzIHRoZSBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC5cbiAgICAgKiBBcyB3aXRoIGBjZWxsQ2xhc3Nlc2AgaXQgYWNjZXB0cyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBzdHlsZXMgPSB7XG4gICAgICogIGJhY2tncm91bmQ6ICdyb3lhbGJsdWUnLFxuICAgICAqICBjb2xvcjogKHJvd0RhdGEsIGNvbHVtbktleSwgY2VsbFZhbHVlLCByb3dJbmRleCkgPT4gdmFsdWUuc3RhcnRzV2l0aCgnSW1wb3J0YW50JykgPyAncmVkJzogJ2luaGVyaXQnXG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbY2VsbFN0eWxlc109XCJzdHlsZXNcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNlbGxTdHlsZXMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgZGlzcGxheSBmb3JtYXQgdG8gY2VsbCB2YWx1ZXMgaW4gdGhlIGNvbHVtbi4gRG9lcyBub3QgbW9kaWZ5IHRoZSB1bmRlcmx5aW5nIGRhdGEuXG4gICAgICpcbiAgICAgKiBAcmVtYXJrXG4gICAgICogTm90ZTogQXMgdGhlIGZvcm1hdHRlciBpcyB1c2VkIGluIHBsYWNlcyBsaWtlIHRoZSBFeGNlbCBzdHlsZSBmaWx0ZXJpbmcgZGlhbG9nLCBpbiBjZXJ0YWluXG4gICAgICogc2NlbmFyaW9zIChyZW1vdGUgZmlsdGVyaW5nIGZvciBleGFtcGxlKSwgdGhlIHJvdyBkYXRhIGFyZ3VtZW50IGNhbiBiZSBgdW5kZWZpbmVkYC5cbiAgICAgKlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGNvbHVtbiBuYW1lIGlzIFNhbGFyeSwgYW5kIHRoZW4gcHJvdmlkZSBhIG1ldGhvZCBhcyB0aGUgY29sdW1uIGZvcm1hdHRlclxuICAgICAqIHRvIGZvcm1hdCB0aGUgdmFsdWUgaW50byBhIGN1cnJlbmN5IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbHVtbkluaXQoY29sdW1uOiBJZ3hDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgKiAgIGlmIChjb2x1bW4uZmllbGQgPT0gXCJTYWxhcnlcIikge1xuICAgICAqICAgICBjb2x1bW4uZm9ybWF0dGVyID0gKHNhbGFyeSA9PiB0aGlzLmZvcm1hdChzYWxhcnkpKTtcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICpcbiAgICAgKiBmb3JtYXQodmFsdWU6IG51bWJlcikgOiBzdHJpbmcge1xuICAgICAqICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbHVlLCBcImVuLXVzXCIsIFwiJFwiKTtcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBjb2x1bW4gPSB0aGlzLmdyaWQuZ2V0Q29sdW1uQnlOYW1lKCdBZGRyZXNzJyk7XG4gICAgICogY29uc3QgYWRkcmVzc0Zvcm1hdHRlciA9IChhZGRyZXNzOiBzdHJpbmcsIHJvd0RhdGE6IGFueSkgPT4gZGF0YS5wcml2YWN5RW5hYmxlZCA/ICd1bmtub3duJyA6IGFkZHJlc3M7XG4gICAgICogY29sdW1uLmZvcm1hdHRlciA9IGFkZHJlc3NGb3JtYXR0ZXI7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZvcm1hdHRlcjogKHZhbHVlOiBhbnksIHJvd0RhdGE/OiBhbnkpID0+IGFueTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdW1tYXJ5Rm9ybWF0dGVyIGlzIHVzZWQgdG8gZm9ybWF0IHRoZSBkaXNwbGF5IG9mIHRoZSBjb2x1bW4gc3VtbWFyaWVzLlxuICAgICAqXG4gICAgICogSW4gdGhpcyBleGFtcGxlLCB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGNvbHVtbiBuYW1lIGlzIE9yZGVyRGF0ZSwgYW5kIHRoZW4gcHJvdmlkZSBhIG1ldGhvZCBhcyB0aGUgc3VtbWFyeUZvcm1hdHRlclxuICAgICAqIHRvIGNoYW5nZSB0aGUgbG9jYWxlIGZvciB0aGUgZGF0ZXMgdG8gJ2ZyLUZSJy4gVGhlIHN1bW1hcmllcyB3aXRoIHRoZSBjb3VudCBrZXkgYXJlIHNraXBwZWQgc28gdGhleSBhcmUgZGlzcGxheWVkIGFzIG51bWJlcnMuXG4gICAgICpcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29sdW1uSW5pdChjb2x1bW46IElneENvbHVtbkNvbXBvbmVudCkge1xuICAgICAqICAgaWYgKGNvbHVtbi5maWVsZCA9PSBcIk9yZGVyRGF0ZVwiKSB7XG4gICAgICogICAgIGNvbHVtbi5zdW1tYXJ5Rm9ybWF0dGVyID0gdGhpcy5zdW1tYXJ5Rm9ybWF0O1xuICAgICAqICAgfVxuICAgICAqIH1cbiAgICAgKlxuICAgICAqIHN1bW1hcnlGb3JtYXQoc3VtbWFyeTogSWd4U3VtbWFyeVJlc3VsdCwgc3VtbWFyeU9wZXJhbmQ6IElneFN1bW1hcnlPcGVyYW5kKTogc3RyaW5nIHtcbiAgICAgKiAgIGNvbnN0IHJlc3VsdCA9IHN1bW1hcnkuc3VtbWFyeVJlc3VsdDtcbiAgICAgKiAgIGlmKHN1bW1hcnlSZXN1bHQua2V5ICE9PSAnY291bnQnICYmIHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAqICAgICAgY29uc3QgcGlwZSA9IG5ldyBEYXRlUGlwZSgnZnItRlInKTtcbiAgICAgKiAgICAgIHJldHVybiBwaXBlLnRyYW5zZm9ybShyZXN1bHQsJ21lZGl1bURhdGUnKTtcbiAgICAgKiAgIH1cbiAgICAgKiAgIHJldHVybiByZXN1bHQ7XG4gICAgICogfVxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzdW1tYXJ5Rm9ybWF0dGVyOiAoc3VtbWFyeTogSWd4U3VtbWFyeVJlc3VsdCwgc3VtbWFyeU9wZXJhbmQ6IElneFN1bW1hcnlPcGVyYW5kKSA9PiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgY29sdW1uIGZpbHRlcmluZyBzaG91bGQgYmUgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJpbmdJZ25vcmVDYXNlID0gdGhpcy5jb2x1bW4uZmlsdGVyaW5nSWdub3JlQ2FzZTtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW2ZpbHRlcmluZ0lnbm9yZUNhc2VdID0gXCJmYWxzZVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgZmlsdGVyaW5nSWdub3JlQ2FzZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBzb3J0aW5nIHNob3VsZCBiZSBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHNvcnRpbmdJZ25vcmVDYXNlID0gdGhpcy5jb2x1bW4uc29ydGluZ0lnbm9yZUNhc2U7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtzb3J0aW5nSWdub3JlQ2FzZV0gPSBcImZhbHNlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICAgIHB1YmxpYyBzb3J0aW5nSWdub3JlQ2FzZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBgc2VhcmNoYWJsZWAuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgdHJ1ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc1NlYXJjaGFibGUgPSAgdGhpcy5jb2x1bW4uc2VhcmNoYWJsZSc7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWNvbHVtbiBbc2VhcmNoYWJsZV0gPSBcImZhbHNlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcbiAgICBwdWJsaWMgc2VhcmNoYWJsZSA9IHRydWU7XG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbiB2YWx1ZXMuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgc3RyaW5nYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkRhdGFUeXBlID0gdGhpcy5jb2x1bW4uZGF0YVR5cGU7XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtkYXRhVHlwZV0gPSBcIidudW1iZXInXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGFUeXBlOiBHcmlkQ29sdW1uRGF0YVR5cGUgPSBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2xsYXBzaWJsZUluZGljYXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDb2x1bW5UZW1wbGF0ZUNvbnRleHQ+O1xuXG4gICAgLyoqXG4gICAgICogUm93IGluZGV4IHdoZXJlIHRoZSBjdXJyZW50IGZpZWxkIHNob3VsZCBlbmQuXG4gICAgICogVGhlIGFtb3VudCBvZiByb3dzIGJldHdlZW4gcm93U3RhcnQgYW5kIHJvd0VuZCB3aWxsIGRldGVybWluZSB0aGUgYW1vdW50IG9mIHNwYW5uaW5nIHJvd3MgdG8gdGhhdCBmaWVsZFxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogICA8aWd4LWNvbHVtbiBbcm93RW5kXT1cIjJcIiBbcm93U3RhcnRdPVwiMVwiIFtjb2xTdGFydF09XCIxXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIDwvaWd4LWNvbHVtbi1sYXlvdXQ+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcm93RW5kOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDb2x1bW4gaW5kZXggd2hlcmUgdGhlIGN1cnJlbnQgZmllbGQgc2hvdWxkIGVuZC5cbiAgICAgKiBUaGUgYW1vdW50IG9mIGNvbHVtbnMgYmV0d2VlbiBjb2xTdGFydCBhbmQgY29sRW5kIHdpbGwgZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2Ygc3Bhbm5pbmcgY29sdW1ucyB0byB0aGF0IGZpZWxkXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiAgIDxpZ3gtY29sdW1uIFtjb2xFbmRdPVwiM1wiIFtyb3dTdGFydF09XCIxXCIgW2NvbFN0YXJ0XT1cIjFcIj48L2lneC1jb2x1bW4+XG4gICAgICogPC9pZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2xFbmQ6IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqIFJvdyBpbmRleCBmcm9tIHdoaWNoIHRoZSBmaWVsZCBpcyBzdGFydGluZy5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4tbGF5b3V0PlxuICAgICAqICAgPGlneC1jb2x1bW4gW3Jvd1N0YXJ0XT1cIjFcIiBbY29sU3RhcnRdPVwiMVwiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiA8L2lneC1jb2x1bW4tbGF5b3V0PlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJvd1N0YXJ0OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBDb2x1bW4gaW5kZXggZnJvbSB3aGljaCB0aGUgZmllbGQgaXMgc3RhcnRpbmcuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiAgIDxpZ3gtY29sdW1uIFtjb2xTdGFydF09XCIxXCIgW3Jvd1N0YXJ0XT1cIjFcIj48L2lneC1jb2x1bW4+XG4gICAgICogPC9pZ3gtY29sdW1uLWxheW91dD5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjb2xTdGFydDogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIGN1c3RvbSBwcm9wZXJ0aWVzIHByb3ZpZGVkIGluIGFkZGl0aW9uYWwgdGVtcGxhdGUgY29udGV4dC5cbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWNvbHVtbiBbYWRkaXRpb25hbFRlbXBsYXRlQ29udGV4dF09XCJjb250ZXh0T2JqZWN0XCI+XG4gICAgICogICA8bmctdGVtcGxhdGUgaWd4Q2VsbCBsZXQtY2VsbD1cImNlbGxcIiBsZXQtcHJvcHM9XCJhZGRpdGlvbmFsVGVtcGxhdGVDb250ZXh0XCI+XG4gICAgICogICAgICB7eyBwcm9wcyB9fVxuICAgICAqICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiA8L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgYWRkaXRpb25hbFRlbXBsYXRlQ29udGV4dDogYW55O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyB3aWR0aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwaW5uZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4RmlsdGVyQ2VsbFRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHB1YmxpYyBmaWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmU6IElneEZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hTdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4U3VtbWFyeVRlbXBsYXRlRGlyZWN0aXZlIH0pXG4gICAgcHJvdGVjdGVkIHN1bW1hcnlUZW1wbGF0ZURpcmVjdGl2ZTogSWd4U3VtbWFyeVRlbXBsYXRlRGlyZWN0aXZlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAc2VlIHtAbGluayBib2R5VGVtcGxhdGV9XG4gICAgICovXG4gICAgQENvbnRlbnRDaGlsZChJZ3hDZWxsVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4Q2VsbFRlbXBsYXRlRGlyZWN0aXZlIH0pXG4gICAgcHJvdGVjdGVkIGNlbGxUZW1wbGF0ZTogSWd4Q2VsbFRlbXBsYXRlRGlyZWN0aXZlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENlbGxWYWxpZGF0aW9uRXJyb3JEaXJlY3RpdmUsIHsgcmVhZDogSWd4Q2VsbFZhbGlkYXRpb25FcnJvckRpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBjZWxsVmFsaWRhdGlvbkVycm9yVGVtcGxhdGU6IElneENlbGxWYWxpZGF0aW9uRXJyb3JEaXJlY3RpdmU7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGRyZW4oSWd4Q2VsbEhlYWRlclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneENlbGxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZSwgZGVzY2VuZGFudHM6IGZhbHNlIH0pXG4gICAgcHJvdGVjdGVkIGhlYWRUZW1wbGF0ZTogUXVlcnlMaXN0PElneENlbGxIZWFkZXJUZW1wbGF0ZURpcmVjdGl2ZT47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBDb250ZW50Q2hpbGQoSWd4Q2VsbEVkaXRvclRlbXBsYXRlRGlyZWN0aXZlLCB7IHJlYWQ6IElneENlbGxFZGl0b3JUZW1wbGF0ZURpcmVjdGl2ZSB9KVxuICAgIHByb3RlY3RlZCBlZGl0b3JUZW1wbGF0ZTogSWd4Q2VsbEVkaXRvclRlbXBsYXRlRGlyZWN0aXZlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneENvbGxhcHNpYmxlSW5kaWNhdG9yVGVtcGxhdGVEaXJlY3RpdmUsIHsgcmVhZDogSWd4Q29sbGFwc2libGVJbmRpY2F0b3JUZW1wbGF0ZURpcmVjdGl2ZSwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHByb3RlY3RlZCBjb2xsYXBzZUluZGljYXRvclRlbXBsYXRlOiBJZ3hDb2xsYXBzaWJsZUluZGljYXRvclRlbXBsYXRlRGlyZWN0aXZlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbGNXaWR0aCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRDYWxjV2lkdGgoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGNhbGNQaXhlbFdpZHRoOiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtYXhXaWR0aFB4KCkge1xuICAgICAgICBjb25zdCBncmlkQXZhaWxhYmxlU2l6ZSA9IHRoaXMuZ3JpZC5jYWxjV2lkdGg7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudGFnZVdpZHRoID0gdGhpcy5tYXhXaWR0aCAmJiB0eXBlb2YgdGhpcy5tYXhXaWR0aCA9PT0gJ3N0cmluZycgJiYgdGhpcy5tYXhXaWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgICAgICByZXR1cm4gaXNQZXJjZW50YWdlV2lkdGggPyBwYXJzZUZsb2F0KHRoaXMubWF4V2lkdGgpIC8gMTAwICogZ3JpZEF2YWlsYWJsZVNpemUgOiBwYXJzZUZsb2F0KHRoaXMubWF4V2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1heFdpZHRoUGVyY2VudCgpIHtcbiAgICAgICAgY29uc3QgZ3JpZEF2YWlsYWJsZVNpemUgPSB0aGlzLmdyaWQuY2FsY1dpZHRoO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IHRoaXMubWF4V2lkdGggJiYgdHlwZW9mIHRoaXMubWF4V2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMubWF4V2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICAgICAgcmV0dXJuIGlzUGVyY2VudGFnZVdpZHRoID8gcGFyc2VGbG9hdCh0aGlzLm1heFdpZHRoKSA6IHBhcnNlRmxvYXQodGhpcy5tYXhXaWR0aCkgLyBncmlkQXZhaWxhYmxlU2l6ZSAqIDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBtaW5XaWR0aFB4KCkge1xuICAgICAgICBjb25zdCBncmlkQXZhaWxhYmxlU2l6ZSA9IHRoaXMuZ3JpZC5jYWxjV2lkdGg7XG4gICAgICAgIGNvbnN0IGlzUGVyY2VudGFnZVdpZHRoID0gdGhpcy5taW5XaWR0aCAmJiB0eXBlb2YgdGhpcy5taW5XaWR0aCA9PT0gJ3N0cmluZycgJiYgdGhpcy5taW5XaWR0aC5pbmRleE9mKCclJykgIT09IC0xO1xuICAgICAgICByZXR1cm4gaXNQZXJjZW50YWdlV2lkdGggPyBwYXJzZUZsb2F0KHRoaXMubWluV2lkdGgpIC8gMTAwICogZ3JpZEF2YWlsYWJsZVNpemUgOiBwYXJzZUZsb2F0KHRoaXMubWluV2lkdGgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IG1pbldpZHRoUGVyY2VudCgpIHtcbiAgICAgICAgY29uc3QgZ3JpZEF2YWlsYWJsZVNpemUgPSB0aGlzLmdyaWQuY2FsY1dpZHRoO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IHRoaXMubWluV2lkdGggJiYgdHlwZW9mIHRoaXMubWluV2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMubWluV2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICAgICAgcmV0dXJuIGlzUGVyY2VudGFnZVdpZHRoID8gcGFyc2VGbG9hdCh0aGlzLm1pbldpZHRoKSA6IHBhcnNlRmxvYXQodGhpcy5taW5XaWR0aCkgLyBncmlkQXZhaWxhYmxlU2l6ZSAqIDEwMDtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgbWluaW11bSBgd2lkdGhgIG9mIHRoZSBjb2x1bW4uXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgODhgO1xuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uTWluV2lkdGggPSB0aGlzLmNvbHVtbi5taW5XaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jb2x1bW4gW21pbldpZHRoXSA9IFwiJzEwMHB4J1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IG1pbldpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgbWluVmFsID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obWluVmFsKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RlZmF1bHRNaW5XaWR0aCA9IHZhbHVlO1xuXG4gICAgfVxuICAgIHB1YmxpYyBnZXQgbWluV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9kZWZhdWx0TWluV2lkdGggPyB0aGlzLmRlZmF1bHRNaW5XaWR0aCA6IHRoaXMuX2RlZmF1bHRNaW5XaWR0aDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGdldCByZXNvbHZlZFdpZHRoKCk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxheW91dENoaWxkKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNBdXRvV2lkdGggPSB0aGlzLl93aWR0aCAmJiB0eXBlb2YgdGhpcy5fd2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMuX3dpZHRoID09PSAnYXV0byc7XG4gICAgICAgIHJldHVybiBpc0F1dG9XaWR0aCA/IHRoaXMud2lkdGggOiB0aGlzLmNhbGNQaXhlbFdpZHRoICsgJ3B4JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gaW5kZXguXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBjb2x1bW5JbmRleCA9IHRoaXMuY29sdW1uLmluZGV4O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmdyaWQgYXMgYW55KS5fY29sdW1ucy5pbmRleE9mKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIGBwaW5uZWRgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNQaW5uZWQgPSB0aGlzLmNvbHVtbi5waW5uZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIGdldCBwaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9waW5uZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgY29sdW1uIGlzIHBpbm5lZC5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFtwaW5uZWRdID0gXCJ0cnVlXCI+PC9pZ3gtY29sdW1uPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogVHdvLXdheSBkYXRhIGJpbmRpbmcuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIFsocGlubmVkKV0gPSBcIm1vZGVsLmNvbHVtbnNbMF0uaXNQaW5uZWRcIj48L2lneC1jb2x1bW4+XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBwaW5uZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuX3Bpbm5lZCAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQXV0b1dpZHRoID0gdGhpcy53aWR0aCAmJiB0eXBlb2YgdGhpcy53aWR0aCA9PT0gJ3N0cmluZycgJiYgdGhpcy53aWR0aCA9PT0gJ2ZpdC1jb250ZW50JztcbiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy53aWR0aCAmJiAoaXNBdXRvV2lkdGggfHwgIWlzTmFOKHBhcnNlSW50KHRoaXMud2lkdGgsIDEwKSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGluKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnBpbigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBObyBncmlkL3dpZHRoIGF2YWlsYWJsZSBhdCBpbml0aWFsaXphdGlvbi4gYGluaXRQaW5uaW5nYCBpbiB0aGUgZ3JpZFxuICAgICAgICAgICAgICAgd2lsbCByZS1pbml0IHRoZSBncm91cCAoaWYgcHJlc2VudClcbiAgICAgICAgICAgICovXG4gICAgICAgICAgICB0aGlzLl9waW5uZWQgPSB2YWx1ZTtcbiAgICAgICAgICAgIHRoaXMucGlubmVkQ2hhbmdlLmVtaXQodGhpcy5fcGlubmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNvbHVtbiBgc3VtbWFyaWVzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtblN1bW1hcmllcyA9IHRoaXMuY29sdW1uLnN1bW1hcmllcztcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcyh0cnVlKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJpZXMoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N1bW1hcmllcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBzdW1tYXJpZXNgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbi5zdW1tYXJpZXMgPSBJZ3hOdW1iZXJTdW1tYXJ5T3BlcmFuZDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHN1bW1hcmllcyhjbGFzc1JlZjogYW55KSB7XG4gICAgICAgIGlmIChpc0NvbnN0cnVjdG9yKGNsYXNzUmVmKSkge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyaWVzID0gbmV3IGNsYXNzUmVmKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVtb3ZlU3VtbWFyaWVzQ2FjaGVQZXJDb2x1bW4odGhpcy5maWVsZCk7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVBpcGVUcmlnZ2VyKys7XG4gICAgICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UucmVzZXRTdW1tYXJ5SGVpZ2h0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGBmaWx0ZXJzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmNvbHVtbi5maWx0ZXJzJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmaWx0ZXJzKCk6IElneEZpbHRlcmluZ09wZXJhbmQge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsdGVycztcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBmaWx0ZXJzYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4uZmlsdGVycyA9IElneEJvb2xlYW5GaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCkuXG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJzKGluc3RhbmNlOiBJZ3hGaWx0ZXJpbmdPcGVyYW5kKSB7XG4gICAgICAgIHRoaXMuX2ZpbHRlcnMgPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGBzb3J0U3RyYXRlZ3lgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc29ydFN0cmF0ZWd5ID0gdGhpcy5jb2x1bW4uc29ydFN0cmF0ZWd5XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNvcnRTdHJhdGVneSgpOiBJU29ydGluZ1N0cmF0ZWd5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRTdHJhdGVneTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29sdW1uIGBzb3J0U3RyYXRlZ3lgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmNvbHVtbi5zb3J0U3RyYXRlZ3kgPSBuZXcgQ3VzdG9tU29ydGluZ1N0cmF0ZWd5KCkuXG4gICAgICogY2xhc3MgQ3VzdG9tU29ydGluZ1N0cmF0ZWd5IGV4dGVuZHMgU29ydGluZ1N0cmF0ZWd5IHsuLi59XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBzb3J0U3RyYXRlZ3koY2xhc3NSZWY6IElTb3J0aW5nU3RyYXRlZ3kpIHtcbiAgICAgICAgdGhpcy5fc29ydFN0cmF0ZWd5ID0gY2xhc3NSZWY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgdmFsdWVzIGZvciBncm91cGluZy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGdyb3VwaW5nQ29tcGFyZXIgPSB0aGlzLmNvbHVtbi5ncm91cGluZ0NvbXBhcmVyJ1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBncm91cGluZ0NvbXBhcmVyKCk6IChhOiBhbnksIGI6IGFueSwgY3VyclJlYz86IGFueSwgZ3JvdXBSZWM/OiBhbnkpID0+IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ncm91cGluZ0NvbXBhcmVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIGEgY3VzdG9tIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdmFsdWVzIGZvciBncm91cGluZy5cbiAgICAgKiBTdWJzZXF1ZW50IHZhbHVlcyBpbiB0aGUgc29ydGVkIGRhdGEgdGhhdCB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIGZvciBhcmUgZ3JvdXBlZC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5jb2x1bW4uZ3JvdXBpbmdDb21wYXJlciA9IChhOiBhbnksIGI6IGFueSwgY3VyclJlYz86IGFueSwgZ3JvdXBSZWM/OiBhbnkpID0+IHsgcmV0dXJuIGEgPT09IGIgPyAwIDogLTE7IH1cbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGdyb3VwaW5nQ29tcGFyZXIoZnVuY1JlZjogKGE6IGFueSwgYjogYW55LCBjdXJyUmVjPzogYW55LCBncm91cFJlYz86IGFueSkgPT4gbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2dyb3VwaW5nQ29tcGFyZXIgPSBmdW5jUmVmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IG1pbmltdW0gYHdpZHRoYCBvZiB0aGUgY29sdW1uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGVmYXVsdE1pbldpZHRoID0gIHRoaXMuY29sdW1uLmRlZmF1bHRNaW5XaWR0aDtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGRlZmF1bHRNaW5XaWR0aCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXRoaXMuZ3JpZCkge1xuICAgICAgICAgICAgcmV0dXJuICc4MCc7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0aGlzLmdyaWQuZGlzcGxheURlbnNpdHkpIHtcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29zeTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzY0JztcbiAgICAgICAgICAgIGNhc2UgRGlzcGxheURlbnNpdHkuY29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJzU2JztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICc4MCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYHN1bW1hcnlUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBzdW1tYXJ5VGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5zdW1tYXJ5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzdW1tYXJ5VGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4U3VtbWFyeVRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3VtbWFyeVRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdW1tYXJ5IHRlbXBsYXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI3N1bW1hcnlUZW1wbGF0ZSBpZ3hTdW1tYXJ5IGxldC1zdW1tYXJ5UmVzdWx0cz5cbiAgICAgKiAgICA8cD57eyBzdW1tYXJ5UmVzdWx0c1swXS5sYWJlbCB9fToge3sgc3VtbWFyeVJlc3VsdHNbMF0uc3VtbWFyeVJlc3VsdCB9fTwvcD5cbiAgICAgKiAgICA8cD57eyBzdW1tYXJ5UmVzdWx0c1sxXS5sYWJlbCB9fToge3sgc3VtbWFyeVJlc3VsdHNbMV0uc3VtbWFyeVJlc3VsdCB9fTwvcD5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ3N1bW1hcnlUZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIHN1bW1hcnlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmNvbHVtbi5zdW1tYXJ5VGVtcGxhdGUgPSB0aGlzLnN1bW1hcnlUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHN1bW1hcnlUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4U3VtbWFyeVRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fc3VtbWFyeVRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYGJvZHlUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBib2R5VGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5ib2R5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgnY2VsbFRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGJvZHlUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ib2R5VGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGJvZHkgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjYm9keVRlbXBsYXRlIGlneENlbGwgbGV0LXZhbD5cbiAgICAgKiAgICA8ZGl2IHN0eWxlID0gXCJiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3dncmVlblwiIChjbGljaykgPSBcImNoYW5nZUNvbG9yKHZhbClcIj5cbiAgICAgKiAgICAgICA8c3Bhbj4ge3t2YWx9fSA8L3NwYW4+XG4gICAgICogICAgPC9kaXY+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidib2R5VGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBib2R5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5jb2x1bW4uYm9keVRlbXBsYXRlID0gdGhpcy5ib2R5VGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBib2R5VGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENlbGxUZW1wbGF0ZUNvbnRleHQ+KSB7XG4gICAgICAgIHRoaXMuX2JvZHlUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgdGVtcGxhdGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBoZWFkZXJUZW1wbGF0ZSA9IHRoaXMuY29sdW1uLmhlYWRlclRlbXBsYXRlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKClcbiAgICBAV2F0Y2hDb2x1bW5DaGFuZ2VzKClcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgaGVhZGVyVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9oZWFkZXJUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgaGVhZGVyIHRlbXBsYXRlLlxuICAgICAqIE5vdGUgdGhhdCB0aGUgY29sdW1uIGhlYWRlciBoZWlnaHQgaXMgZml4ZWQgYW5kIGFueSBjb250ZW50IGJpZ2dlciB0aGFuIGl0IHdpbGwgYmUgY3V0IG9mZi5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlICNoZWFkZXJUZW1wbGF0ZT5cbiAgICAgKiAgIDxkaXYgc3R5bGUgPSBcImJhY2tncm91bmQtY29sb3I6YmxhY2tcIiAoY2xpY2spID0gXCJjaGFuZ2VDb2xvcih2YWwpXCI+XG4gICAgICogICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIiA+e3tjb2x1bW4uZmllbGR9fTwvc3Bhbj5cbiAgICAgKiAgIDwvZGl2PlxuICAgICAqIDwvbmctdGVtcGxhdGU+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoXCInaGVhZGVyVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBoZWFkZXJUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgICAgKiB0aGlzLmNvbHVtbi5oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBoZWFkZXJUZW1wbGF0ZSh0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbmxpbmUgZWRpdG9yIHRlbXBsYXRlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaW5saW5lRWRpdG9yVGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KCdjZWxsRWRpdG9yVGVtcGxhdGUnKVxuICAgIHB1YmxpYyBnZXQgaW5saW5lRWRpdG9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5saW5lRWRpdG9yVGVtcGxhdGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGlubGluZSBlZGl0b3IgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSAjaW5saW5lRWRpdG9yVGVtcGxhdGUgaWd4Q2VsbEVkaXRvciBsZXQtY2VsbD1cImNlbGxcIj5cbiAgICAgKiAgICAgPGlucHV0IHR5cGU9XCJzdHJpbmdcIiBbKG5nTW9kZWwpXT1cImNlbGwudmFsdWVcIi8+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidpbmxpbmVFZGl0b3JUZW1wbGF0ZSdcIiwge3JlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gICAgICogcHVibGljIGlubGluZUVkaXRvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuY29sdW1uLmlubGluZUVkaXRvclRlbXBsYXRlID0gdGhpcy5pbmxpbmVFZGl0b3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGlubGluZUVkaXRvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9pbmxpbmVFZGl0b3JUZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHZhbGlkYXRpb24gZXJyb3IgdGVtcGxhdGUuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBlcnJvclRlbXBsYXRlID0gdGhpcy5jb2x1bW4uZXJyb3JUZW1wbGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAbm90aWZ5Q2hhbmdlcygpXG4gICAgQFdhdGNoQ29sdW1uQ2hhbmdlcygpXG4gICAgQElucHV0KCdlcnJvclRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGVycm9yVGVtcGxhdGUoKTogVGVtcGxhdGVSZWY8SWd4Q2VsbFRlbXBsYXRlQ29udGV4dD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3JUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZXJyb3IgdGVtcGxhdGUuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSBpZ3hDZWxsVmFsaWRhdGlvbkVycm9yIGxldC1jZWxsPVwiY2VsbFwiICNlcnJvclRlbXBsYXRlID5cbiAgICAgKiAgICAgPGRpdiAqbmdJZj1cImNlbGwudmFsaWRhdGlvbi5lcnJvcnM/LlsnZm9yYmlkZGVuTmFtZSddXCI+XG4gICAgICogICAgICBUaGlzIG5hbWUgaXMgZm9yYmlkZGVuLlxuICAgICAqICAgICA8L2Rpdj5cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBAVmlld0NoaWxkKFwiJ2Vycm9yVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBlcnJvclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAgICAqIHRoaXMuY29sdW1uLmVycm9yVGVtcGxhdGUgPSB0aGlzLmVycm9yVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBlcnJvclRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDZWxsVGVtcGxhdGVDb250ZXh0Pikge1xuICAgICAgICB0aGlzLl9lcnJvclRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgYGZpbHRlckNlbGxUZW1wbGF0ZWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBmaWx0ZXJDZWxsVGVtcGxhdGUgPSB0aGlzLmNvbHVtbi5maWx0ZXJDZWxsVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgnZmlsdGVyQ2VsbFRlbXBsYXRlJylcbiAgICBwdWJsaWMgZ2V0IGZpbHRlckNlbGxUZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxJZ3hDb2x1bW5UZW1wbGF0ZUNvbnRleHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlckNlbGxUZW1wbGF0ZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcXVpY2sgZmlsdGVyIHRlbXBsYXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUgI2ZpbHRlckNlbGxUZW1wbGF0ZSBJZ3hGaWx0ZXJDZWxsVGVtcGxhdGUgbGV0LWNvbHVtbj1cImNvbHVtblwiPlxuICAgICAqICAgIDxpbnB1dCAoaW5wdXQpPVwib25JbnB1dCgpXCI+XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIidmaWx0ZXJDZWxsVGVtcGxhdGUnXCIsIHtyZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICAgICAqIHB1YmxpYyBmaWx0ZXJDZWxsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gICAgICogdGhpcy5jb2x1bW4uZmlsdGVyQ2VsbFRlbXBsYXRlID0gdGhpcy5maWx0ZXJDZWxsVGVtcGxhdGU7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBmaWx0ZXJDZWxsVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENvbHVtblRlbXBsYXRlQ29udGV4dD4pIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyQ2VsbFRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY2VsbHMgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkNlbGxzID0gdGhpcy5jb2x1bW4uY2VsbHM7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNlbGxzKCk6IENlbGxUeXBlW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmRhdGFWaWV3XG4gICAgICAgICAgICAubWFwKChyZWMsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdyaWQuaXNHcm91cEJ5UmVjb3JkKHJlYykgJiYgIXRoaXMuZ3JpZC5pc1N1bW1hcnlSb3cocmVjKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyaWQucGFnaW5nTW9kZSA9PT0gMSAmJiB0aGlzLmdyaWQucGFnZSAhPT0gMCA/IGluZGV4ID0gaW5kZXggKyB0aGlzLmdyaWQucGVyUGFnZSAqIHRoaXMuZ3JpZC5wYWdlIDogaW5kZXggPSB0aGlzLmdyaWQuZGF0YVJvd0xpc3QuZmlyc3QuaW5kZXggKyBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IG5ldyBJZ3hHcmlkQ2VsbCh0aGlzLmdyaWQgYXMgYW55LCBpbmRleCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmZpbHRlcihjZWxsID0+IGNlbGwpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IF9jZWxscygpOiBDZWxsVHlwZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5yb3dMaXN0LmZpbHRlcigocm93KSA9PiByb3cgaW5zdGFuY2VvZiBJZ3hSb3dEaXJlY3RpdmUpXG4gICAgICAgICAgICAubWFwKChyb3cpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocm93Ll9jZWxscykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm93Ll9jZWxscy5maWx0ZXIoKGNlbGwpID0+IGNlbGwuY29sdW1uSW5kZXggPT09IHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnJlZHVjZSgoYSwgYikgPT4gYS5jb25jYXQoYiksIFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBjb2x1bW4gdmlzaWJsZSBpbmRleC5cbiAgICAgKiBJZiB0aGUgY29sdW1uIGlzIG5vdCB2aXNpYmxlLCByZXR1cm5zIGAtMWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCB2aXNpYmxlQ29sdW1uSW5kZXggPSAgdGhpcy5jb2x1bW4udmlzaWJsZUluZGV4O1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgdmlzaWJsZUluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNOYU4odGhpcy5fdkluZGV4KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZJbmRleDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bnBpbm5lZENvbHVtbnMgPSB0aGlzLmdyaWQudW5waW5uZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgY29uc3QgcGlubmVkQ29sdW1ucyA9IHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmZpbHRlcihjID0+ICFjLmNvbHVtbkdyb3VwKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgIGxldCBjb2wgPSB0aGlzO1xuICAgICAgICBsZXQgdkluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uR3JvdXApIHtcbiAgICAgICAgICAgIGNvbCA9IHRoaXMuYWxsQ2hpbGRyZW4uZmlsdGVyKGMgPT4gIWMuY29sdW1uR3JvdXAgJiYgIWMuaGlkZGVuKVswXSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uTGF5b3V0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlblZpc2libGVJbmRleGVzLmZpbmQoeCA9PiB4LmNvbHVtbiA9PT0gdGhpcykuaW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGlubmVkKSB7XG4gICAgICAgICAgICBjb25zdCBpbmRleEluQ29sbGVjdGlvbiA9IHVucGlubmVkQ29sdW1ucy5pbmRleE9mKGNvbCk7XG4gICAgICAgICAgICB2SW5kZXggPSBpbmRleEluQ29sbGVjdGlvbiA9PT0gLTEgP1xuICAgICAgICAgICAgICAgIC0xIDpcbiAgICAgICAgICAgICAgICAodGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgP1xuICAgICAgICAgICAgICAgICAgICBwaW5uZWRDb2x1bW5zLmxlbmd0aCArIGluZGV4SW5Db2xsZWN0aW9uIDpcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhJbkNvbGxlY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaW5kZXhJbkNvbGxlY3Rpb24gPSBwaW5uZWRDb2x1bW5zLmluZGV4T2YoY29sKTtcbiAgICAgICAgICAgIHZJbmRleCA9IHRoaXMuZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0ID9cbiAgICAgICAgICAgICAgICBpbmRleEluQ29sbGVjdGlvbiA6XG4gICAgICAgICAgICAgICAgdW5waW5uZWRDb2x1bW5zLmxlbmd0aCArIGluZGV4SW5Db2xsZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ZJbmRleCA9IHZJbmRleDtcbiAgICAgICAgcmV0dXJuIHZJbmRleDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2x1bW4gaXMgYSBgQ29sdW1uR3JvdXBgLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgY29sdW1uR3JvdXAgPSAgdGhpcy5jb2x1bW4uY29sdW1uR3JvdXA7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb2x1bW5Hcm91cCgpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIHRoZSBjb2x1bW4gaXMgYSBgQ29sdW1uTGF5b3V0YCBmb3IgbXVsdGktcm93IGxheW91dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkdyb3VwID0gIHRoaXMuY29sdW1uLmNvbHVtbkdyb3VwO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uTGF5b3V0KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiB0aGUgY29sdW1uIGlzIGEgY2hpbGQgb2YgYSBgQ29sdW1uTGF5b3V0YCBmb3IgbXVsdGktcm93IGxheW91dC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkxheW91dENoaWxkID0gIHRoaXMuY29sdW1uLmNvbHVtbkxheW91dENoaWxkO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29sdW1uTGF5b3V0Q2hpbGQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5jb2x1bW5MYXlvdXQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXQgYWxsQ2hpbGRyZW4oKTogSWd4Q29sdW1uQ29tcG9uZW50W10ge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxldmVsIG9mIHRoZSBjb2x1bW4gaW4gYSBjb2x1bW4gZ3JvdXAuXG4gICAgICogUmV0dXJucyBgMGAgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IGhhdmUgYSBgcGFyZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkxldmVsID0gIHRoaXMuY29sdW1uLmxldmVsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbGV2ZWwoKSB7XG4gICAgICAgIGxldCBwdHIgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgbGV0IGx2bCA9IDA7XG5cbiAgICAgICAgd2hpbGUgKHB0cikge1xuICAgICAgICAgICAgbHZsKys7XG4gICAgICAgICAgICBwdHIgPSBwdHIucGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdmw7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXQgaXNMYXN0UGlubmVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgJiZcbiAgICAgICAgICAgIHRoaXMuZ3JpZC5waW5uZWRDb2x1bW5zW3RoaXMuZ3JpZC5waW5uZWRDb2x1bW5zLmxlbmd0aCAtIDFdID09PSB0aGlzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgZ2V0IGlzRmlyc3RQaW5uZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHBpbm5lZENvbHMgPSB0aGlzLmdyaWQucGlubmVkQ29sdW1ucy5maWx0ZXIoeCA9PiAheC5jb2x1bW5Hcm91cCk7XG4gICAgICAgIHJldHVybiAhdGhpcy5ncmlkLmlzUGlubmluZ1RvU3RhcnQgJiYgcGlubmVkQ29sc1swXSA9PT0gdGhpcztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGdldCByaWdodFBpbm5lZE9mZnNldCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5waW5uZWQgJiYgIXRoaXMuZ3JpZC5pc1Bpbm5pbmdUb1N0YXJ0ID9cbiAgICAgICAgICAgIC0gdGhpcy5ncmlkLnBpbm5lZFdpZHRoIC0gdGhpcy5ncmlkLmhlYWRlckZlYXR1cmVzV2lkdGggKyAncHgnIDpcbiAgICAgICAgICAgIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBncmlkUm93U3BhbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yb3dFbmQgJiYgdGhpcy5yb3dTdGFydCA/IHRoaXMucm93RW5kIC0gdGhpcy5yb3dTdGFydCA6IDE7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgZ3JpZENvbHVtblNwYW4oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sRW5kICYmIHRoaXMuY29sU3RhcnQgPyB0aGlzLmNvbEVuZCAtIHRoaXMuY29sU3RhcnQgOiAxO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gd2lsbCBiZSB2aXNpYmxlIHdoZW4gaXRzIHBhcmVudCBpcyBjb2xsYXBzZWQuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqICAgPGlneC1jb2x1bW4gW3Zpc2libGVXaGVuQ29sbGFwc2VkXT1cInRydWVcIj48L2lneC1jb2x1bW4+XG4gICAgICogPC9pZ3gtY29sdW1uLWdyb3VwPlxuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIEBub3RpZnlDaGFuZ2VzKHRydWUpXG4gICAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXG4gICAgcHVibGljIHNldCB2aXNpYmxlV2hlbkNvbGxhcHNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl92aXNpYmxlV2hlbkNvbGxhcHNlZCA9IHZhbHVlO1xuICAgICAgICB0aGlzLnZpc2libGVXaGVuQ29sbGFwc2VkQ2hhbmdlLmVtaXQodGhpcy5fdmlzaWJsZVdoZW5Db2xsYXBzZWQpO1xuICAgICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50LnNldEV4cGFuZENvbGxhcHNlU3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmlzaWJsZVdoZW5Db2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aXNpYmxlV2hlbkNvbGxhcHNlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmVtYXJrc1xuICAgICAqIFBhc3Mgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgRGF0ZVBpcGUgYW5kL29yIERlY2ltYWxQaXBlIHRvIGZvcm1hdCB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgZGF0ZSBhbmQgbnVtZXJpYyBjb2x1bW5zLlxuICAgICAqIEFjY2VwdHMgYW4gYElDb2x1bW5QaXBlQXJnc2Agb2JqZWN0IHdpdGggYW55IG9mIHRoZSBgZm9ybWF0YCwgYHRpbWV6b25lYCBhbmQgYGRpZ2l0c0luZm9gIHByb3BlcnRpZXMuXG4gICAgICogRm9yIG1vcmUgZGV0YWlscyBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24vRGF0ZVBpcGUgYW5kIGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29tbW9uL0RlY2ltYWxQaXBlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgcGlwZUFyZ3M6IElDb2x1bW5QaXBlQXJncyA9IHtcbiAgICAgKiAgICAgIGZvcm1hdDogJ2xvbmdEYXRlJyxcbiAgICAgKiAgICAgIHRpbWV6b25lOiAnVVRDJyxcbiAgICAgKiAgICAgIGRpZ2l0c0luZm86ICcxLjEtMidcbiAgICAgKiB9XG4gICAgICogYGBgXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtY29sdW1uIGRhdGFUeXBlPVwiZGF0ZVwiIFtwaXBlQXJnc109XCJwaXBlQXJnc1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiA8aWd4LWNvbHVtbiBkYXRhVHlwZT1cIm51bWJlclwiIFtwaXBlQXJnc109XCJwaXBlQXJnc1wiPjwvaWd4LWNvbHVtbj5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgQG5vdGlmeUNoYW5nZXMoKVxuICAgIEBXYXRjaENvbHVtbkNoYW5nZXMoKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBwaXBlQXJncyh2YWx1ZTogSUNvbHVtblBpcGVBcmdzKSB7XG4gICAgICAgIHRoaXMuX2NvbHVtblBpcGVBcmdzID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jb2x1bW5QaXBlQXJncywgdmFsdWUpO1xuICAgICAgICB0aGlzLmdyaWQuc3VtbWFyeVNlcnZpY2UuY2xlYXJTdW1tYXJ5Q2FjaGUoKTtcbiAgICAgICAgdGhpcy5ncmlkLnBpcGVUcmlnZ2VyKys7XG4gICAgfVxuICAgIHB1YmxpYyBnZXQgcGlwZUFyZ3MoKTogSUNvbHVtblBpcGVBcmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblBpcGVBcmdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNvbGxhcHNpYmxlKCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgY29sbGFwc2libGUoX3ZhbHVlOiBib29sZWFuKSB7IH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGV4cGFuZGVkKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcHVibGljIHNldCBleHBhbmRlZChfdmFsdWU6IGJvb2xlYW4pIHsgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBkZWZhdWx0V2lkdGg6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2lkdGhTZXRCeVVzZXI6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGhhc05lc3RlZFBhdGg6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGRlZmF1bHRUaW1lRm9ybWF0ID0gJ2hoOm1tOnNzIHR0JztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVmYXVsdERhdGVUaW1lRm9ybWF0ID0gJ2RkL01NL3l5eXkgSEg6bW06c3MgdHQnO1xuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBmaWx0ZXJpbmdFeHByZXNzaW9uc1RyZWUgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IHRyZWUgPSAgdGhpcy5jb2x1bW4uZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlKCk6IEZpbHRlcmluZ0V4cHJlc3Npb25zVHJlZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlLmZpbmQodGhpcy5maWVsZCkgYXMgRmlsdGVyaW5nRXhwcmVzc2lvbnNUcmVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIHBhcmVudCBjb2x1bW4uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBwYXJlbnRDb2x1bW4gPSB0aGlzLmNvbHVtbi5wYXJlbnQ7XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uLnBhcmVudCA9IGhpZ2hlckxldmVsQ29sdW1uO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJlbnQgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgY2hpbGRyZW4gY29sdW1ucy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbkNoaWxkcmVuID0gdGhpcy5jb2x1bW4uY2hpbGRyZW47XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMuY29sdW1uLmNoaWxkcmVuID0gY2hpbGRyZW5Db2x1bW5zO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBjaGlsZHJlbjogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGFueT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2FwcGx5U2VsZWN0YWJsZUNsYXNzID0gZmFsc2U7XG5cbiAgICBwcm90ZWN0ZWQgX3ZJbmRleCA9IE5hTjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9waW5uZWQgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9ib2R5VGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENlbGxUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2Vycm9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENlbGxUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2hlYWRlclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxJZ3hDb2x1bW5UZW1wbGF0ZUNvbnRleHQ+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3N1bW1hcnlUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4U3VtbWFyeVRlbXBsYXRlQ29udGV4dD47XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaW5saW5lRWRpdG9yVGVtcGxhdGU6IFRlbXBsYXRlUmVmPElneENlbGxUZW1wbGF0ZUNvbnRleHQ+O1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlckNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8SWd4Q29sdW1uVGVtcGxhdGVDb250ZXh0PjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zdW1tYXJpZXMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZpbHRlcnMgPSBudWxsO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3NvcnRTdHJhdGVneTogSVNvcnRpbmdTdHJhdGVneSA9IERlZmF1bHRTb3J0aW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9ncm91cGluZ0NvbXBhcmVyOiAoYTogYW55LCBiOiBhbnksIGN1cnJSZWM/OiBhbnksIGdyb3VwUmVjPzogYW55KSA9PiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGlkZGVuID0gZmFsc2U7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaW5kZXg6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlUGlubmluZyA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3dpZHRoOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfZGVmYXVsdE1pbldpZHRoID0gJyc7XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfaGFzU3VtbWFyeSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2VkaXRhYmxlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2dyb3VwYWJsZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqICBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF92aXNpYmxlV2hlbkNvbGxhcHNlZDtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9jb2xsYXBzaWJsZSA9IGZhbHNlO1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2V4cGFuZGVkID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIF9zZWxlY3RhYmxlID0gdHJ1ZTtcbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldCBpc1ByaW1hcnlDb2x1bW4oKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZpZWxkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5ncmlkICE9PSB1bmRlZmluZWQgJiYgdGhpcy5maWVsZCA9PT0gdGhpcy5ncmlkLnByaW1hcnlLZXk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZmllbGQ6IHN0cmluZztcbiAgICBwcml2YXRlIF9jYWxjV2lkdGggPSBudWxsO1xuICAgIHByaXZhdGUgX2NvbHVtblBpcGVBcmdzOiBJQ29sdW1uUGlwZUFyZ3MgPSB7IGRpZ2l0c0luZm86IERFRkFVTFRfRElHSVRTX0lORk8gfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KElHWF9HUklEX0JBU0UpIHB1YmxpYyBncmlkOiBHcmlkVHlwZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IFZhbGlkYXRvcltdLFxuICAgICAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcm90ZWN0ZWQgcGxhdGZvcm06IFBsYXRmb3JtVXRpbCxcbiAgICApIHtcbiAgICAgICAgdGhpcy52YWxpZGF0b3JzID0gX3ZhbGlkYXRvcnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyByZXNldENhY2hlcygpIHtcbiAgICAgICAgdGhpcy5fdkluZGV4ID0gTmFOO1xuICAgICAgICBpZiAodGhpcy5ncmlkKSB7XG4gICAgICAgICAgICB0aGlzLmNhY2hlQ2FsY1dpZHRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN1bW1hcnlUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fc3VtbWFyeVRlbXBsYXRlID0gdGhpcy5zdW1tYXJ5VGVtcGxhdGVEaXJlY3RpdmUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2VsbFRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl9ib2R5VGVtcGxhdGUgPSB0aGlzLmNlbGxUZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jZWxsVmFsaWRhdGlvbkVycm9yVGVtcGxhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2Vycm9yVGVtcGxhdGUgPSB0aGlzLmNlbGxWYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZS50ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oZWFkVGVtcGxhdGUgJiYgdGhpcy5oZWFkVGVtcGxhdGUubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuaGVhZFRlbXBsYXRlLnRvQXJyYXkoKVswXS50ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5lZGl0b3JUZW1wbGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5faW5saW5lRWRpdG9yVGVtcGxhdGUgPSB0aGlzLmVkaXRvclRlbXBsYXRlLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZpbHRlckNlbGxUZW1wbGF0ZURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy5fZmlsdGVyQ2VsbFRlbXBsYXRlID0gdGhpcy5maWx0ZXJDZWxsVGVtcGxhdGVEaXJlY3RpdmUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jb2x1bW5QaXBlQXJncy5mb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbHVtblBpcGVBcmdzLmZvcm1hdCA9IHRoaXMuZGF0YVR5cGUgPT09IEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lID9cbiAgICAgICAgICAgICAgICBERUZBVUxUX1RJTUVfRk9STUFUIDogdGhpcy5kYXRhVHlwZSA9PT0gR3JpZENvbHVtbkRhdGFUeXBlLkRhdGVUaW1lID9cbiAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9EQVRFX1RJTUVfRk9STUFUIDogREVGQVVMVF9EQVRFX0ZPUk1BVDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuc3VtbWFyaWVzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJpZXMgPSBJZ3hOdW1iZXJTdW1tYXJ5T3BlcmFuZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJpZXMgPSBJZ3hEYXRlU3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlRpbWU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzID0gSWd4VGltZVN1bW1hcnlPcGVyYW5kO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyaWVzID0gSWd4U3VtbWFyeU9wZXJhbmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5maWx0ZXJzKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuZGF0YVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5Cb29sZWFuOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBJZ3hCb29sZWFuRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5OdW1iZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuQ3VycmVuY3k6XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuUGVyY2VudDpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gSWd4TnVtYmVyRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBJZ3hEYXRlRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5UaW1lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBJZ3hUaW1lRmlsdGVyaW5nT3BlcmFuZC5pbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIEdyaWRDb2x1bW5EYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gSWd4RGF0ZVRpbWVGaWx0ZXJpbmdPcGVyYW5kLmluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgR3JpZENvbHVtbkRhdGFUeXBlLkltYWdlOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBHcmlkQ29sdW1uRGF0YVR5cGUuU3RyaW5nOlxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IElneFN0cmluZ0ZpbHRlcmluZ09wZXJhbmQuaW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldEdyaWRUZW1wbGF0ZShpc1JvdzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgICAgIGlmIChpc1Jvdykge1xuICAgICAgICAgICAgY29uc3Qgcm93c0NvdW50ID0gIXRoaXMuZ3JpZC5pc1Bpdm90ID8gdGhpcy5ncmlkLm11bHRpUm93TGF5b3V0Um93U2l6ZSA6IHRoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIHJldHVybiBgcmVwZWF0KCR7cm93c0NvdW50fSwxZnIpYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbHVtblNpemVzU3RyaW5nKHRoaXMuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gQGludGVybmFsICoqL1xuICAgIHB1YmxpYyBnZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyhjaGlsZHJlbjogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pOiBBcnJheTxNUkxDb2x1bW5TaXplSW5mbz4ge1xuICAgICAgICBjb25zdCBjb2x1bW5TaXplczogTVJMQ29sdW1uU2l6ZUluZm9bXSA9IFtdO1xuICAgICAgICAvLyBmaW5kIHRoZSBzbWFsbGVzdCBjb2wgc3BhbnNcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaChjb2wgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb2wuY29sU3RhcnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuZXdXaWR0aFNldCA9IGNvbC53aWR0aFNldEJ5VXNlciAmJiBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXSAmJiAhY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0ud2lkdGhTZXRCeVVzZXI7XG4gICAgICAgICAgICBjb25zdCBuZXdTcGFuU21hbGxlciA9IGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdICYmIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdLmNvbFNwYW4gPiBjb2wuZ3JpZENvbHVtblNwYW47XG4gICAgICAgICAgICBjb25zdCBib3RoV2lkdGhzU2V0ID0gY29sLndpZHRoU2V0QnlVc2VyICYmIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdICYmIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdLndpZHRoU2V0QnlVc2VyO1xuICAgICAgICAgICAgY29uc3QgYm90aFdpZHRoc05vdFNldCA9ICFjb2wud2lkdGhTZXRCeVVzZXIgJiYgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0gJiYgIWNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdLndpZHRoU2V0QnlVc2VyO1xuXG4gICAgICAgICAgICBpZiAoY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIElmIG5vdGhpbmcgaXMgZGVmaW5lZCB5ZXQgdGFrZSBhbnkgY29sdW1uIGF0IGZpcnN0XG4gICAgICAgICAgICAgICAgLy8gV2UgdXNlIGNvbEVuZCB0byBrbm93IHdoZXJlIHRoZSBjb2x1bW4gYWN0dWFsbHkgZW5kcywgYmVjYXVzZSBub3QgYWx3YXlzIGl0IHN0YXJ0cyB3aGVyZSB3ZSBoYXZlIGl0IHNldCBpbiBjb2x1bW5TaXplcy5cbiAgICAgICAgICAgICAgICBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiBjb2wsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb2wud2lkdGggPT09ICdmaXQtY29udGVudCcgPyBjb2wuYXV0b1NpemUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sLndpZHRoU2V0QnlVc2VyIHx8IHRoaXMuZ3JpZC5jb2x1bW5XaWR0aFNldEJ5VXNlciA/IHBhcnNlSW50KGNvbC5jYWxjV2lkdGgsIDEwKSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbFNwYW46IGNvbC5ncmlkQ29sdW1uU3BhbixcbiAgICAgICAgICAgICAgICAgICAgY29sRW5kOiBjb2wuY29sU3RhcnQgKyBjb2wuZ3JpZENvbHVtblNwYW4sXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoU2V0QnlVc2VyOiBjb2wud2lkdGhTZXRCeVVzZXJcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdXaWR0aFNldCB8fCAobmV3U3BhblNtYWxsZXIgJiYgKChib3RoV2lkdGhzU2V0KSB8fCAoYm90aFdpZHRoc05vdFNldCkpKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGEgY29sdW1uIGlzIHNldCBhbHJlYWR5IGl0IHNob3VsZCBlaXRoZXIgbm90IGhhdmUgd2lkdGggZGVmaW5lZCBvciBoYXZlIHdpZHRoIHdpdGggYmlnZ2VyIHNwYW4gdGhhbiB0aGUgbmV3IG9uZS5cblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqICBJZiByZXBsYWNlZCBjb2x1bW4gaGFzIGJpZ2dlciBzcGFuLCB3ZSB3YW50IHRvIGZpbGwgdGhlIHJlbWFpbmluZyBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICogIHRoYXQgdGhlIHJlcGxhY2luZyBjb2x1bW4gZG9lcyBub3QgZmlsbCB3aXRoIHRoZSBvbGQgb25lLlxuICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGlmIChib3RoV2lkdGhzU2V0ICYmIG5ld1NwYW5TbWFsbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGZyb20gd2hlcmUgdGhlIG5ldyBjb2x1bW4gc2V0IHdvdWxkIGVuZCBhbmQgYXBwbHkgdGhlIG9sZCBjb2x1bW4gdG8gdGhlIHJlc3QgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIGl0IHNwYW5zLlxuICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdCB5ZXQgcmVwbGFjZWQgaXQgc28gd2UgY2FuIHVzZSBpdCBkaXJlY3RseSBmcm9tIHRoZSBjb2x1bW5TaXplcyBjb2xsZWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIGNvbEVuZCBpcyB1c2VkIGJlY2F1c2UgdGhlIGNvbFN0YXJ0IG9mIHRoZSBvbGQgY29sdW1uIGlzIG5vdCBhY3R1YWxseSBpICsgMS5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNvbC5jb2xTdGFydCAtIDEgKyBjb2wuZ3JpZENvbHVtblNwYW47IGkgPCBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS5jb2xFbmQgLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sdW1uU2l6ZXNbaV0gfHwgIWNvbHVtblNpemVzW2ldLndpZHRoU2V0QnlVc2VyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0gPSBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvbGQgY29sdW1uIHdpdGggdGhlIG5ldyBvbmUuXG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbY29sLmNvbFN0YXJ0IC0gMV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZjogY29sLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogY29sLndpZHRoID09PSAnZml0LWNvbnRlbnQnID8gY29sLmF1dG9TaXplIDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbC53aWR0aFNldEJ5VXNlciB8fCB0aGlzLmdyaWQuY29sdW1uV2lkdGhTZXRCeVVzZXIgPyBwYXJzZUludChjb2wuY2FsY1dpZHRoLCAxMCkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiBjb2wuZ3JpZENvbHVtblNwYW4sXG4gICAgICAgICAgICAgICAgICAgIGNvbEVuZDogY29sLmNvbFN0YXJ0ICsgY29sLmdyaWRDb2x1bW5TcGFuLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aFNldEJ5VXNlcjogY29sLndpZHRoU2V0QnlVc2VyXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYm90aFdpZHRoc1NldCAmJiBjb2x1bW5TaXplc1tjb2wuY29sU3RhcnQgLSAxXS5jb2xTcGFuIDwgY29sLmdyaWRDb2x1bW5TcGFuKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbHVtbiBhbHJlYWR5IGluIHRoZSBjb2x1bW5TaXplcyBoYXMgc21hbGxlciBzcGFuLCB3ZSBzdGlsbCBuZWVkIHRvIGZpbGwgYW55IGVtcHR5IHBsYWNlcyB3aXRoIHRoZSBjdXJyZW50IGNvbC5cbiAgICAgICAgICAgICAgICAvLyBTdGFydCBmcm9tIHdoZXJlIHRoZSBzbWFsbGVyIGNvbHVtbiBzZXQgd291bGQgZW5kIGFuZCBhcHBseSB0aGUgYmlnZ2VyIGNvbHVtbiB0byB0aGUgcmVzdCBkZXBlbmRpbmcgb24gaG93IG11Y2ggaXQgc3BhbnMuXG4gICAgICAgICAgICAgICAgLy8gU2luY2UgaGVyZSB3ZSBkbyBub3QgaGF2ZSBpdCBpbiBjb2x1bW5TaXplcyB3ZSBzZXQgaXQgYXMgYSBuZXcgY29sdW1uIGtlZXBpbmcgdGhlIHNhbWUgY29sU3Bhbi5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gY29sLmNvbFN0YXJ0IC0gMSArIGNvbHVtblNpemVzW2NvbC5jb2xTdGFydCAtIDFdLmNvbFNwYW47IGkgPCBjb2wuY29sU3RhcnQgLSAxICsgY29sLmdyaWRDb2x1bW5TcGFuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5TaXplc1tpXSB8fCAhY29sdW1uU2l6ZXNbaV0ud2lkdGhTZXRCeVVzZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjogY29sLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBjb2wud2lkdGggPT09ICdmaXQtY29udGVudCcgPyBjb2wuYXV0b1NpemUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wud2lkdGhTZXRCeVVzZXIgfHwgdGhpcy5ncmlkLmNvbHVtbldpZHRoU2V0QnlVc2VyID8gcGFyc2VJbnQoY29sLmNhbGNXaWR0aCwgMTApIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiBjb2wuZ3JpZENvbHVtblNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRW5kOiBjb2wuY29sU3RhcnQgKyBjb2wuZ3JpZENvbHVtblNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhTZXRCeVVzZXI6IGNvbC53aWR0aFNldEJ5VXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBGbGF0dGVuIGNvbHVtblNpemVzIHNvIHRoZXJlIGFyZSBub3QgY29sdW1ucyB3aXRoIGNvbFNwYW4gPiAxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1uU2l6ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjb2x1bW5TaXplc1tpXSAmJiBjb2x1bW5TaXplc1tpXS5jb2xTcGFuID4gMSkge1xuICAgICAgICAgICAgICAgIGxldCBqID0gMTtcblxuICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgYWxsIGVtcHR5IHBsYWNlcyBkZXBlbmRpbmcgb24gaG93IG11Y2ggdGhlIGN1cnJlbnQgY29sdW1uIHNwYW5zIHN0YXJ0aW5nIGZyb20gbmV4dCBjb2wuXG4gICAgICAgICAgICAgICAgZm9yICg7IGogPCBjb2x1bW5TaXplc1tpXS5jb2xTcGFuICYmIGkgKyBqICsgMSA8IGNvbHVtblNpemVzW2ldLmNvbEVuZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5TaXplc1tpICsgal0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICgoIWNvbHVtblNpemVzW2ldLndpZHRoICYmIGNvbHVtblNpemVzW2kgKyBqXS53aWR0aCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIWNvbHVtblNpemVzW2ldLndpZHRoICYmICFjb2x1bW5TaXplc1tpICsgal0ud2lkdGggJiYgY29sdW1uU2l6ZXNbaSArIGpdLmNvbFNwYW4gPD0gY29sdW1uU2l6ZXNbaV0uY29sU3BhbikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISFjb2x1bW5TaXplc1tpICsgal0ud2lkdGggJiYgY29sdW1uU2l6ZXNbaSArIGpdLmNvbFNwYW4gPD0gY29sdW1uU2l6ZXNbaV0uY29sU3BhbikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCBhbiBhbHJlYWR5IGRlZmluZWQgY29sdW1uIHRoYXQgaGFzIHdpZHRoIGFuZCB0aGUgY3VycmVudCBkb2Vzbid0IGhhdmUgb3JcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZWFjaGVkIGNvbHVtbiBoYXMgYmlnZ2VyIGNvbFNwYW4gd2Ugc3RvcC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjb2x1bW5TaXplc1tpXS53aWR0aFNldEJ5VXNlciA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0ud2lkdGggLyBjb2x1bW5TaXplc1tpXS5jb2xTcGFuIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5TaXplc1tpXS53aWR0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblNpemVzW2kgKyBqXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IGNvbHVtblNpemVzW2ldLnJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xTcGFuOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbEVuZDogY29sdW1uU2l6ZXNbaV0uY29sRW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoU2V0QnlVc2VyOiBjb2x1bW5TaXplc1tpXS53aWR0aFNldEJ5VXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY3VycmVudCBjb2x1bW4gd2lkdGggc28gaXQgaXMgZGl2aWRlZCBiZXR3ZWVuIGFsbCBjb2x1bW5zIGl0IHNwYW5zIGFuZCBzZXQgaXQgdG8gMS5cbiAgICAgICAgICAgICAgICBjb2x1bW5TaXplc1tpXS53aWR0aCA9IGNvbHVtblNpemVzW2ldLndpZHRoU2V0QnlVc2VyID9cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0ud2lkdGggLyBjb2x1bW5TaXplc1tpXS5jb2xTcGFuIDpcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0ud2lkdGg7XG4gICAgICAgICAgICAgICAgY29sdW1uU2l6ZXNbaV0uY29sU3BhbiA9IDE7XG5cbiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGluZGV4IGJhc2VkIG9uIGhvdyBtdWNoIHdlIGhhdmUgcmVwbGFjZWQuIFN1YnRyYWN0IDEgYmVjYXVzZSB3ZSBzdGFydGVkIGZyb20gMS5cbiAgICAgICAgICAgICAgICBpICs9IGogLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbHVtblNpemVzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqKi9cbiAgICBwdWJsaWMgZ2V0RmlsbGVkQ2hpbGRDb2x1bW5TaXplcyhjaGlsZHJlbjogUXVlcnlMaXN0PElneENvbHVtbkNvbXBvbmVudD4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgY29sdW1uU2l6ZXMgPSB0aGlzLmdldEluaXRpYWxDaGlsZENvbHVtblNpemVzKGNoaWxkcmVuKTtcblxuICAgICAgICAvLyBmaWxsIHRoZSBnYXBzIGlmIHRoZXJlIGFyZSBhbnlcbiAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHNpemUgb2YgY29sdW1uU2l6ZXMpIHtcbiAgICAgICAgICAgIGlmIChzaXplICYmICEhc2l6ZS53aWR0aCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHNpemUud2lkdGggKyAncHgnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQodGhpcy5ncmlkLmdldFBvc3NpYmxlQ29sdW1uV2lkdGgoKSwgMTApICsgJ3B4Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKiovXG4gICAgcHVibGljIGdldFJlc2l6YWJsZUNvbFVuZGVyRW5kKCk6IE1STFJlc2l6ZUNvbHVtbkluZm9bXSB7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxheW91dCB8fCAhdGhpcy5jb2x1bW5MYXlvdXRDaGlsZCB8fCB0aGlzLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3sgdGFyZ2V0OiB0aGlzLCBzcGFuVXNlZDogMSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbHVtblNpemVkID0gdGhpcy5nZXRJbml0aWFsQ2hpbGRDb2x1bW5TaXplcyh0aGlzLnBhcmVudC5jaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IHRhcmdldHM6IE1STFJlc2l6ZUNvbHVtbkluZm9bXSA9IFtdO1xuICAgICAgICBjb25zdCBjb2xFbmQgPSB0aGlzLmNvbEVuZCA/IHRoaXMuY29sRW5kIDogdGhpcy5jb2xTdGFydCArIDE7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5TaXplZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuY29sU3RhcnQgPD0gaSArIDEgJiYgaSArIDEgPCBjb2xFbmQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRzLnB1c2goeyB0YXJnZXQ6IGNvbHVtblNpemVkW2ldLnJlZiwgc3BhblVzZWQ6IDEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0YXJnZXRzU3F1YXNoZWQ6IE1STFJlc2l6ZUNvbHVtbkluZm9bXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgICAgICAgICBpZiAodGFyZ2V0c1NxdWFzaGVkLmxlbmd0aCAmJiB0YXJnZXRzU3F1YXNoZWRbdGFyZ2V0c1NxdWFzaGVkLmxlbmd0aCAtIDFdLnRhcmdldC5maWVsZCA9PT0gdGFyZ2V0LnRhcmdldC5maWVsZCkge1xuICAgICAgICAgICAgICAgIHRhcmdldHNTcXVhc2hlZFt0YXJnZXRzU3F1YXNoZWQubGVuZ3RoIC0gMV0uc3BhblVzZWQrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0c1NxdWFzaGVkLnB1c2godGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXRzU3F1YXNoZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGlucyB0aGUgY29sdW1uIGF0IHRoZSBwcm92aWRlZCBpbmRleCBpbiB0aGUgcGlubmVkIGFyZWEuXG4gICAgICogRGVmYXVsdHMgdG8gaW5kZXggYDBgIGlmIG5vdCBwcm92aWRlZCwgb3IgdG8gdGhlIGluaXRpYWwgaW5kZXggaW4gdGhlIHBpbm5lZCBhcmVhLlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb2x1bW4gaXMgc3VjY2Vzc2Z1bGx5IHBpbm5lZC4gUmV0dXJucyBgZmFsc2VgIGlmIHRoZSBjb2x1bW4gY2Fubm90IGJlIHBpbm5lZC5cbiAgICAgKiBDb2x1bW4gY2Fubm90IGJlIHBpbm5lZCBpZjpcbiAgICAgKiAtIElzIGFscmVhZHkgcGlubmVkXG4gICAgICogLSBpbmRleCBhcmd1bWVudCBpcyBvdXQgb2YgcmFuZ2VcbiAgICAgKiAtIFRoZSBwaW5uZWQgYXJlYSBleGNlZWRzIDgwJSBvZiB0aGUgZ3JpZCB3aWR0aFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc3VjY2VzcyA9IHRoaXMuY29sdW1uLnBpbigpO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBwaW4oaW5kZXg/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLy8gVE9ETzogUHJvYmFibHkgc2hvdWxkIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgb2xkIGZ1bmN0aW9uc1xuICAgICAgICAvLyBzaG91bGQgYmUgbW92ZWQgYXMgYSBldmVudCBwYXJhbWV0ZXIuXG4gICAgICAgIGNvbnN0IGdyaWQgPSAodGhpcy5ncmlkIGFzIGFueSk7XG4gICAgICAgIGlmICh0aGlzLl9waW5uZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBhcmVudCAmJiAhdGhpcy5wYXJlbnQucGlubmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b3BMZXZlbFBhcmVudC5waW4oaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFzSW5kZXggPSBpbmRleCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaGFzSW5kZXggJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGdyaWQucGlubmVkQ29sdW1ucy5sZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucGFyZW50ICYmICF0aGlzLnBpbm5hYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb290UGlubmVkQ29scyA9IGdyaWQuX3Bpbm5lZENvbHVtbnMuZmlsdGVyKChjKSA9PiBjLmxldmVsID09PSAwKTtcbiAgICAgICAgaW5kZXggPSBoYXNJbmRleCA/IGluZGV4IDogcm9vdFBpbm5lZENvbHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBhcmdzOiBJUGluQ29sdW1uQ2FuY2VsbGFibGVFdmVudEFyZ3MgPSB7IGNvbHVtbjogdGhpcywgaW5zZXJ0QXRJbmRleDogaW5kZXgsIGlzUGlubmVkOiBmYWxzZSwgY2FuY2VsOiBmYWxzZSB9O1xuICAgICAgICB0aGlzLmdyaWQuY29sdW1uUGluLmVtaXQoYXJncyk7XG5cbiAgICAgICAgaWYgKGFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdyaWQuY3J1ZFNlcnZpY2UuZW5kRWRpdChmYWxzZSk7XG5cbiAgICAgICAgdGhpcy5fcGlubmVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5waW5uZWRDaGFuZ2UuZW1pdCh0aGlzLl9waW5uZWQpO1xuICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IGluZGV4IGlzIHRoZSBsYXN0IHBvc2l0aW9uLCBzbyB3aWxsIG5lZWQgdG8gZmluZCB0YXJnZXQgY29sdW1uIGJ5IFtpbmRleC0xXVxuICAgICAgICBjb25zdCB0YXJnZXRDb2x1bW4gPSBhcmdzLmluc2VydEF0SW5kZXggPT09IGdyaWQuX3Bpbm5lZENvbHVtbnMubGVuZ3RoID9cbiAgICAgICAgICAgIGdyaWQuX3Bpbm5lZENvbHVtbnNbYXJncy5pbnNlcnRBdEluZGV4IC0gMV0gOiBncmlkLl9waW5uZWRDb2x1bW5zW2FyZ3MuaW5zZXJ0QXRJbmRleF07XG5cbiAgICAgICAgaWYgKGdyaWQuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmICghZ3JpZC5oYXNDb2x1bW5Hcm91cHMpIHtcbiAgICAgICAgICAgICAgICBncmlkLl9waW5uZWRDb2x1bW5zLnNwbGljZShhcmdzLmluc2VydEF0SW5kZXgsIDAsIHRoaXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpbnNlcnQgYmFzZWQgb25seSBvbiByb290IGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICByb290UGlubmVkQ29scy5zcGxpY2UoYXJncy5pbnNlcnRBdEluZGV4LCAwLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsUGlubmVkID0gW107XG4gICAgICAgICAgICAgICAgLy8gcmUtY3JlYXRlIGhpZXJhcmNoeVxuICAgICAgICAgICAgICAgIHJvb3RQaW5uZWRDb2xzLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhbGxQaW5uZWQucHVzaChncm91cCk7XG4gICAgICAgICAgICAgICAgICAgIGFsbFBpbm5lZCA9IGFsbFBpbm5lZC5jb25jYXQoZ3JvdXAuYWxsQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGdyaWQuX3Bpbm5lZENvbHVtbnMgPSBhbGxQaW5uZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChncmlkLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbkNvdW50ID0gdGhpcy5hbGxDaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZ3JpZC5fdW5waW5uZWRDb2x1bW5zLnNwbGljZShncmlkLl91bnBpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzKSwgMSArIGNoaWxkcmVuQ291bnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0luZGV4KSB7XG4gICAgICAgICAgICBpbmRleCA9PT0gZ3JpZC5fcGlubmVkQ29sdW1ucy5sZW5ndGggLSAxID9cbiAgICAgICAgICAgICAgICBncmlkLl9tb3ZlQ29sdW1ucyh0aGlzLCB0YXJnZXRDb2x1bW4sIERyb3BQb3NpdGlvbi5BZnRlckRyb3BUYXJnZXQpIDogZ3JpZC5fbW92ZUNvbHVtbnModGhpcywgdGFyZ2V0Q29sdW1uLCBEcm9wUG9zaXRpb24uQmVmb3JlRHJvcFRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb2x1bW5Hcm91cCkge1xuICAgICAgICAgICAgdGhpcy5hbGxDaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IGNoaWxkLnBpbigpKTtcbiAgICAgICAgICAgIGdyaWQucmVpbml0UGluU3RhdGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLnJlc2V0Q2FjaGVzKCk7XG4gICAgICAgIGdyaWQubm90aWZ5Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5jb2x1bW5MYXlvdXRDaGlsZCkge1xuICAgICAgICAgICAgdGhpcy5ncmlkLmNvbHVtbnMuZmlsdGVyKHggPT4geC5jb2x1bW5MYXlvdXQpLmZvckVhY2goeCA9PiB4LnBvcHVsYXRlVmlzaWJsZUluZGV4ZXMoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5ncmlkLmZpbHRlcmluZ1NlcnZpY2UucmVmcmVzaEV4cHJlc3Npb25zKCk7XG4gICAgICAgIGNvbnN0IGV2ZW50QXJnczogSVBpbkNvbHVtbkV2ZW50QXJncyA9IHsgY29sdW1uOiB0aGlzLCBpbnNlcnRBdEluZGV4OiBpbmRleCwgaXNQaW5uZWQ6IHRydWUgfTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblBpbm5lZC5lbWl0KGV2ZW50QXJncyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVbnBpbnMgdGhlIGNvbHVtbiBhbmQgcGxhY2UgaXQgYXQgdGhlIHByb3ZpZGVkIGluZGV4IGluIHRoZSB1bnBpbm5lZCBhcmVhLlxuICAgICAqIERlZmF1bHRzIHRvIGluZGV4IGAwYCBpZiBub3QgcHJvdmlkZWQsIG9yIHRvIHRoZSBpbml0aWFsIGluZGV4IGluIHRoZSB1bnBpbm5lZCBhcmVhLlxuICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBjb2x1bW4gaXMgc3VjY2Vzc2Z1bGx5IHVucGlubmVkLiBSZXR1cm5zIGBmYWxzZWAgaWYgdGhlIGNvbHVtbiBjYW5ub3QgYmUgdW5waW5uZWQuXG4gICAgICogQ29sdW1uIGNhbm5vdCBiZSB1bnBpbm5lZCBpZjpcbiAgICAgKiAtIElzIGFscmVhZHkgdW5waW5uZWRcbiAgICAgKiAtIGluZGV4IGFyZ3VtZW50IGlzIG91dCBvZiByYW5nZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgc3VjY2VzcyA9IHRoaXMuY29sdW1uLnVucGluKCk7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHVucGluKGluZGV4PzogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGdyaWQgPSAodGhpcy5ncmlkIGFzIGFueSk7XG4gICAgICAgIGlmICghdGhpcy5fcGlubmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQucGlubmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b3BMZXZlbFBhcmVudC51bnBpbihpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaGFzSW5kZXggPSBpbmRleCAhPT0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaGFzSW5kZXggJiYgKGluZGV4IDwgMCB8fCBpbmRleCA+IGdyaWQuX3VucGlubmVkQ29sdW1ucy5sZW5ndGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc3RpbWF0ZSB0aGUgZXhhY3QgaW5kZXggYXQgd2hpY2ggY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWRcbiAgICAgICAgLy8gdGFrZXMgaW50byBhY2NvdW50IGluaXRpYWwgdW5waW5uZWQgaW5kZXggb2YgdGhlIGNvbHVtblxuICAgICAgICBpZiAoIWhhc0luZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBpbmRpY2VzID0gZ3JpZC51bnBpbm5lZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuaW5kZXgpO1xuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKHRoaXMuaW5kZXgpO1xuICAgICAgICAgICAgaW5kaWNlcy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgICAgICAgICBpbmRleCA9IGluZGljZXMuaW5kZXhPZih0aGlzLmluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFyZ3M6IElQaW5Db2x1bW5DYW5jZWxsYWJsZUV2ZW50QXJncyA9IHsgY29sdW1uOiB0aGlzLCBpbnNlcnRBdEluZGV4OiBpbmRleCwgaXNQaW5uZWQ6IHRydWUsIGNhbmNlbDogZmFsc2UgfTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblBpbi5lbWl0KGFyZ3MpO1xuXG4gICAgICAgIGlmIChhcmdzLmNhbmNlbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ncmlkLmNydWRTZXJ2aWNlLmVuZEVkaXQoZmFsc2UpO1xuXG4gICAgICAgIHRoaXMuX3Bpbm5lZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBpbm5lZENoYW5nZS5lbWl0KHRoaXMuX3Bpbm5lZCk7XG5cbiAgICAgICAgLy8gaXQgaXMgcG9zc2libGUgdGhhdCBpbmRleCBpcyB0aGUgbGFzdCBwb3NpdGlvbiwgc28gd2lsbCBuZWVkIHRvIGZpbmQgdGFyZ2V0IGNvbHVtbiBieSBbaW5kZXgtMV1cbiAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gYXJncy5pbnNlcnRBdEluZGV4ID09PSBncmlkLl91bnBpbm5lZENvbHVtbnMubGVuZ3RoID9cbiAgICAgICAgICAgIGdyaWQuX3VucGlubmVkQ29sdW1uc1thcmdzLmluc2VydEF0SW5kZXggLSAxXSA6IGdyaWQuX3VucGlubmVkQ29sdW1uc1thcmdzLmluc2VydEF0SW5kZXhdO1xuXG4gICAgICAgIGlmICghaGFzSW5kZXgpIHtcbiAgICAgICAgICAgIGdyaWQuX3VucGlubmVkQ29sdW1ucy5zcGxpY2UoaW5kZXgsIDAsIHRoaXMpO1xuICAgICAgICAgICAgaWYgKGdyaWQuX3Bpbm5lZENvbHVtbnMuaW5kZXhPZih0aGlzKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBncmlkLl9waW5uZWRDb2x1bW5zLnNwbGljZShncmlkLl9waW5uZWRDb2x1bW5zLmluZGV4T2YodGhpcyksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc0luZGV4KSB7XG4gICAgICAgICAgICBncmlkLm1vdmVDb2x1bW4odGhpcywgdGFyZ2V0Q29sdW1uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLmFsbENoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gY2hpbGQudW5waW4oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBncmlkLnJlaW5pdFBpblN0YXRlcygpO1xuICAgICAgICBncmlkLnJlc2V0Q2FjaGVzKCk7XG5cbiAgICAgICAgZ3JpZC5ub3RpZnlDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLmNvbHVtbkxheW91dENoaWxkKSB7XG4gICAgICAgICAgICB0aGlzLmdyaWQuY29sdW1ucy5maWx0ZXIoeCA9PiB4LmNvbHVtbkxheW91dCkuZm9yRWFjaCh4ID0+IHgucG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdyaWQuZmlsdGVyaW5nU2VydmljZS5yZWZyZXNoRXhwcmVzc2lvbnMoKTtcblxuICAgICAgICB0aGlzLmdyaWQuY29sdW1uUGlubmVkLmVtaXQoeyBjb2x1bW46IHRoaXMsIGluc2VydEF0SW5kZXg6IGluZGV4LCBpc1Bpbm5lZDogZmFsc2UgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBjb2x1bW4gdG8gdGhlIHNwZWNpZmllZCB2aXNpYmxlIGluZGV4LlxuICAgICAqIElmIHBhc3NlZCBpbmRleCBpcyBpbnZhbGlkLCBvciBpZiBjb2x1bW4gd291bGQgcmVjZWl2ZSBhIGRpZmZlcmVudCB2aXNpYmxlIGluZGV4IGFmdGVyIG1vdmluZywgbW92aW5nIGlzIG5vdCBwZXJmb3JtZWQuXG4gICAgICogSWYgcGFzc2VkIGluZGV4IHdvdWxkIG1vdmUgdGhlIGNvbHVtbiB0byBhIGRpZmZlcmVudCBjb2x1bW4gZ3JvdXAuIG1vdmluZyBpcyBub3QgcGVyZm9ybWVkLlxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29sdW1uLm1vdmUoaW5kZXgpO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbW92ZShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGxldCB0YXJnZXQ7XG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5ncmlkLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlSW5kZXggPiAtMSk7XG4gICAgICAgIC8vIGdyaWQgbGFzdCB2aXNpYmxlIGluZGV4XG4gICAgICAgIGNvbnN0IGxpID0gY29sdW1ucy5tYXAoYyA9PiBjLnZpc2libGVJbmRleCkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSk7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICBjb25zdCBpc1ByZWNlZGluZyA9IHRoaXMudmlzaWJsZUluZGV4IDwgaW5kZXg7XG5cbiAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLnZpc2libGVJbmRleCB8fCBpbmRleCA8IDAgfHwgaW5kZXggPiBsaSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgY29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gYy5sZXZlbCA+PSB0aGlzLmxldmVsICYmIGMgIT09IHRoaXMgJiYgYy5wYXJlbnQgIT09IHRoaXMgJiZcbiAgICAgICAgICAgICAgICBjLnRvcExldmVsUGFyZW50ID09PSB0aGlzLnRvcExldmVsUGFyZW50KTtcbiAgICAgICAgfVxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG4gICAgICAgIC8vIElmIGlzUHJlY2VkaW5nLCBmaW5kIGEgdGFyZ2V0IHN1Y2ggdGhhdCB3aGVuIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBwbGFjZWQgYWZ0ZXIgaXQsIGN1cnJlbnQgY29sdW1tbiB3aWxsIHJlY2VpdmUgYSB2aXNpYmxlSW5kZXggPT09IGluZGV4LiBUaGlzIHRha2VzIGludG8gYWNjb3VudCB2aXNpYmxlIGNoaWxkcmVuIG9mIHRoZSBjb2x1bW5zLlxuICAgICAgICAvLyBJZiAhaXNQcmVjZWRpbmcsIGZpbmRzIGEgY29sdW1uIG9mIHRoZSBzYW1lIGxldmVsIGFuZCB2aXNpYmxlIGluZGV4IHRoYXQgZXF1YWxzIHRoZSBwYXNzZWQgaW5kZXggYWd1bWVudCAoYy52aXNpYmxlSW5kZXggPT09IGluZGV4KS4gTm8gbmVlZCB0byBjb25zaWRlciB0aGUgY2hpbGRyZW4gaGVyZS5cbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG4gICAgICAgIGlmIChpc1ByZWNlZGluZykge1xuICAgICAgICAgICAgY29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKGMgPT4gYy52aXNpYmxlSW5kZXggPiB0aGlzLnZpc2libGVJbmRleCk7XG4gICAgICAgICAgICB0YXJnZXQgPSBjb2x1bW5zLmZpbmQoYyA9PiBjLmxldmVsID09PSB0aGlzLmxldmVsICYmIGMudmlzaWJsZUluZGV4ICsgKGMgYXMgYW55KS5jYWxjQ2hpbGRyZW4oKSAtIHRoaXMuY2FsY0NoaWxkcmVuKCkgPT09IGluZGV4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihjID0+IGMudmlzaWJsZUluZGV4IDwgdGhpcy52aXNpYmxlSW5kZXgpO1xuICAgICAgICAgICAgdGFyZ2V0ID0gY29sdW1ucy5maW5kKGMgPT4gYy5sZXZlbCA9PT0gdGhpcy5sZXZlbCAmJiBjLnZpc2libGVJbmRleCA9PT0gaW5kZXgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0YXJnZXQgfHwgKHRhcmdldC5waW5uZWQgJiYgdGhpcy5kaXNhYmxlUGlubmluZykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcyA9IGlzUHJlY2VkaW5nID8gRHJvcFBvc2l0aW9uLkFmdGVyRHJvcFRhcmdldCA6IERyb3BQb3NpdGlvbi5CZWZvcmVEcm9wVGFyZ2V0O1xuICAgICAgICB0aGlzLmdyaWQubW92ZUNvbHVtbih0aGlzLCB0YXJnZXQgYXMgSWd4Q29sdW1uQ29tcG9uZW50LCBwb3MpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vIGNoaWxkcmVuIGZvciB0aGUgY29sdW1uLCBzbyB3aWxsIHJldHVybnMgMSBvciAwLCBpZiB0aGUgY29sdW1uIGlzIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2FsY0NoaWxkcmVuKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5oaWRkZW4gPyAwIDogMTtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgY29sdW1uIHZpYmlzaWxpdHkgYW5kIGVtaXRzIHRoZSByZXNwZWN0aXZlIGV2ZW50LlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVWaXNpYmlsaXR5KHZhbHVlPzogYm9vbGVhbikge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID8/ICF0aGlzLmhpZGRlbjtcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzOiBJQ29sdW1uVmlzaWJpbGl0eUNoYW5naW5nRXZlbnRBcmdzID0geyBjb2x1bW46IHRoaXMsIG5ld1ZhbHVlLCBjYW5jZWw6IGZhbHNlIH07XG4gICAgICAgIHRoaXMuZ3JpZC5jb2x1bW5WaXNpYmlsaXR5Q2hhbmdpbmcuZW1pdChldmVudEFyZ3MpO1xuXG4gICAgICAgIGlmIChldmVudEFyZ3MuY2FuY2VsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRkZW4gPSBuZXdWYWx1ZTtcbiAgICAgICAgdGhpcy5ncmlkLmNvbHVtblZpc2liaWxpdHlDaGFuZ2VkLmVtaXQoeyBjb2x1bW46IHRoaXMsIG5ld1ZhbHVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHRvcCBsZXZlbCBwYXJlbnQgY29sdW1uLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdG9wTGV2ZWxQYXJlbnQgPSAgdGhpcy5jb2x1bW4udG9wTGV2ZWxQYXJlbnQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCB0b3BMZXZlbFBhcmVudCgpIHtcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbHRlcihjID0+IGMuZmllbGQgPT09ICdJRCcpWzBdO1xuICAgICAqIGxldCBoZWFkZXJDZWxsID0gY29sdW1uLmhlYWRlckNlbGw7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBoZWFkZXJDZWxsKCk6IElneEdyaWRIZWFkZXJDb21wb25lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5ncmlkLmhlYWRlckNlbGxMaXN0LmZpbmQoKGhlYWRlcikgPT4gaGVhZGVyLmNvbHVtbiA9PT0gdGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZmlsdGVyIGNlbGwgb2YgdGhlIGNvbHVtbi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbHRlcihjID0+IGMuZmllbGQgPT09ICdJRCcpWzBdO1xuICAgICAqIGxldCBmaWx0ZXJlbGwgPSBjb2x1bW4uZmlsdGVyZWxsO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsdGVyQ2VsbCgpOiBJZ3hHcmlkRmlsdGVyaW5nQ2VsbENvbXBvbmVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmdyaWQuZmlsdGVyQ2VsbExpc3QuZmluZCgoZmlsdGVyQ2VsbCkgPT4gZmlsdGVyQ2VsbC5jb2x1bW4gPT09IHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGhlYWRlciBncm91cCBvZiB0aGUgY29sdW1uLlxuICAgICAqXG4gICAgICogQG1lbWJlcm9mIElneENvbHVtbkNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaGVhZGVyR3JvdXAoKTogSWd4R3JpZEhlYWRlckdyb3VwQ29tcG9uZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5oZWFkZXJHcm91cHNMaXN0LmZpbmQoZ3JvdXAgPT4gZ3JvdXAuY29sdW1uID09PSB0aGlzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBdXRvc2l6ZSB0aGUgY29sdW1uIHRvIHRoZSBsb25nZXN0IGN1cnJlbnRseSB2aXNpYmxlIGNlbGwgdmFsdWUsIGluY2x1ZGluZyB0aGUgaGVhZGVyIGNlbGwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ2dyaWQnKSBncmlkOiBJZ3hHcmlkQ29tcG9uZW50O1xuICAgICAqIGxldCBjb2x1bW4gPSB0aGlzLmdyaWQuY29sdW1uTGlzdC5maWx0ZXIoYyA9PiBjLmZpZWxkID09PSAnSUQnKVswXTtcbiAgICAgKiBjb2x1bW4uYXV0b3NpemUoKTtcbiAgICAgKiBgYGBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJvZiBJZ3hDb2x1bW5Db21wb25lbnRcbiAgICAgKiBAcGFyYW0gYnlIZWFkZXJPbmx5IFNldCBpZiBjb2x1bW4gc2hvdWxkIGJlIGF1dG9zaXplZCBiYXNlZCBvbmx5IG9uIHRoZSBoZWFkZXIgY29udGVudC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXV0b3NpemUoYnlIZWFkZXJPbmx5ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbHVtbkdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5nZXRBdXRvU2l6ZShieUhlYWRlck9ubHkpO1xuICAgICAgICAgICAgdGhpcy5ncmlkLnJlZmxvdygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBdXRvU2l6ZShieUhlYWRlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9ICFieUhlYWRlciA/IHRoaXMuZ2V0TGFyZ2VzdENlbGxXaWR0aCgpIDpcbiAgICAgICAgICAgIChPYmplY3QudmFsdWVzKHRoaXMuZ2V0SGVhZGVyQ2VsbFdpZHRocygpKS5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSArICdweCcpO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IHRoaXMud2lkdGggJiYgdHlwZW9mIHRoaXMud2lkdGggPT09ICdzdHJpbmcnICYmIHRoaXMud2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcblxuICAgICAgICBsZXQgbmV3V2lkdGg7XG4gICAgICAgIGlmIChpc1BlcmNlbnRhZ2VXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgZ3JpZEF2YWlsYWJsZVNpemUgPSB0aGlzLmdyaWQuY2FsY1dpZHRoO1xuICAgICAgICAgICAgY29uc3QgcGVyY2VudGFnZVNpemUgPSBwYXJzZUZsb2F0KHNpemUpIC8gZ3JpZEF2YWlsYWJsZVNpemUgKiAxMDA7XG4gICAgICAgICAgICBuZXdXaWR0aCA9IHBlcmNlbnRhZ2VTaXplICsgJyUnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBzaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWF4V2lkdGggPSBpc1BlcmNlbnRhZ2VXaWR0aCA/IHRoaXMubWF4V2lkdGhQZXJjZW50IDogdGhpcy5tYXhXaWR0aFB4O1xuICAgICAgICBjb25zdCBtaW5XaWR0aCA9IGlzUGVyY2VudGFnZVdpZHRoID8gdGhpcy5taW5XaWR0aFBlcmNlbnQgOiB0aGlzLm1pbldpZHRoUHg7XG4gICAgICAgIGlmICh0aGlzLm1heFdpZHRoICYmIChwYXJzZUZsb2F0KG5ld1dpZHRoKSA+IG1heFdpZHRoKSkge1xuICAgICAgICAgICAgbmV3V2lkdGggPSBpc1BlcmNlbnRhZ2VXaWR0aCA/IG1heFdpZHRoICsgJyUnIDogbWF4V2lkdGggKyAncHgnO1xuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQobmV3V2lkdGgpIDwgbWluV2lkdGgpIHtcbiAgICAgICAgICAgIG5ld1dpZHRoID0gaXNQZXJjZW50YWdlV2lkdGggPyBtaW5XaWR0aCArICclJyA6IG1pbldpZHRoICsgJ3B4JztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXdXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldENhbGNXaWR0aCgpOiBhbnkge1xuICAgICAgICBpZiAodGhpcy5fY2FsY1dpZHRoICYmICFpc05hTih0aGlzLmNhbGNQaXhlbFdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGNXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhY2hlQ2FsY1dpZHRoKCk7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxjV2lkdGg7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmV0dXJucyB0aGUgd2lkdGggYW5kIHBhZGRpbmcgb2YgYSBoZWFkZXIgY2VsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SGVhZGVyQ2VsbFdpZHRocygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZC5nZXRIZWFkZXJDZWxsV2lkdGgodGhpcy5oZWFkZXJDZWxsLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSZXR1cm5zIHRoZSBzaXplIChpbiBwaXhlbHMpIG9mIHRoZSBsb25nZXN0IGN1cnJlbnRseSB2aXNpYmxlIGNlbGwsIGluY2x1ZGluZyB0aGUgaGVhZGVyIGNlbGwuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIEBWaWV3Q2hpbGQoJ2dyaWQnKSBncmlkOiBJZ3hHcmlkQ29tcG9uZW50O1xuICAgICAqXG4gICAgICogbGV0IGNvbHVtbiA9IHRoaXMuZ3JpZC5jb2x1bW5MaXN0LmZpbHRlcihjID0+IGMuZmllbGQgPT09ICdJRCcpWzBdO1xuICAgICAqIGxldCBzaXplID0gY29sdW1uLmdldExhcmdlc3RDZWxsV2lkdGgoKTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4Q29sdW1uQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldExhcmdlc3RDZWxsV2lkdGgoKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLmdyaWQuZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgY29uc3QgbGFyZ2VzdCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX2NlbGxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxzQ29udGVudFdpZHRocyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY2VsbHMuZm9yRWFjaCgoY2VsbCkgPT4gY2VsbHNDb250ZW50V2lkdGhzLnB1c2goY2VsbC5jYWxjdWxhdGVTaXplVG9GaXQocmFuZ2UpKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gY2VsbHNDb250ZW50V2lkdGhzLmluZGV4T2YoTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKSk7XG4gICAgICAgICAgICBjb25zdCBjZWxsU3R5bGUgPSB0aGlzLmdyaWQuZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9jZWxsc1tpbmRleF0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICBjb25zdCBjZWxsUGFkZGluZyA9IHBhcnNlRmxvYXQoY2VsbFN0eWxlLnBhZGRpbmdMZWZ0KSArIHBhcnNlRmxvYXQoY2VsbFN0eWxlLnBhZGRpbmdSaWdodCkgK1xuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoY2VsbFN0eWxlLmJvcmRlckxlZnRXaWR0aCkgKyBwYXJzZUZsb2F0KGNlbGxTdHlsZS5ib3JkZXJSaWdodFdpZHRoKTtcblxuICAgICAgICAgICAgbGFyZ2VzdC5zZXQoTWF0aC5tYXgoLi4uY2VsbHNDb250ZW50V2lkdGhzKSwgY2VsbFBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaGVhZGVyQ2VsbCAmJiB0aGlzLmF1dG9zaXplSGVhZGVyKSB7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJDZWxsV2lkdGhzID0gdGhpcy5nZXRIZWFkZXJDZWxsV2lkdGhzKCk7XG4gICAgICAgICAgICBsYXJnZXN0LnNldChoZWFkZXJDZWxsV2lkdGhzLndpZHRoLCBoZWFkZXJDZWxsV2lkdGhzLnBhZGRpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFyZ2VzdENlbGwgPSBNYXRoLm1heCguLi5BcnJheS5mcm9tKGxhcmdlc3Qua2V5cygpKSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gTWF0aC5jZWlsKGxhcmdlc3RDZWxsICsgbGFyZ2VzdC5nZXQobGFyZ2VzdENlbGwpKTtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHdpZHRoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMud2lkdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gd2lkdGggKyAncHgnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDZWxsV2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGNvbFdpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgY29uc3QgaXNQZXJjZW50YWdlV2lkdGggPSBjb2xXaWR0aCAmJiB0eXBlb2YgY29sV2lkdGggPT09ICdzdHJpbmcnICYmIGNvbFdpZHRoLmluZGV4T2YoJyUnKSAhPT0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuY29sdW1uTGF5b3V0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2xXaWR0aCAmJiAhaXNQZXJjZW50YWdlV2lkdGgpIHtcblxuICAgICAgICAgICAgbGV0IGNlbGxXaWR0aCA9IGNvbFdpZHRoO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBjZWxsV2lkdGggIT09ICdzdHJpbmcnIHx8IGNlbGxXaWR0aC5lbmRzV2l0aCgncHgnKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjZWxsV2lkdGggKz0gJ3B4JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNlbGxXaWR0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb2xXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcG9wdWxhdGVWaXNpYmxlSW5kZXhlcygpIHsgfVxuXG4gICAgcHJvdGVjdGVkIGdldENvbHVtblNpemVzU3RyaW5nKGNoaWxkcmVuOiBRdWVyeUxpc3Q8SWd4Q29sdW1uQ29tcG9uZW50Pik6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJlcyA9IHRoaXMuZ2V0RmlsbGVkQ2hpbGRDb2x1bW5TaXplcyhjaGlsZHJlbik7XG4gICAgICAgIHJldHVybiByZXMuam9pbignICcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY2FjaGVDYWxjV2lkdGgoKTogYW55IHtcbiAgICAgICAgY29uc3QgY29sV2lkdGggPSB0aGlzLndpZHRoO1xuICAgICAgICBjb25zdCBpc1BlcmNlbnRhZ2VXaWR0aCA9IGNvbFdpZHRoICYmIHR5cGVvZiBjb2xXaWR0aCA9PT0gJ3N0cmluZycgJiYgY29sV2lkdGguaW5kZXhPZignJScpICE9PSAtMTtcbiAgICAgICAgY29uc3QgaXNBdXRvV2lkdGggPSBjb2xXaWR0aCAmJiB0eXBlb2YgY29sV2lkdGggPT09ICdzdHJpbmcnICYmIGNvbFdpZHRoID09PSAnZml0LWNvbnRlbnQnO1xuICAgICAgICBpZiAoaXNQZXJjZW50YWdlV2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGNXaWR0aCA9IE1hdGguZmxvb3IocGFyc2VGbG9hdChjb2xXaWR0aCkgLyAxMDAgKiB0aGlzLmdyaWQuY2FsY1dpZHRoKTtcbiAgICAgICAgfSBlbHNlIGlmICghY29sV2lkdGggfHwgaXNBdXRvV2lkdGggJiYgIXRoaXMuYXV0b1NpemUpIHtcbiAgICAgICAgICAgIC8vIG5vIHdpZHRoXG4gICAgICAgICAgICB0aGlzLl9jYWxjV2lkdGggPSB0aGlzLmRlZmF1bHRXaWR0aCB8fCB0aGlzLmdyaWQuZ2V0UG9zc2libGVDb2x1bW5XaWR0aCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY2FsY1dpZHRoID0gdGhpcy53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbGNQaXhlbFdpZHRoID0gcGFyc2VJbnQodGhpcy5fY2FsY1dpZHRoLCAxMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzZXRFeHBhbmRDb2xsYXBzZVN0YXRlKCkge1xuICAgICAgICB0aGlzLmNoaWxkcmVuLmZpbHRlcihjb2wgPT4gKGNvbC52aXNpYmxlV2hlbkNvbGxhcHNlZCAhPT0gdW5kZWZpbmVkKSkuZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgICAgIGMuaGlkZGVuID0gdGhpcy5oaWRkZW47IHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGMuaGlkZGVuID0gdGhpcy5fZXhwYW5kZWQgPyBjLnZpc2libGVXaGVuQ29sbGFwc2VkIDogIWMudmlzaWJsZVdoZW5Db2xsYXBzZWQ7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNoZWNrQ29sbGFwc2libGVTdGF0ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29scyA9IHRoaXMuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnZpc2libGVXaGVuQ29sbGFwc2VkKTtcbiAgICAgICAgcmV0dXJuIChjb2xzLnNvbWUoYyA9PiBjID09PSB0cnVlKSAmJiBjb2xzLnNvbWUoYyA9PiBjID09PSBmYWxzZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBpbm5hYmxlKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ3JpZCBhcyBhbnkpLl9pbml0IHx8ICF0aGlzLnBpbm5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBhcHBseVNlbGVjdGFibGVDbGFzcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcGx5U2VsZWN0YWJsZUNsYXNzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGFwcGx5U2VsZWN0YWJsZUNsYXNzKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2FwcGx5U2VsZWN0YWJsZUNsYXNzID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=