@worktile/theia 16.1.7 → 16.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/components/contextmenu/contextmenu.component.d.ts +1 -1
  2. package/components/conversion-hint/conversion-hint.component.d.ts +1 -1
  3. package/components/inline-toolbar/inline-toolbar.component.d.ts +1 -1
  4. package/components/listbox/listbox.d.ts +3 -3
  5. package/components/plugin-menu/plugin-menu.component.d.ts +5 -4
  6. package/components/table-select/table-select.component.d.ts +1 -1
  7. package/components/toolbar/toolbar.component.d.ts +2 -2
  8. package/components/toolbar-group/toolbar-group.component.d.ts +1 -1
  9. package/core/toolbar-item/base-toolbar-item.d.ts +2 -2
  10. package/custom-types.d.ts +1 -0
  11. package/editor.component.d.ts +1 -1
  12. package/editor.module.d.ts +2 -2
  13. package/{esm2020 → esm2022}/components/action/prevent-default.mjs +4 -4
  14. package/{esm2020 → esm2022}/components/column-resize/column-resize-notifier.mjs +4 -4
  15. package/{esm2020 → esm2022}/components/column-resize/column-resize.directive.mjs +4 -4
  16. package/{esm2020 → esm2022}/components/column-resize/column-resize.module.mjs +9 -9
  17. package/{esm2020 → esm2022}/components/column-resize/event-dispatcher.mjs +4 -4
  18. package/{esm2020 → esm2022}/components/column-resize/overlay-handle.component.mjs +4 -4
  19. package/{esm2020 → esm2022}/components/column-resize/resizing.store.mjs +4 -4
  20. package/{esm2020 → esm2022}/components/contextmenu/contextmenu.component.mjs +4 -4
  21. package/{esm2020 → esm2022}/components/conversion-hint/conversion-hint.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/components/element/element.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/components/inline-toolbar/inline-toolbar.component.mjs +6 -6
  24. package/esm2022/components/listbox/listbox.mjs +375 -0
  25. package/esm2022/components/plugin-menu/plugin-menu.component.mjs +205 -0
  26. package/{esm2020 → esm2022}/components/table-select/table-select.component.mjs +4 -4
  27. package/{esm2020 → esm2022}/components/template/template.component.mjs +4 -4
  28. package/{esm2020 → esm2022}/components/text/text.component.mjs +4 -4
  29. package/esm2022/components/toolbar/toolbar.component.mjs +267 -0
  30. package/{esm2020 → esm2022}/components/toolbar-dropdown/toolbar-dropdown.component.mjs +4 -4
  31. package/{esm2020 → esm2022}/components/toolbar-group/toolbar-group.component.mjs +4 -4
  32. package/{esm2020 → esm2022}/components/toolbar-item/toolbar-item.component.mjs +6 -6
  33. package/{esm2020 → esm2022}/core/toolbar-item/base-toolbar-item.mjs +7 -7
  34. package/esm2022/custom-types.mjs +2 -0
  35. package/{esm2020 → esm2022}/editor.component.mjs +11 -11
  36. package/esm2022/editor.module.mjs +254 -0
  37. package/esm2022/interfaces/image.mjs +3 -0
  38. package/{esm2020 → esm2022}/interfaces/view-base.mjs +4 -4
  39. package/{esm2020 → esm2022}/pipes.mjs +10 -10
  40. package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-block.mjs +1 -1
  41. package/{esm2020 → esm2022}/plugins/blockquote/blockquote.component.mjs +4 -4
  42. package/{esm2020 → esm2022}/plugins/code/code.component.mjs +5 -5
  43. package/{esm2020 → esm2022}/plugins/color/toolbar-item.component.mjs +4 -4
  44. package/esm2022/plugins/deserialize/deserialize-html.plugin.mjs +59 -0
  45. package/esm2022/plugins/deserialize/deserialize-md.plugin.mjs +136 -0
  46. package/{esm2020 → esm2022}/plugins/hr/hr.component.mjs +6 -6
  47. package/esm2022/plugins/image/image.component.mjs +438 -0
  48. package/esm2022/plugins/image/image.editor.mjs +96 -0
  49. package/{esm2020 → esm2022}/plugins/inline-code/inline-code.component.mjs +6 -6
  50. package/{esm2020 → esm2022}/plugins/link/edit/link-edit.component.mjs +4 -4
  51. package/{esm2020 → esm2022}/plugins/link/hover/link-hover.component.mjs +5 -5
  52. package/{esm2020 → esm2022}/plugins/link/link.component.mjs +9 -9
  53. package/{esm2020 → esm2022}/plugins/list/components/bulleted-list.component.mjs +4 -4
  54. package/{esm2020 → esm2022}/plugins/list/components/list-item.component.mjs +4 -4
  55. package/{esm2020 → esm2022}/plugins/list/components/numbered-list.component.mjs +4 -4
  56. package/{esm2020 → esm2022}/plugins/mention/suggestion.component.mjs +4 -4
  57. package/{esm2020 → esm2022}/plugins/quick-insert/components/quick-insert.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/plugins/table/components/insert-mark/insert-mark.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/plugins/table/components/row/row.component.mjs +6 -6
  60. package/esm2022/plugins/table/components/table.component.mjs +834 -0
  61. package/{esm2020 → esm2022}/plugins/table/components/td/td.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-options.component.mjs +6 -6
  63. package/{esm2020 → esm2022}/plugins/table/components/toolbar/table-toolbar.component.mjs +5 -5
  64. package/{esm2020 → esm2022}/plugins/table/table.pipe.mjs +7 -7
  65. package/{esm2020 → esm2022}/plugins/table/table.service.mjs +4 -4
  66. package/{esm2020 → esm2022}/plugins/table/table.store.mjs +4 -4
  67. package/{esm2020 → esm2022}/plugins/table/toolbar-item.component.mjs +6 -6
  68. package/{esm2020 → esm2022}/plugins/todo-item/todo-item.component.mjs +6 -6
  69. package/{esm2020 → esm2022}/plugins/vertical-align/toolbar-item.component.mjs +4 -4
  70. package/{esm2020 → esm2022}/services/context.service.mjs +4 -4
  71. package/{esm2020 → esm2022}/services/table-contextmenu.service.mjs +4 -4
  72. package/{esm2020 → esm2022}/services/toolbar.service.mjs +4 -4
  73. package/{esm2020 → esm2022}/transforms/on-keydown-reset-block-type.mjs +1 -1
  74. package/{fesm2020 → fesm2022}/worktile-theia.mjs +420 -393
  75. package/fesm2022/worktile-theia.mjs.map +1 -0
  76. package/interfaces/editor.d.ts +5 -3
  77. package/interfaces/image.d.ts +5 -4
  78. package/package.json +6 -15
  79. package/plugins/image/image.component.d.ts +1 -1
  80. package/plugins/image/image.editor.d.ts +7 -0
  81. package/plugins/link/edit/link-edit.component.d.ts +1 -1
  82. package/plugins/link/hover/link-hover.component.d.ts +1 -1
  83. package/plugins/mention/suggestion.component.d.ts +1 -1
  84. package/plugins/quick-insert/components/quick-insert.component.d.ts +1 -1
  85. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +1 -1
  86. package/plugins/table/components/table.component.d.ts +7 -7
  87. package/plugins/table/components/toolbar/table-options.component.d.ts +1 -1
  88. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +1 -1
  89. package/esm2020/components/listbox/listbox.mjs +0 -375
  90. package/esm2020/components/plugin-menu/plugin-menu.component.mjs +0 -204
  91. package/esm2020/components/toolbar/toolbar.component.mjs +0 -266
  92. package/esm2020/custom-types.mjs +0 -2
  93. package/esm2020/editor.module.mjs +0 -254
  94. package/esm2020/interfaces/image.mjs +0 -3
  95. package/esm2020/plugins/deserialize/deserialize-html.plugin.mjs +0 -53
  96. package/esm2020/plugins/deserialize/deserialize-md.plugin.mjs +0 -130
  97. package/esm2020/plugins/image/image.component.mjs +0 -440
  98. package/esm2020/plugins/image/image.editor.mjs +0 -81
  99. package/esm2020/plugins/table/components/table.component.mjs +0 -834
  100. package/fesm2015/worktile-theia.mjs +0 -16711
  101. package/fesm2015/worktile-theia.mjs.map +0 -1
  102. package/fesm2020/worktile-theia.mjs.map +0 -1
  103. /package/{esm2020 → esm2022}/components/column-resize/resize-ref.mjs +0 -0
  104. /package/{esm2020 → esm2022}/components/column-resize/selectors.mjs +0 -0
  105. /package/{esm2020 → esm2022}/components/index.mjs +0 -0
  106. /package/{esm2020 → esm2022}/components/listbox/listbox.type.mjs +0 -0
  107. /package/{esm2020 → esm2022}/constants/auto-format-rules.mjs +0 -0
  108. /package/{esm2020 → esm2022}/constants/code.mjs +0 -0
  109. /package/{esm2020 → esm2022}/constants/color-select.mjs +0 -0
  110. /package/{esm2020 → esm2022}/constants/default.mjs +0 -0
  111. /package/{esm2020 → esm2022}/constants/error.mjs +0 -0
  112. /package/{esm2020 → esm2022}/constants/index.mjs +0 -0
  113. /package/{esm2020 → esm2022}/constants/node-types.mjs +0 -0
  114. /package/{esm2020 → esm2022}/constants/plugin-menu.mjs +0 -0
  115. /package/{esm2020 → esm2022}/constants/selector.mjs +0 -0
  116. /package/{esm2020 → esm2022}/constants/toolbar.mjs +0 -0
  117. /package/{esm2020 → esm2022}/core/create-plugin.mjs +0 -0
  118. /package/{esm2020 → esm2022}/core/create-toolbar.mjs +0 -0
  119. /package/{esm2020 → esm2022}/core/index.mjs +0 -0
  120. /package/{esm2020 → esm2022}/core/utils/combine-plugins.mjs +0 -0
  121. /package/{esm2020 → esm2022}/core/utils/flatten-deep-plugins.mjs +0 -0
  122. /package/{esm2020 → esm2022}/core/utils/get-plugin-options.mjs +0 -0
  123. /package/{esm2020 → esm2022}/core/utils/get-plugin.mjs +0 -0
  124. /package/{esm2020 → esm2022}/core/utils/get-plugins.mjs +0 -0
  125. /package/{esm2020 → esm2022}/core/utils/index.mjs +0 -0
  126. /package/{esm2020 → esm2022}/core/utils/merge-array.mjs +0 -0
  127. /package/{esm2020 → esm2022}/core/utils/merge-deep-plugins.mjs +0 -0
  128. /package/{esm2020 → esm2022}/core/utils/merge-options.mjs +0 -0
  129. /package/{esm2020 → esm2022}/core/utils/nested-structure-by-key.mjs +0 -0
  130. /package/{esm2020 → esm2022}/core/utils/plugin-menu.mjs +0 -0
  131. /package/{esm2020 → esm2022}/core/utils/plugins-by-key.mjs +0 -0
  132. /package/{esm2020 → esm2022}/core/with-theia.mjs +0 -0
  133. /package/{esm2020 → esm2022}/interfaces/auto-format.mjs +0 -0
  134. /package/{esm2020 → esm2022}/interfaces/editor.mjs +0 -0
  135. /package/{esm2020 → esm2022}/interfaces/element.mjs +0 -0
  136. /package/{esm2020 → esm2022}/interfaces/index.mjs +0 -0
  137. /package/{esm2020 → esm2022}/interfaces/plugins/index.mjs +0 -0
  138. /package/{esm2020 → esm2022}/interfaces/plugins/no-infer.mjs +0 -0
  139. /package/{esm2020 → esm2022}/interfaces/plugins/plugin-key.mjs +0 -0
  140. /package/{esm2020 → esm2022}/interfaces/plugins/plugin-menu.mjs +0 -0
  141. /package/{esm2020 → esm2022}/interfaces/plugins/plugins.mjs +0 -0
  142. /package/{esm2020 → esm2022}/interfaces/plugins/with-override.mjs +0 -0
  143. /package/{esm2020 → esm2022}/interfaces/reset-block-type-plugin-options.mjs +0 -0
  144. /package/{esm2020 → esm2022}/interfaces/toolbar.mjs +0 -0
  145. /package/{esm2020 → esm2022}/interfaces/upload.mjs +0 -0
  146. /package/{esm2020 → esm2022}/interfaces/utility/index.mjs +0 -0
  147. /package/{esm2020 → esm2022}/interfaces/utility/nested-structure-by-key.mjs +0 -0
  148. /package/{esm2020 → esm2022}/interfaces/utility/override-by-key.mjs +0 -0
  149. /package/{esm2020 → esm2022}/interfaces/utility/types.mjs +0 -0
  150. /package/{esm2020 → esm2022}/interfaces/valid-children-types.mjs +0 -0
  151. /package/{esm2020 → esm2022}/plugins/align/align.editor.mjs +0 -0
  152. /package/{esm2020 → esm2022}/plugins/align/align.plugin.mjs +0 -0
  153. /package/{esm2020 → esm2022}/plugins/autoformat/autoformat.plugin.mjs +0 -0
  154. /package/{esm2020 → esm2022}/plugins/autoformat/transforms/auto-format-inline.mjs +0 -0
  155. /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.editor.mjs +0 -0
  156. /package/{esm2020 → esm2022}/plugins/blockquote/blockquote.plugin.mjs +0 -0
  157. /package/{esm2020 → esm2022}/plugins/code/code.editor.mjs +0 -0
  158. /package/{esm2020 → esm2022}/plugins/code/code.plugin.mjs +0 -0
  159. /package/{esm2020 → esm2022}/plugins/color/color.editor.mjs +0 -0
  160. /package/{esm2020 → esm2022}/plugins/color/color.plugin.mjs +0 -0
  161. /package/{esm2020 → esm2022}/plugins/common/block-card.plugin.mjs +0 -0
  162. /package/{esm2020 → esm2022}/plugins/common/common.plugin.mjs +0 -0
  163. /package/{esm2020 → esm2022}/plugins/common/get-fragment.plugin.mjs +0 -0
  164. /package/{esm2020 → esm2022}/plugins/common/history.plugin.mjs +0 -0
  165. /package/{esm2020 → esm2022}/plugins/common/insert-data-by-invalid-type.mjs +0 -0
  166. /package/{esm2020 → esm2022}/plugins/common/move-selection.plugin.mjs +0 -0
  167. /package/{esm2020 → esm2022}/plugins/common/remove-empty.plugin.mjs +0 -0
  168. /package/{esm2020 → esm2022}/plugins/common/remove-void.plugin.mjs +0 -0
  169. /package/{esm2020 → esm2022}/plugins/common/reset-type.plugin.mjs +0 -0
  170. /package/{esm2020 → esm2022}/plugins/common/transforms.plugin.mjs +0 -0
  171. /package/{esm2020 → esm2022}/plugins/font-size/font-size.editor.mjs +0 -0
  172. /package/{esm2020 → esm2022}/plugins/heading/heading.editor.mjs +0 -0
  173. /package/{esm2020 → esm2022}/plugins/heading/heading.plugin.mjs +0 -0
  174. /package/{esm2020 → esm2022}/plugins/hr/hr.editor.mjs +0 -0
  175. /package/{esm2020 → esm2022}/plugins/hr/hr.plugin.mjs +0 -0
  176. /package/{esm2020 → esm2022}/plugins/image/image.plugin.mjs +0 -0
  177. /package/{esm2020 → esm2022}/plugins/indent/indent.editor.mjs +0 -0
  178. /package/{esm2020 → esm2022}/plugins/indent/indent.plugin.mjs +0 -0
  179. /package/{esm2020 → esm2022}/plugins/indent/on-keydown-indent.mjs +0 -0
  180. /package/{esm2020 → esm2022}/plugins/index.mjs +0 -0
  181. /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.editor.mjs +0 -0
  182. /package/{esm2020 → esm2022}/plugins/inline-code/inline-code.plugin.mjs +0 -0
  183. /package/{esm2020 → esm2022}/plugins/link/link.editor.mjs +0 -0
  184. /package/{esm2020 → esm2022}/plugins/link/link.plugin.mjs +0 -0
  185. /package/{esm2020 → esm2022}/plugins/link/link.types.mjs +0 -0
  186. /package/{esm2020 → esm2022}/plugins/list/list.editor.mjs +0 -0
  187. /package/{esm2020 → esm2022}/plugins/list/list.plugin.mjs +0 -0
  188. /package/{esm2020 → esm2022}/plugins/list/normalizers/get-list-normalizer.mjs +0 -0
  189. /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-list-item.mjs +0 -0
  190. /package/{esm2020 → esm2022}/plugins/list/normalizers/normalize-no.mjs +0 -0
  191. /package/{esm2020 → esm2022}/plugins/list/on-key-down-list.mjs +0 -0
  192. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-entry.mjs +0 -0
  193. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-item-sublist.mjs +0 -0
  194. /package/{esm2020 → esm2022}/plugins/list/queries/get-list-types.mjs +0 -0
  195. /package/{esm2020 → esm2022}/plugins/list/queries/get-start-list-item.mjs +0 -0
  196. /package/{esm2020 → esm2022}/plugins/list/queries/has-list-in-list-item.mjs +0 -0
  197. /package/{esm2020 → esm2022}/plugins/list/queries/is-in-list.mjs +0 -0
  198. /package/{esm2020 → esm2022}/plugins/list/queries/is-list-nested.mjs +0 -0
  199. /package/{esm2020 → esm2022}/plugins/list/queries/is-list.mjs +0 -0
  200. /package/{esm2020 → esm2022}/plugins/list/queries/is-node-type-list.mjs +0 -0
  201. /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-at-list-item-start.mjs +0 -0
  202. /package/{esm2020 → esm2022}/plugins/list/queries/is-selection-in-same-list-item.mjs +0 -0
  203. /package/{esm2020 → esm2022}/plugins/list/queries/is-single-list-item.mjs +0 -0
  204. /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-data.mjs +0 -0
  205. /package/{esm2020 → esm2022}/plugins/list/transforms/insert-list-item.mjs +0 -0
  206. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-down.mjs +0 -0
  207. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.mjs +0 -0
  208. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-sublist-items-to-list.mjs +0 -0
  209. /package/{esm2020 → esm2022}/plugins/list/transforms/move-list-item-up.mjs +0 -0
  210. /package/{esm2020 → esm2022}/plugins/list/transforms/unwrap-list.mjs +0 -0
  211. /package/{esm2020 → esm2022}/plugins/list/types.mjs +0 -0
  212. /package/{esm2020 → esm2022}/plugins/mark/mark.editor.mjs +0 -0
  213. /package/{esm2020 → esm2022}/plugins/mark/mark.plugin.mjs +0 -0
  214. /package/{esm2020 → esm2022}/plugins/mention/index.mjs +0 -0
  215. /package/{esm2020 → esm2022}/plugins/mention/mention.editor.mjs +0 -0
  216. /package/{esm2020 → esm2022}/plugins/mention/mention.plugin.mjs +0 -0
  217. /package/{esm2020 → esm2022}/plugins/mention/mention.type.mjs +0 -0
  218. /package/{esm2020 → esm2022}/plugins/node-id/node-id.plugin.mjs +0 -0
  219. /package/{esm2020 → esm2022}/plugins/normalizers/insert-paragraph-nodes.mjs +0 -0
  220. /package/{esm2020 → esm2022}/plugins/normalizers/remove-empty-nodes.mjs +0 -0
  221. /package/{esm2020 → esm2022}/plugins/normalizers/trailing-node.plugin.mjs +0 -0
  222. /package/{esm2020 → esm2022}/plugins/paint-format/paint-format.editor.mjs +0 -0
  223. /package/{esm2020 → esm2022}/plugins/public-api.mjs +0 -0
  224. /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.editor.mjs +0 -0
  225. /package/{esm2020 → esm2022}/plugins/quick-insert/quick-insert.plugin.mjs +0 -0
  226. /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.plugin.mjs +0 -0
  227. /package/{esm2020 → esm2022}/plugins/soft-break/soft-break.types.mjs +0 -0
  228. /package/{esm2020 → esm2022}/plugins/table/table.editor.mjs +0 -0
  229. /package/{esm2020 → esm2022}/plugins/table/table.plugin.mjs +0 -0
  230. /package/{esm2020 → esm2022}/plugins/table/table.types.mjs +0 -0
  231. /package/{esm2020 → esm2022}/plugins/table/transforms/clear-cell.mjs +0 -0
  232. /package/{esm2020 → esm2022}/plugins/table/transforms/clear-table-node.mjs +0 -0
  233. /package/{esm2020 → esm2022}/plugins/table/transforms/index.mjs +0 -0
  234. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-column.mjs +0 -0
  235. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-row.mjs +0 -0
  236. /package/{esm2020 → esm2022}/plugins/table/transforms/insert-table.mjs +0 -0
  237. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-column.mjs +0 -0
  238. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-row.mjs +0 -0
  239. /package/{esm2020 → esm2022}/plugins/table/transforms/remove-table.mjs +0 -0
  240. /package/{esm2020 → esm2022}/plugins/table/utils/add-columns.mjs +0 -0
  241. /package/{esm2020 → esm2022}/plugins/table/utils/calc-anchor-position.mjs +0 -0
  242. /package/{esm2020 → esm2022}/plugins/table/utils/calc-span.mjs +0 -0
  243. /package/{esm2020 → esm2022}/plugins/table/utils/calculate-table.mjs +0 -0
  244. /package/{esm2020 → esm2022}/plugins/table/utils/cell-position.mjs +0 -0
  245. /package/{esm2020 → esm2022}/plugins/table/utils/create-cell.mjs +0 -0
  246. /package/{esm2020 → esm2022}/plugins/table/utils/create-row.mjs +0 -0
  247. /package/{esm2020 → esm2022}/plugins/table/utils/create-table-position.mjs +0 -0
  248. /package/{esm2020 → esm2022}/plugins/table/utils/create-table.mjs +0 -0
  249. /package/{esm2020 → esm2022}/plugins/table/utils/get-grid-columns.mjs +0 -0
  250. /package/{esm2020 → esm2022}/plugins/table/utils/get-min-max-cell-index.mjs +0 -0
  251. /package/{esm2020 → esm2022}/plugins/table/utils/get-select-cell-node.mjs +0 -0
  252. /package/{esm2020 → esm2022}/plugins/table/utils/handle-cell.mjs +0 -0
  253. /package/{esm2020 → esm2022}/plugins/table/utils/index.mjs +0 -0
  254. /package/{esm2020 → esm2022}/plugins/table/utils/is-header-row.mjs +0 -0
  255. /package/{esm2020 → esm2022}/plugins/table/utils/is-legal-table.mjs +0 -0
  256. /package/{esm2020 → esm2022}/plugins/table/utils/is-range-in-table.mjs +0 -0
  257. /package/{esm2020 → esm2022}/plugins/table/utils/is-selection-in-table.mjs +0 -0
  258. /package/{esm2020 → esm2022}/plugins/table/utils/is-virtual-key.mjs +0 -0
  259. /package/{esm2020 → esm2022}/plugins/table/utils/merge-cell.mjs +0 -0
  260. /package/{esm2020 → esm2022}/plugins/table/utils/next-path.mjs +0 -0
  261. /package/{esm2020 → esm2022}/plugins/table/utils/normalize-table.mjs +0 -0
  262. /package/{esm2020 → esm2022}/plugins/table/utils/remove-columns.mjs +0 -0
  263. /package/{esm2020 → esm2022}/plugins/table/utils/remove-row-column.mjs +0 -0
  264. /package/{esm2020 → esm2022}/plugins/table/utils/set-cells-background-color.mjs +0 -0
  265. /package/{esm2020 → esm2022}/plugins/table/utils/set-menu-cell-invisibility.mjs +0 -0
  266. /package/{esm2020 → esm2022}/plugins/table/utils/set-node-options.mjs +0 -0
  267. /package/{esm2020 → esm2022}/plugins/table/utils/split-cell.mjs +0 -0
  268. /package/{esm2020 → esm2022}/plugins/table/utils/table-entry.mjs +0 -0
  269. /package/{esm2020 → esm2022}/plugins/table/utils/table-position.mjs +0 -0
  270. /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.editor.mjs +0 -0
  271. /package/{esm2020 → esm2022}/plugins/todo-item/todo-item.plugin.mjs +0 -0
  272. /package/{esm2020 → esm2022}/plugins/vertical-align/vertical-align.editor.mjs +0 -0
  273. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  274. /package/{esm2020 → esm2022}/queries/anchor-block-entry.mjs +0 -0
  275. /package/{esm2020 → esm2022}/queries/anchor-block.mjs +0 -0
  276. /package/{esm2020 → esm2022}/queries/anchor-inline-entry.mjs +0 -0
  277. /package/{esm2020 → esm2022}/queries/find-descendant.mjs +0 -0
  278. /package/{esm2020 → esm2022}/queries/find-node.mjs +0 -0
  279. /package/{esm2020 → esm2022}/queries/find-path.mjs +0 -0
  280. /package/{esm2020 → esm2022}/queries/get-above-by-type.mjs +0 -0
  281. /package/{esm2020 → esm2022}/queries/get-above.mjs +0 -0
  282. /package/{esm2020 → esm2022}/queries/get-anchor-block-entry.mjs +0 -0
  283. /package/{esm2020 → esm2022}/queries/get-block-above.mjs +0 -0
  284. /package/{esm2020 → esm2022}/queries/get-block-card-above.mjs +0 -0
  285. /package/{esm2020 → esm2022}/queries/get-block-card-cursor.mjs +0 -0
  286. /package/{esm2020 → esm2022}/queries/get-container-blocks.mjs +0 -0
  287. /package/{esm2020 → esm2022}/queries/get-directly-parent.mjs +0 -0
  288. /package/{esm2020 → esm2022}/queries/get-insert-elements-path.mjs +0 -0
  289. /package/{esm2020 → esm2022}/queries/get-last-child-path.mjs +0 -0
  290. /package/{esm2020 → esm2022}/queries/get-last-node.mjs +0 -0
  291. /package/{esm2020 → esm2022}/queries/get-next-sibling-nodes.mjs +0 -0
  292. /package/{esm2020 → esm2022}/queries/get-node.mjs +0 -0
  293. /package/{esm2020 → esm2022}/queries/get-nodes-by-type.mjs +0 -0
  294. /package/{esm2020 → esm2022}/queries/get-nodes.mjs +0 -0
  295. /package/{esm2020 → esm2022}/queries/get-parent.mjs +0 -0
  296. /package/{esm2020 → esm2022}/queries/get-plain-text.mjs +0 -0
  297. /package/{esm2020 → esm2022}/queries/get-plugin-by-toolbar.mjs +0 -0
  298. /package/{esm2020 → esm2022}/queries/get-point-before.mjs +0 -0
  299. /package/{esm2020 → esm2022}/queries/get-point-from-location.mjs +0 -0
  300. /package/{esm2020 → esm2022}/queries/get-previous-path.mjs +0 -0
  301. /package/{esm2020 → esm2022}/queries/get-rang-from-block-start.mjs +0 -0
  302. /package/{esm2020 → esm2022}/queries/get-range-before.mjs +0 -0
  303. /package/{esm2020 → esm2022}/queries/get-selection-marks.mjs +0 -0
  304. /package/{esm2020 → esm2022}/queries/get-selection-nodes-by-type.mjs +0 -0
  305. /package/{esm2020 → esm2022}/queries/get-text.mjs +0 -0
  306. /package/{esm2020 → esm2022}/queries/get-toolbar-disabled.mjs +0 -0
  307. /package/{esm2020 → esm2022}/queries/index.mjs +0 -0
  308. /package/{esm2020 → esm2022}/queries/is-across-blocks.mjs +0 -0
  309. /package/{esm2020 → esm2022}/queries/is-ancestor-empty.mjs +0 -0
  310. /package/{esm2020 → esm2022}/queries/is-ancestor.mjs +0 -0
  311. /package/{esm2020 → esm2022}/queries/is-block-above-empty.mjs +0 -0
  312. /package/{esm2020 → esm2022}/queries/is-block-active.mjs +0 -0
  313. /package/{esm2020 → esm2022}/queries/is-block-card-cursor.mjs +0 -0
  314. /package/{esm2020 → esm2022}/queries/is-block-text-empty-after-selection.mjs +0 -0
  315. /package/{esm2020 → esm2022}/queries/is-collapsed.mjs +0 -0
  316. /package/{esm2020 → esm2022}/queries/is-contain-nested-type.mjs +0 -0
  317. /package/{esm2020 → esm2022}/queries/is-container-type.mjs +0 -0
  318. /package/{esm2020 → esm2022}/queries/is-descendant.mjs +0 -0
  319. /package/{esm2020 → esm2022}/queries/is-empty-content-filter.mjs +0 -0
  320. /package/{esm2020 → esm2022}/queries/is-empty-content.mjs +0 -0
  321. /package/{esm2020 → esm2022}/queries/is-empty-paragraph-by-path.mjs +0 -0
  322. /package/{esm2020 → esm2022}/queries/is-empty-paragraph.mjs +0 -0
  323. /package/{esm2020 → esm2022}/queries/is-first-child.mjs +0 -0
  324. /package/{esm2020 → esm2022}/queries/is-global-collapsed.mjs +0 -0
  325. /package/{esm2020 → esm2022}/queries/is-include-types.mjs +0 -0
  326. /package/{esm2020 → esm2022}/queries/is-node-type-in.mjs +0 -0
  327. /package/{esm2020 → esm2022}/queries/is-node-type.mjs +0 -0
  328. /package/{esm2020 → esm2022}/queries/is-paragraph.mjs +0 -0
  329. /package/{esm2020 → esm2022}/queries/is-point-at-root.mjs +0 -0
  330. /package/{esm2020 → esm2022}/queries/is-range-across-blocks.mjs +0 -0
  331. /package/{esm2020 → esm2022}/queries/is-range-at-root.mjs +0 -0
  332. /package/{esm2020 → esm2022}/queries/is-start.mjs +0 -0
  333. /package/{esm2020 → esm2022}/queries/some-node.mjs +0 -0
  334. /package/{esm2020 → esm2022}/shortcuts/index.mjs +0 -0
  335. /package/{esm2020 → esm2022}/shortcuts/mark.mjs +0 -0
  336. /package/{esm2020 → esm2022}/test/index.mjs +0 -0
  337. /package/{esm2020 → esm2022}/test/utils/with-plugin.mjs +0 -0
  338. /package/{esm2020 → esm2022}/transforms/apply-deep-to-nodes.mjs +0 -0
  339. /package/{esm2020 → esm2022}/transforms/clear-marks.mjs +0 -0
  340. /package/{esm2020 → esm2022}/transforms/close-conversion-hint.mjs +0 -0
  341. /package/{esm2020 → esm2022}/transforms/delete-element.mjs +0 -0
  342. /package/{esm2020 → esm2022}/transforms/handle-continual-delete-backward.mjs +0 -0
  343. /package/{esm2020 → esm2022}/transforms/handle-continual-insert-break.mjs +0 -0
  344. /package/{esm2020 → esm2022}/transforms/index.mjs +0 -0
  345. /package/{esm2020 → esm2022}/transforms/insert-elements.mjs +0 -0
  346. /package/{esm2020 → esm2022}/transforms/insert-paragraph.mjs +0 -0
  347. /package/{esm2020 → esm2022}/transforms/merge-deep-to-nodes.mjs +0 -0
  348. /package/{esm2020 → esm2022}/transforms/move-children.mjs +0 -0
  349. /package/{esm2020 → esm2022}/transforms/set-end-selection.mjs +0 -0
  350. /package/{esm2020 → esm2022}/transforms/set-marks.mjs +0 -0
  351. /package/{esm2020 → esm2022}/transforms/set-node.mjs +0 -0
  352. /package/{esm2020 → esm2022}/transforms/un-hang-range.mjs +0 -0
  353. /package/{esm2020 → esm2022}/transforms/un-wrap.mjs +0 -0
  354. /package/{esm2020 → esm2022}/transforms/unwrap-nodes-by-type.mjs +0 -0
  355. /package/{esm2020 → esm2022}/utils/auto-focus.mjs +0 -0
  356. /package/{esm2020 → esm2022}/utils/blob.mjs +0 -0
  357. /package/{esm2020 → esm2022}/utils/cast-array.mjs +0 -0
  358. /package/{esm2020 → esm2022}/utils/color-picker.mjs +0 -0
  359. /package/{esm2020 → esm2022}/utils/common.mjs +0 -0
  360. /package/{esm2020 → esm2022}/utils/copy-node.mjs +0 -0
  361. /package/{esm2020 → esm2022}/utils/create-empty-paragraph.mjs +0 -0
  362. /package/{esm2020 → esm2022}/utils/data-transform.mjs +0 -0
  363. /package/{esm2020 → esm2022}/utils/dom.mjs +0 -0
  364. /package/{esm2020 → esm2022}/utils/editor-uuid.mjs +0 -0
  365. /package/{esm2020 → esm2022}/utils/fragment.mjs +0 -0
  366. /package/{esm2020 → esm2022}/utils/get-editable-element-height.mjs +0 -0
  367. /package/{esm2020 → esm2022}/utils/get-toolbar-class.mjs +0 -0
  368. /package/{esm2020 → esm2022}/utils/id-creator.mjs +0 -0
  369. /package/{esm2020 → esm2022}/utils/index.mjs +0 -0
  370. /package/{esm2020 → esm2022}/utils/insert-data-by-invalid-type.mjs +0 -0
  371. /package/{esm2020 → esm2022}/utils/is-clean-empty-paragraph.mjs +0 -0
  372. /package/{esm2020 → esm2022}/utils/is-inline.mjs +0 -0
  373. /package/{esm2020 → esm2022}/utils/lodash.mjs +0 -0
  374. /package/{esm2020 → esm2022}/utils/match.mjs +0 -0
  375. /package/{esm2020 → esm2022}/utils/merge-element-options.mjs +0 -0
  376. /package/{esm2020 → esm2022}/utils/refocus.mjs +0 -0
  377. /package/{esm2020 → esm2022}/utils/scroll-into-view.mjs +0 -0
  378. /package/{esm2020 → esm2022}/utils/weak-maps.mjs +0 -0
  379. /package/{esm2020 → esm2022}/worktile-theia.mjs +0 -0
@@ -0,0 +1,834 @@
1
+ import { Component, ElementRef, HostListener, Inject, ViewChild, ViewChildren } from '@angular/core';
2
+ import { isKeyHotkey } from 'is-hotkey';
3
+ import { Subject, fromEvent, merge } from 'rxjs';
4
+ import { debounceTime, distinctUntilChanged, filter, map, take, takeUntil } from 'rxjs/operators';
5
+ import { Editor, Transforms } from 'slate';
6
+ import { AngularEditor } from 'slate-angular';
7
+ import { ColumnResizeNotifierSource, TableCellEventDispatcher } from '../../../components';
8
+ import { DEFAULT_SCROLL_CONTAINER } from '../../../constants/default';
9
+ import { ScrollDirection } from '../../../constants/node-types';
10
+ import { SLA_TABLE_CELL_SELECTOR } from '../../../constants/selector';
11
+ import { getPluginOptions } from '../../../core';
12
+ import { PluginKeys, THE_MODE_TOKEN, TheBaseElementComponent, TheEditor } from '../../../interfaces';
13
+ import { TheTableContextMenuService } from '../../../services/table-contextmenu.service';
14
+ import * as TheTransforms from '../../../transforms';
15
+ import { coercePixelsFromCssValue, getElementHeight, getElementWidth, isColorInput, isColorPanel } from '../../../utils';
16
+ import { TableFreezeColumnPipe, TableFreezeRowPipe } from '../table.pipe';
17
+ import { TableService } from '../table.service';
18
+ import { TableStore } from '../table.store';
19
+ import { HEADER_CELL_CLASS, TABLE_CONTROL, TABLE_INSERT_MASK, TABLE_NUMBER_COLUMN, TABLE_PADDING, THE_TABLE_COMPONENT_TOKEN, TableOptions, TableWithStickyRowClass } from '../table.types';
20
+ import { calcColumnGroups, calculateRowControls, createTablePosition, getColumnsWidth, getGridColumns, isHeaderRow, isSelectedAllCell, isVirtualKey } from '../utils';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "../../../components";
23
+ import * as i2 from "../table.store";
24
+ import * as i3 from "../table.service";
25
+ import * as i4 from "../../../services/table-contextmenu.service";
26
+ import * as i5 from "../table.pipe";
27
+ import * as i6 from "../../../services/context.service";
28
+ import * as i7 from "@angular/common";
29
+ import * as i8 from "slate-angular";
30
+ import * as i9 from "../../../components/column-resize/column-resize.directive";
31
+ import * as i10 from "./insert-mark/insert-mark.component";
32
+ import * as i11 from "../../../interfaces";
33
+ export class TheTableComponent extends TheBaseElementComponent {
34
+ get nativeElement() {
35
+ return this.elementRef.nativeElement;
36
+ }
37
+ get tbodyNativeElement() {
38
+ return this.tbodyElement?.nativeElement;
39
+ }
40
+ handleMousedown(event) {
41
+ if (event.target instanceof Element && this.tbodyNativeElement.contains(event.target)) {
42
+ return;
43
+ }
44
+ if (!TheEditor.isFocused(this.editor)) {
45
+ TheEditor.focus(this.editor);
46
+ }
47
+ AngularEditor.moveBlockCard(this.editor, this.element, { direction: 'left' });
48
+ event.preventDefault();
49
+ }
50
+ onContextChange() {
51
+ super.onContextChange();
52
+ if (this.initialized) {
53
+ Promise.resolve().then(() => {
54
+ this.tableStore.emitTableChange();
55
+ this.tableStore.setSelectedColumnsAndRowIndex();
56
+ this.bindTableScrollingShadow();
57
+ this.useRowControls();
58
+ this.setHeaderCellStyle();
59
+ this.setHeaderRowShadow();
60
+ this.setHeaderRowLeftStyle();
61
+ this.cdr.markForCheck();
62
+ });
63
+ this.getIsInTable();
64
+ this.getColControls();
65
+ this.getColumnGroups();
66
+ }
67
+ this.headerRow = isHeaderRow(this.element);
68
+ }
69
+ constructor(elementRef, eventDispatcher, resizeNotifier, tableStore, cdr, ngZone, tableService, theTableContextMenuService, freezeColumnPipe, freezeRowPipe, renderer, contextService, config) {
70
+ super(elementRef, cdr);
71
+ this.eventDispatcher = eventDispatcher;
72
+ this.resizeNotifier = resizeNotifier;
73
+ this.tableStore = tableStore;
74
+ this.cdr = cdr;
75
+ this.ngZone = ngZone;
76
+ this.tableService = tableService;
77
+ this.theTableContextMenuService = theTableContextMenuService;
78
+ this.freezeColumnPipe = freezeColumnPipe;
79
+ this.freezeRowPipe = freezeRowPipe;
80
+ this.renderer = renderer;
81
+ this.contextService = contextService;
82
+ this.config = config;
83
+ this.headerRow = false;
84
+ this.isSelectedAllCell = false;
85
+ this.destroy$ = new Subject();
86
+ this.rowControls = [];
87
+ this.colControls = [];
88
+ this.getColControlButtonWidth = () => {
89
+ let result = 0;
90
+ result += this.element?.options?.numberedColumn ? TABLE_NUMBER_COLUMN : 0;
91
+ return result;
92
+ };
93
+ }
94
+ ngOnInit() {
95
+ super.ngOnInit();
96
+ this.getColControls();
97
+ this.getIsInTable();
98
+ this.tablePluginOptions = getPluginOptions(this.editor, PluginKeys.table);
99
+ if (this.tablePluginOptions.showFullscreen && this.tablePluginOptions.fullscreenAction) {
100
+ this.tablePluginOptions
101
+ .fullscreenAction(this.editor)
102
+ .pipe(takeUntil(this.destroy$), filter(content => {
103
+ return content.element === this.element;
104
+ }), map(content => {
105
+ return content.state === 'off' ? false : true;
106
+ }))
107
+ .subscribe(value => {
108
+ this.tableStore.isFullscreen = value;
109
+ if (this.tableStore.isFullscreen) {
110
+ this.previousScrollContainer = this.editor.options.scrollContainer;
111
+ this.editor.options.scrollContainer = DEFAULT_SCROLL_CONTAINER;
112
+ }
113
+ else {
114
+ this.editor.options.scrollContainer = this.previousScrollContainer;
115
+ }
116
+ this.isStickyTop = false;
117
+ this.setHeaderRowStyle();
118
+ this.contextService.rebindContainerScroll();
119
+ });
120
+ }
121
+ this.tableStore
122
+ .selectedCellsChange()
123
+ .pipe(takeUntil(this.destroy$))
124
+ .subscribe(() => {
125
+ this.isSelectedAllCell = isSelectedAllCell(this.editor, this.tableStore.getSelectedCellPositions());
126
+ });
127
+ }
128
+ getWrapperWidth() {
129
+ const tableContainer = this.nativeElement.firstChild;
130
+ const paddingLeft = coercePixelsFromCssValue(window.getComputedStyle(tableContainer)['paddingLeft']);
131
+ const width = tableContainer.offsetWidth - paddingLeft;
132
+ return width;
133
+ }
134
+ ngAfterViewInit() {
135
+ this.ngZone.onStable.pipe(take(1)).subscribe(async () => {
136
+ const blockCardElement = this.nativeElement.closest('slate-block-card');
137
+ if (blockCardElement) {
138
+ blockCardElement.classList.add(`slate-block-card-${this.element.type}`);
139
+ }
140
+ this.tableStore.initEditor(this.editor);
141
+ this.subscribeCellsChange();
142
+ this.subscribeCellPositionChange();
143
+ this.listenTableContextMenuEvent();
144
+ this.listenOnSelectedCells();
145
+ this.listenKeydownEvent();
146
+ this.listenKeyupEvent();
147
+ this.listenTableWrapperScroll();
148
+ this.listenSelectstartEvent();
149
+ this.getColumnGroups();
150
+ this.bindTableScrollingShadow();
151
+ if (this.element.options?.numberedColumn) {
152
+ const loadImageDone = await this.resolveImage();
153
+ // 等待序号列表格内图片加载完成后再去渲染表格行高度
154
+ if (loadImageDone) {
155
+ this.useRowControls();
156
+ this.cdr.detectChanges();
157
+ }
158
+ }
159
+ else {
160
+ this.useRowControls();
161
+ this.cdr.markForCheck();
162
+ }
163
+ this.setHeaderCellStyle();
164
+ const { left } = this.nativeElement.getBoundingClientRect();
165
+ this.tableRectLeft = left;
166
+ this.subscribeScrollContainerScroll();
167
+ this.contextService.containerResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
168
+ if (result.widthChanged) {
169
+ this.setHeaderRowShadow();
170
+ this.setHeaderRowLeftStyle();
171
+ }
172
+ });
173
+ this.contextService.theEditorResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
174
+ if (result.widthChanged) {
175
+ this.setGridColumnsStyle();
176
+ this.setStickyRowStyle();
177
+ this.bindTableScrollingShadow();
178
+ this.setHeaderRowShadow();
179
+ this.getColumnGroups();
180
+ }
181
+ });
182
+ this.contextService.windowResized$.pipe(takeUntil(this.destroy$)).subscribe(result => {
183
+ if (result.widthChanged) {
184
+ this.setHeaderRowShadow();
185
+ this.setHeaderRowLeftStyle();
186
+ }
187
+ });
188
+ });
189
+ }
190
+ getColumnGroups() {
191
+ this.columns = calcColumnGroups(this.readonly, this.element, this.elementRef.nativeElement.offsetWidth, this.config.mode);
192
+ this.cdr.detectChanges();
193
+ }
194
+ /* 给标题行的左/右加阴影 */
195
+ setHeaderRowShadow() {
196
+ // 固定标题行遮盖
197
+ this.renderer.setStyle(this.tableWrapper.nativeElement, 'z-index', this.isStickyTop ? '3' : '0');
198
+ if (this.isLeftShadow || this.isRightShadow) {
199
+ let { height, top } = this.calcHeaderRowShadow();
200
+ let { left, width } = this.nativeElement.getBoundingClientRect();
201
+ if (this.isRightShadow && this.headerRowRightShadow) {
202
+ const headerRowRightShadow = this.headerRowRightShadow.nativeElement;
203
+ this.renderer.setStyle(headerRowRightShadow, 'height', `${height}px`);
204
+ this.renderer.setStyle(headerRowRightShadow, 'top', `${top}px`);
205
+ this.renderer.setStyle(headerRowRightShadow, 'left', `${left + width - 8}px`);
206
+ }
207
+ if (this.isLeftShadow && this.headerRowLeftShadow) {
208
+ const headerRowLeftShadow = this.headerRowLeftShadow.nativeElement;
209
+ this.renderer.setStyle(headerRowLeftShadow, 'height', `${height}px`);
210
+ this.renderer.setStyle(headerRowLeftShadow, 'top', `${top}px`);
211
+ this.renderer.setStyle(headerRowLeftShadow, 'left', `${left + this.getColControlButtonWidth()}px`);
212
+ }
213
+ }
214
+ }
215
+ calcHeaderRowShadow() {
216
+ const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
217
+ let height = headerRowHeight;
218
+ // 默认(没有聚焦)的 top 值:滚动容器高度 + 表格的padding(8)
219
+ let top = this.scrollContainerTop + TABLE_PADDING;
220
+ // 聚焦在表格中: 高度 + control(11),top 加一个 mask(19)
221
+ if (this.isInTable) {
222
+ height = height + TABLE_CONTROL;
223
+ top = top + TABLE_INSERT_MASK - 1;
224
+ }
225
+ return { height, top };
226
+ }
227
+ subscribeScrollContainerScroll() {
228
+ this.ngZone.runOutsideAngular(() => {
229
+ this.contextService.containerScrolled$
230
+ .pipe(takeUntil(this.destroy$), map(entires => {
231
+ const { event, direction } = entires;
232
+ if (direction === ScrollDirection.X) {
233
+ const { left } = this.nativeElement.getBoundingClientRect();
234
+ this.isScrollX = this.tableRectLeft !== left;
235
+ this.setHeaderRowLeftStyle();
236
+ }
237
+ if (direction === ScrollDirection.Y) {
238
+ this.scrollContainerTop = event.target.getBoundingClientRect().top;
239
+ const clientRect = this.theTableElement.nativeElement.getBoundingClientRect();
240
+ const headerTopHeight = this.isInTable ? -19 : 11;
241
+ const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
242
+ const top = clientRect.top + headerTopHeight;
243
+ this.isStickyTop =
244
+ top <= this.scrollContainerTop + 8 &&
245
+ clientRect.bottom - this.scrollContainerTop >= headerRowHeight &&
246
+ this.freezeRowPipe.transform(this.element, this.headerRow, this.tablePluginOptions);
247
+ // 标题行内容超过固定高度时移除冻结
248
+ if (this.isStickyTop) {
249
+ const maxHeaderRowHeight = (24 + 8) * 11; // 超出 11 行,取消冻结
250
+ this.isStickyTop = headerRowHeight <= maxHeaderRowHeight;
251
+ }
252
+ }
253
+ return this.isStickyTop;
254
+ }), distinctUntilChanged())
255
+ .subscribe(() => {
256
+ this.setHeaderRowStyle();
257
+ });
258
+ });
259
+ }
260
+ setHeaderCellStyle() {
261
+ let headerRowCells = this.element.children[0].children;
262
+ let headerColumnCells = this.element.children.map(item => item.children[0]);
263
+ if (!this.headerRow) {
264
+ this.removeHeaderCellStyle(headerRowCells);
265
+ headerRowCells = [];
266
+ }
267
+ if (!this.element.options?.headerColumn) {
268
+ this.removeHeaderCellStyle(headerColumnCells);
269
+ headerColumnCells = [];
270
+ }
271
+ let headerCells = headerRowCells.concat(headerColumnCells).filter(item => !item.hidden);
272
+ if (this.headerRow && this.element.options?.headerColumn) {
273
+ headerCells.shift();
274
+ }
275
+ if (headerCells.length) {
276
+ headerCells.map(item => {
277
+ const cellElement = TheEditor.toDOMNode(this.editor, item);
278
+ this.renderer.addClass(cellElement, HEADER_CELL_CLASS);
279
+ });
280
+ }
281
+ this.setHeaderColumnAndControlStyle(headerColumnCells);
282
+ this.setHeaderRowStyle();
283
+ }
284
+ removeHeaderCellStyle(cells) {
285
+ cells.map(item => {
286
+ const cellElement = TheEditor.toDOMNode(this.editor, item);
287
+ this.renderer.removeClass(cellElement, HEADER_CELL_CLASS);
288
+ });
289
+ }
290
+ setHeaderColumnAndControlStyle(cells) {
291
+ let headerColumnCells = [];
292
+ if (cells.length === 0) {
293
+ headerColumnCells = this.element.children.map(item => item.children[0]).filter(item => !item.hidden);
294
+ }
295
+ else {
296
+ headerColumnCells = cells.filter(item => !item.hidden);
297
+ }
298
+ const headerColControl = this.columnControlsWrapper.nativeElement.firstElementChild;
299
+ const headerColumnElements = headerColumnCells.map(item => {
300
+ return TheEditor.toDOMNode(this.editor, item);
301
+ });
302
+ [...headerColumnElements, headerColControl].map(item => {
303
+ if (this.freezeColumnPipe.transform(this.element, this.tablePluginOptions)) {
304
+ this.renderer.addClass(item, 'the-sticky-cell');
305
+ }
306
+ else {
307
+ this.renderer.removeClass(item, 'the-sticky-cell');
308
+ }
309
+ });
310
+ }
311
+ setHeaderRowStyle() {
312
+ this.setGridColumnsStyle();
313
+ this.setStickyRowStyle();
314
+ this.setHeaderRowShadow();
315
+ this.setHeaderRowLeftStyle();
316
+ }
317
+ setGridColumnsStyle() {
318
+ const colControl = this.columnControlsWrapper.nativeElement;
319
+ if (this.freezeRowPipe.transform(this.element, this.headerRow, this.tablePluginOptions)) {
320
+ const headerRow = this.tbodyElement.nativeElement.childNodes[0];
321
+ const cellsWidth = this.element?.columns && this.colgroup?.nativeElement
322
+ ? getColumnsWidth(this.colgroup.nativeElement, true)
323
+ : this.getDefaultCellWidth();
324
+ const gridColumns = getGridColumns(headerRow, cellsWidth);
325
+ const tablePadding = 44;
326
+ let tableWidth = this.elementRef.nativeElement.getBoundingClientRect().width;
327
+ // 序号列存在时, 表格宽度加序号列宽度
328
+ // 只读模式下, 表格宽度不变
329
+ tableWidth = !this.readonly && this.element?.options?.numberedColumn ? tableWidth - tablePadding : tableWidth;
330
+ const stickyRows = this.isInTable ? [colControl, headerRow] : [headerRow];
331
+ stickyRows.map(item => {
332
+ this.renderer.setStyle(item, 'grid-template-columns', gridColumns);
333
+ this.renderer.setStyle(item, 'width', tableWidth + 'px');
334
+ });
335
+ }
336
+ }
337
+ setStickyRowStyle() {
338
+ const colControl = this.columnControlsWrapper.nativeElement;
339
+ const headerRow = this.nativeElement.querySelector('tbody tr');
340
+ const rowControlInner = this.rowControlsInner.nativeElement;
341
+ const tableCornerBtn = this.cornerControl.nativeElement;
342
+ const headerRowHeight = calculateRowControls(this.editor, this.element)[0]?.height;
343
+ const numberedColumn = this.element?.options?.numberedColumn;
344
+ if (this.isStickyTop) {
345
+ this.renderer.addClass(this.nativeElement, TableWithStickyRowClass);
346
+ this.updateStickyRowScrollLeft();
347
+ const top = this.isInTable ? this.scrollContainerTop + 36 : this.scrollContainerTop;
348
+ this.renderer.setStyle(headerRow, 'top', top + 'px');
349
+ this.renderer.setStyle(headerRow, 'height', `${headerRowHeight}px`);
350
+ if (this.isInTable || numberedColumn) {
351
+ [colControl, tableCornerBtn].map(item => {
352
+ item && this.renderer.setStyle(item, 'top', this.scrollContainerTop + 'px');
353
+ });
354
+ }
355
+ // 优化:table 的 padding-top 应该动态变化(与阴影同变)
356
+ const tablePaddingTop = headerRowHeight + 11; // 标题行高 + ctrl btn(11px)高度
357
+ this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', tablePaddingTop + 'px');
358
+ this.renderer.setStyle(rowControlInner, 'padding-top', tablePaddingTop + 'px');
359
+ this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '4');
360
+ }
361
+ else {
362
+ this.renderer.removeClass(this.nativeElement, TableWithStickyRowClass);
363
+ [headerRow, colControl, tableCornerBtn].map(item => {
364
+ item && this.renderer.setStyle(item, 'top', null);
365
+ });
366
+ this.renderer.setStyle(this.theTableElement.nativeElement, 'padding-top', null);
367
+ this.renderer.setStyle(rowControlInner, 'padding-top', null);
368
+ this.renderer.setStyle(this.tableRowControlsWrapper.nativeElement, 'z-index', '1');
369
+ }
370
+ const rowControlButton = this.rowControlsButtonWrapper.first?.nativeElement;
371
+ if (this.initialized && rowControlButton) {
372
+ this.setRowControlButtonStyle(rowControlButton);
373
+ }
374
+ else {
375
+ // setTimeout: 需要等待 rowControls 在 dom 中渲染完毕后才能获取到 rowControlButton
376
+ setTimeout(() => this.setRowControlButtonStyle(rowControlButton));
377
+ }
378
+ }
379
+ setRowControlButtonStyle(rowControlButton) {
380
+ const numberedColumn = this.element?.options?.numberedColumn;
381
+ if (!rowControlButton) {
382
+ rowControlButton = this.rowControlsButtonWrapper.first?.nativeElement;
383
+ }
384
+ if (this.isStickyTop) {
385
+ if ((this.isInTable || numberedColumn) && rowControlButton) {
386
+ this.renderer.setStyle(rowControlButton, 'top', this.scrollContainerTop + 'px');
387
+ }
388
+ }
389
+ else {
390
+ rowControlButton && this.renderer.setStyle(rowControlButton, 'top', null);
391
+ }
392
+ }
393
+ bindTableScrollingShadow() {
394
+ const nativeElement = this.tableWrapper.nativeElement;
395
+ const scrollLeft = nativeElement.scrollLeft;
396
+ const scrollWidth = nativeElement.scrollWidth;
397
+ const clientWidth = nativeElement.clientWidth;
398
+ this.isLeftShadow = scrollLeft > 0;
399
+ this.isRightShadow = scrollLeft + clientWidth < scrollWidth;
400
+ const rows = nativeElement.querySelectorAll(`tr`);
401
+ const stickyCells = Array.from(rows).map(item => item.querySelector('th.the-table-col-controls') || item.querySelector('td.slate-element-table-cell'));
402
+ const isColumnHeader = this.freezeColumnPipe.transform(this.element, this.tablePluginOptions);
403
+ const elements = isColumnHeader ? stickyCells : [nativeElement.parentElement];
404
+ if (this.isLeftShadow) {
405
+ elements.forEach(element => {
406
+ element.classList.add('the-table-left-shadow');
407
+ });
408
+ }
409
+ else {
410
+ elements.forEach(item => {
411
+ item.classList.remove('the-table-left-shadow');
412
+ });
413
+ }
414
+ if (this.isRightShadow) {
415
+ nativeElement.parentElement.classList.add('the-table-right-shadow');
416
+ }
417
+ else {
418
+ nativeElement.parentElement.classList.remove('the-table-right-shadow');
419
+ }
420
+ }
421
+ subscribeCellPositionChange() {
422
+ this.tableStore
423
+ .cellsPositionChange()
424
+ .pipe(debounceTime(100), takeUntil(this.destroy$))
425
+ .subscribe(() => {
426
+ this.cdr.detectChanges();
427
+ });
428
+ }
429
+ subscribeCellsChange() {
430
+ this.tableStore
431
+ .dangerousOrSelectedCellsChange()
432
+ .pipe(takeUntil(this.destroy$))
433
+ .subscribe(() => {
434
+ this.cdr.detectChanges();
435
+ });
436
+ }
437
+ useRowControls() {
438
+ if ((this.selection && !this.readonly) ||
439
+ this.element?.options?.numberedColumn ||
440
+ this.tableStore.isRightClicking ||
441
+ this.tableStore.isFocusedInput) {
442
+ this.rowControls = calculateRowControls(this.editor, this.element);
443
+ }
444
+ }
445
+ detectChanges() {
446
+ this.cdr.detectChanges();
447
+ }
448
+ resolveImage() {
449
+ const imageElements = this.nativeElement.querySelectorAll('img');
450
+ if (imageElements.length) {
451
+ const imageResolves = [];
452
+ imageElements.forEach(item => {
453
+ const image = new Image();
454
+ const imageLoad = new Promise(resolve => {
455
+ image.onload = () => {
456
+ resolve(true);
457
+ };
458
+ image.onerror = () => {
459
+ resolve(true);
460
+ };
461
+ image.src = item.getAttribute('src');
462
+ });
463
+ imageResolves.push(imageLoad);
464
+ });
465
+ return Promise.all(imageResolves);
466
+ }
467
+ return Promise.resolve(true);
468
+ }
469
+ getColControls() {
470
+ this.colControls = this.element?.children[0]?.children || [];
471
+ }
472
+ getIsInTable() {
473
+ if (this.selection && !this.readonly) {
474
+ const opts = new TableOptions();
475
+ const selection = this.editor.selection;
476
+ const startPosition = createTablePosition(this.editor);
477
+ const endPosition = createTablePosition(this.editor, selection.focus.path);
478
+ this.isInTable = startPosition.isInTable() && endPosition.isInTable();
479
+ }
480
+ else {
481
+ this.isInTable = false;
482
+ }
483
+ }
484
+ getDefaultCellWidth() {
485
+ const tr = this.element.children[0];
486
+ let width = this.elementRef.nativeElement.getBoundingClientRect().width;
487
+ if (this.rowControlsInner) {
488
+ width -= this.rowControlsInner.nativeElement.getBoundingClientRect().width;
489
+ if (this.isCollapsedAndNonReadonly) {
490
+ // 聚焦之后会向左偏移一个 control(-11),见 .the-table-row-controls-wrapper
491
+ width += TABLE_CONTROL;
492
+ }
493
+ }
494
+ let cellsWidth = [];
495
+ // 只读模式,如果有序号列,需要减去序号列的宽度
496
+ if (this.readonly && this.element?.options?.numberedColumn) {
497
+ width -= TABLE_NUMBER_COLUMN;
498
+ cellsWidth.push(TABLE_NUMBER_COLUMN);
499
+ }
500
+ tr.children.forEach(() => {
501
+ cellsWidth.push(Number((width / tr.children.length).toFixed(2)));
502
+ });
503
+ return cellsWidth;
504
+ }
505
+ initializeColumns() {
506
+ if (this.element.columns) {
507
+ const columns = [];
508
+ this.tableWrapper.nativeElement.querySelectorAll('col').forEach((ele) => {
509
+ // Compatible with the problem that the width cannot be obtained under safari #WIK-9643
510
+ columns.push({ width: ele.clientWidth || coercePixelsFromCssValue(ele.style.width) });
511
+ });
512
+ // Editor container width changes, resulting in column widths no longer valid #WIK-6766
513
+ const warning = this.element.columns.some((col, index) => col.width !== columns[index]?.width);
514
+ if (warning) {
515
+ TheTransforms.setNode(this.editor, { columns }, this.element);
516
+ }
517
+ }
518
+ else {
519
+ const tr = this.element.children[0];
520
+ const tableWidth = AngularEditor.toDOMNode(this.editor, tr).offsetWidth;
521
+ const columns = tr.children.map(cell => {
522
+ return { width: Number((tableWidth / tr.children.length - tr.children.length).toFixed(2)) };
523
+ });
524
+ TheTransforms.setNode(this.editor, { columns }, this.element);
525
+ }
526
+ }
527
+ initializeRows() {
528
+ this.element.children.map((row, index) => {
529
+ if (!row.height) {
530
+ const element = TheEditor.toDOMNode(this.editor, row);
531
+ let height = getElementHeight(element);
532
+ TheTransforms.setNode(this.editor, { height }, row);
533
+ }
534
+ });
535
+ }
536
+ transformRowHeight() {
537
+ const rowElements = this.nativeElement.querySelector('tbody').children;
538
+ if (rowElements) {
539
+ [...rowElements].map((row, index) => {
540
+ let height = getElementHeight(row);
541
+ TheTransforms.setNode(this.editor, { height }, this.element.children[index]);
542
+ });
543
+ }
544
+ }
545
+ transformColumnsWidth() {
546
+ const cols = [...this.nativeElement.querySelector('colgroup').children];
547
+ const columns = cols.map(col => {
548
+ return { width: getElementWidth(col) };
549
+ });
550
+ TheTransforms.setNode(this.editor, { columns }, this.element);
551
+ }
552
+ onColMousedown(event, index) {
553
+ event.stopPropagation();
554
+ event.preventDefault();
555
+ if (!!this.selection && this.isInTable) {
556
+ this.tableStore.clearDangerousCells();
557
+ this.tableStore.selectColumn(this.editor, index);
558
+ this.tableService.afterSelectedCells(event.target, this.element);
559
+ }
560
+ }
561
+ onRowMousedown(event, index) {
562
+ if (this.readonly)
563
+ return;
564
+ event.stopPropagation();
565
+ event.preventDefault();
566
+ if (!this.isInTable) {
567
+ const path = TheEditor.findPath(this.editor, this.element);
568
+ Transforms.select(this.editor, path);
569
+ }
570
+ this.tableStore.selectRow(this.editor, index);
571
+ this.tableService.afterSelectedCells(event.target, this.element);
572
+ }
573
+ onSelectTable(event) {
574
+ event.stopPropagation();
575
+ event.preventDefault();
576
+ this.tableStore.selectTable(this.editor);
577
+ this.tableService.afterSelectedCells(event.target, this.element);
578
+ }
579
+ listenTableContextMenuEvent() {
580
+ this.ngZone.runOutsideAngular(() => {
581
+ fromEvent(this.theTableElement.nativeElement, 'contextmenu')
582
+ .pipe(takeUntil(this.destroy$))
583
+ .subscribe(event => {
584
+ if (this.readonly) {
585
+ return;
586
+ }
587
+ event.preventDefault();
588
+ this.tableStore.isRightClicking = true;
589
+ const cell = event.target.closest(SLA_TABLE_CELL_SELECTOR);
590
+ if (!cell) {
591
+ return;
592
+ }
593
+ else {
594
+ if (!cell.classList.contains('selected-cell')) {
595
+ this.tableStore.selectCell(cell, this.editor);
596
+ }
597
+ }
598
+ if (this.theTableContextMenuService.isOpened) {
599
+ this.theTableContextMenuService
600
+ .closeContextMenu()
601
+ .pipe(take(1))
602
+ .subscribe(() => {
603
+ this.theTableContextMenuService.openMenuList(event);
604
+ });
605
+ }
606
+ else if (this.tableService.isOpened) {
607
+ this.tableService
608
+ .closeToolbar()
609
+ .pipe(take(1))
610
+ .subscribe(() => {
611
+ this.theTableContextMenuService.openMenuList(event);
612
+ });
613
+ }
614
+ else {
615
+ this.cdr.markForCheck();
616
+ this.theTableContextMenuService.openMenuList(event);
617
+ }
618
+ // patch for right click select next cell
619
+ setTimeout(() => {
620
+ Transforms.select(this.editor, Editor.start(this.editor, this.editor.selection));
621
+ });
622
+ });
623
+ });
624
+ }
625
+ listenOnSelectedCells() {
626
+ merge(fromEvent(document, 'mousedown').pipe(filter((e) => e.button !== 2)), fromEvent(document, 'keydown').pipe(filter((e) => {
627
+ return !isVirtualKey(e) && !this.theTableContextMenuService.isOpened;
628
+ })))
629
+ .pipe(filter((event) => {
630
+ if (isColorInput(event.target)) {
631
+ this.tableStore.isFocusedInput = true;
632
+ return false;
633
+ }
634
+ if (isColorPanel(event.target)) {
635
+ return false;
636
+ }
637
+ const selectedCellPositions = this.tableStore.getSelectedCellPositions();
638
+ return selectedCellPositions?.length > 0;
639
+ }), takeUntil(this.destroy$))
640
+ .subscribe((e) => {
641
+ if (e.type === 'keydown') {
642
+ this.tableStore.clearSelectedCellsContent();
643
+ }
644
+ const isCurrentTableElement = this.nativeElement.contains(e.target);
645
+ if (!isCurrentTableElement || (!this.tableStore.pointerSelection && !this.tableStore.areaSelection)) {
646
+ this.tableStore.clearSelectedCells();
647
+ }
648
+ if (!isCurrentTableElement) {
649
+ this.tableStore.clearLastFocusPath();
650
+ }
651
+ this.theTableContextMenuService.closeContextMenu();
652
+ });
653
+ }
654
+ listenKeydownEvent() {
655
+ this.ngZone.runOutsideAngular(() => {
656
+ fromEvent(document, 'keydown')
657
+ .pipe(takeUntil(this.destroy$), filter((e) => !!e))
658
+ .subscribe((event) => {
659
+ if (!this.readonly && isKeyHotkey('mod', event)) {
660
+ this.tableService.handleKeydownForPointerSelection(event, this.tbodyNativeElement);
661
+ }
662
+ if (!this.readonly && isKeyHotkey('shift', event)) {
663
+ this.tableService.handleKeydownForAreaSelection(event, this.tbodyNativeElement);
664
+ }
665
+ });
666
+ });
667
+ }
668
+ listenKeyupEvent() {
669
+ this.ngZone.runOutsideAngular(() => {
670
+ fromEvent(document, 'keyup')
671
+ .pipe(takeUntil(this.destroy$), filter((e) => !!e))
672
+ .subscribe(() => {
673
+ this.tableService.cancelPointerSelection();
674
+ this.tableService.cancelAreaSelection();
675
+ });
676
+ });
677
+ }
678
+ listenSelectstartEvent() {
679
+ this.ngZone.runOutsideAngular(() => {
680
+ fromEvent(document, 'selectstart')
681
+ .pipe(takeUntil(this.destroy$))
682
+ .subscribe((event) => {
683
+ this.tableService.selectStartPreventDefault(event);
684
+ });
685
+ });
686
+ }
687
+ listenTableWrapperScroll() {
688
+ const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
689
+ const setStickyRowPointerEvents = (pointerEventsStyle) => {
690
+ for (const stiRow of stickyRows) {
691
+ this.renderer.setStyle(stiRow, 'pointer-events', pointerEventsStyle);
692
+ }
693
+ };
694
+ let timer;
695
+ fromEvent(this.tableWrapper.nativeElement, 'wheel')
696
+ .pipe(takeUntil(this.destroy$))
697
+ .subscribe(() => {
698
+ // 处理标题行固定时的滚动跟随
699
+ setStickyRowPointerEvents('none');
700
+ timer && clearTimeout(timer);
701
+ timer = setTimeout(() => {
702
+ setStickyRowPointerEvents('auto');
703
+ timer = null;
704
+ }, 200);
705
+ });
706
+ fromEvent(this.tableWrapper.nativeElement, 'scroll')
707
+ .pipe(takeUntil(this.destroy$))
708
+ .subscribe(() => {
709
+ this.bindTableScrollingShadow();
710
+ this.updateStickyRowScrollLeft();
711
+ this.setHeaderRowShadow();
712
+ });
713
+ }
714
+ updateStickyRowScrollLeft() {
715
+ // 判断是否出现固定标题行
716
+ if (this.isStickyTop) {
717
+ const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
718
+ for (const stiRow of stickyRows) {
719
+ // 修复获取 scrollLeft 属性引起的浏览器重绘,导致跳动问题 #WIK-11038
720
+ requestAnimationFrame(() => {
721
+ // 同步滚动状态到 .the-sticky-row
722
+ stiRow.scrollLeft = this.tableWrapper.nativeElement.scrollLeft;
723
+ });
724
+ }
725
+ }
726
+ }
727
+ setHeaderRowLeftStyle() {
728
+ const stickyRows = this.elementRef.nativeElement.querySelectorAll('.the-sticky-row');
729
+ const cornerControl = this.cornerControl.nativeElement;
730
+ const rowControl = this.rowControlsButtonWrapper.first?.nativeElement;
731
+ const stickyElements = [...stickyRows, cornerControl, rowControl];
732
+ const { left } = this.nativeElement.getBoundingClientRect();
733
+ const buffer = this.isInTable ? -TABLE_CONTROL : 0;
734
+ if (this.isStickyTop && this.isScrollX) {
735
+ this.setHeaderRowShadow();
736
+ stickyRows.forEach((element) => {
737
+ this.renderer.setStyle(element, 'left', `${left + this.getColControlButtonWidth()}px`);
738
+ });
739
+ this.renderer.setStyle(cornerControl, 'left', `${left + buffer}px`);
740
+ rowControl && this.renderer.setStyle(rowControl, 'left', `${left + buffer}px`);
741
+ }
742
+ else {
743
+ stickyElements.forEach((element) => {
744
+ element && this.renderer.setStyle(element, 'left', null);
745
+ });
746
+ }
747
+ }
748
+ trackByFnRowControls(index) {
749
+ return index;
750
+ }
751
+ trackByFnColControls(index) {
752
+ return index;
753
+ }
754
+ ngOnDestroy() {
755
+ super.ngOnDestroy();
756
+ this.destroy$.next();
757
+ this.destroy$.complete();
758
+ }
759
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: TheTableComponent, deps: [{ token: i0.ElementRef }, { token: i1.TableCellEventDispatcher }, { token: i1.ColumnResizeNotifierSource }, { token: i2.TableStore }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i3.TableService }, { token: i4.TheTableContextMenuService }, { token: i5.TableFreezeColumnPipe }, { token: i5.TableFreezeRowPipe }, { token: i0.Renderer2 }, { token: i6.TheContextService }, { token: THE_MODE_TOKEN }], target: i0.ɵɵFactoryTarget.Component }); }
760
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.5", type: TheTableComponent, selector: "the-table, [theTable]", host: { listeners: { "mousedown": "handleMousedown($event)" }, properties: { "class.the-table-with-controls": "isInTable || tableStore.isRightClicking || tableStore.isFocusedInput", "class.the-table-with-sticky-column": "freezeColumnPipe.transform(element, tablePluginOptions)", "class.the-numbered-table": "element?.options?.numberedColumn", "class.the-table-selection-hide": "tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput" } }, providers: [
761
+ TableStore,
762
+ TableService,
763
+ TheTableContextMenuService,
764
+ TableCellEventDispatcher,
765
+ ColumnResizeNotifierSource,
766
+ TableFreezeColumnPipe,
767
+ TableFreezeRowPipe,
768
+ {
769
+ provide: THE_TABLE_COMPONENT_TOKEN,
770
+ useExisting: TheTableComponent
771
+ }
772
+ ], viewQueries: [{ propertyName: "tableWrapper", first: true, predicate: ["tableWrapper"], descendants: true, read: ElementRef, static: true }, { propertyName: "theTableElement", first: true, predicate: ["theTable"], descendants: true, read: ElementRef, static: true }, { propertyName: "tbodyElement", first: true, predicate: ["tbody"], descendants: true, read: ElementRef, static: true }, { propertyName: "tableRowControlsWrapper", first: true, predicate: ["tableRowControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "columnControlsWrapper", first: true, predicate: ["columnControlsWrapper"], descendants: true, read: ElementRef }, { propertyName: "cornerControl", first: true, predicate: ["cornerControl"], descendants: true, read: ElementRef }, { propertyName: "rowControlsInner", first: true, predicate: ["rowControlsInner"], descendants: true, read: ElementRef }, { propertyName: "headerRowLeftShadow", first: true, predicate: ["headerRowLeftShadow"], descendants: true, read: ElementRef }, { propertyName: "headerRowRightShadow", first: true, predicate: ["headerRowRightShadow"], descendants: true, read: ElementRef }, { propertyName: "colgroup", first: true, predicate: ["colgroup"], descendants: true, read: ElementRef }, { propertyName: "rowControlsButtonWrapper", predicate: ["rowControlsButtonWrapper"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking || tableStore.isFocusedInput\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i8.SlateChildren, selector: "slate-children", inputs: ["children", "context", "viewContext"] }, { kind: "directive", type: i9.TheColumnResizeDirective, selector: "div[theColumnResize]" }, { kind: "component", type: i10.TheInsertMarkComponent, selector: "the-table-insert-mark", inputs: ["type", "at", "tableStore", "parentElement"] }] }); }
773
+ }
774
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.5", ngImport: i0, type: TheTableComponent, decorators: [{
775
+ type: Component,
776
+ args: [{ selector: 'the-table, [theTable]', providers: [
777
+ TableStore,
778
+ TableService,
779
+ TheTableContextMenuService,
780
+ TableCellEventDispatcher,
781
+ ColumnResizeNotifierSource,
782
+ TableFreezeColumnPipe,
783
+ TableFreezeRowPipe,
784
+ {
785
+ provide: THE_TABLE_COMPONENT_TOKEN,
786
+ useExisting: TheTableComponent
787
+ }
788
+ ], host: {
789
+ '[class.the-table-with-controls]': 'isInTable || tableStore.isRightClicking || tableStore.isFocusedInput',
790
+ '[class.the-table-with-sticky-column]': 'freezeColumnPipe.transform(element, tablePluginOptions)',
791
+ '[class.the-numbered-table]': 'element?.options?.numberedColumn',
792
+ '[class.the-table-selection-hide]': 'tableStore.isCellSelecting || tableStore.isRightClicking || tableStore.isFocusedInput'
793
+ }, template: "<div class=\"the-table-container\" theColumnResize>\n <div #tableRowControlsWrapper class=\"the-table-row-controls-wrapper\">\n <div\n class=\"the-table-corner-controls the-sticky-corner-controls\"\n #cornerControl\n [ngClass]=\"{\n visible: !readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput),\n 'control-active': isSelectedAllCell,\n dangerous: tableStore.isSelectedTable && tableStore.dangerousCells.length > 0\n }\"\n >\n <div class=\"the-table-corner-button\" (mousedown)=\"onSelectTable($event)\"></div>\n <div class=\"the-table-corner-controls-insert-row-marker\" *ngIf=\"!headerRow\">\n <the-table-insert-mark type=\"row\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n <div class=\"the-table-corner-controls-insert-column-marker\" *ngIf=\"!element?.options?.headerColumn\">\n <the-table-insert-mark type=\"column\" [at]=\"0\" [tableStore]=\"tableStore\"></the-table-insert-mark>\n </div>\n </div>\n <div class=\"the-table-row-controls\">\n <div class=\"the-table-row-controls-inner\" #rowControlsInner>\n <div\n class=\"the-table-row-controls-button-wrap\"\n #rowControlsButtonWrapper\n *ngFor=\"let control of rowControls; let i = index; trackBy: trackByFnRowControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedRowsIndex.includes(control.rowIndex),\n dangerous: tableStore.dangerousRowsIndex.includes(control.rowIndex) && tableStore.dangerousCells.length > 0\n }\"\n >\n <ng-container\n *ngIf=\"!readonly && (isInTable || tableStore.isRightClicking || tableStore.isFocusedInput) && !element?.options?.numberedColumn\"\n >\n <button\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n type=\"button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n class=\"the-table-row-controls-button the-table-controls-button\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"element?.options?.numberedColumn\">\n <div\n [contentEditable]=\"false\"\n contenteditable=\"false\"\n (mousedown)=\"onRowMousedown($event, control.rowIndex)\"\n class=\"the-table-numbered-controls-button\"\n [ngStyle]=\"{ height: control.height + 1 + 'px' }\"\n >\n <p class=\"row-number d-flex align-items-center\">{{ headerRow && i === 0 ? '' : headerRow ? i : i + 1 }}</p>\n </div>\n </ng-container>\n <the-table-insert-mark type=\"row\" [at]=\"control.rowIndex + 1\" [tableStore]=\"tableStore\"> </the-table-insert-mark>\n </div>\n </div>\n </div>\n </div>\n <div class=\"the-table-wrapper\" #tableWrapper [ngClass]=\"{ 'the-table-numbered': element?.options?.numberedColumn }\">\n <table class=\"the-table\" #theTable>\n <colgroup #colgroup *ngIf=\"columns\">\n <col *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\" />\n <col *ngFor=\"let col of columns\" [ngStyle]=\"{ width: col.width + 'px' }\" />\n </colgroup>\n <thead>\n <tr class=\"the-table-col-controls-wrapper the-sticky-row\" #columnControlsWrapper>\n <th *ngIf=\"readonly && element?.options?.numberedColumn\" class=\"the-table-number-col\"></th>\n <th\n #colControl\n class=\"the-table-col-controls\"\n *ngFor=\"let control of colControls; let i = index; trackBy: trackByFnColControls\"\n [ngClass]=\"{\n 'control-active': tableStore.selectedColumnsIndex.includes(i),\n dangerous: tableStore.dangerousColumnsIndex.includes(i) && tableStore.dangerousCells.length > 0\n }\"\n (mousedown)=\"onColMousedown($event, i)\"\n >\n <the-table-insert-mark\n *ngIf=\"isInTable || tableStore.isRightClicking || tableStore.isFocusedInput\"\n type=\"column\"\n [at]=\"i + 1\"\n [tableStore]=\"tableStore\"\n [parentElement]=\"colControl\"\n >\n </the-table-insert-mark>\n </th>\n </tr>\n </thead>\n <tbody #tbody>\n <slate-children [children]=\"children\" [context]=\"childrenContext\" [viewContext]=\"viewContext\"> </slate-children>\n </tbody>\n <div\n *ngIf=\"!element?.options?.headerColumn\"\n #headerRowLeftShadow\n class=\"header-row-shadow header-row-left-shadow\"\n contenteditable=\"false\"\n ></div>\n <div class=\"header-row-shadow header-row-right-shadow\" #headerRowRightShadow contenteditable=\"false\"></div>\n </table>\n </div>\n</div>\n" }]
794
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.TableCellEventDispatcher }, { type: i1.ColumnResizeNotifierSource }, { type: i2.TableStore }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i3.TableService }, { type: i4.TheTableContextMenuService }, { type: i5.TableFreezeColumnPipe }, { type: i5.TableFreezeRowPipe }, { type: i0.Renderer2 }, { type: i6.TheContextService }, { type: i11.TheModeConfig, decorators: [{
795
+ type: Inject,
796
+ args: [THE_MODE_TOKEN]
797
+ }] }]; }, propDecorators: { tableWrapper: [{
798
+ type: ViewChild,
799
+ args: ['tableWrapper', { read: ElementRef, static: true }]
800
+ }], theTableElement: [{
801
+ type: ViewChild,
802
+ args: ['theTable', { read: ElementRef, static: true }]
803
+ }], tbodyElement: [{
804
+ type: ViewChild,
805
+ args: ['tbody', { read: ElementRef, static: true }]
806
+ }], tableRowControlsWrapper: [{
807
+ type: ViewChild,
808
+ args: ['tableRowControlsWrapper', { read: ElementRef, static: false }]
809
+ }], columnControlsWrapper: [{
810
+ type: ViewChild,
811
+ args: ['columnControlsWrapper', { read: ElementRef, static: false }]
812
+ }], cornerControl: [{
813
+ type: ViewChild,
814
+ args: ['cornerControl', { read: ElementRef, static: false }]
815
+ }], rowControlsInner: [{
816
+ type: ViewChild,
817
+ args: ['rowControlsInner', { read: ElementRef, static: false }]
818
+ }], headerRowLeftShadow: [{
819
+ type: ViewChild,
820
+ args: ['headerRowLeftShadow', { read: ElementRef, static: false }]
821
+ }], headerRowRightShadow: [{
822
+ type: ViewChild,
823
+ args: ['headerRowRightShadow', { read: ElementRef, static: false }]
824
+ }], colgroup: [{
825
+ type: ViewChild,
826
+ args: ['colgroup', { read: ElementRef, static: false }]
827
+ }], rowControlsButtonWrapper: [{
828
+ type: ViewChildren,
829
+ args: ['rowControlsButtonWrapper', { read: ElementRef }]
830
+ }], handleMousedown: [{
831
+ type: HostListener,
832
+ args: ['mousedown', ['$event']]
833
+ }] } });
834
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvc3JjL3BsdWdpbnMvdGFibGUvY29tcG9uZW50cy90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy90YWJsZS9jb21wb25lbnRzL3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHSCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBTU4sU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRCxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSx1QkFB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QUFFO2dCQUlyRSxvQkFBb0I7c0JBRG5CLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBSXRFLFFBQVE7c0JBRFAsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBR00sd0JBQXdCO3NCQUF2RixZQUFZO3VCQUFDLDBCQUEwQixFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFHOUQsZUFBZTtzQkFEZCxZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5qZWN0LFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzS2V5SG90a2V5IH0gZnJvbSAnaXMtaG90a2V5JztcbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCwgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFZGl0b3IsIFRyYW5zZm9ybXMgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSwgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cyc7XG5pbXBvcnQgeyBERUZBVUxUX1NDUk9MTF9DT05UQUlORVIgfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvZGVmYXVsdCc7XG5pbXBvcnQgeyBTY3JvbGxEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi8uLi9jb25zdGFudHMvbm9kZS10eXBlcyc7XG5pbXBvcnQgeyBTTEFfVEFCTEVfQ0VMTF9TRUxFQ1RPUiB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cy9zZWxlY3Rvcic7XG5pbXBvcnQgeyBnZXRQbHVnaW5PcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBUYWJsZUNlbGxFbGVtZW50LCBUYWJsZUVsZW1lbnQsIFRhYmxlUm93RWxlbWVudCB9IGZyb20gJy4uLy4uLy4uL2N1c3RvbS10eXBlcyc7XG5pbXBvcnQgeyBQbHVnaW5LZXlzLCBUSEVfTU9ERV9UT0tFTiwgVGhlQmFzZUVsZW1lbnRDb21wb25lbnQsIFRoZUVkaXRvciwgVGhlTW9kZUNvbmZpZywgVGhlUGx1Z2luT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUaGVDb250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbnRleHQuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3RhYmxlLWNvbnRleHRtZW51LnNlcnZpY2UnO1xuaW1wb3J0ICogYXMgVGhlVHJhbnNmb3JtcyBmcm9tICcuLi8uLi8uLi90cmFuc2Zvcm1zJztcbmltcG9ydCB7IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZSwgZ2V0RWxlbWVudEhlaWdodCwgZ2V0RWxlbWVudFdpZHRoLCBpc0NvbG9ySW5wdXQsIGlzQ29sb3JQYW5lbCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCB7IFRhYmxlRnJlZXplQ29sdW1uUGlwZSwgVGFibGVGcmVlemVSb3dQaXBlIH0gZnJvbSAnLi4vdGFibGUucGlwZSc7XG5pbXBvcnQgeyBUYWJsZVNlcnZpY2UgfSBmcm9tICcuLi90YWJsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlU3RvcmUgfSBmcm9tICcuLi90YWJsZS5zdG9yZSc7XG5pbXBvcnQge1xuICAgIEhFQURFUl9DRUxMX0NMQVNTLFxuICAgIFRBQkxFX0NPTlRST0wsXG4gICAgVEFCTEVfSU5TRVJUX01BU0ssXG4gICAgVEFCTEVfTlVNQkVSX0NPTFVNTixcbiAgICBUQUJMRV9QQURESU5HLFxuICAgIFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU4sXG4gICAgVGFibGVPcHRpb25zLFxuICAgIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzLFxuICAgIFRoZVBsdWdpblRhYmxlT3B0aW9uLFxuICAgIFRoZVRhYmxlQ29sdW1uXG59IGZyb20gJy4uL3RhYmxlLnR5cGVzJztcbmltcG9ydCB7XG4gICAgY2FsY0NvbHVtbkdyb3VwcyxcbiAgICBjYWxjdWxhdGVSb3dDb250cm9scyxcbiAgICBjcmVhdGVUYWJsZVBvc2l0aW9uLFxuICAgIGdldENvbHVtbnNXaWR0aCxcbiAgICBnZXRHcmlkQ29sdW1ucyxcbiAgICBpc0hlYWRlclJvdyxcbiAgICBpc1NlbGVjdGVkQWxsQ2VsbCxcbiAgICBpc1ZpcnR1YWxLZXlcbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3RoZS10YWJsZSwgW3RoZVRhYmxlXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgVGFibGVTdG9yZSxcbiAgICAgICAgVGFibGVTZXJ2aWNlLFxuICAgICAgICBUaGVUYWJsZUNvbnRleHRNZW51U2VydmljZSxcbiAgICAgICAgVGFibGVDZWxsRXZlbnREaXNwYXRjaGVyLFxuICAgICAgICBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBUYWJsZUZyZWV6ZVJvd1BpcGUsXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IFRIRV9UQUJMRV9DT01QT05FTlRfVE9LRU4sXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogVGhlVGFibGVDb21wb25lbnRcbiAgICAgICAgfVxuICAgIF0sXG4gICAgaG9zdDoge1xuICAgICAgICAnW2NsYXNzLnRoZS10YWJsZS13aXRoLWNvbnRyb2xzXSc6ICdpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCcsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXdpdGgtc3RpY2t5LWNvbHVtbl0nOiAnZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0oZWxlbWVudCwgdGFibGVQbHVnaW5PcHRpb25zKScsXG4gICAgICAgICdbY2xhc3MudGhlLW51bWJlcmVkLXRhYmxlXSc6ICdlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbicsXG4gICAgICAgICdbY2xhc3MudGhlLXRhYmxlLXNlbGVjdGlvbi1oaWRlXSc6ICd0YWJsZVN0b3JlLmlzQ2VsbFNlbGVjdGluZyB8fCB0YWJsZVN0b3JlLmlzUmlnaHRDbGlja2luZyB8fCB0YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0J1xuICAgIH1cbn0pXG5leHBvcnQgY2xhc3MgVGhlVGFibGVDb21wb25lbnQgZXh0ZW5kcyBUaGVCYXNlRWxlbWVudENvbXBvbmVudDxUYWJsZUVsZW1lbnQsIEVkaXRvcj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgaGVhZGVyUm93ID0gZmFsc2U7XG5cbiAgICBpc1NlbGVjdGVkQWxsQ2VsbDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgcm93Q29udHJvbHM6IHsgaGVpZ2h0OiBudW1iZXI7IHJvd0luZGV4OiBudW1iZXIgfVtdID0gW107XG5cbiAgICBjb2xDb250cm9scyA9IFtdO1xuXG4gICAgaXNJblRhYmxlOiBib29sZWFuO1xuXG4gICAgdGFibGVQbHVnaW5PcHRpb25zOiBUaGVQbHVnaW5PcHRpb248VGhlUGx1Z2luVGFibGVPcHRpb24+O1xuXG4gICAgaXNTdGlja3lUb3A6IGJvb2xlYW47XG5cbiAgICBpc1Njcm9sbFg6IGJvb2xlYW47XG5cbiAgICBzY3JvbGxDb250YWluZXJUb3A6IG51bWJlcjtcblxuICAgIHRhYmxlUmVjdExlZnQ6IG51bWJlcjtcblxuICAgIGlzUmlnaHRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBpc0xlZnRTaGFkb3c6IGJvb2xlYW47XG5cbiAgICBwcmV2aW91c1Njcm9sbENvbnRhaW5lcjogc3RyaW5nO1xuXG4gICAgY29sdW1uczogVGhlVGFibGVDb2x1bW5bXTtcblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIGdldCB0Ym9keU5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy50Ym9keUVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgQFZpZXdDaGlsZCgndGFibGVXcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0YWJsZVdyYXBwZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZCgndGhlVGFibGUnLCB7IHJlYWQ6IEVsZW1lbnRSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHRoZVRhYmxlRWxlbWVudDogRWxlbWVudFJlZjtcblxuICAgIEBWaWV3Q2hpbGQoJ3Rib2R5JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgICB0Ym9keUVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCd0YWJsZVJvd0NvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIHRhYmxlUm93Q29udHJvbHNXcmFwcGVyOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbHVtbkNvbnRyb2xzV3JhcHBlcicsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGNvbHVtbkNvbnRyb2xzV3JhcHBlcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdjb3JuZXJDb250cm9sJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29ybmVyQ29udHJvbDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdyb3dDb250cm9sc0lubmVyJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgcm93Q29udHJvbHNJbm5lcjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dMZWZ0U2hhZG93JywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgaGVhZGVyUm93TGVmdFNoYWRvdzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBAVmlld0NoaWxkKCdoZWFkZXJSb3dSaWdodFNoYWRvdycsIHsgcmVhZDogRWxlbWVudFJlZiwgc3RhdGljOiBmYWxzZSB9KVxuICAgIGhlYWRlclJvd1JpZ2h0U2hhZG93OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICAgIEBWaWV3Q2hpbGQoJ2NvbGdyb3VwJywgeyByZWFkOiBFbGVtZW50UmVmLCBzdGF0aWM6IGZhbHNlIH0pXG4gICAgY29sZ3JvdXA6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgQFZpZXdDaGlsZHJlbigncm93Q29udHJvbHNCdXR0b25XcmFwcGVyJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlcjogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlZG93bicsIFsnJGV2ZW50J10pXG4gICAgaGFuZGxlTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRoaXMudGJvZHlOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIVRoZUVkaXRvci5pc0ZvY3VzZWQodGhpcy5lZGl0b3IpKSB7XG4gICAgICAgICAgICBUaGVFZGl0b3IuZm9jdXModGhpcy5lZGl0b3IpO1xuICAgICAgICB9XG4gICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50LCB7IGRpcmVjdGlvbjogJ2xlZnQnIH0pO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIG9uQ29udGV4dENoYW5nZSgpIHtcbiAgICAgICAgc3VwZXIub25Db250ZXh0Q2hhbmdlKCk7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuZW1pdFRhYmxlQ2hhbmdlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNldFNlbGVjdGVkQ29sdW1uc0FuZFJvd0luZGV4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZVJvd0NvbnRyb2xzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93TGVmdFN0eWxlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGVhZGVyUm93ID0gaXNIZWFkZXJSb3codGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIHB1YmxpYyBldmVudERpc3BhdGNoZXI6IFRhYmxlQ2VsbEV2ZW50RGlzcGF0Y2hlcixcbiAgICAgICAgcHVibGljIHJlc2l6ZU5vdGlmaWVyOiBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSxcbiAgICAgICAgcHVibGljIHRhYmxlU3RvcmU6IFRhYmxlU3RvcmUsXG4gICAgICAgIHB1YmxpYyBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwdWJsaWMgbmdab25lOiBOZ1pvbmUsXG4gICAgICAgIHB1YmxpYyB0YWJsZVNlcnZpY2U6IFRhYmxlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0aGVUYWJsZUNvbnRleHRNZW51U2VydmljZTogVGhlVGFibGVDb250ZXh0TWVudVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZnJlZXplQ29sdW1uUGlwZTogVGFibGVGcmVlemVDb2x1bW5QaXBlLFxuICAgICAgICBwdWJsaWMgZnJlZXplUm93UGlwZTogVGFibGVGcmVlemVSb3dQaXBlLFxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IFRoZUNvbnRleHRTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFRIRV9NT0RFX1RPS0VOKVxuICAgICAgICBwcml2YXRlIGNvbmZpZzogVGhlTW9kZUNvbmZpZ1xuICAgICkge1xuICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBjZHIpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmdldENvbENvbnRyb2xzKCk7XG4gICAgICAgIHRoaXMuZ2V0SXNJblRhYmxlKCk7XG4gICAgICAgIHRoaXMudGFibGVQbHVnaW5PcHRpb25zID0gZ2V0UGx1Z2luT3B0aW9uczxUaGVQbHVnaW5UYWJsZU9wdGlvbj4odGhpcy5lZGl0b3IsIFBsdWdpbktleXMudGFibGUpO1xuICAgICAgICBpZiAodGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuc2hvd0Z1bGxzY3JlZW4gJiYgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnMuZnVsbHNjcmVlbkFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy50YWJsZVBsdWdpbk9wdGlvbnNcbiAgICAgICAgICAgICAgICAuZnVsbHNjcmVlbkFjdGlvbih0aGlzLmVkaXRvcilcbiAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoY29udGVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5lbGVtZW50ID09PSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBtYXAoY29udGVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudC5zdGF0ZSA9PT0gJ29mZicgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhYmxlU3RvcmUuaXNGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzU2Nyb2xsQ29udGFpbmVyID0gdGhpcy5lZGl0b3Iub3B0aW9ucy5zY3JvbGxDb250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5vcHRpb25zLnNjcm9sbENvbnRhaW5lciA9IERFRkFVTFRfU0NST0xMX0NPTlRBSU5FUjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yLm9wdGlvbnMuc2Nyb2xsQ29udGFpbmVyID0gdGhpcy5wcmV2aW91c1Njcm9sbENvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5yZWJpbmRDb250YWluZXJTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5zZWxlY3RlZENlbGxzQ2hhbmdlKClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNTZWxlY3RlZEFsbENlbGwgPSBpc1NlbGVjdGVkQWxsQ2VsbCh0aGlzLmVkaXRvciwgdGhpcy50YWJsZVN0b3JlLmdldFNlbGVjdGVkQ2VsbFBvc2l0aW9ucygpKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldFdyYXBwZXJXaWR0aCgpIHtcbiAgICAgICAgY29uc3QgdGFibGVDb250YWluZXIgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0xlZnQgPSBjb2VyY2VQaXhlbHNGcm9tQ3NzVmFsdWUod2luZG93LmdldENvbXB1dGVkU3R5bGUodGFibGVDb250YWluZXIpWydwYWRkaW5nTGVmdCddKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0YWJsZUNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIHBhZGRpbmdMZWZ0O1xuICAgICAgICByZXR1cm4gd2lkdGg7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9ja0NhcmRFbGVtZW50ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3Nlc3QoJ3NsYXRlLWJsb2NrLWNhcmQnKTtcbiAgICAgICAgICAgIGlmIChibG9ja0NhcmRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmxvY2tDYXJkRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBzbGF0ZS1ibG9jay1jYXJkLSR7dGhpcy5lbGVtZW50LnR5cGV9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaW5pdEVkaXRvcih0aGlzLmVkaXRvcik7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxzQ2hhbmdlKCk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZUNlbGxQb3NpdGlvbkNoYW5nZSgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKTtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuT25TZWxlY3RlZENlbGxzKCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbktleWRvd25FdmVudCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5LZXl1cEV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5TZWxlY3RzdGFydEV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICAgICAgdGhpcy5iaW5kVGFibGVTY3JvbGxpbmdTaGFkb3coKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vcHRpb25zPy5udW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRJbWFnZURvbmUgPSBhd2FpdCB0aGlzLnJlc29sdmVJbWFnZSgpO1xuICAgICAgICAgICAgICAgIC8vIOetieW+heW6j+WPt+WIl+ihqOagvOWGheWbvueJh+WKoOi9veWujOaIkOWQjuWGjeWOu+a4suafk+ihqOagvOihjOmrmOW6plxuICAgICAgICAgICAgICAgIGlmIChsb2FkSW1hZ2VEb25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXNlUm93Q29udHJvbHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VSb3dDb250cm9scygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJDZWxsU3R5bGUoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgdGhpcy50YWJsZVJlY3RMZWZ0ID0gbGVmdDtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlU2Nyb2xsQ29udGFpbmVyU2Nyb2xsKCk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNvbnRhaW5lclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnRoZUVkaXRvclJlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEdyaWRDb2x1bW5zU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbHVtbkdyb3VwcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLndpbmRvd1Jlc2l6ZWQkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LndpZHRoQ2hhbmdlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRDb2x1bW5Hcm91cHMoKSB7XG4gICAgICAgIHRoaXMuY29sdW1ucyA9IGNhbGNDb2x1bW5Hcm91cHModGhpcy5yZWFkb25seSwgdGhpcy5lbGVtZW50LCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCwgdGhpcy5jb25maWcubW9kZSk7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICAvKiDnu5nmoIfpopjooYznmoTlt6Yv5Y+z5Yqg6Zi05b2xICovXG4gICAgc2V0SGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICAvLyDlm7rlrprmoIfpopjooYzpga7nm5ZcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnei1pbmRleCcsIHRoaXMuaXNTdGlja3lUb3AgPyAnMycgOiAnMCcpO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cgfHwgdGhpcy5pc1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICBsZXQgeyBoZWlnaHQsIHRvcCB9ID0gdGhpcy5jYWxjSGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICBsZXQgeyBsZWZ0LCB3aWR0aCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93UmlnaHRTaGFkb3cgPSB0aGlzLmhlYWRlclJvd1JpZ2h0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dSaWdodFNoYWRvdywgJ2hlaWdodCcsIGAke2hlaWdodH1weGApO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaGVhZGVyUm93UmlnaHRTaGFkb3csICd0b3AnLCBgJHt0b3B9cHhgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvd1JpZ2h0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB3aWR0aCAtIDh9cHhgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGVmdFNoYWRvdyAmJiB0aGlzLmhlYWRlclJvd0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dMZWZ0U2hhZG93ID0gdGhpcy5oZWFkZXJSb3dMZWZ0U2hhZG93Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAndG9wJywgYCR7dG9wfXB4YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3dMZWZ0U2hhZG93LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxjSGVhZGVyUm93U2hhZG93KCkge1xuICAgICAgICBjb25zdCBoZWFkZXJSb3dIZWlnaHQgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KVswXT8uaGVpZ2h0O1xuICAgICAgICBsZXQgaGVpZ2h0ID0gaGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAvLyDpu5jorqTvvIjmsqHmnInogZrnhKbvvInnmoQgdG9wIOWAvO+8mua7muWKqOWuueWZqOmrmOW6piArIOihqOagvOeahHBhZGRpbmfvvIg477yJXG4gICAgICAgIGxldCB0b3AgPSB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIFRBQkxFX1BBRERJTkc7XG4gICAgICAgIC8vIOiBmueEpuWcqOihqOagvOS4re+8miDpq5jluqYgKyBjb250cm9s77yIMTHvvInvvIx0b3Ag5Yqg5LiA5LiqIG1hc2vvvIgxOe+8iVxuICAgICAgICBpZiAodGhpcy5pc0luVGFibGUpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodCArIFRBQkxFX0NPTlRST0w7XG4gICAgICAgICAgICB0b3AgPSB0b3AgKyBUQUJMRV9JTlNFUlRfTUFTSyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaGVpZ2h0LCB0b3AgfTtcbiAgICB9XG5cbiAgICBzdWJzY3JpYmVTY3JvbGxDb250YWluZXJTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY29udGFpbmVyU2Nyb2xsZWQkXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgbWFwKGVudGlyZXMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBldmVudCwgZGlyZWN0aW9uIH0gPSBlbnRpcmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGxlZnQgfSA9IHRoaXMubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2Nyb2xsWCA9IHRoaXMudGFibGVSZWN0TGVmdCAhPT0gbGVmdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gU2Nyb2xsRGlyZWN0aW9uLlkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGllbnRSZWN0ID0gKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhlYWRlclRvcEhlaWdodCA9IHRoaXMuaXNJblRhYmxlID8gLTE5IDogMTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93SGVpZ2h0ID0gY2FsY3VsYXRlUm93Q29udHJvbHModGhpcy5lZGl0b3IsIHRoaXMuZWxlbWVudClbMF0/LmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBjbGllbnRSZWN0LnRvcCArIGhlYWRlclRvcEhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5VG9wID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wIDw9IHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgOCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRSZWN0LmJvdHRvbSAtIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wID49IGhlYWRlclJvd0hlaWdodCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZyZWV6ZVJvd1BpcGUudHJhbnNmb3JtKHRoaXMuZWxlbWVudCwgdGhpcy5oZWFkZXJSb3csIHRoaXMudGFibGVQbHVnaW5PcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmoIfpopjooYzlhoXlrrnotoXov4flm7rlrprpq5jluqbml7bnp7vpmaTlhrvnu5NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhIZWFkZXJSb3dIZWlnaHQgPSAoMjQgKyA4KSAqIDExOyAvLyDotoXlh7ogMTEg6KGM77yM5Y+W5raI5Ya757uTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3lUb3AgPSBoZWFkZXJSb3dIZWlnaHQgPD0gbWF4SGVhZGVyUm93SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzU3RpY2t5VG9wO1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRIZWFkZXJDZWxsU3R5bGUoKSB7XG4gICAgICAgIGxldCBoZWFkZXJSb3dDZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXS5jaGlsZHJlbjtcbiAgICAgICAgbGV0IGhlYWRlckNvbHVtbkNlbGxzID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuLm1hcChpdGVtID0+IGl0ZW0uY2hpbGRyZW5bMF0pO1xuICAgICAgICBpZiAoIXRoaXMuaGVhZGVyUm93KSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUhlYWRlckNlbGxTdHlsZShoZWFkZXJSb3dDZWxscyk7XG4gICAgICAgICAgICBoZWFkZXJSb3dDZWxscyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm9wdGlvbnM/LmhlYWRlckNvbHVtbikge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVIZWFkZXJDZWxsU3R5bGUoaGVhZGVyQ29sdW1uQ2VsbHMpO1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaGVhZGVyQ2VsbHMgPSBoZWFkZXJSb3dDZWxscy5jb25jYXQoaGVhZGVyQ29sdW1uQ2VsbHMpLmZpbHRlcihpdGVtID0+ICFpdGVtLmhpZGRlbik7XG4gICAgICAgIGlmICh0aGlzLmhlYWRlclJvdyAmJiB0aGlzLmVsZW1lbnQub3B0aW9ucz8uaGVhZGVyQ29sdW1uKSB7XG4gICAgICAgICAgICBoZWFkZXJDZWxscy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWFkZXJDZWxscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGhlYWRlckNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IFRoZUVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoY2VsbEVsZW1lbnQsIEhFQURFUl9DRUxMX0NMQVNTKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0SGVhZGVyQ29sdW1uQW5kQ29udHJvbFN0eWxlKGhlYWRlckNvbHVtbkNlbGxzKTtcbiAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTdHlsZSgpO1xuICAgIH1cblxuICAgIHJlbW92ZUhlYWRlckNlbGxTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxFbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgaXRlbSk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGNlbGxFbGVtZW50LCBIRUFERVJfQ0VMTF9DTEFTUyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlckNvbHVtbkFuZENvbnRyb2xTdHlsZShjZWxsczogVGFibGVDZWxsRWxlbWVudFtdKSB7XG4gICAgICAgIGxldCBoZWFkZXJDb2x1bW5DZWxscyA9IFtdO1xuICAgICAgICBpZiAoY2VsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBoZWFkZXJDb2x1bW5DZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbi5tYXAoaXRlbSA9PiBpdGVtLmNoaWxkcmVuWzBdKS5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaGVhZGVyQ29sdW1uQ2VsbHMgPSBjZWxscy5maWx0ZXIoaXRlbSA9PiAhaXRlbS5oaWRkZW4pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhlYWRlckNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICBjb25zdCBoZWFkZXJDb2x1bW5FbGVtZW50cyA9IGhlYWRlckNvbHVtbkNlbGxzLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUaGVFZGl0b3IudG9ET01Ob2RlKHRoaXMuZWRpdG9yLCBpdGVtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFsuLi5oZWFkZXJDb2x1bW5FbGVtZW50cywgaGVhZGVyQ29sQ29udHJvbF0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGl0ZW0sICd0aGUtc3RpY2t5LWNlbGwnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhpdGVtLCAndGhlLXN0aWNreS1jZWxsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEhlYWRlclJvd1N0eWxlKCkge1xuICAgICAgICB0aGlzLnNldEdyaWRDb2x1bW5zU3R5bGUoKTtcbiAgICAgICAgdGhpcy5zZXRTdGlja3lSb3dTdHlsZSgpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd1NoYWRvdygpO1xuICAgICAgICB0aGlzLnNldEhlYWRlclJvd0xlZnRTdHlsZSgpO1xuICAgIH1cblxuICAgIHNldEdyaWRDb2x1bW5zU3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5mcmVlemVSb3dQaXBlLnRyYW5zZm9ybSh0aGlzLmVsZW1lbnQsIHRoaXMuaGVhZGVyUm93LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucykpIHtcbiAgICAgICAgICAgIGNvbnN0IGhlYWRlclJvdyA9ICh0aGlzLnRib2R5RWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5jaGlsZE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29uc3QgY2VsbHNXaWR0aCA9XG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Py5jb2x1bW5zICYmIHRoaXMuY29sZ3JvdXA/Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgPyBnZXRDb2x1bW5zV2lkdGgodGhpcy5jb2xncm91cC5uYXRpdmVFbGVtZW50LCB0cnVlKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0RGVmYXVsdENlbGxXaWR0aCgpO1xuXG4gICAgICAgICAgICBjb25zdCBncmlkQ29sdW1ucyA9IGdldEdyaWRDb2x1bW5zKGhlYWRlclJvdywgY2VsbHNXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmcgPSA0NDtcbiAgICAgICAgICAgIGxldCB0YWJsZVdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG5cbiAgICAgICAgICAgIC8vIOW6j+WPt+WIl+WtmOWcqOaXtiwg6KGo5qC85a695bqm5Yqg5bqP5Y+35YiX5a695bqmXG4gICAgICAgICAgICAvLyDlj6ror7vmqKHlvI/kuIssIOihqOagvOWuveW6puS4jeWPmFxuICAgICAgICAgICAgdGFibGVXaWR0aCA9ICF0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gPyB0YWJsZVdpZHRoIC0gdGFibGVQYWRkaW5nIDogdGFibGVXaWR0aDtcblxuICAgICAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuaXNJblRhYmxlID8gW2NvbENvbnRyb2wsIGhlYWRlclJvd10gOiBbaGVhZGVyUm93XTtcbiAgICAgICAgICAgIHN0aWNreVJvd3MubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucycsIGdyaWRDb2x1bW5zKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0sICd3aWR0aCcsIHRhYmxlV2lkdGggKyAncHgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3RpY2t5Um93U3R5bGUoKSB7XG4gICAgICAgIGNvbnN0IGNvbENvbnRyb2wgPSB0aGlzLmNvbHVtbkNvbnRyb2xzV3JhcHBlci5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHkgdHInKTtcbiAgICAgICAgY29uc3Qgcm93Q29udHJvbElubmVyID0gdGhpcy5yb3dDb250cm9sc0lubmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRhYmxlQ29ybmVyQnRuID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGhlYWRlclJvd0hlaWdodCA9IGNhbGN1bGF0ZVJvd0NvbnRyb2xzKHRoaXMuZWRpdG9yLCB0aGlzLmVsZW1lbnQpWzBdPy5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcblxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsIFRhYmxlV2l0aFN0aWNreVJvd0NsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Um93U2Nyb2xsTGVmdCgpO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gdGhpcy5pc0luVGFibGUgPyB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArIDM2IDogdGhpcy5zY3JvbGxDb250YWluZXJUb3A7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGhlYWRlclJvdywgJ3RvcCcsIHRvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShoZWFkZXJSb3csICdoZWlnaHQnLCBgJHtoZWFkZXJSb3dIZWlnaHR9cHhgKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzSW5UYWJsZSB8fCBudW1iZXJlZENvbHVtbikge1xuICAgICAgICAgICAgICAgIFtjb2xDb250cm9sLCB0YWJsZUNvcm5lckJ0bl0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoaXRlbSwgJ3RvcCcsIHRoaXMuc2Nyb2xsQ29udGFpbmVyVG9wICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDkvJjljJbvvJp0YWJsZSDnmoQgcGFkZGluZy10b3Ag5bqU6K+l5Yqo5oCB5Y+Y5YyW77yI5LiO6Zi05b2x5ZCM5Y+Y77yJXG4gICAgICAgICAgICBjb25zdCB0YWJsZVBhZGRpbmdUb3AgPSBoZWFkZXJSb3dIZWlnaHQgKyAxMTsgLy8g5qCH6aKY6KGM6auYICsgY3RybCBidG7vvIgxMXB477yJ6auY5bqmXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGhlVGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXRvcCcsIHRhYmxlUGFkZGluZ1RvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyb3dDb250cm9sSW5uZXIsICdwYWRkaW5nLXRvcCcsIHRhYmxlUGFkZGluZ1RvcCArICdweCcpO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnRhYmxlUm93Q29udHJvbHNXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICd6LWluZGV4JywgJzQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBUYWJsZVdpdGhTdGlja3lSb3dDbGFzcyk7XG4gICAgICAgICAgICBbaGVhZGVyUm93LCBjb2xDb250cm9sLCB0YWJsZUNvcm5lckJ0bl0ubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0gJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLCAndG9wJywgbnVsbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy50aGVUYWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xJbm5lciwgJ3BhZGRpbmctdG9wJywgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMudGFibGVSb3dDb250cm9sc1dyYXBwZXIubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCAnMScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93Q29udHJvbEJ1dHRvbiA9IHRoaXMucm93Q29udHJvbHNCdXR0b25XcmFwcGVyLmZpcnN0Py5uYXRpdmVFbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCAmJiByb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNldFJvd0NvbnRyb2xCdXR0b25TdHlsZShyb3dDb250cm9sQnV0dG9uKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHNldFRpbWVvdXTvvJog6ZyA6KaB562J5b6FIHJvd0NvbnRyb2xzIOWcqCBkb20g5Lit5riy5p+T5a6M5q+V5ZCO5omN6IO96I635Y+W5YiwIHJvd0NvbnRyb2xCdXR0b25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRSb3dDb250cm9sQnV0dG9uU3R5bGUocm93Q29udHJvbEJ1dHRvbikpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0Um93Q29udHJvbEJ1dHRvblN0eWxlKHJvd0NvbnRyb2xCdXR0b246IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IG51bWJlcmVkQ29sdW1uID0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbjtcbiAgICAgICAgaWYgKCFyb3dDb250cm9sQnV0dG9uKSB7XG4gICAgICAgICAgICByb3dDb250cm9sQnV0dG9uID0gdGhpcy5yb3dDb250cm9sc0J1dHRvbldyYXBwZXIuZmlyc3Q/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3ApIHtcbiAgICAgICAgICAgIGlmICgodGhpcy5pc0luVGFibGUgfHwgbnVtYmVyZWRDb2x1bW4pICYmIHJvd0NvbnRyb2xCdXR0b24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCB0aGlzLnNjcm9sbENvbnRhaW5lclRvcCArICdweCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93Q29udHJvbEJ1dHRvbiAmJiB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJvd0NvbnRyb2xCdXR0b24sICd0b3AnLCBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJpbmRUYWJsZVNjcm9sbGluZ1NoYWRvdygpIHtcbiAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBuYXRpdmVFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIGNvbnN0IHNjcm9sbFdpZHRoID0gbmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3QgY2xpZW50V2lkdGggPSBuYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoO1xuICAgICAgICB0aGlzLmlzTGVmdFNoYWRvdyA9IHNjcm9sbExlZnQgPiAwO1xuICAgICAgICB0aGlzLmlzUmlnaHRTaGFkb3cgPSBzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPCBzY3JvbGxXaWR0aDtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChgdHJgKTtcbiAgICAgICAgY29uc3Qgc3RpY2t5Q2VsbHMgPSBBcnJheS5mcm9tKHJvd3MpLm1hcChcbiAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5xdWVyeVNlbGVjdG9yKCd0aC50aGUtdGFibGUtY29sLWNvbnRyb2xzJykgfHwgaXRlbS5xdWVyeVNlbGVjdG9yKCd0ZC5zbGF0ZS1lbGVtZW50LXRhYmxlLWNlbGwnKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc0NvbHVtbkhlYWRlciA9IHRoaXMuZnJlZXplQ29sdW1uUGlwZS50cmFuc2Zvcm0odGhpcy5lbGVtZW50LCB0aGlzLnRhYmxlUGx1Z2luT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gaXNDb2x1bW5IZWFkZXIgPyBzdGlja3lDZWxscyA6IFtuYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRdO1xuICAgICAgICBpZiAodGhpcy5pc0xlZnRTaGFkb3cpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd0aGUtdGFibGUtbGVmdC1zaGFkb3cnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3RoZS10YWJsZS1sZWZ0LXNoYWRvdycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNSaWdodFNoYWRvdykge1xuICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3RoZS10YWJsZS1yaWdodC1zaGFkb3cnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd0aGUtdGFibGUtcmlnaHQtc2hhZG93Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdWJzY3JpYmVDZWxsUG9zaXRpb25DaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMudGFibGVTdG9yZVxuICAgICAgICAgICAgLmNlbGxzUG9zaXRpb25DaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDEwMCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN1YnNjcmliZUNlbGxzQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnRhYmxlU3RvcmVcbiAgICAgICAgICAgIC5kYW5nZXJvdXNPclNlbGVjdGVkQ2VsbHNDaGFuZ2UoKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdXNlUm93Q29udHJvbHMoKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLnNlbGVjdGlvbiAmJiAhdGhpcy5yZWFkb25seSkgfHxcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4gfHxcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHxcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMucm93Q29udHJvbHMgPSBjYWxjdWxhdGVSb3dDb250cm9scyh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldGVjdENoYW5nZXMoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICByZXNvbHZlSW1hZ2UoKSB7XG4gICAgICAgIGNvbnN0IGltYWdlRWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nJyk7XG4gICAgICAgIGlmIChpbWFnZUVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgaW1hZ2VSZXNvbHZlczogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgICAgIGltYWdlRWxlbWVudHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGltYWdlTG9hZCA9IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gaXRlbS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGltYWdlUmVzb2x2ZXMucHVzaChpbWFnZUxvYWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaW1hZ2VSZXNvbHZlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9scygpIHtcbiAgICAgICAgdGhpcy5jb2xDb250cm9scyA9IHRoaXMuZWxlbWVudD8uY2hpbGRyZW5bMF0/LmNoaWxkcmVuIHx8IFtdO1xuICAgIH1cblxuICAgIGdldElzSW5UYWJsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gbmV3IFRhYmxlT3B0aW9ucygpO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uID0gdGhpcy5lZGl0b3Iuc2VsZWN0aW9uO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQb3NpdGlvbiA9IGNyZWF0ZVRhYmxlUG9zaXRpb24odGhpcy5lZGl0b3IpO1xuICAgICAgICAgICAgY29uc3QgZW5kUG9zaXRpb24gPSBjcmVhdGVUYWJsZVBvc2l0aW9uKHRoaXMuZWRpdG9yLCBzZWxlY3Rpb24uZm9jdXMucGF0aCk7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IHN0YXJ0UG9zaXRpb24uaXNJblRhYmxlKCkgJiYgZW5kUG9zaXRpb24uaXNJblRhYmxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzSW5UYWJsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVmYXVsdENlbGxXaWR0aCgpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IHRyID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuWzBdIGFzIFRhYmxlUm93RWxlbWVudDtcbiAgICAgICAgbGV0IHdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIGlmICh0aGlzLnJvd0NvbnRyb2xzSW5uZXIpIHtcbiAgICAgICAgICAgIHdpZHRoIC09IHRoaXMucm93Q29udHJvbHNJbm5lci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb2xsYXBzZWRBbmROb25SZWFkb25seSkge1xuICAgICAgICAgICAgICAgIC8vIOiBmueEpuS5i+WQjuS8muWQkeW3puWBj+enu+S4gOS4qiBjb250cm9s77yILTEx77yJ77yM6KeBIC50aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcbiAgICAgICAgICAgICAgICB3aWR0aCArPSBUQUJMRV9DT05UUk9MO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNlbGxzV2lkdGggPSBbXTtcbiAgICAgICAgLy8g5Y+q6K+75qih5byP77yM5aaC5p6c5pyJ5bqP5Y+35YiX77yM6ZyA6KaB5YeP5Y675bqP5Y+35YiX55qE5a695bqmXG4gICAgICAgIGlmICh0aGlzLnJlYWRvbmx5ICYmIHRoaXMuZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW4pIHtcbiAgICAgICAgICAgIHdpZHRoIC09IFRBQkxFX05VTUJFUl9DT0xVTU47XG4gICAgICAgICAgICBjZWxsc1dpZHRoLnB1c2goVEFCTEVfTlVNQkVSX0NPTFVNTik7XG4gICAgICAgIH1cbiAgICAgICAgdHIuY2hpbGRyZW4uZm9yRWFjaCgoKSA9PiB7XG4gICAgICAgICAgICBjZWxsc1dpZHRoLnB1c2goTnVtYmVyKCh3aWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gY2VsbHNXaWR0aDtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplQ29sdW1ucygpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5jb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gW107XG4gICAgICAgICAgICB0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2NvbCcpLmZvckVhY2goKGVsZTogSFRNTEVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBDb21wYXRpYmxlIHdpdGggdGhlIHByb2JsZW0gdGhhdCB0aGUgd2lkdGggY2Fubm90IGJlIG9idGFpbmVkIHVuZGVyIHNhZmFyaSAjV0lLLTk2NDNcbiAgICAgICAgICAgICAgICBjb2x1bW5zLnB1c2goeyB3aWR0aDogZWxlLmNsaWVudFdpZHRoIHx8IGNvZXJjZVBpeGVsc0Zyb21Dc3NWYWx1ZShlbGUuc3R5bGUud2lkdGgpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBFZGl0b3IgY29udGFpbmVyIHdpZHRoIGNoYW5nZXMsIHJlc3VsdGluZyBpbiBjb2x1bW4gd2lkdGhzIG5vIGxvbmdlciB2YWxpZCAjV0lLLTY3NjZcbiAgICAgICAgICAgIGNvbnN0IHdhcm5pbmcgPSB0aGlzLmVsZW1lbnQuY29sdW1ucy5zb21lKChjb2wsIGluZGV4KSA9PiBjb2wud2lkdGggIT09IGNvbHVtbnNbaW5kZXhdPy53aWR0aCk7XG4gICAgICAgICAgICBpZiAod2FybmluZykge1xuICAgICAgICAgICAgICAgIFRoZVRyYW5zZm9ybXMuc2V0Tm9kZSh0aGlzLmVkaXRvciwgeyBjb2x1bW5zIH0sIHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IHRoaXMuZWxlbWVudC5jaGlsZHJlblswXSBhcyBUYWJsZVJvd0VsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCB0YWJsZVdpZHRoID0gQW5ndWxhckVkaXRvci50b0RPTU5vZGUodGhpcy5lZGl0b3IsIHRyKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0ci5jaGlsZHJlbi5tYXAoY2VsbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IE51bWJlcigodGFibGVXaWR0aCAvIHRyLmNoaWxkcmVuLmxlbmd0aCAtIHRyLmNoaWxkcmVuLmxlbmd0aCkudG9GaXhlZCgyKSkgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGNvbHVtbnMgfSwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXRpYWxpemVSb3dzKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4ubWFwKChyb3csIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXJvdy5oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gVGhlRWRpdG9yLnRvRE9NTm9kZSh0aGlzLmVkaXRvciwgcm93KTtcbiAgICAgICAgICAgICAgICBsZXQgaGVpZ2h0ID0gZ2V0RWxlbWVudEhlaWdodChlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgaGVpZ2h0IH0sIHJvdyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHRyYW5zZm9ybVJvd0hlaWdodCgpIHtcbiAgICAgICAgY29uc3Qgcm93RWxlbWVudHMgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGJvZHknKS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHJvd0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAoWy4uLnJvd0VsZW1lbnRzXSBhcyBIVE1MVGFibGVSb3dFbGVtZW50W10pLm1hcCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBnZXRFbGVtZW50SGVpZ2h0KHJvdyk7XG4gICAgICAgICAgICAgICAgVGhlVHJhbnNmb3Jtcy5zZXROb2RlKHRoaXMuZWRpdG9yLCB7IGhlaWdodCB9LCB0aGlzLmVsZW1lbnQuY2hpbGRyZW5baW5kZXhdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJhbnNmb3JtQ29sdW1uc1dpZHRoKCkge1xuICAgICAgICBjb25zdCBjb2xzID0gWy4uLnRoaXMubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjb2xncm91cCcpLmNoaWxkcmVuXSBhcyBIVE1MVGFibGVDb2xFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IFRoZVRhYmxlQ29sdW1uW10gPSBjb2xzLm1hcChjb2wgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgd2lkdGg6IGdldEVsZW1lbnRXaWR0aChjb2wpIH07XG4gICAgICAgIH0pO1xuICAgICAgICBUaGVUcmFuc2Zvcm1zLnNldE5vZGUodGhpcy5lZGl0b3IsIHsgY29sdW1ucyB9LCB0aGlzLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIG9uQ29sTW91c2Vkb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoISF0aGlzLnNlbGVjdGlvbiAmJiB0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyRGFuZ2Vyb3VzQ2VsbHMoKTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDb2x1bW4odGhpcy5lZGl0b3IsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblJvd01vdXNlZG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBpZiAodGhpcy5yZWFkb25seSkgcmV0dXJuO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5UYWJsZSkge1xuICAgICAgICAgICAgY29uc3QgcGF0aCA9IFRoZUVkaXRvci5maW5kUGF0aCh0aGlzLmVkaXRvciwgdGhpcy5lbGVtZW50KTtcbiAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRhYmxlU3RvcmUuc2VsZWN0Um93KHRoaXMuZWRpdG9yLCBpbmRleCk7XG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmFmdGVyU2VsZWN0ZWRDZWxscyhldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHRoaXMuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3RUYWJsZShldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy50YWJsZVN0b3JlLnNlbGVjdFRhYmxlKHRoaXMuZWRpdG9yKTtcbiAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuYWZ0ZXJTZWxlY3RlZENlbGxzKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgdGhpcy5lbGVtZW50KTtcbiAgICB9XG5cbiAgICBsaXN0ZW5UYWJsZUNvbnRleHRNZW51RXZlbnQoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLnRoZVRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LCAnY29udGV4dG1lbnUnKVxuICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RvcmUuaXNSaWdodENsaWNraW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoU0xBX1RBQkxFX0NFTExfU0VMRUNUT1IpIGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2VsbC5jbGFzc0xpc3QuY29udGFpbnMoJ3NlbGVjdGVkLWNlbGwnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5zZWxlY3RDZWxsKGNlbGwsIHRoaXMuZWRpdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5pc09wZW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZUNvbnRleHRNZW51KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50YWJsZVNlcnZpY2UuaXNPcGVuZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3NlVG9vbGJhcigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aGVUYWJsZUNvbnRleHRNZW51U2VydmljZS5vcGVuTWVudUxpc3QoZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLm9wZW5NZW51TGlzdChldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXRjaCBmb3IgcmlnaHQgY2xpY2sgc2VsZWN0IG5leHQgY2VsbFxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KHRoaXMuZWRpdG9yLCBFZGl0b3Iuc3RhcnQodGhpcy5lZGl0b3IsIHRoaXMuZWRpdG9yLnNlbGVjdGlvbikpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuT25TZWxlY3RlZENlbGxzKCkge1xuICAgICAgICBtZXJnZShcbiAgICAgICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pihkb2N1bWVudCwgJ21vdXNlZG93bicpLnBpcGUoZmlsdGVyKChlOiBNb3VzZUV2ZW50KSA9PiBlLmJ1dHRvbiAhPT0gMikpLFxuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhaXNWaXJ0dWFsS2V5KGUpICYmICF0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmlzT3BlbmVkO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbG9ySW5wdXQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmlzRm9jdXNlZElucHV0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb2xvclBhbmVsKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZENlbGxQb3NpdGlvbnMgPSB0aGlzLnRhYmxlU3RvcmUuZ2V0U2VsZWN0ZWRDZWxsUG9zaXRpb25zKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZENlbGxQb3NpdGlvbnM/Lmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGUudHlwZSA9PT0gJ2tleWRvd24nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHNDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudFRhYmxlRWxlbWVudCA9IHRoaXMubmF0aXZlRWxlbWVudC5jb250YWlucyhlLnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRUYWJsZUVsZW1lbnQgfHwgKCF0aGlzLnRhYmxlU3RvcmUucG9pbnRlclNlbGVjdGlvbiAmJiAhdGhpcy50YWJsZVN0b3JlLmFyZWFTZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTdG9yZS5jbGVhclNlbGVjdGVkQ2VsbHMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRUYWJsZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0b3JlLmNsZWFyTGFzdEZvY3VzUGF0aCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnRoZVRhYmxlQ29udGV4dE1lbnVTZXJ2aWNlLmNsb3NlQ29udGV4dE1lbnUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbktleWRvd25FdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChlOiBLZXlib2FyZEV2ZW50KSA9PiAhIWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBpc0tleUhvdGtleSgnbW9kJywgZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5oYW5kbGVLZXlkb3duRm9yUG9pbnRlclNlbGVjdGlvbihldmVudCwgdGhpcy50Ym9keU5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZWFkb25seSAmJiBpc0tleUhvdGtleSgnc2hpZnQnLCBldmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLmhhbmRsZUtleWRvd25Gb3JBcmVhU2VsZWN0aW9uKGV2ZW50LCB0aGlzLnRib2R5TmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuS2V5dXBFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGRvY3VtZW50LCAna2V5dXAnKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoZTogS2V5Ym9hcmRFdmVudCkgPT4gISFlKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2UuY2FuY2VsUG9pbnRlclNlbGVjdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5jYW5jZWxBcmVhU2VsZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbGlzdGVuU2VsZWN0c3RhcnRFdmVudCgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JylcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVNlcnZpY2Uuc2VsZWN0U3RhcnRQcmV2ZW50RGVmYXVsdChldmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlblRhYmxlV3JhcHBlclNjcm9sbCgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuXG4gICAgICAgIGNvbnN0IHNldFN0aWNreVJvd1BvaW50ZXJFdmVudHMgPSAocG9pbnRlckV2ZW50c1N0eWxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3RpUm93IG9mIHN0aWNreVJvd3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHN0aVJvdywgJ3BvaW50ZXItZXZlbnRzJywgcG9pbnRlckV2ZW50c1N0eWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdGltZXI7XG4gICAgICAgIGZyb21FdmVudCh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnd2hlZWwnKVxuICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g5aSE55CG5qCH6aKY6KGM5Zu65a6a5pe255qE5rua5Yqo6Lef6ZqPXG4gICAgICAgICAgICAgICAgc2V0U3RpY2t5Um93UG9pbnRlckV2ZW50cygnbm9uZScpO1xuICAgICAgICAgICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5Um93UG9pbnRlckV2ZW50cygnYXV0bycpO1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZyb21FdmVudCh0aGlzLnRhYmxlV3JhcHBlci5uYXRpdmVFbGVtZW50LCAnc2Nyb2xsJylcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYmluZFRhYmxlU2Nyb2xsaW5nU2hhZG93KCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lSb3dTY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRIZWFkZXJSb3dTaGFkb3coKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZVN0aWNreVJvd1Njcm9sbExlZnQoKSB7XG4gICAgICAgIC8vIOWIpOaWreaYr+WQpuWHuueOsOWbuuWumuagh+mimOihjFxuICAgICAgICBpZiAodGhpcy5pc1N0aWNreVRvcCkge1xuICAgICAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzdGlSb3cgb2Ygc3RpY2t5Um93cykge1xuICAgICAgICAgICAgICAgIC8vIOS/ruWkjeiOt+WPliBzY3JvbGxMZWZ0IOWxnuaAp+W8lei1t+eahOa1j+iniOWZqOmHjee7mO+8jOWvvOiHtOi3s+WKqOmXrumimCAjV0lLLTExMDM4XG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8g5ZCM5q2l5rua5Yqo54q25oCB5YiwIC50aGUtc3RpY2t5LXJvd1xuICAgICAgICAgICAgICAgICAgICBzdGlSb3cuc2Nyb2xsTGVmdCA9IHRoaXMudGFibGVXcmFwcGVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldEhlYWRlclJvd0xlZnRTdHlsZSgpIHtcbiAgICAgICAgY29uc3Qgc3RpY2t5Um93cyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGUtc3RpY2t5LXJvdycpO1xuICAgICAgICBjb25zdCBjb3JuZXJDb250cm9sID0gdGhpcy5jb3JuZXJDb250cm9sLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHJvd0NvbnRyb2wgPSB0aGlzLnJvd0NvbnRyb2xzQnV0dG9uV3JhcHBlci5maXJzdD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3RpY2t5RWxlbWVudHMgPSBbLi4uc3RpY2t5Um93cywgY29ybmVyQ29udHJvbCwgcm93Q29udHJvbF07XG4gICAgICAgIGNvbnN0IHsgbGVmdCB9ID0gdGhpcy5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmlzSW5UYWJsZSA/IC1UQUJMRV9DT05UUk9MIDogMDtcbiAgICAgICAgaWYgKHRoaXMuaXNTdGlja3lUb3AgJiYgdGhpcy5pc1Njcm9sbFgpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVhZGVyUm93U2hhZG93KCk7XG4gICAgICAgICAgICBzdGlja3lSb3dzLmZvckVhY2goKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnbGVmdCcsIGAke2xlZnQgKyB0aGlzLmdldENvbENvbnRyb2xCdXR0b25XaWR0aCgpfXB4YCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoY29ybmVyQ29udHJvbCwgJ2xlZnQnLCBgJHtsZWZ0ICsgYnVmZmVyfXB4YCk7XG4gICAgICAgICAgICByb3dDb250cm9sICYmIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocm93Q29udHJvbCwgJ2xlZnQnLCBgJHtsZWZ0ICsgYnVmZmVyfXB4YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGlja3lFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQgJiYgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShlbGVtZW50LCAnbGVmdCcsIG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRDb2xDb250cm9sQnV0dG9uV2lkdGggPSAoKSA9PiB7XG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgICByZXN1bHQgKz0gdGhpcy5lbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtbiA/IFRBQkxFX05VTUJFUl9DT0xVTU4gOiAwO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICB0cmFja0J5Rm5Sb3dDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm5Db2xDb250cm9scyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvbnRhaW5lclwiIHRoZUNvbHVtblJlc2l6ZT5cbiAgPGRpdiAjdGFibGVSb3dDb250cm9sc1dyYXBwZXIgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLXdyYXBwZXJcIj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItY29udHJvbHMgdGhlLXN0aWNreS1jb3JuZXItY29udHJvbHNcIlxuICAgICAgI2Nvcm5lckNvbnRyb2xcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgdmlzaWJsZTogIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCksXG4gICAgICAgICdjb250cm9sLWFjdGl2ZSc6IGlzU2VsZWN0ZWRBbGxDZWxsLFxuICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuaXNTZWxlY3RlZFRhYmxlICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgfVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInRoZS10YWJsZS1jb3JuZXItYnV0dG9uXCIgKG1vdXNlZG93bik9XCJvblNlbGVjdFRhYmxlKCRldmVudClcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtY29ybmVyLWNvbnRyb2xzLWluc2VydC1yb3ctbWFya2VyXCIgKm5nSWY9XCIhaGVhZGVyUm93XCI+XG4gICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCIwXCIgW3RhYmxlU3RvcmVdPVwidGFibGVTdG9yZVwiPjwvdGhlLXRhYmxlLWluc2VydC1tYXJrPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLWNvcm5lci1jb250cm9scy1pbnNlcnQtY29sdW1uLW1hcmtlclwiICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiPlxuICAgICAgICA8dGhlLXRhYmxlLWluc2VydC1tYXJrIHR5cGU9XCJjb2x1bW5cIiBbYXRdPVwiMFwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj48L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXJvdy1jb250cm9scy1pbm5lclwiICNyb3dDb250cm9sc0lubmVyPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbi13cmFwXCJcbiAgICAgICAgICAjcm93Q29udHJvbHNCdXR0b25XcmFwcGVyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGNvbnRyb2wgb2Ygcm93Q29udHJvbHM7IGxldCBpID0gaW5kZXg7IHRyYWNrQnk6IHRyYWNrQnlGblJvd0NvbnRyb2xzXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkUm93c0luZGV4LmluY2x1ZGVzKGNvbnRyb2wucm93SW5kZXgpLFxuICAgICAgICAgICAgZGFuZ2Vyb3VzOiB0YWJsZVN0b3JlLmRhbmdlcm91c1Jvd3NJbmRleC5pbmNsdWRlcyhjb250cm9sLnJvd0luZGV4KSAmJiB0YWJsZVN0b3JlLmRhbmdlcm91c0NlbGxzLmxlbmd0aCA+IDBcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIXJlYWRvbmx5ICYmIChpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dCkgJiYgIWVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Sb3dNb3VzZWRvd24oJGV2ZW50LCBjb250cm9sLnJvd0luZGV4KVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY29udHJvbC5oZWlnaHQgKyAxICsgJ3B4JyB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtcm93LWNvbnRyb2xzLWJ1dHRvbiB0aGUtdGFibGUtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgW2NvbnRlbnRFZGl0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblJvd01vdXNlZG93bigkZXZlbnQsIGNvbnRyb2wucm93SW5kZXgpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0aGUtdGFibGUtbnVtYmVyZWQtY29udHJvbHMtYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNvbnRyb2wuaGVpZ2h0ICsgMSArICdweCcgfVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxwIGNsYXNzPVwicm93LW51bWJlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+e3sgaGVhZGVyUm93ICYmIGkgPT09IDAgPyAnJyA6IGhlYWRlclJvdyA/IGkgOiBpICsgMSB9fTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmsgdHlwZT1cInJvd1wiIFthdF09XCJjb250cm9sLnJvd0luZGV4ICsgMVwiIFt0YWJsZVN0b3JlXT1cInRhYmxlU3RvcmVcIj4gPC90aGUtdGFibGUtaW5zZXJ0LW1hcms+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwidGhlLXRhYmxlLXdyYXBwZXJcIiAjdGFibGVXcmFwcGVyIFtuZ0NsYXNzXT1cInsgJ3RoZS10YWJsZS1udW1iZXJlZCc6IGVsZW1lbnQ/Lm9wdGlvbnM/Lm51bWJlcmVkQ29sdW1uIH1cIj5cbiAgICA8dGFibGUgY2xhc3M9XCJ0aGUtdGFibGVcIiAjdGhlVGFibGU+XG4gICAgICA8Y29sZ3JvdXAgI2NvbGdyb3VwICpuZ0lmPVwiY29sdW1uc1wiPlxuICAgICAgICA8Y29sICpuZ0lmPVwicmVhZG9ubHkgJiYgZWxlbWVudD8ub3B0aW9ucz8ubnVtYmVyZWRDb2x1bW5cIiBjbGFzcz1cInRoZS10YWJsZS1udW1iZXItY29sXCIgLz5cbiAgICAgICAgPGNvbCAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIiBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2wud2lkdGggKyAncHgnIH1cIiAvPlxuICAgICAgPC9jb2xncm91cD5cbiAgICAgIDx0aGVhZD5cbiAgICAgICAgPHRyIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9scy13cmFwcGVyIHRoZS1zdGlja3ktcm93XCIgI2NvbHVtbkNvbnRyb2xzV3JhcHBlcj5cbiAgICAgICAgICA8dGggKm5nSWY9XCJyZWFkb25seSAmJiBlbGVtZW50Py5vcHRpb25zPy5udW1iZXJlZENvbHVtblwiIGNsYXNzPVwidGhlLXRhYmxlLW51bWJlci1jb2xcIj48L3RoPlxuICAgICAgICAgIDx0aFxuICAgICAgICAgICAgI2NvbENvbnRyb2xcbiAgICAgICAgICAgIGNsYXNzPVwidGhlLXRhYmxlLWNvbC1jb250cm9sc1wiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgY29udHJvbCBvZiBjb2xDb250cm9sczsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuQ29sQ29udHJvbHNcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAnY29udHJvbC1hY3RpdmUnOiB0YWJsZVN0b3JlLnNlbGVjdGVkQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpLFxuICAgICAgICAgICAgICBkYW5nZXJvdXM6IHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ29sdW1uc0luZGV4LmluY2x1ZGVzKGkpICYmIHRhYmxlU3RvcmUuZGFuZ2Vyb3VzQ2VsbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uQ29sTW91c2Vkb3duKCRldmVudCwgaSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx0aGUtdGFibGUtaW5zZXJ0LW1hcmtcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0luVGFibGUgfHwgdGFibGVTdG9yZS5pc1JpZ2h0Q2xpY2tpbmcgfHwgdGFibGVTdG9yZS5pc0ZvY3VzZWRJbnB1dFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJjb2x1bW5cIlxuICAgICAgICAgICAgICBbYXRdPVwiaSArIDFcIlxuICAgICAgICAgICAgICBbdGFibGVTdG9yZV09XCJ0YWJsZVN0b3JlXCJcbiAgICAgICAgICAgICAgW3BhcmVudEVsZW1lbnRdPVwiY29sQ29udHJvbFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3RoZS10YWJsZS1pbnNlcnQtbWFyaz5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICAgIDx0Ym9keSAjdGJvZHk+XG4gICAgICAgIDxzbGF0ZS1jaGlsZHJlbiBbY2hpbGRyZW5dPVwiY2hpbGRyZW5cIiBbY29udGV4dF09XCJjaGlsZHJlbkNvbnRleHRcIiBbdmlld0NvbnRleHRdPVwidmlld0NvbnRleHRcIj4gPC9zbGF0ZS1jaGlsZHJlbj5cbiAgICAgIDwvdGJvZHk+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiIWVsZW1lbnQ/Lm9wdGlvbnM/LmhlYWRlckNvbHVtblwiXG4gICAgICAgICNoZWFkZXJSb3dMZWZ0U2hhZG93XG4gICAgICAgIGNsYXNzPVwiaGVhZGVyLXJvdy1zaGFkb3cgaGVhZGVyLXJvdy1sZWZ0LXNoYWRvd1wiXG4gICAgICAgIGNvbnRlbnRlZGl0YWJsZT1cImZhbHNlXCJcbiAgICAgID48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItcm93LXNoYWRvdyBoZWFkZXItcm93LXJpZ2h0LXNoYWRvd1wiICNoZWFkZXJSb3dSaWdodFNoYWRvdyBjb250ZW50ZWRpdGFibGU9XCJmYWxzZVwiPjwvZGl2PlxuICAgIDwvdGFibGU+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=