@talrace/ngx-noder 0.0.6 → 0.0.8

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 (645) hide show
  1. package/README.md +5 -4
  2. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +61 -0
  3. package/esm2022/lib/apart-components/add-link-dialog/validation.helper.mjs +7 -0
  4. package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +47 -0
  5. package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +32 -0
  6. package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +64 -0
  7. package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +89 -0
  8. package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +22 -0
  9. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +111 -0
  10. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +37 -0
  11. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +49 -0
  12. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +90 -0
  13. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-style/font-style.component.mjs +81 -0
  14. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +28 -0
  15. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +22 -0
  16. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +53 -0
  17. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/print/print.component.mjs +18 -0
  18. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/undo-redo/undo-redo.component.mjs +27 -0
  19. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/zoom/zoom.component.mjs +71 -0
  20. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +94 -0
  21. package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +24 -0
  22. package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +65 -0
  23. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +84 -0
  24. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.mjs +90 -0
  25. package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +117 -0
  26. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.mjs +8 -0
  27. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/numbering-templates.const.mjs +6 -6
  28. package/esm2022/lib/apart-components/editor-toolbar/shared/constants/svg-icons.const.mjs +157 -0
  29. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/alignment.enum.mjs +8 -0
  30. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.mjs +11 -0
  31. package/esm2022/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.mjs +1 -1
  32. package/esm2022/lib/apart-components/editor-toolbar/shared/enums/numbering-type.enum.mjs +6 -0
  33. package/esm2022/lib/apart-components/editor-toolbar/shared/services/custom-icon.service.mjs +34 -0
  34. package/esm2022/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.mjs +26 -0
  35. package/esm2022/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.mjs +60 -0
  36. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +55 -0
  37. package/esm2022/lib/apart-components/insert-table/insert-table.component.mjs +54 -0
  38. package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +84 -0
  39. package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +123 -0
  40. package/esm2022/lib/editor/components/edges/edge-element.model.mjs +9 -0
  41. package/esm2022/lib/editor/components/edges/edge-type.enum.mjs +6 -0
  42. package/esm2022/lib/editor/components/edges/edge.component.mjs +99 -0
  43. package/esm2022/lib/editor/components/edges/edges.mjs +108 -0
  44. package/esm2022/lib/editor/components/edges/page-type.enum.mjs +7 -0
  45. package/esm2022/lib/editor/components/editor.component.mjs +112 -0
  46. package/esm2022/lib/editor/components/external-element/external-element.service.mjs +6 -0
  47. package/esm2022/lib/editor/components/external-element/external-elements.const.mjs +4 -0
  48. package/esm2022/lib/editor/components/external-element/external-sidenav.interface.mjs +2 -0
  49. package/esm2022/lib/editor/components/external-element/external.component.mjs +41 -0
  50. package/esm2022/lib/editor/components/external-element/models/element-data.model.mjs +9 -0
  51. package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +11 -0
  52. package/esm2022/lib/editor/components/external-element/models/external-sidenav.model.mjs +15 -0
  53. package/esm2022/lib/editor/components/image/components/image.component.mjs +88 -0
  54. package/esm2022/lib/editor/components/image/image-api.service.mjs +36 -0
  55. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +38 -0
  56. package/esm2022/lib/editor/components/image/resizer/coordinate.mjs +2 -0
  57. package/esm2022/lib/editor/components/image/resizer/direction-wrapper.mjs +19 -0
  58. package/esm2022/lib/editor/components/image/resizer/direction.enum.mjs +12 -0
  59. package/esm2022/lib/editor/components/image/resizer/resizer.component.mjs +106 -0
  60. package/esm2022/lib/editor/components/image/resizer/size-delta.mjs +2 -0
  61. package/esm2022/lib/editor/components/image/resizer/size-wrapper.mjs +52 -0
  62. package/esm2022/lib/editor/components/image/size.mjs +2 -0
  63. package/esm2022/lib/editor/components/shared/abstract/base.component.mjs +59 -0
  64. package/esm2022/lib/editor/components/shared/abstract/destroy.component.mjs +18 -0
  65. package/esm2022/lib/editor/components/shared/custom-component.hepler.mjs +43 -0
  66. package/esm2022/lib/editor/components/shared/custom-components.interface.mjs +2 -0
  67. package/esm2022/lib/editor/components/shared/custom-content-markers.const.mjs +3 -0
  68. package/esm2022/lib/editor/components/shared/custom-content.mjs +2 -0
  69. package/esm2022/lib/editor/components/shared/services/component.service.mjs +64 -0
  70. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +163 -0
  71. package/esm2022/lib/editor/components/shared/services/overlay.service.mjs +55 -0
  72. package/esm2022/lib/editor/components/tab/tab.component.mjs +44 -0
  73. package/esm2022/lib/editor/components/tab/tab.helper.mjs +6 -0
  74. package/esm2022/lib/editor/components/table/cell-resizer/cell-resizer.mjs +118 -0
  75. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +97 -0
  76. package/esm2022/lib/editor/components/table/components/table.component.mjs +401 -0
  77. package/esm2022/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.mjs +1 -1
  78. package/esm2022/lib/editor/components/table/enums/reisizer-side.enum.mjs +8 -0
  79. package/esm2022/lib/editor/components/table/enums/vertical-merge.enum.mjs +6 -0
  80. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +18 -0
  81. package/esm2022/lib/editor/components/table/models/cell-resizer-parameters.model.mjs +9 -0
  82. package/esm2022/lib/editor/components/table/models/row-data.model.mjs +8 -0
  83. package/esm2022/lib/editor/components/table/models/selection-range.model.mjs +7 -0
  84. package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +74 -0
  85. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +366 -0
  86. package/esm2022/lib/editor/content/constants/display-values.const.mjs +8 -0
  87. package/esm2022/lib/editor/content/constants/document-info.const.mjs +13 -0
  88. package/esm2022/lib/editor/content/constants/editor.const.mjs +62 -0
  89. package/esm2022/lib/editor/content/contents.interface.mjs +2 -0
  90. package/esm2022/lib/editor/content/display-data/display-token.model.mjs +12 -0
  91. package/esm2022/lib/editor/content/display-data/document.mjs +134 -0
  92. package/esm2022/lib/editor/content/display-data/format-ext.model.mjs +10 -0
  93. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +11 -0
  94. package/esm2022/lib/editor/content/display-data/indent.model.mjs +9 -0
  95. package/esm2022/lib/editor/content/display-data/line-info.model.mjs +9 -0
  96. package/esm2022/lib/editor/content/display-data/lines.mjs +96 -0
  97. package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +226 -0
  98. package/esm2022/lib/editor/content/display-data/paragraph-info.interface.mjs +2 -0
  99. package/esm2022/lib/editor/content/display-data/paragraph.mjs +52 -0
  100. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +34 -0
  101. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +2 -0
  102. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +96 -0
  103. package/esm2022/lib/{+shared/editor → editor/content}/helpers/format.helper.mjs +1 -1
  104. package/esm2022/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.mjs +1 -1
  105. package/esm2022/lib/editor/content/helpers/scaling.helper.mjs +9 -0
  106. package/esm2022/lib/editor/content/margin.model.mjs +16 -0
  107. package/esm2022/lib/editor/content/page-vertical-data.model.mjs +9 -0
  108. package/esm2022/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.mjs +1 -1
  109. package/esm2022/lib/editor/core/event-emitting.mjs +56 -0
  110. package/esm2022/lib/editor/display/cell.interface.mjs +2 -0
  111. package/esm2022/lib/editor/display/event.helper.mjs +18 -0
  112. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +101 -0
  113. package/esm2022/lib/editor/display/layers/layer.config.mjs +2 -0
  114. package/esm2022/lib/editor/display/layers/pages.layer.mjs +97 -0
  115. package/esm2022/lib/editor/display/layers/print.pages.layer.mjs +7 -0
  116. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +7 -0
  117. package/esm2022/lib/editor/display/layers/selection.layer.mjs +113 -0
  118. package/esm2022/lib/editor/display/layers/text.layer.mjs +203 -0
  119. package/esm2022/lib/editor/display/print/print.helper.mjs +40 -0
  120. package/esm2022/lib/editor/display/print/print.renderer.mjs +67 -0
  121. package/esm2022/lib/editor/display/print/print.rendering.helper.mjs +7 -0
  122. package/esm2022/lib/editor/display/render-changes.interface.mjs +2 -0
  123. package/esm2022/lib/editor/display/render-changes.model.mjs +25 -0
  124. package/esm2022/lib/editor/display/renderer.mjs +206 -0
  125. package/esm2022/lib/editor/display/rendering.helper.mjs +187 -0
  126. package/esm2022/lib/editor/display/renderloop.mjs +26 -0
  127. package/esm2022/lib/editor/display/virtual.renderer.mjs +317 -0
  128. package/esm2022/lib/editor/display/visible-range.interface.mjs +2 -0
  129. package/esm2022/lib/editor/editor.module.mjs +67 -0
  130. package/esm2022/lib/editor/execution/distance.model.mjs +10 -0
  131. package/esm2022/lib/editor/execution/edit.session.mjs +1117 -0
  132. package/esm2022/lib/editor/execution/editor.mjs +1346 -0
  133. package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +18 -0
  134. package/esm2022/lib/editor/execution/helpers/dom.helper.mjs +42 -0
  135. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +64 -0
  136. package/esm2022/lib/editor/execution/helpers/page.helper.mjs +12 -0
  137. package/esm2022/lib/editor/execution/helpers/paragraph-style.helper.mjs +41 -0
  138. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +169 -0
  139. package/esm2022/lib/editor/execution/regulator.service.mjs +198 -0
  140. package/esm2022/lib/editor/execution/targeting/cell-session-source.model.mjs +19 -0
  141. package/esm2022/lib/editor/execution/targeting/edge-session-source.model.mjs +15 -0
  142. package/esm2022/lib/editor/execution/targeting/main-session-source.model.mjs +8 -0
  143. package/esm2022/lib/editor/execution/targeting/session-source.model.mjs +3 -0
  144. package/esm2022/lib/editor/execution/targeting/session.model.mjs +10 -0
  145. package/esm2022/lib/editor/gadgets/font-metrics/editor-version.const.mjs +2 -0
  146. package/esm2022/lib/editor/gadgets/font-metrics/font-metric-size.interface.mjs +2 -0
  147. package/esm2022/lib/editor/gadgets/font-metrics/font-metrics.helper.mjs +88 -0
  148. package/esm2022/lib/editor/gadgets/history/operation-history.mjs +206 -0
  149. package/esm2022/lib/editor/gadgets/history/operation.type.mjs +2 -0
  150. package/esm2022/lib/editor/gadgets/history/operations-history-info.model.mjs +7 -0
  151. package/esm2022/lib/editor/gadgets/numbering/numbering-data.model.mjs +9 -0
  152. package/esm2022/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.mjs +1 -1
  153. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +82 -0
  154. package/esm2022/lib/editor/gadgets/page-break/break-types.enum.mjs +7 -0
  155. package/esm2022/lib/editor/gadgets/page-break/break.helper.mjs +18 -0
  156. package/esm2022/lib/editor/gadgets/scrollbar.mjs +81 -0
  157. package/esm2022/lib/editor/gadgets/search/replace.interface.mjs +2 -0
  158. package/esm2022/lib/editor/gadgets/search/search-iteration.interface.mjs +2 -0
  159. package/esm2022/lib/editor/gadgets/search/search.mjs +231 -0
  160. package/esm2022/lib/editor/gadgets/unicode/unicode-chars.const.mjs +5 -0
  161. package/esm2022/lib/editor/gadgets/unicode/unicode.helper.mjs +20 -0
  162. package/esm2022/lib/editor/interaction/base.handler.mjs +19 -0
  163. package/esm2022/lib/editor/interaction/document.handler.mjs +27 -0
  164. package/esm2022/lib/editor/interaction/editor.service.mjs +325 -0
  165. package/esm2022/lib/editor/interaction/input.handler.mjs +149 -0
  166. package/esm2022/lib/{+shared/enums → editor/interaction}/mode.enum.mjs +1 -1
  167. package/esm2022/lib/editor/interaction/mouse-button.enum.mjs +7 -0
  168. package/esm2022/lib/editor/interaction/mouse.handler.mjs +49 -0
  169. package/esm2022/lib/editor/interaction/text-input.mjs +53 -0
  170. package/esm2022/lib/editor/operations/commands.service.mjs +20 -0
  171. package/esm2022/lib/editor/operations/enums/command-type.enum.mjs +32 -0
  172. package/esm2022/lib/editor/operations/enums/target-type.enum.mjs +7 -0
  173. package/esm2022/lib/editor/operations/helpers/break-operations.helper.mjs +9 -0
  174. package/esm2022/lib/editor/operations/helpers/content-operations.helper.mjs +15 -0
  175. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +55 -0
  176. package/esm2022/lib/editor/operations/helpers/image-operations.helper.mjs +19 -0
  177. package/esm2022/lib/editor/operations/helpers/indexed-element-operations.helper.mjs +43 -0
  178. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +28 -0
  179. package/esm2022/lib/editor/operations/helpers/numbering-operations.helper.mjs +55 -0
  180. package/esm2022/lib/editor/operations/helpers/paragraph-operations.helper.mjs +114 -0
  181. package/esm2022/lib/editor/operations/helpers/tab-operations.helper.mjs +16 -0
  182. package/esm2022/lib/editor/operations/helpers/table-operations.helper.mjs +374 -0
  183. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +432 -0
  184. package/esm2022/lib/editor/operations/save-commands.helper.mjs +127 -0
  185. package/esm2022/lib/editor/operations/target-operations.helper.mjs +23 -0
  186. package/esm2022/lib/editor/positioning/alignments.const.mjs +8 -0
  187. package/esm2022/lib/editor/positioning/content.helper.mjs +36 -0
  188. package/esm2022/lib/editor/positioning/cursor-paragraph.mjs +13 -0
  189. package/esm2022/lib/editor/positioning/cursor-position.interface.mjs +2 -0
  190. package/esm2022/lib/editor/positioning/insert-index.interface.mjs +2 -0
  191. package/esm2022/lib/editor/positioning/line-width.helper.mjs +13 -0
  192. package/esm2022/lib/editor/positioning/position.helper.mjs +194 -0
  193. package/esm2022/lib/editor/positioning/range.mjs +94 -0
  194. package/esm2022/lib/editor/positioning/selection.mjs +307 -0
  195. package/esm2022/lib/editor/revision.helper.mjs +91 -0
  196. package/esm2022/lib/models/generated/command.model.mjs +5 -1
  197. package/esm2022/lib/models/generated/insert-paragraph.model.mjs +20 -0
  198. package/esm2022/lib/models/generated/replace.model.mjs +5 -1
  199. package/esm2022/public-api.mjs +36 -33
  200. package/fesm2022/talrace-ngx-noder.mjs +3583 -3278
  201. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  202. package/lib/{+shared → apart-components}/add-link-dialog/add-link-dialog.component.d.ts +1 -1
  203. package/lib/apart-components/add-link-mobile/add-link-mobile.component.d.ts +19 -0
  204. package/lib/{+shared → apart-components}/confirm-dialog/confirm-dialog.component.d.ts +1 -1
  205. package/lib/{+shared → apart-components}/editor-search/editor-search-dialog.component.d.ts +6 -7
  206. package/lib/{+shared → apart-components}/editor-title/editor-title.component.d.ts +4 -3
  207. package/lib/apart-components/editor-title-mobile/editor-title-mobile.component.d.ts +6 -0
  208. package/lib/apart-components/editor-toolbar/components/base-toolbar.component.d.ts +49 -0
  209. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/color-picker/color-picker.component.d.ts +1 -1
  210. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/font.component.d.ts +2 -2
  211. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/font-size.component.d.ts +1 -1
  212. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/font-style.component.d.ts +1 -1
  213. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/format.component.d.ts +2 -2
  214. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/heading/heading.component.d.ts +1 -1
  215. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/numbering.component.d.ts +3 -3
  216. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/print/print.component.d.ts +1 -1
  217. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/undo-redo.component.d.ts +1 -1
  218. package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/zoom/zoom.component.d.ts +1 -1
  219. package/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.d.ts +36 -0
  220. package/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.d.ts +14 -0
  221. package/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.d.ts +23 -0
  222. package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +26 -0
  223. package/lib/apart-components/editor-toolbar/editor-toolbar/editor-toolbar.component.d.ts +40 -0
  224. package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +32 -0
  225. package/lib/apart-components/editor-toolbar/shared/constants/editor-toolbar-modes.const.d.ts +2 -0
  226. package/lib/apart-components/editor-toolbar/shared/constants/numbering-templates.const.d.ts +6 -0
  227. package/lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum.d.ts +9 -0
  228. package/lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service.d.ts +14 -0
  229. package/lib/apart-components/editor-toolbar/shared/services/toolbar-core.service.d.ts +38 -0
  230. package/lib/{+shared/editor-toolbar/helpers → apart-components/editor-toolbar/shared}/toolbar-styles.helper.d.ts +2 -2
  231. package/lib/{+shared → apart-components}/insert-table/insert-table.component.d.ts +1 -1
  232. package/lib/apart-components/insert-table-mobile/insert-table-mobile.component.d.ts +30 -0
  233. package/lib/apart-components/text-format-mobile/text-format-mobile.component.d.ts +35 -0
  234. package/lib/{+shared/editor/core/models → editor/components/edges}/edge-element.model.d.ts +1 -1
  235. package/lib/editor/components/edges/edge.component.d.ts +44 -0
  236. package/lib/{+shared/editor/core → editor}/components/edges/edges.d.ts +7 -7
  237. package/lib/{+shared/editor → editor/components}/editor.component.d.ts +10 -7
  238. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-sidenav.interface.d.ts +1 -1
  239. package/lib/{+shared/editor/custom-components → editor/components}/external-element/external.component.d.ts +4 -4
  240. package/lib/{+shared/editor/custom-components → editor/components}/image/components/image.component.d.ts +4 -4
  241. package/lib/editor/components/image/image-api.service.d.ts +17 -0
  242. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/resizer.component.d.ts +2 -2
  243. package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-wrapper.d.ts +1 -1
  244. package/lib/{+shared/editor/custom-components → editor/components}/shared/abstract/base.component.d.ts +4 -4
  245. package/lib/editor/components/shared/abstract/destroy.component.d.ts +9 -0
  246. package/lib/{+shared/editor/custom-components/shared/helpers → editor/components/shared}/custom-component.hepler.d.ts +3 -3
  247. package/lib/editor/components/shared/custom-components.interface.d.ts +13 -0
  248. package/lib/editor/components/shared/custom-content.d.ts +5 -0
  249. package/lib/{+shared/editor/custom-components/shared/services/component → editor/components/shared/services}/component.service.d.ts +1 -1
  250. package/lib/{+shared/editor/custom-components/shared/services/custom-content → editor/components/shared/services}/custom-content.service.d.ts +14 -12
  251. package/lib/{+shared/editor/custom-components → editor/components}/tab/tab.component.d.ts +2 -2
  252. package/lib/{+shared/editor/custom-components → editor/components}/table/cell-resizer/cell-resizer.d.ts +1 -1
  253. package/lib/{+shared/editor/custom-components → editor/components}/table/components/table-cell.component.d.ts +10 -10
  254. package/lib/{+shared/editor/custom-components → editor/components}/table/components/table.component.d.ts +8 -8
  255. package/lib/{+shared/editor/custom-components → editor/components}/table/overlay-menu/overlay-menu.component.d.ts +2 -2
  256. package/lib/{+shared/editor/custom-components → editor/components}/table/selection/table-selection.d.ts +3 -3
  257. package/lib/{+shared/editor/core → editor/content}/constants/editor.const.d.ts +3 -3
  258. package/lib/editor/content/contents.interface.d.ts +22 -0
  259. package/lib/{+shared/editor/core/models → editor/content/display-data}/display-token.model.d.ts +1 -1
  260. package/lib/{+shared/editor/core → editor/content/display-data}/document.d.ts +9 -9
  261. package/lib/{+shared/editor/core/models → editor/content/display-data}/format-ext.model.d.ts +1 -1
  262. package/lib/{+shared/editor/execution/models → editor/content/display-data}/general-properties.model.d.ts +1 -1
  263. package/lib/{+shared/editor/core/layers → editor/content/display-data}/lines.d.ts +1 -1
  264. package/lib/{+shared/editor/core/paging → editor/content/display-data}/pages.wrap.d.ts +13 -13
  265. package/lib/{+shared/editor/core/paging → editor/content/display-data}/paragraph.d.ts +4 -4
  266. package/lib/{+shared/editor/core/paging → editor/content/display-data}/text-line-info.d.ts +2 -2
  267. package/lib/editor/content/helpers/content-style.helper.d.ts +11 -0
  268. package/lib/{+shared/editor → editor/content}/helpers/indexed-element.helper.d.ts +1 -1
  269. package/lib/{+shared/editor/core/paging → editor/content}/page-vertical-data.model.d.ts +1 -1
  270. package/lib/{+shared/editor/core/base → editor/core}/event-emitting.d.ts +0 -5
  271. package/lib/{+shared/editor/core → editor/display}/layers/cursor.layer.d.ts +7 -8
  272. package/lib/{+shared/editor/core/interfaces → editor/display/layers}/layer.config.d.ts +2 -2
  273. package/lib/{+shared/editor/core → editor/display}/layers/pages.layer.d.ts +5 -6
  274. package/lib/editor/display/layers/print.text.layer.d.ts +4 -0
  275. package/lib/{+shared/editor/core → editor/display}/layers/selection.layer.d.ts +5 -6
  276. package/lib/editor/display/layers/text.layer.d.ts +34 -0
  277. package/lib/{+shared/helpers → editor/display/print}/print.helper.d.ts +3 -3
  278. package/lib/editor/display/print/print.renderer.d.ts +23 -0
  279. package/lib/{+shared/editor/core/helpers → editor/display/print}/print.rendering.helper.d.ts +2 -2
  280. package/lib/{+shared/editor/core/models → editor/display}/render-changes.model.d.ts +1 -1
  281. package/lib/{+shared/editor/core → editor/display}/renderer.d.ts +10 -13
  282. package/lib/{+shared/editor/core/helpers → editor/display}/rendering.helper.d.ts +7 -7
  283. package/lib/{+shared/editor/core/layers → editor/display}/renderloop.d.ts +2 -2
  284. package/lib/{+shared/editor/core → editor/display}/virtual.renderer.d.ts +14 -29
  285. package/lib/{+shared/editor → editor}/editor.module.d.ts +12 -10
  286. package/lib/{+shared/editor/core → editor/execution}/edit.session.d.ts +65 -63
  287. package/lib/{+shared/editor/core → editor/execution}/editor.d.ts +48 -43
  288. package/lib/editor/execution/helpers/delta.helper.d.ts +6 -0
  289. package/lib/{+shared/editor/core → editor/execution}/helpers/format-style.helper.d.ts +3 -5
  290. package/lib/{+shared/editor/core → editor/execution}/helpers/page.helper.d.ts +1 -1
  291. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph-style.helper.d.ts +1 -1
  292. package/lib/{+shared/editor/core → editor/execution}/helpers/paragraph.helper.d.ts +11 -8
  293. package/lib/{+shared/editor → editor}/execution/regulator.service.d.ts +15 -14
  294. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/cell-session-source.model.d.ts +3 -3
  295. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/edge-session-source.model.d.ts +3 -3
  296. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/main-session-source.model.d.ts +1 -1
  297. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session-source.model.d.ts +1 -1
  298. package/lib/{+shared/editor/execution/models → editor/execution/targeting}/session.model.d.ts +3 -3
  299. package/lib/{+shared/editor/core/helpers → editor/gadgets/font-metrics}/font-metrics.helper.d.ts +1 -1
  300. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation-history.d.ts +9 -7
  301. package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operation.type.d.ts +2 -1
  302. package/lib/{+shared/editor/core/models → editor/gadgets/numbering}/numbering-data.model.d.ts +1 -1
  303. package/lib/{+shared/editor/core/helpers → editor/gadgets/numbering}/numbering.helper.d.ts +8 -8
  304. package/lib/{+shared/editor/helpers → editor/gadgets/page-break}/break.helper.d.ts +2 -2
  305. package/lib/{+shared/editor/core/layers → editor/gadgets}/scrollbar.d.ts +9 -18
  306. package/lib/{+shared/editor/core → editor/gadgets/search}/search.d.ts +4 -4
  307. package/lib/editor/interaction/base.handler.d.ts +9 -0
  308. package/lib/editor/interaction/document.handler.d.ts +10 -0
  309. package/lib/{+shared/editor → editor}/interaction/editor.service.d.ts +24 -18
  310. package/lib/{+shared/editor → editor}/interaction/input.handler.d.ts +4 -5
  311. package/lib/{+shared/editor → editor}/interaction/mouse.handler.d.ts +1 -1
  312. package/lib/{+shared/editor → editor}/operations/enums/command-type.enum.d.ts +11 -10
  313. package/lib/{+shared/editor → editor}/operations/helpers/break-operations.helper.d.ts +2 -2
  314. package/lib/{+shared/editor → editor}/operations/helpers/format-operations.helper.d.ts +2 -2
  315. package/lib/editor/operations/helpers/image-operations.helper.d.ts +7 -0
  316. package/lib/{+shared/editor → editor}/operations/helpers/indexed-element-operations.helper.d.ts +1 -1
  317. package/lib/{+shared/editor → editor}/operations/helpers/link-operations.helper.d.ts +1 -1
  318. package/lib/{+shared/editor → editor}/operations/helpers/numbering-operations.helper.d.ts +3 -3
  319. package/lib/{+shared/editor → editor}/operations/helpers/paragraph-operations.helper.d.ts +3 -2
  320. package/lib/{+shared/editor → editor}/operations/helpers/tab-operations.helper.d.ts +1 -1
  321. package/lib/{+shared/editor → editor}/operations/helpers/table-operations.helper.d.ts +6 -6
  322. package/lib/{+shared/editor/operations/helpers → editor/operations}/operations-helper.helper.d.ts +21 -19
  323. package/lib/{+shared/editor/operations/helpers → editor/operations}/save-commands.helper.d.ts +28 -22
  324. package/lib/editor/operations/target-operations.helper.d.ts +6 -0
  325. package/lib/{+shared/editor/helpers → editor/positioning}/content.helper.d.ts +10 -5
  326. package/lib/editor/positioning/cursor-paragraph.d.ts +7 -0
  327. package/lib/{+shared/editor/core/interfaces → editor/positioning}/cursor-position.interface.d.ts +1 -1
  328. package/lib/{+shared/editor/core/helpers → editor/positioning}/line-width.helper.d.ts +2 -2
  329. package/lib/{+shared/editor/core/helpers → editor/positioning}/position.helper.d.ts +9 -9
  330. package/lib/{+shared/editor/core → editor/positioning}/range.d.ts +12 -12
  331. package/lib/{+shared/editor → editor}/positioning/selection.d.ts +10 -10
  332. package/lib/editor/revision.helper.d.ts +15 -0
  333. package/lib/models/generated/command.model.d.ts +2 -0
  334. package/lib/models/generated/insert-paragraph.model.d.ts +10 -0
  335. package/lib/models/generated/replace.model.d.ts +2 -0
  336. package/package.json +1 -1
  337. package/public-api.d.ts +35 -32
  338. package/src/_ngx-noder.theme.scss +14 -9
  339. package/src/assets/fonts/nc-iconfont.css +112 -106
  340. package/src/assets/fonts/nc-iconfont.eot +0 -0
  341. package/src/assets/fonts/nc-iconfont.svg +4 -1
  342. package/src/assets/fonts/nc-iconfont.ttf +0 -0
  343. package/src/assets/fonts/nc-iconfont.woff +0 -0
  344. package/src/lib/{+shared → apart-components}/add-link-dialog/_add-link-dialog.theme.scss +1 -1
  345. package/src/lib/apart-components/add-link-mobile/_add-link-mobile.theme.scss +25 -0
  346. package/src/lib/{+shared → apart-components}/confirm-dialog/_theme.scss +1 -1
  347. package/src/lib/{+shared → apart-components}/editor-title/_editor-title.theme.scss +1 -1
  348. package/src/lib/apart-components/editor-title-mobile/_editor-title-mobile.theme.scss +42 -0
  349. package/src/lib/apart-components/editor-toolbar/_editor-toolbar.theme.scss +27 -0
  350. package/src/lib/apart-components/editor-toolbar/_theme.scss +25 -0
  351. package/src/lib/apart-components/editor-toolbar/components/buttons/color-picker/_color-picker.theme.scss +12 -0
  352. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font/_font.theme.scss +1 -1
  353. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-size/_font-size.theme.scss +1 -1
  354. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/font-style/_font-style.theme.scss +1 -1
  355. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/format/_format.theme.scss +1 -1
  356. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/numbering/_numbering.theme.scss +1 -1
  357. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components/buttons}/undo-redo/_undo-redo.theme.scss +1 -1
  358. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/menu-dropdowns/_menu-dropdowns.theme.scss +1 -1
  359. package/src/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/_menu-dropdowns-mobile.theme.scss +33 -0
  360. package/src/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/components}/toolbar-actions/_toolbar-actions.theme.scss +2 -1
  361. package/src/lib/{+shared → apart-components}/insert-table/_insert-table.theme.scss +1 -1
  362. package/src/lib/apart-components/insert-table-mobile/_insert-table-mobile.theme.scss +54 -0
  363. package/src/lib/apart-components/text-format-mobile/_text-format-mobile.theme.scss +86 -0
  364. package/src/lib/{+shared/editor → editor}/_theme.scss +1 -1
  365. package/src/lib/{+shared/editor → editor/components}/_editor.theme.scss +10 -2
  366. package/src/scss/base-editor.scss +329 -0
  367. package/src/styles.scss +3 -58
  368. package/esm2022/lib/+shared/abstract/base-api.service.mjs +0 -99
  369. package/esm2022/lib/+shared/abstract/observer.component.mjs +0 -24
  370. package/esm2022/lib/+shared/add-link-dialog/add-link-dialog.component.mjs +0 -71
  371. package/esm2022/lib/+shared/confirm-dialog/confirm-dialog.component.mjs +0 -32
  372. package/esm2022/lib/+shared/constants/default-file-name.const.mjs +0 -2
  373. package/esm2022/lib/+shared/constants/paginator-sizes.const.mjs +0 -3
  374. package/esm2022/lib/+shared/editor/core/base/event-emitting.mjs +0 -71
  375. package/esm2022/lib/+shared/editor/core/components/edges/edge-type.enum.mjs +0 -6
  376. package/esm2022/lib/+shared/editor/core/components/edges/edge.component.mjs +0 -100
  377. package/esm2022/lib/+shared/editor/core/components/edges/edges.mjs +0 -104
  378. package/esm2022/lib/+shared/editor/core/constants/alignments.const.mjs +0 -8
  379. package/esm2022/lib/+shared/editor/core/constants/clipboardEventTypes.const.mjs +0 -6
  380. package/esm2022/lib/+shared/editor/core/constants/content-style-change.const.mjs +0 -15
  381. package/esm2022/lib/+shared/editor/core/constants/display-values.const.mjs +0 -8
  382. package/esm2022/lib/+shared/editor/core/constants/document-info.const.mjs +0 -13
  383. package/esm2022/lib/+shared/editor/core/constants/editor-version.const.mjs +0 -2
  384. package/esm2022/lib/+shared/editor/core/constants/editor.const.mjs +0 -62
  385. package/esm2022/lib/+shared/editor/core/constants/unicode-chars.const.mjs +0 -5
  386. package/esm2022/lib/+shared/editor/core/document.mjs +0 -134
  387. package/esm2022/lib/+shared/editor/core/edit.session.mjs +0 -1099
  388. package/esm2022/lib/+shared/editor/core/editor.mjs +0 -1274
  389. package/esm2022/lib/+shared/editor/core/enums/break-types.enum.mjs +0 -7
  390. package/esm2022/lib/+shared/editor/core/enums/mouse-button.enum.mjs +0 -7
  391. package/esm2022/lib/+shared/editor/core/enums/page-type.enum.mjs +0 -7
  392. package/esm2022/lib/+shared/editor/core/helpers/content-style.helper.mjs +0 -156
  393. package/esm2022/lib/+shared/editor/core/helpers/delta.helper.mjs +0 -18
  394. package/esm2022/lib/+shared/editor/core/helpers/dom.helper.mjs +0 -42
  395. package/esm2022/lib/+shared/editor/core/helpers/event.helper.mjs +0 -18
  396. package/esm2022/lib/+shared/editor/core/helpers/font-metrics.helper.mjs +0 -88
  397. package/esm2022/lib/+shared/editor/core/helpers/format-style.helper.mjs +0 -72
  398. package/esm2022/lib/+shared/editor/core/helpers/line-width.helper.mjs +0 -13
  399. package/esm2022/lib/+shared/editor/core/helpers/numbering.helper.mjs +0 -83
  400. package/esm2022/lib/+shared/editor/core/helpers/page.helper.mjs +0 -12
  401. package/esm2022/lib/+shared/editor/core/helpers/paragraph-style.helper.mjs +0 -41
  402. package/esm2022/lib/+shared/editor/core/helpers/paragraph.helper.mjs +0 -169
  403. package/esm2022/lib/+shared/editor/core/helpers/position.helper.mjs +0 -194
  404. package/esm2022/lib/+shared/editor/core/helpers/print.rendering.helper.mjs +0 -7
  405. package/esm2022/lib/+shared/editor/core/helpers/rendering.helper.mjs +0 -187
  406. package/esm2022/lib/+shared/editor/core/helpers/unicode.helper.mjs +0 -20
  407. package/esm2022/lib/+shared/editor/core/interfaces/cell.interface.mjs +0 -2
  408. package/esm2022/lib/+shared/editor/core/interfaces/cursor-position.interface.mjs +0 -2
  409. package/esm2022/lib/+shared/editor/core/interfaces/font-metric-size.interface.mjs +0 -2
  410. package/esm2022/lib/+shared/editor/core/interfaces/layer.config.mjs +0 -2
  411. package/esm2022/lib/+shared/editor/core/interfaces/paragraph-info.interface.mjs +0 -2
  412. package/esm2022/lib/+shared/editor/core/interfaces/render-changes.interface.mjs +0 -2
  413. package/esm2022/lib/+shared/editor/core/interfaces/replace.interface.mjs +0 -2
  414. package/esm2022/lib/+shared/editor/core/interfaces/search-iteration.interface.mjs +0 -2
  415. package/esm2022/lib/+shared/editor/core/interfaces/toolbar-styles.interface.mjs +0 -2
  416. package/esm2022/lib/+shared/editor/core/interfaces/visible-line-info.interface.mjs +0 -2
  417. package/esm2022/lib/+shared/editor/core/interfaces/visible-range.interface.mjs +0 -2
  418. package/esm2022/lib/+shared/editor/core/keyboard/text-input.mjs +0 -53
  419. package/esm2022/lib/+shared/editor/core/layers/cursor.layer.mjs +0 -103
  420. package/esm2022/lib/+shared/editor/core/layers/edges.layer.mjs +0 -99
  421. package/esm2022/lib/+shared/editor/core/layers/lines.mjs +0 -96
  422. package/esm2022/lib/+shared/editor/core/layers/pages.layer.mjs +0 -106
  423. package/esm2022/lib/+shared/editor/core/layers/print.edges.layer.mjs +0 -7
  424. package/esm2022/lib/+shared/editor/core/layers/print.pages.layer.mjs +0 -7
  425. package/esm2022/lib/+shared/editor/core/layers/print.text.layer.mjs +0 -7
  426. package/esm2022/lib/+shared/editor/core/layers/renderloop.mjs +0 -26
  427. package/esm2022/lib/+shared/editor/core/layers/scrollbar.mjs +0 -100
  428. package/esm2022/lib/+shared/editor/core/layers/selection.layer.mjs +0 -115
  429. package/esm2022/lib/+shared/editor/core/layers/text.layer.mjs +0 -124
  430. package/esm2022/lib/+shared/editor/core/models/display-token.model.mjs +0 -12
  431. package/esm2022/lib/+shared/editor/core/models/distance.model.mjs +0 -10
  432. package/esm2022/lib/+shared/editor/core/models/edge-element.model.mjs +0 -9
  433. package/esm2022/lib/+shared/editor/core/models/format-ext.model.mjs +0 -10
  434. package/esm2022/lib/+shared/editor/core/models/indent.model.mjs +0 -9
  435. package/esm2022/lib/+shared/editor/core/models/line-info.model.mjs +0 -9
  436. package/esm2022/lib/+shared/editor/core/models/margin.model.mjs +0 -16
  437. package/esm2022/lib/+shared/editor/core/models/numbering-data.model.mjs +0 -9
  438. package/esm2022/lib/+shared/editor/core/models/render-changes.model.mjs +0 -25
  439. package/esm2022/lib/+shared/editor/core/paging/page-vertical-data.model.mjs +0 -9
  440. package/esm2022/lib/+shared/editor/core/paging/pages.wrap.mjs +0 -226
  441. package/esm2022/lib/+shared/editor/core/paging/paragraph.mjs +0 -52
  442. package/esm2022/lib/+shared/editor/core/paging/text-line-info.mjs +0 -34
  443. package/esm2022/lib/+shared/editor/core/point.mjs +0 -13
  444. package/esm2022/lib/+shared/editor/core/print.renderer.mjs +0 -72
  445. package/esm2022/lib/+shared/editor/core/range.mjs +0 -94
  446. package/esm2022/lib/+shared/editor/core/renderer.mjs +0 -217
  447. package/esm2022/lib/+shared/editor/core/search.mjs +0 -231
  448. package/esm2022/lib/+shared/editor/core/virtual.renderer.mjs +0 -356
  449. package/esm2022/lib/+shared/editor/custom-components/external-element/external-element.service.mjs +0 -6
  450. package/esm2022/lib/+shared/editor/custom-components/external-element/external-elements.const.mjs +0 -4
  451. package/esm2022/lib/+shared/editor/custom-components/external-element/external-sidenav.interface.mjs +0 -2
  452. package/esm2022/lib/+shared/editor/custom-components/external-element/external.component.mjs +0 -41
  453. package/esm2022/lib/+shared/editor/custom-components/external-element/models/element-data.model.mjs +0 -9
  454. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-element.model.mjs +0 -11
  455. package/esm2022/lib/+shared/editor/custom-components/external-element/models/external-sidenav.model.mjs +0 -15
  456. package/esm2022/lib/+shared/editor/custom-components/image/components/image.component.mjs +0 -88
  457. package/esm2022/lib/+shared/editor/custom-components/image/input-handler/image-input.handler.mjs +0 -38
  458. package/esm2022/lib/+shared/editor/custom-components/image/interfaces/size.mjs +0 -2
  459. package/esm2022/lib/+shared/editor/custom-components/image/resizer/coordinate.mjs +0 -2
  460. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction-wrapper.mjs +0 -19
  461. package/esm2022/lib/+shared/editor/custom-components/image/resizer/direction.enum.mjs +0 -12
  462. package/esm2022/lib/+shared/editor/custom-components/image/resizer/resizer.component.mjs +0 -106
  463. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-delta.mjs +0 -2
  464. package/esm2022/lib/+shared/editor/custom-components/image/resizer/size-wrapper.mjs +0 -52
  465. package/esm2022/lib/+shared/editor/custom-components/image/services/image-api.service.mjs +0 -14
  466. package/esm2022/lib/+shared/editor/custom-components/shared/abstract/base.component.mjs +0 -59
  467. package/esm2022/lib/+shared/editor/custom-components/shared/constants/custom-content-markers.const.mjs +0 -3
  468. package/esm2022/lib/+shared/editor/custom-components/shared/helpers/custom-component.hepler.mjs +0 -43
  469. package/esm2022/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.mjs +0 -2
  470. package/esm2022/lib/+shared/editor/custom-components/shared/services/component/component.service.mjs +0 -64
  471. package/esm2022/lib/+shared/editor/custom-components/shared/services/custom-content/custom-content.service.mjs +0 -115
  472. package/esm2022/lib/+shared/editor/custom-components/shared/services/overlay/overlay.service.mjs +0 -55
  473. package/esm2022/lib/+shared/editor/custom-components/shared/types/custom-content.mjs +0 -2
  474. package/esm2022/lib/+shared/editor/custom-components/tab/tab.component.mjs +0 -44
  475. package/esm2022/lib/+shared/editor/custom-components/table/cell-resizer/cell-resizer.mjs +0 -118
  476. package/esm2022/lib/+shared/editor/custom-components/table/components/table-cell.component.mjs +0 -97
  477. package/esm2022/lib/+shared/editor/custom-components/table/components/table.component.mjs +0 -401
  478. package/esm2022/lib/+shared/editor/custom-components/table/enums/reisizer-side.enum.mjs +0 -8
  479. package/esm2022/lib/+shared/editor/custom-components/table/enums/vertical-merge.enum.mjs +0 -6
  480. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-data.model.mjs +0 -18
  481. package/esm2022/lib/+shared/editor/custom-components/table/models/cell-resizer-parameters.model.mjs +0 -9
  482. package/esm2022/lib/+shared/editor/custom-components/table/models/row-data.model.mjs +0 -8
  483. package/esm2022/lib/+shared/editor/custom-components/table/models/selection-range.model.mjs +0 -7
  484. package/esm2022/lib/+shared/editor/custom-components/table/overlay-menu/overlay-menu.component.mjs +0 -74
  485. package/esm2022/lib/+shared/editor/custom-components/table/selection/table-selection.mjs +0 -364
  486. package/esm2022/lib/+shared/editor/editor.component.mjs +0 -98
  487. package/esm2022/lib/+shared/editor/editor.module.mjs +0 -82
  488. package/esm2022/lib/+shared/editor/execution/models/cell-session-source.model.mjs +0 -19
  489. package/esm2022/lib/+shared/editor/execution/models/edge-session-source.model.mjs +0 -15
  490. package/esm2022/lib/+shared/editor/execution/models/general-properties.model.mjs +0 -11
  491. package/esm2022/lib/+shared/editor/execution/models/main-session-source.model.mjs +0 -8
  492. package/esm2022/lib/+shared/editor/execution/models/session-source.model.mjs +0 -3
  493. package/esm2022/lib/+shared/editor/execution/models/session.model.mjs +0 -10
  494. package/esm2022/lib/+shared/editor/execution/regulator.service.mjs +0 -203
  495. package/esm2022/lib/+shared/editor/helpers/break.helper.mjs +0 -18
  496. package/esm2022/lib/+shared/editor/helpers/content.helper.mjs +0 -30
  497. package/esm2022/lib/+shared/editor/helpers/tab.helper.mjs +0 -6
  498. package/esm2022/lib/+shared/editor/interaction/editor.service.mjs +0 -309
  499. package/esm2022/lib/+shared/editor/interaction/input.handler.mjs +0 -160
  500. package/esm2022/lib/+shared/editor/interaction/mouse.handler.mjs +0 -49
  501. package/esm2022/lib/+shared/editor/interfaces/contents.interface.mjs +0 -2
  502. package/esm2022/lib/+shared/editor/interfaces/insert-index.interface.mjs +0 -2
  503. package/esm2022/lib/+shared/editor/operation-history/operation-history.mjs +0 -184
  504. package/esm2022/lib/+shared/editor/operation-history/operation.type.mjs +0 -2
  505. package/esm2022/lib/+shared/editor/operation-history/operations-history-info.model.mjs +0 -7
  506. package/esm2022/lib/+shared/editor/operations/enums/command-type.enum.mjs +0 -31
  507. package/esm2022/lib/+shared/editor/operations/enums/target-type.enum.mjs +0 -7
  508. package/esm2022/lib/+shared/editor/operations/helpers/break-operations.helper.mjs +0 -9
  509. package/esm2022/lib/+shared/editor/operations/helpers/content-operations.helper.mjs +0 -15
  510. package/esm2022/lib/+shared/editor/operations/helpers/format-operations.helper.mjs +0 -56
  511. package/esm2022/lib/+shared/editor/operations/helpers/image-operations.helper.mjs +0 -19
  512. package/esm2022/lib/+shared/editor/operations/helpers/indexed-element-operations.helper.mjs +0 -43
  513. package/esm2022/lib/+shared/editor/operations/helpers/link-operations.helper.mjs +0 -28
  514. package/esm2022/lib/+shared/editor/operations/helpers/numbering-operations.helper.mjs +0 -55
  515. package/esm2022/lib/+shared/editor/operations/helpers/operations-helper.helper.mjs +0 -394
  516. package/esm2022/lib/+shared/editor/operations/helpers/paragraph-operations.helper.mjs +0 -83
  517. package/esm2022/lib/+shared/editor/operations/helpers/save-commands.helper.mjs +0 -118
  518. package/esm2022/lib/+shared/editor/operations/helpers/tab-operations.helper.mjs +0 -16
  519. package/esm2022/lib/+shared/editor/operations/helpers/table-operations.helper.mjs +0 -374
  520. package/esm2022/lib/+shared/editor/operations/helpers/target-operations.helper.mjs +0 -23
  521. package/esm2022/lib/+shared/editor/positioning/selection.mjs +0 -307
  522. package/esm2022/lib/+shared/editor/store/editor.actions.mjs +0 -13
  523. package/esm2022/lib/+shared/editor-search/editor-search-dialog.component.mjs +0 -71
  524. package/esm2022/lib/+shared/editor-title/editor-title.component.mjs +0 -83
  525. package/esm2022/lib/+shared/editor-toolbar/color-picker/color-picker.component.mjs +0 -32
  526. package/esm2022/lib/+shared/editor-toolbar/constants/svg-icons.const.mjs +0 -157
  527. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.component.mjs +0 -101
  528. package/esm2022/lib/+shared/editor-toolbar/editor-toolbar.module.mjs +0 -117
  529. package/esm2022/lib/+shared/editor-toolbar/enums/alignment.enum.mjs +0 -8
  530. package/esm2022/lib/+shared/editor-toolbar/enums/numbering-type.enum.mjs +0 -6
  531. package/esm2022/lib/+shared/editor-toolbar/font/font.component.mjs +0 -45
  532. package/esm2022/lib/+shared/editor-toolbar/font-size/font-size.component.mjs +0 -85
  533. package/esm2022/lib/+shared/editor-toolbar/font-style/font-style.component.mjs +0 -80
  534. package/esm2022/lib/+shared/editor-toolbar/format/format.component.mjs +0 -28
  535. package/esm2022/lib/+shared/editor-toolbar/heading/heading.component.mjs +0 -23
  536. package/esm2022/lib/+shared/editor-toolbar/helpers/toolbar-styles.helper.mjs +0 -55
  537. package/esm2022/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.mjs +0 -194
  538. package/esm2022/lib/+shared/editor-toolbar/numbering/numbering.component.mjs +0 -53
  539. package/esm2022/lib/+shared/editor-toolbar/print/print.component.mjs +0 -18
  540. package/esm2022/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.mjs +0 -126
  541. package/esm2022/lib/+shared/editor-toolbar/undo-redo/undo-redo.component.mjs +0 -27
  542. package/esm2022/lib/+shared/editor-toolbar/zoom/zoom.component.mjs +0 -74
  543. package/esm2022/lib/+shared/helpers/print.helper.mjs +0 -40
  544. package/esm2022/lib/+shared/helpers/revision.helper.mjs +0 -91
  545. package/esm2022/lib/+shared/helpers/scaling.helper.mjs +0 -9
  546. package/esm2022/lib/+shared/helpers/validation.helper.mjs +0 -7
  547. package/esm2022/lib/+shared/insert-table/insert-table.component.mjs +0 -54
  548. package/esm2022/lib/+shared/services/commands.service.mjs +0 -20
  549. package/esm2022/lib/+shared/services/custom-icon.service.mjs +0 -34
  550. package/lib/+shared/abstract/base-api.service.d.ts +0 -23
  551. package/lib/+shared/abstract/observer.component.d.ts +0 -10
  552. package/lib/+shared/constants/default-file-name.const.d.ts +0 -1
  553. package/lib/+shared/constants/paginator-sizes.const.d.ts +0 -2
  554. package/lib/+shared/editor/core/components/edges/edge.component.d.ts +0 -45
  555. package/lib/+shared/editor/core/constants/clipboardEventTypes.const.d.ts +0 -5
  556. package/lib/+shared/editor/core/constants/content-style-change.const.d.ts +0 -14
  557. package/lib/+shared/editor/core/helpers/content-style.helper.d.ts +0 -16
  558. package/lib/+shared/editor/core/helpers/delta.helper.d.ts +0 -6
  559. package/lib/+shared/editor/core/interfaces/visible-line-info.interface.d.ts +0 -5
  560. package/lib/+shared/editor/core/layers/edges.layer.d.ts +0 -24
  561. package/lib/+shared/editor/core/layers/print.edges.layer.d.ts +0 -4
  562. package/lib/+shared/editor/core/layers/print.text.layer.d.ts +0 -5
  563. package/lib/+shared/editor/core/layers/text.layer.d.ts +0 -22
  564. package/lib/+shared/editor/core/point.d.ts +0 -7
  565. package/lib/+shared/editor/core/print.renderer.d.ts +0 -25
  566. package/lib/+shared/editor/custom-components/image/services/image-api.service.d.ts +0 -8
  567. package/lib/+shared/editor/custom-components/shared/interfaces/custom-components.interface.d.ts +0 -13
  568. package/lib/+shared/editor/custom-components/shared/types/custom-content.d.ts +0 -5
  569. package/lib/+shared/editor/interfaces/contents.interface.d.ts +0 -22
  570. package/lib/+shared/editor/operations/helpers/image-operations.helper.d.ts +0 -7
  571. package/lib/+shared/editor/operations/helpers/target-operations.helper.d.ts +0 -6
  572. package/lib/+shared/editor/store/editor.actions.d.ts +0 -11
  573. package/lib/+shared/editor-toolbar/constants/numbering-templates.const.d.ts +0 -6
  574. package/lib/+shared/editor-toolbar/editor-toolbar.component.d.ts +0 -45
  575. package/lib/+shared/editor-toolbar/editor-toolbar.module.d.ts +0 -31
  576. package/lib/+shared/editor-toolbar/menu-dropdowns/menu-dropdowns.component.d.ts +0 -73
  577. package/lib/+shared/editor-toolbar/toolbar-actions/toolbar-actions.component.d.ts +0 -49
  578. package/lib/+shared/helpers/revision.helper.d.ts +0 -15
  579. package/src/lib/+shared/editor-toolbar/_editor-toolbar.theme.scss +0 -10
  580. package/src/lib/+shared/editor-toolbar/_theme.scss +0 -21
  581. package/src/scss/_mixins.scss +0 -14
  582. package/src/scss/_variables.scss +0 -1
  583. /package/lib/{+shared/helpers → apart-components/add-link-dialog}/validation.helper.d.ts +0 -0
  584. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/constants/svg-icons.const.d.ts +0 -0
  585. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/alignment.enum.d.ts +0 -0
  586. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-template-type.enum.d.ts +0 -0
  587. /package/lib/{+shared/editor-toolbar → apart-components/editor-toolbar/shared}/enums/numbering-type.enum.d.ts +0 -0
  588. /package/lib/{+shared → apart-components/editor-toolbar/shared}/services/custom-icon.service.d.ts +0 -0
  589. /package/lib/{+shared/editor/core → editor}/components/edges/edge-type.enum.d.ts +0 -0
  590. /package/lib/{+shared/editor/core/enums → editor/components/edges}/page-type.enum.d.ts +0 -0
  591. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-element.service.d.ts +0 -0
  592. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/external-elements.const.d.ts +0 -0
  593. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/element-data.model.d.ts +0 -0
  594. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-element.model.d.ts +0 -0
  595. /package/lib/{+shared/editor/custom-components → editor/components}/external-element/models/external-sidenav.model.d.ts +0 -0
  596. /package/lib/{+shared/editor/custom-components → editor/components}/image/input-handler/image-input.handler.d.ts +0 -0
  597. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/coordinate.d.ts +0 -0
  598. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction-wrapper.d.ts +0 -0
  599. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/direction.enum.d.ts +0 -0
  600. /package/lib/{+shared/editor/custom-components → editor/components}/image/resizer/size-delta.d.ts +0 -0
  601. /package/lib/{+shared/editor/custom-components/image/interfaces → editor/components/image}/size.d.ts +0 -0
  602. /package/lib/{+shared/editor/custom-components/shared/constants → editor/components/shared}/custom-content-markers.const.d.ts +0 -0
  603. /package/lib/{+shared/editor/custom-components/shared/services/overlay → editor/components/shared/services}/overlay.service.d.ts +0 -0
  604. /package/lib/{+shared/editor/helpers → editor/components/tab}/tab.helper.d.ts +0 -0
  605. /package/lib/{+shared/editor/core → editor/components/table}/enums/hrule.enum.d.ts +0 -0
  606. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/reisizer-side.enum.d.ts +0 -0
  607. /package/lib/{+shared/editor/custom-components → editor/components}/table/enums/vertical-merge.enum.d.ts +0 -0
  608. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-data.model.d.ts +0 -0
  609. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/cell-resizer-parameters.model.d.ts +0 -0
  610. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/row-data.model.d.ts +0 -0
  611. /package/lib/{+shared/editor/custom-components → editor/components}/table/models/selection-range.model.d.ts +0 -0
  612. /package/lib/{+shared/editor/core → editor/content}/constants/display-values.const.d.ts +0 -0
  613. /package/lib/{+shared/editor/core → editor/content}/constants/document-info.const.d.ts +0 -0
  614. /package/lib/{+shared/editor/core/models → editor/content/display-data}/indent.model.d.ts +0 -0
  615. /package/lib/{+shared/editor/core/models → editor/content/display-data}/line-info.model.d.ts +0 -0
  616. /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/paragraph-info.interface.d.ts +0 -0
  617. /package/lib/{+shared/editor/core/interfaces → editor/content/display-data}/toolbar-styles.interface.d.ts +0 -0
  618. /package/lib/{+shared/editor → editor/content}/helpers/format.helper.d.ts +0 -0
  619. /package/lib/{+shared → editor/content}/helpers/scaling.helper.d.ts +0 -0
  620. /package/lib/{+shared/editor/core/models → editor/content}/margin.model.d.ts +0 -0
  621. /package/lib/{+shared/editor/core/enums → editor/content}/vertical-alignment.enum.d.ts +0 -0
  622. /package/lib/{+shared/editor/core/interfaces → editor/display}/cell.interface.d.ts +0 -0
  623. /package/lib/{+shared/editor/core/helpers → editor/display}/event.helper.d.ts +0 -0
  624. /package/lib/{+shared/editor/core → editor/display}/layers/print.pages.layer.d.ts +0 -0
  625. /package/lib/{+shared/editor/core/interfaces → editor/display}/render-changes.interface.d.ts +0 -0
  626. /package/lib/{+shared/editor/core/interfaces → editor/display}/visible-range.interface.d.ts +0 -0
  627. /package/lib/{+shared/editor/core/models → editor/execution}/distance.model.d.ts +0 -0
  628. /package/lib/{+shared/editor/core → editor/execution}/helpers/dom.helper.d.ts +0 -0
  629. /package/lib/{+shared/editor/core/constants → editor/gadgets/font-metrics}/editor-version.const.d.ts +0 -0
  630. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/font-metrics}/font-metric-size.interface.d.ts +0 -0
  631. /package/lib/{+shared/editor/operation-history → editor/gadgets/history}/operations-history-info.model.d.ts +0 -0
  632. /package/lib/{+shared/editor/core/enums → editor/gadgets/numbering}/numbering-marker-type.enum.d.ts +0 -0
  633. /package/lib/{+shared/editor/core/enums → editor/gadgets/page-break}/break-types.enum.d.ts +0 -0
  634. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/replace.interface.d.ts +0 -0
  635. /package/lib/{+shared/editor/core/interfaces → editor/gadgets/search}/search-iteration.interface.d.ts +0 -0
  636. /package/lib/{+shared/editor/core/constants → editor/gadgets/unicode}/unicode-chars.const.d.ts +0 -0
  637. /package/lib/{+shared/editor/core/helpers → editor/gadgets/unicode}/unicode.helper.d.ts +0 -0
  638. /package/lib/{+shared/enums → editor/interaction}/mode.enum.d.ts +0 -0
  639. /package/lib/{+shared/editor/core/enums → editor/interaction}/mouse-button.enum.d.ts +0 -0
  640. /package/lib/{+shared/editor/core/keyboard → editor/interaction}/text-input.d.ts +0 -0
  641. /package/lib/{+shared/services → editor/operations}/commands.service.d.ts +0 -0
  642. /package/lib/{+shared/editor → editor}/operations/enums/target-type.enum.d.ts +0 -0
  643. /package/lib/{+shared/editor → editor}/operations/helpers/content-operations.helper.d.ts +0 -0
  644. /package/lib/{+shared/editor/core/constants → editor/positioning}/alignments.const.d.ts +0 -0
  645. /package/lib/{+shared/editor/interfaces → editor/positioning}/insert-index.interface.d.ts +0 -0
@@ -1,1274 +0,0 @@
1
- import { AddNumberingModel } from '../../../models/generated/add-numbering.model';
2
- import { ApplyElementStyleModel } from '../../../models/generated/apply-element-style.model';
3
- import { ApplyImageStyleModel } from '../../../models/generated/apply-image-style.model';
4
- import { ApplyParagraphStyleModel } from '../../../models/generated/apply-paragraph-style.model';
5
- import { ApplyTextStyleModel } from '../../../models/generated/apply-text-style.model';
6
- import { BreakHelper } from '../helpers/break.helper';
7
- import { BreakModel } from '../../../models/generated/break.model';
8
- import { BreakTypes } from './enums/break-types.enum';
9
- import { CUSTOM_ELEMENT_MARKER, TABLE_MARKER } from '../custom-components/shared/constants/custom-content-markers.const';
10
- import { ClipboardEventTypes } from './constants/clipboardEventTypes.const';
11
- import { ContentHelper } from '../helpers/content.helper';
12
- import { DeleteModel } from '../../../models/generated/delete.model';
13
- import { EdgeType } from './components/edges/edge-type.enum';
14
- import { ElementModel } from '../../../models/generated/element.model';
15
- import { EventEmitting } from './base/event-emitting';
16
- import { FormatHelper } from '../helpers/format.helper';
17
- import { ImageModel } from '../../../models/generated/image.model';
18
- import { IndexedElementHelper } from '../helpers/indexed-element.helper';
19
- import { InputHandler } from '../interaction/input.handler';
20
- import { InsertBreakModel } from '../../../models/generated/insert-break.model';
21
- import { InsertElementModel } from '../../../models/generated/insert-element.model';
22
- import { InsertImageModel } from '../../../models/generated/insert-image.model';
23
- import { InsertLinkModel } from '../../../models/generated/insert-link.model';
24
- import { InsertStyledTextModel } from '../../../models/generated/insert-styled-text.model';
25
- import { InsertTabModel } from '../../../models/generated/insert-tab.model';
26
- import { InsertTableColumnsModel } from '../../../models/generated/insert-table-columns.model';
27
- import { InsertTableModel } from '../../../models/generated/insert-table.model';
28
- import { InsertTableRowsModel } from '../../../models/generated/insert-table-rows.model';
29
- import { InsertTextModel } from '../../../models/generated/insert-text.model';
30
- import { MouseHandler } from '../interaction/mouse.handler';
31
- import { NEW_LINE_MARKUP } from './constants/editor.const';
32
- import { OperationHistory } from '../operation-history/operation-history';
33
- import { PageHelper } from './helpers/page.helper';
34
- import { ParagraphModel } from '../../../models/generated/paragraph.model';
35
- import { ParagraphStyleModel } from '../../../models/generated/paragraph-style.model';
36
- import { Point } from './point';
37
- import { PositionHelper } from './helpers/position.helper';
38
- import { PrintHelper } from '../../helpers/print.helper';
39
- import { Range } from './range';
40
- import { RemoveNumberingsModel } from '../../../models/generated/remove-numberings.model';
41
- import { RemoveTableColumnsModel } from '../../../models/generated/remove-table-columns.model';
42
- import { RemoveTableRowsModel } from '../../../models/generated/remove-table-rows.model';
43
- import { ReplaceModel } from '../../../models/generated/replace.model';
44
- import { ResizeTableColumnsModel } from '../../../models/generated/resize-table-columns.model';
45
- import { RestoreModel } from '../../../models/generated/restore.model';
46
- import { RestoreNumberingsModel } from '../../../models/generated/restore-numberings.model';
47
- import { RestoreParagraphStylesModel } from '../../../models/generated/restore-paragraph-styles.model';
48
- import { RestoreTableModel } from '../../../models/generated/restore-table.model';
49
- import { RestoreTextStylesModel } from '../../../models/generated/restore-text-styles.model';
50
- import { SaveCommandsHelper } from '../operations/helpers/save-commands.helper';
51
- import { ScalingHelper } from '../../helpers/scaling.helper';
52
- import { Search } from './search';
53
- import { Selection } from '../positioning/selection';
54
- import { TabModel } from '../../../models/generated/tab.model';
55
- import { TableModel } from '../../../models/generated/table.model';
56
- import { TextInput } from './keyboard/text-input';
57
- import { TextStyleModel } from '../../../models/generated/text-style.model';
58
- export class Editor extends EventEmitting {
59
- get mainSession() {
60
- return this.regulatorService.mainSession.session;
61
- }
62
- get mainRenderer() {
63
- return this.regulatorService.mainSession.renderer;
64
- }
65
- get session() {
66
- return this.regulatorService.currentSession.session;
67
- }
68
- get renderer() {
69
- return this.regulatorService.currentSession.renderer;
70
- }
71
- get isViewOnly() {
72
- return this.editorService.isViewOnly;
73
- }
74
- get targets() {
75
- return this.regulatorService.getCurrentSessionTargets();
76
- }
77
- constructor(model, container, editorService, regulatorService, commandsService, clipboard, customPageWidth) {
78
- super();
79
- this.model = model;
80
- this.container = container;
81
- this.editorService = editorService;
82
- this.regulatorService = regulatorService;
83
- this.commandsService = commandsService;
84
- this.clipboard = clipboard;
85
- this.customPageWidth = customPageWidth;
86
- this.MAX_COUNT = 999;
87
- this.parentTagName = 'APP-EDITOR';
88
- this.tableCellTagName = 'APP-NODER-TABLE-CELL';
89
- this.customElementTagNamesWithoutTable = ['APP-NODER-INPUT', 'APP-NODER-IMAGE', 'APP-NODER-SIGNATURE', 'APP-NODER-DATEPICKER'];
90
- this.customElementTagNames = [...this.customElementTagNamesWithoutTable, this.tableCellTagName];
91
- this.subscriptions = [];
92
- this.rerenderResize = () => {
93
- this.mainRenderer.onResize(true);
94
- };
95
- this.setStyles = (styles) => {
96
- this.editorService.styles = styles;
97
- };
98
- this.onScrollTopChange = (value) => {
99
- this.mainRenderer.scrollTo(value);
100
- };
101
- this.onDocumentChange = (range) => {
102
- let lastRow = range.start.row === range.end.row ? range.end.row : Infinity;
103
- this.renderer.updateLines(range.start.row, lastRow);
104
- // Update cursor because tab characters can influence the cursor position.
105
- this.renderer.updateCursor();
106
- };
107
- this.history = new OperationHistory(editorService, regulatorService);
108
- this.selection = new Selection();
109
- this.regulatorService.setSelection(this.selection);
110
- this.initMainSession();
111
- this.textInput = new TextInput(this.mainRenderer.container);
112
- this.renderer.textarea = this.textInput.input;
113
- this.mouseHandler = new MouseHandler(this.renderer.container, this);
114
- this.inputHandler = new InputHandler(this.textInput.input, this);
115
- this.initResizeListener();
116
- this.focus();
117
- this.session.processSelectionStyles();
118
- this.search = new Search();
119
- this.search.set({ wrap: true });
120
- this.subscriptions.push(this.searchOptionSubscription(), this.replaceSubscription(), this.setTextStylesSubscription(), this.setParagraphStylesSubscription(), this.changeElementStyleSubscription(), this.setNumberingTemplateTypeSubscription(), this.removeNumberingsSubscription(), this.setImageStyleSubscription(), this.createCustomComponentSubscription(), this.insertBreakSubscription(), this.insertImageSubscription(), this.insertLinkSubscription(), this.endMousePressSubscription(), this.clearSelectionSubscription(), this.changedTableSizeSubscription(), this.insertTableRowsSubscription(), this.insertTableColumnsSubscription(), this.removeTableRowsSubscription(), this.removeTableColumnsSubscription(), this.removedImageSubscription(), this.resizeTableColumnsSubscription(), this.insertTableSubscription(), this.rendererUpdatedSubscription(), this.edgeElementCopyUpdatedSubscription(), this.changedEdgeHeightSubscription(), this.undoSubscription(), this.redoSubscription(), this.clipboardDataSubscription(), this.cutSelectedSubscription(), this.copySelectedSubscription(), this.pasteFromClipboardSubscription(), this.selectAllSubscription(), this.removeSelectedSubscription(), this.printSubscription());
121
- }
122
- destroy() {
123
- this.subscriptions.forEach(s => s?.unsubscribe());
124
- this.destroyResizeListener();
125
- this.destroyMainSessionListeners();
126
- this.mouseHandler.destroy();
127
- this.inputHandler.destroy();
128
- this.session.removeEventListener('setStyles', this.setStyles);
129
- this.blurCustomComponent();
130
- }
131
- selectPageDown() {
132
- const config = this.mainRenderer.layerConfig;
133
- const line = config.visibleRange.endScreenLine;
134
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
135
- this.selection.moveSelection(position);
136
- this.mainRenderer.scrollBy(config.height);
137
- this.scrollCursorIntoMainView(0.5);
138
- this.onSelectionChange();
139
- }
140
- selectPageUp() {
141
- const config = this.mainRenderer.layerConfig;
142
- const line = config.visibleRange.startScreenLine;
143
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
144
- this.selection.moveSelection(position);
145
- this.mainRenderer.scrollBy(-config.height);
146
- this.scrollCursorIntoMainView(0.5);
147
- this.onSelectionChange();
148
- }
149
- gotoPageDown() {
150
- const config = this.mainRenderer.layerConfig;
151
- const line = config.visibleRange.endScreenLine;
152
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
153
- this.selection.placeCursor(position);
154
- this.mainRenderer.scrollBy(config.height);
155
- this.scrollCursorIntoMainView(0.5);
156
- this.onSelectionChange();
157
- }
158
- gotoPageUp() {
159
- const config = this.mainRenderer.layerConfig;
160
- const line = config.visibleRange.startScreenLine;
161
- const position = PositionHelper.screenToDocument(this.mainSession, line, 0);
162
- this.selection.placeCursor(position);
163
- this.mainRenderer.scrollBy(-config.height);
164
- this.scrollCursorIntoMainView(0.5);
165
- this.onSelectionChange();
166
- }
167
- cut() {
168
- this.removeSelected();
169
- }
170
- insert(text) {
171
- if (this.selection.isEmpty) {
172
- this.insertText(text, this.session.cursorStyle);
173
- }
174
- else {
175
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
176
- const insertText = new InsertTextModel({ insertIndex, text });
177
- this.replaceBy(new ReplaceModel({ insertText }));
178
- }
179
- }
180
- insertText(text, textStyle) {
181
- const position = this.selection.cursor;
182
- if (textStyle) {
183
- this.saveInsertStyledTextToHistory(position.row, position.column, text, textStyle);
184
- }
185
- else {
186
- this.saveInsertTextToHistory(position.row, position.column, text);
187
- }
188
- this.session.insertText(position, text, textStyle);
189
- this.onSelectionChange();
190
- }
191
- replaceText(text) {
192
- const toolbarStyle = new TextStyleModel(this.session.stylesMap);
193
- this.removeSelected();
194
- this.insertText(text, toolbarStyle);
195
- }
196
- removeLeft() {
197
- if (this.selection.isEmpty) {
198
- this.selection.selectLeft(this.session);
199
- }
200
- this.removeSelected();
201
- }
202
- removeRight() {
203
- if (this.selection.isEmpty) {
204
- this.selection.selectRight(this.session);
205
- }
206
- this.removeSelected();
207
- }
208
- insertBreak(breakType) {
209
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
210
- const insertBreak = new InsertBreakModel({ insertIndex, breakType });
211
- if (!this.selection.isEmpty) {
212
- this.replaceBy(new ReplaceModel({ insertBreak }));
213
- return;
214
- }
215
- if (breakType === BreakTypes.Column) {
216
- return;
217
- }
218
- this.saveInsertBreakToHistory(insertBreak);
219
- const endPoint = this.session.insertBreak(this.selection.cursor, breakType);
220
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
221
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
222
- this.renderer.updateCursor();
223
- this.rerenderMarker();
224
- this.scrollCursorIntoMainView(0.1);
225
- }
226
- insertTab() {
227
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
228
- const insertTab = new InsertTabModel({ insertIndex });
229
- if (!this.selection.isEmpty) {
230
- this.replaceBy(new ReplaceModel({ insertTab }));
231
- return;
232
- }
233
- this.saveInsertTabToHistory(insertTab);
234
- const endPoint = this.session.insertTab(this.selection.cursor);
235
- this.onDocumentChange(new Range(this.selection.cursor, endPoint));
236
- this.onSelectionChange();
237
- }
238
- insertImage(imageData) {
239
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
240
- const insertImage = new InsertImageModel({ insertIndex, imageData });
241
- if (!this.selection.isEmpty) {
242
- this.replaceBy(new ReplaceModel({ insertImage }));
243
- return;
244
- }
245
- this.saveInsertImageToHistory(insertImage);
246
- const endPoint = this.session.insertImage(this.selection.cursor, imageData);
247
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
248
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
249
- this.renderer.updateCursor();
250
- this.rerenderMarker();
251
- }
252
- insertLink(linkDataModel) {
253
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
254
- const insertLink = new InsertLinkModel({ insertIndex, endIndex: insertIndex + linkDataModel.text.length, linkDataModel });
255
- if (!this.selection.isEmpty) {
256
- this.replaceBy(new ReplaceModel({ insertLink }));
257
- return;
258
- }
259
- this.saveInsertLinkToHistory(insertLink);
260
- this.session.insertLink(this.selection.cursor, linkDataModel);
261
- this.renderer.updateCursor();
262
- this.rerenderMarker();
263
- }
264
- insertTable(tableData) {
265
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
266
- let textToInsert = TABLE_MARKER;
267
- let insertTableIndex = insertIndex;
268
- if (!this.session.wrapParagraphIndex.some(x => x === insertIndex)) {
269
- textToInsert = NEW_LINE_MARKUP + textToInsert;
270
- insertTableIndex++;
271
- }
272
- if (!this.session.document.isNewLineSymbol(insertIndex)) {
273
- textToInsert = textToInsert + NEW_LINE_MARKUP;
274
- }
275
- const insertTable = new InsertTableModel({
276
- insertIndex,
277
- insertTableIndex,
278
- rowsCount: tableData.rows,
279
- columnsCount: tableData.columns,
280
- content: textToInsert
281
- });
282
- if (!this.selection.isEmpty) {
283
- this.replaceBy(new ReplaceModel({ insertTable }));
284
- return;
285
- }
286
- this.saveInsertTableToHistory(insertTable);
287
- const endPoint = this.session.insertTable(this.selection.cursor, insertTable);
288
- let lastRow = this.selection.cursor.row === endPoint.row ? endPoint.row : Infinity;
289
- this.renderer.updateLines(this.selection.cursor.row, lastRow);
290
- this.renderer.updateCursor();
291
- this.rerenderMarker();
292
- }
293
- replaceBy(model) {
294
- const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start);
295
- const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.end) - 1;
296
- model.delete = new DeleteModel({ startIndex, endIndex });
297
- this.saveReplaceToHistory(this.selection.range, model);
298
- const endPoint = this.session.replace(model);
299
- this.onDocumentChange(new Range(this.selection.cursor, endPoint));
300
- this.onSelectionChange();
301
- }
302
- removeToLineStart() {
303
- if (this.selection.isEmpty) {
304
- this.selection.selectLineStart(this.session);
305
- }
306
- this.removeSelected();
307
- }
308
- removeToLineEnd() {
309
- if (this.selection.isEmpty) {
310
- this.selection.selectLineEnd(this.session);
311
- }
312
- this.removeSelected();
313
- }
314
- removeWordLeft() {
315
- if (this.selection.isEmpty) {
316
- this.selection.selectWordLeft(this.session);
317
- }
318
- this.removeSelected();
319
- }
320
- removeWordRight() {
321
- if (this.selection.isEmpty) {
322
- this.selection.selectWordRight(this.session);
323
- }
324
- this.removeSelected();
325
- }
326
- applyTextStyles(textStyle) {
327
- if (!textStyle) {
328
- return;
329
- }
330
- this.blurCustomComponent();
331
- if (!this.selection.isEmpty) {
332
- const range = this.selection.range;
333
- const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, range.start.row, range.start.column);
334
- const endIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, range.end.row, range.end.column) - 1;
335
- this.saveApplyTextStyleToHistory(startIndex, endIndex, textStyle);
336
- this.session.applyTextStyle(startIndex, endIndex, textStyle);
337
- }
338
- else {
339
- this.setTextStyle(textStyle);
340
- }
341
- }
342
- setTextStyle(textStyle) {
343
- const index = ContentHelper.paragraphPositionToDocumentIndex(this.session.wrapParagraphIndex, this.selection.cursor);
344
- const isParagraph = this.session.model.contentLength === index || this.session.model.content[index] === NEW_LINE_MARKUP;
345
- if (isParagraph) {
346
- this.saveApplyTextStyleToHistory(index, index, textStyle);
347
- this.session.applyTextStyle(index, index, textStyle);
348
- }
349
- else {
350
- this.session.setTextStyle(textStyle);
351
- }
352
- this.renderer.updateCursor();
353
- }
354
- applyParagraphStyles(paragraphStyle) {
355
- const range = this.selection.range;
356
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
357
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
358
- this.saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle);
359
- this.session.applyParagraphStyle(startIndex, endIndex, paragraphStyle);
360
- }
361
- applyElementStyle(current) {
362
- this.session.applyElementStyle(new ApplyElementStyleModel(current));
363
- }
364
- handleImageStyleChange(previous, current) {
365
- this.history.pushApplyImageStyle(previous, current);
366
- const start = this.session.document.indexToPosition(current.insertIndex, 0);
367
- this.session.updateWrapData(start.row, this.session.document.lines.length - 1);
368
- }
369
- setNumberingTemplate(templateLevels) {
370
- const range = this.selection.range;
371
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
372
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
373
- this.saveAddNumberingToHistory(templateLevels, startIndex, endIndex);
374
- this.session.addNumbering(templateLevels, startIndex, endIndex);
375
- }
376
- removeNumberingsFromParagraphs() {
377
- const range = this.selection.range;
378
- const startIndex = this.session.model.paragraphs[range.start.row].insertIndex;
379
- const endIndex = this.session.model.paragraphs[range.end.row].insertIndex;
380
- this.saveRemoveNumberingToHistory(startIndex, endIndex);
381
- this.session.removeNumberings(startIndex, endIndex);
382
- }
383
- applyImageStyles(image) {
384
- this.saveApplyImageStyleToHistory(image);
385
- const imageStyle = new ApplyImageStyleModel({ insertIndex: image.insertIndex, height: image.height, width: image.width });
386
- this.session.applyImageStyle(imageStyle);
387
- this.renderer.updateCursor();
388
- }
389
- focus() {
390
- this.textInput.input.focus();
391
- }
392
- openSearch() {
393
- this.editorService.openSearchDialog = true;
394
- }
395
- find(options) {
396
- let range = this.selection.range;
397
- if (options.term == null) {
398
- let term = this.session.document.getTextRange(range) || this.search.options.term;
399
- if (!term) {
400
- range = this.session.getWordRange(range.start.row, range.start.column);
401
- term = this.session.document.getTextRange(range);
402
- }
403
- options.term = term;
404
- }
405
- if (!options.start) {
406
- options.start = range;
407
- }
408
- this.search.set(options);
409
- const newRange = this.search.find(this.session);
410
- if (newRange) {
411
- this.selection.placeSelection(range.start, range.end);
412
- this.onSelectionChange();
413
- if (this.session === this.mainSession) {
414
- this.mainRenderer.scrollSelectionIntoView(range.start, range.end, 0.5);
415
- }
416
- return newRange;
417
- }
418
- range.end = range.start;
419
- this.selection.placeCursor(range.start);
420
- this.onSelectionChange();
421
- return null;
422
- }
423
- updateCounter() {
424
- const regex = this.search.options.regex;
425
- let all = 0;
426
- let current = 0;
427
- if (!regex) {
428
- return { current: 0, total: 0 };
429
- }
430
- const value = this.session.document.getAllLines().join('\n');
431
- let offset = this.session.document.positionToIndex(this.session.document.lines, this.selection.range.start);
432
- regex.lastIndex = 0;
433
- let regexResult;
434
- while ((regexResult = regex.exec(value))) {
435
- all++;
436
- let last = regexResult.index;
437
- if (last <= offset) {
438
- current++;
439
- }
440
- if (all > this.MAX_COUNT) {
441
- break;
442
- }
443
- }
444
- return { current: current, total: all > this.MAX_COUNT ? this.MAX_COUNT : all };
445
- }
446
- replace(search, replace) {
447
- if (this.selection.isEmpty) {
448
- return;
449
- }
450
- if (search !== replace) {
451
- if (replace) {
452
- this.replaceText(replace);
453
- }
454
- else {
455
- this.removeSelected();
456
- }
457
- }
458
- this.find({ term: search, skipCurrent: true, backwards: false });
459
- }
460
- undo() {
461
- const undo = this.history.popUndoOperation();
462
- if (!undo) {
463
- return;
464
- }
465
- this.regulatorService.setTargetedSessionAsCurrent(undo.targets);
466
- this.applyOperation(undo.operation);
467
- this.selection.placeSelection(undo.cursor, undo.anchor);
468
- this.onSelectionChange();
469
- }
470
- redo() {
471
- const redo = this.history.popRedoOperation();
472
- if (!redo) {
473
- return;
474
- }
475
- this.regulatorService.setTargetedSessionAsCurrent(redo.targets);
476
- this.selection.placeSelection(redo.cursor, redo.anchor);
477
- this.applyOperation(redo.operation);
478
- this.onSelectionChange();
479
- }
480
- applyOperation(operation) {
481
- if (operation instanceof InsertTextModel) {
482
- this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, null);
483
- }
484
- else if (operation instanceof DeleteModel) {
485
- this.session.removeByDocumentIndexes(operation.startIndex, operation.endIndex);
486
- }
487
- else if (operation instanceof InsertStyledTextModel) {
488
- this.session.insertTextByDocumentIndex(operation.insertIndex, operation.text, new TextStyleModel(operation.textStyle));
489
- }
490
- else if (operation instanceof RestoreModel) {
491
- const deepCopy = structuredClone(operation);
492
- this.session.restore(deepCopy);
493
- this.commandsService.createCommand(SaveCommandsHelper.getRestoreCommand(deepCopy));
494
- }
495
- else if (operation instanceof ApplyTextStyleModel) {
496
- this.session.applyTextStyle(operation.startIndex, operation.endIndex, new TextStyleModel(operation.textStyle));
497
- }
498
- else if (operation instanceof ApplyParagraphStyleModel) {
499
- const copy = new ParagraphStyleModel(operation.paragraphStyle);
500
- this.session.applyParagraphStyle(operation.startIndex, operation.endIndex, copy);
501
- }
502
- else if (operation instanceof RestoreTextStylesModel) {
503
- const deepCopy = structuredClone(operation);
504
- this.session.restoreTextStyles(deepCopy.formats);
505
- this.commandsService.createCommand(SaveCommandsHelper.getRestoreTextStylesCommand(deepCopy.formats));
506
- }
507
- else if (operation instanceof RestoreParagraphStylesModel) {
508
- const deepCopy = structuredClone(operation);
509
- this.session.restoreParagraphStyles(deepCopy.paragraphs);
510
- this.commandsService.createCommand(SaveCommandsHelper.getRestoreParagraphStylesCommand(deepCopy.paragraphs));
511
- }
512
- else if (operation instanceof InsertElementModel) {
513
- this.session.insertElementByDocumentIndex(operation);
514
- }
515
- else if (operation instanceof InsertBreakModel) {
516
- this.session.insertBreakByDocumentIndex(operation);
517
- }
518
- else if (operation instanceof ApplyElementStyleModel) {
519
- this.session.applyElementStyle(operation);
520
- }
521
- else if (operation instanceof InsertTabModel) {
522
- this.session.insertTabByDocumentIndex(operation);
523
- }
524
- else if (operation instanceof InsertImageModel) {
525
- this.session.insertImageByDocumentIndex(operation);
526
- }
527
- else if (operation instanceof ApplyImageStyleModel) {
528
- this.session.applyImageStyle(operation);
529
- }
530
- else if (operation instanceof AddNumberingModel) {
531
- this.session.addNumbering(operation.levels, operation.startIndex, operation.endIndex);
532
- }
533
- else if (operation instanceof RestoreNumberingsModel) {
534
- this.session.restoreNumberings(operation.paragraphs, operation.numberings);
535
- }
536
- else if (operation instanceof InsertTableColumnsModel) {
537
- this.session.insertTableColumns(operation.insertIndex, operation.columnsCount, operation.targetIndex, operation.inheritIndex);
538
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
539
- }
540
- else if (operation instanceof InsertTableRowsModel) {
541
- this.session.insertTableRows(operation.insertIndex, operation.rowsCount, operation.targetIndex, operation.inheritIndex);
542
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
543
- }
544
- else if (operation instanceof RemoveTableColumnsModel) {
545
- this.session.removeTableColumns(operation.insertIndex, operation.startIndex, operation.endIndex);
546
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
547
- }
548
- else if (operation instanceof RemoveTableRowsModel) {
549
- this.session.removeTableRows(operation.insertIndex, operation.startIndex, operation.endIndex);
550
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
551
- }
552
- else if (operation instanceof ResizeTableColumnsModel) {
553
- this.session.resizeTableColumns(operation);
554
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
555
- this.commandsService.createCommand(SaveCommandsHelper.getResizeTableColumnsCommand(operation));
556
- }
557
- else if (operation instanceof RestoreTableModel) {
558
- this.session.restoreTable(operation.insertIndex, operation.oldTable);
559
- this.changedTableSize(operation.insertIndex, this.session.sessionId);
560
- this.commandsService.createCommand(SaveCommandsHelper.getRestoreTableCommand(operation));
561
- }
562
- else if (operation instanceof InsertTableModel) {
563
- this.session.insertTableByDocumentIndex(operation);
564
- }
565
- else if (operation instanceof RemoveNumberingsModel) {
566
- this.session.removeNumberings(operation.startIndex, operation.endIndex);
567
- }
568
- else if (operation instanceof ReplaceModel) {
569
- this.session.replace(operation);
570
- this.commandsService.createCommand(SaveCommandsHelper.getReplaceCommand(operation, this.targets));
571
- }
572
- this.renderer.updateCursor();
573
- }
574
- saveRemoveToHistory(range) {
575
- const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
576
- const endIndex = restoreModel.endIndex;
577
- this.history.pushDelete(restoreModel);
578
- this.commandsService.createCommand(SaveCommandsHelper.getDeleteCommand(restoreModel.startIndex, endIndex, this.targets));
579
- }
580
- saveInsertTextToHistory(paragraph, indexInParagraph, text) {
581
- const index = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, paragraph, indexInParagraph);
582
- this.history.pushInsertText(index, text);
583
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTextCommand(text, index, this.targets));
584
- }
585
- saveInsertStyledTextToHistory(paragraph, indexInParagraph, text, style) {
586
- const index = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, paragraph, indexInParagraph);
587
- this.history.pushInsertStyledText(index, text, style);
588
- this.commandsService.createCommand(SaveCommandsHelper.getInsertStyledTextCommand(text, index, style, this.targets));
589
- }
590
- saveInsertElementToHistory(model) {
591
- this.history.pushInsertElement(model);
592
- this.commandsService.createCommand(SaveCommandsHelper.getInsertElementCommand(model, this.targets));
593
- }
594
- saveInsertBreakToHistory(model) {
595
- model.isOnNewParagraph =
596
- model.breakType === BreakTypes.Page &&
597
- BreakHelper.getBreakType(this.session.model, CUSTOM_ELEMENT_MARKER, model.insertIndex - 1) !== BreakTypes.Page;
598
- const endIndex = model.isOnNewParagraph ? model.insertIndex + NEW_LINE_MARKUP.length + 1 : model.insertIndex + 1;
599
- this.history.pushInsertBreak(model, endIndex);
600
- this.commandsService.createCommand(SaveCommandsHelper.getInsertBreakCommand(model, this.targets));
601
- }
602
- saveInsertTabToHistory(model) {
603
- this.history.pushInsertTab(model);
604
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTabCommand(model, this.targets));
605
- }
606
- saveInsertImageToHistory(model) {
607
- this.history.pushInsertImage(model);
608
- this.commandsService.createCommand(SaveCommandsHelper.getInsertImageCommand(model, this.targets));
609
- }
610
- saveInsertLinkToHistory(model) {
611
- this.history.pushInsertLink(model);
612
- this.commandsService.createCommand(SaveCommandsHelper.getInsertLinkOperation(model, this.targets));
613
- }
614
- saveInsertTableToHistory(model) {
615
- this.history.pushInsertTable(model);
616
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableCommand(model, this.targets));
617
- }
618
- saveApplyTextStyleToHistory(startIndex, endIndex, textStyle) {
619
- const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
620
- this.history.pushApplyTextStyle(startIndex, endIndex, textStyle, formats);
621
- this.commandsService.createCommand(SaveCommandsHelper.getApplyTextStyleCommand(startIndex, endIndex, textStyle, this.targets));
622
- }
623
- saveApplyParagraphStyleToHistory(startIndex, endIndex, paragraphStyle) {
624
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
625
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
626
- this.history.pushApplyParagraphStyle(startIndex, endIndex, paragraphStyle, paragraphsDeepCopy);
627
- this.commandsService.createCommand(SaveCommandsHelper.getApplyParagraphStyleCommand(startIndex, endIndex, paragraphStyle, this.targets));
628
- }
629
- saveAddNumberingToHistory(templateLevels, startIndex, endIndex) {
630
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
631
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
632
- const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
633
- const numberings = this.session.properties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
634
- this.history.pushAddNumbering(startIndex, endIndex, templateLevels, paragraphsDeepCopy, numberings);
635
- this.commandsService.createCommand(SaveCommandsHelper.getAddNumberingCommand(startIndex, endIndex, templateLevels, this.targets));
636
- }
637
- saveRemoveNumberingToHistory(startIndex, endIndex) {
638
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex);
639
- const paragraphsDeepCopy = paragraphs.map(x => new ParagraphModel({ insertIndex: x.insertIndex, paragraphStyle: new ParagraphStyleModel({ ...x.paragraphStyle }) }));
640
- const removedNumberingIds = [...new Set(paragraphs.map(x => x.paragraphStyle.numberingId))];
641
- const numberings = this.session.properties.numberings.filter(x => removedNumberingIds.includes(x.numberingId));
642
- this.history.pushRemoveNumberings(startIndex, endIndex, numberings, paragraphsDeepCopy);
643
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveNumberingsCommand(startIndex, endIndex, this.targets));
644
- }
645
- saveApplyImageStyleToHistory(image) {
646
- const previous = this.session.model.images.find(x => x.insertIndex === image.insertIndex);
647
- this.history.pushApplyImageStyle(previous, image);
648
- this.commandsService.createCommand(SaveCommandsHelper.getApplyImageStyleCommand(image.height, image.width, image.insertIndex, this.targets));
649
- }
650
- saveReplaceToHistory(range, model) {
651
- const restoreModel = this.createRestoreFromSlice(range.start.row, range.start.column, range.end.row, range.end.column);
652
- this.history.pushReplace(restoreModel, model);
653
- this.commandsService.createCommand(SaveCommandsHelper.getReplaceCommand(model, this.targets));
654
- }
655
- createRestoreFromSlice(paragraphStart, indexInStart, paragraphEnd, indexInEnd) {
656
- const startIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, paragraphStart, indexInStart);
657
- const endIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, paragraphEnd, indexInEnd) - 1;
658
- const text = this.session.model.content.slice(startIndex, endIndex + 1);
659
- const formats = FormatHelper.sliceSection(this.session.model.formats, startIndex, endIndex);
660
- const paragraphs = IndexedElementHelper.sliceSection(this.session.model.paragraphs, startIndex, endIndex).map(x => new ParagraphModel(x));
661
- const images = IndexedElementHelper.sliceSection(this.session.model.images, startIndex, endIndex).map(x => new ImageModel(x));
662
- const tables = IndexedElementHelper.sliceSection(this.session.model.tables, startIndex, endIndex).map(x => new TableModel(x));
663
- const elements = IndexedElementHelper.sliceSection(this.session.model.elements, startIndex, endIndex).map(x => new ElementModel(x));
664
- const breaks = IndexedElementHelper.sliceSection(this.session.model.breaks, startIndex, endIndex).map(x => new BreakModel(x));
665
- const tabs = IndexedElementHelper.sliceSection(this.session.model.tabs, startIndex, endIndex).map(x => new TabModel(x));
666
- return new RestoreModel({ startIndex, endIndex, text, formats, paragraphs, images, tables, elements, breaks, tabs });
667
- }
668
- createCustomElement(data) {
669
- const insertIndex = ContentHelper.paragraphToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start.row, this.selection.range.start.column);
670
- const insertElement = new InsertElementModel({ element: new ElementModel({ ...data, insertIndex }) });
671
- if (!this.selection.isEmpty) {
672
- this.replaceBy(new ReplaceModel({ insertElement }));
673
- return;
674
- }
675
- this.saveInsertElementToHistory(insertElement);
676
- const endPoint = this.session.insertElement(this.selection.cursor, data);
677
- this.onDocumentChange(new Range(this.selection.cursor, endPoint));
678
- this.onSelectionChange();
679
- }
680
- removeSelected() {
681
- if (this.selection.isEmpty) {
682
- return;
683
- }
684
- this.saveRemoveToHistory(this.selection.range);
685
- this.session.remove(this.selection.range);
686
- this.onSelectionChange();
687
- }
688
- onInput() {
689
- const text = this.textInput.getInsertText();
690
- if (!text) {
691
- return;
692
- }
693
- const isEmptyNumberingParagraph = this.isEmptyNumberingParagraph(this.selection.cursor.row);
694
- if (text === NEW_LINE_MARKUP && this.selection.isEmpty && isEmptyNumberingParagraph) {
695
- this.removeNumberingsFromParagraphs();
696
- }
697
- else {
698
- this.insert(text);
699
- this.scrollCursorIntoMainView();
700
- }
701
- }
702
- onCut(event) {
703
- event.preventDefault();
704
- const data = this.getSelectedText();
705
- if (!data) {
706
- return;
707
- }
708
- this.editorService.setClipboardData(data);
709
- this.clipboard.copy(data);
710
- this.cut();
711
- this.scrollCursorIntoMainView();
712
- }
713
- onCopy(event) {
714
- event.preventDefault();
715
- const data = this.getSelectedText();
716
- if (!data) {
717
- return;
718
- }
719
- this.editorService.setClipboardData(data);
720
- this.clipboard.copy(data);
721
- }
722
- onPaste(event) {
723
- event.preventDefault();
724
- const data = this.textInput.getClipboardData(event);
725
- this.pasteData(data);
726
- }
727
- initResizeListener() {
728
- window.addEventListener('resize', this.rerenderResize);
729
- }
730
- destroyResizeListener() {
731
- window.removeEventListener('resize', this.rerenderResize);
732
- }
733
- rerenderMarker() {
734
- this.renderer.loop.schedule({ marker: true });
735
- }
736
- onBlur() {
737
- if (!this.textInput.isFocused) {
738
- return;
739
- }
740
- this.textInput.isFocused = false;
741
- this.renderer.hideCursor();
742
- }
743
- onFocus() {
744
- if (this.textInput.isFocused) {
745
- return;
746
- }
747
- this.blurCustomComponent();
748
- this.textInput.isFocused = true;
749
- this.renderer.showCursor();
750
- }
751
- onMouseClick(event) {
752
- const customElement = this.setCurrentSession(event.clientY, event.target);
753
- if (customElement && customElement.tagName !== this.tableCellTagName) {
754
- this.focusCustomComponent(customElement);
755
- }
756
- else {
757
- this.blurCustomComponent();
758
- }
759
- this.emit('focusEditor');
760
- }
761
- onLeftClick(event) {
762
- const customElement = this.setCurrentSession(event.clientY, event.target);
763
- this.emit('focusEditor');
764
- if (customElement && customElement.tagName !== this.tableCellTagName) {
765
- this.focusCustomComponent(customElement);
766
- return;
767
- }
768
- this.blurCustomComponent();
769
- if (!this.textInput.isFocused) {
770
- this.textInput.input.focus();
771
- }
772
- const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
773
- if (event.shiftKey) {
774
- this.selection.moveSelection(position);
775
- }
776
- else if (event.ctrlKey) {
777
- const linkModel = this.session.getLinkModel(position);
778
- if (linkModel) {
779
- window.open(linkModel.link);
780
- event.preventDefault();
781
- return;
782
- }
783
- }
784
- else {
785
- this.selection.placeCursor(position);
786
- }
787
- this.onSelectionChange();
788
- event.preventDefault();
789
- this.mouseHandler.startMousePress(this);
790
- }
791
- onDoubleClick(event) {
792
- this.session.removeEventListener('setStyles', this.setStyles);
793
- let isStartEditEdge = false;
794
- const customElement = this.getCustomElement(event.target);
795
- if (customElement) {
796
- const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
797
- this.regulatorService.setCustomSessionAsCurrent(elementSessionId);
798
- }
799
- else {
800
- const edgeData = this.getClickedEdgeData(event.clientY);
801
- if (edgeData) {
802
- isStartEditEdge = !this.regulatorService.edgeEditingPage;
803
- this.regulatorService.setEdgeSessionAsCurrent(edgeData.edge.sessionId, edgeData.clickedPage);
804
- }
805
- else {
806
- this.regulatorService.setMainSessionAsCurrent();
807
- }
808
- }
809
- this.session.addEventListener('setStyles', this.setStyles);
810
- if (customElement && customElement.tagName !== this.tableCellTagName) {
811
- this.focusCustomComponent(customElement);
812
- return;
813
- }
814
- this.blurCustomComponent();
815
- event.preventDefault();
816
- const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
817
- if (isStartEditEdge) {
818
- this.selection.placeCursor(position);
819
- }
820
- else {
821
- const range = this.session.getWordRange(position.row, position.column);
822
- this.selection.placeSelection(range.start, range.end);
823
- }
824
- this.onSelectionChange();
825
- }
826
- onTripleClick(event) {
827
- const customElement = this.setCurrentSession(event.clientY, event.target);
828
- if (customElement && customElement.tagName !== this.tableCellTagName) {
829
- this.focusCustomComponent(customElement);
830
- return;
831
- }
832
- this.blurCustomComponent();
833
- event.preventDefault();
834
- const position = this.renderer.screenToTextCoordinates(event.clientX, event.clientY);
835
- const start = new Point(position.row, 0);
836
- const end = new Point(position.row, this.session.document.lines[position.row].length);
837
- this.selection.placeSelection(start, end);
838
- this.onSelectionChange();
839
- }
840
- onQuadClick(event) {
841
- const customElement = this.setCurrentSession(event.clientY, event.target);
842
- if (customElement && customElement.tagName !== this.tableCellTagName) {
843
- this.focusCustomComponent(customElement);
844
- return;
845
- }
846
- this.blurCustomComponent();
847
- event.preventDefault();
848
- this.selection.selectAll(this.session.model);
849
- this.onSelectionChange();
850
- }
851
- onMouseWheel(event) {
852
- if (event.ctrlKey) {
853
- return;
854
- }
855
- const factor = 0.35;
856
- const scrollSpeed = 4;
857
- const deltaY = event.deltaY * factor * scrollSpeed;
858
- this.mainRenderer.scrollBy(deltaY);
859
- event.stopPropagation();
860
- event.preventDefault();
861
- }
862
- setCurrentSession(clickPositionY, element) {
863
- this.session.removeEventListener('setStyles', this.setStyles);
864
- const customElement = this.getCustomElement(element);
865
- if (customElement) {
866
- const elementSessionId = +customElement.attributes.getNamedItem('data-session-id').value;
867
- this.regulatorService.setCustomSessionAsCurrent(elementSessionId);
868
- this.session.addEventListener('setStyles', this.setStyles);
869
- return customElement;
870
- }
871
- const edgeData = this.getClickedEdgeData(clickPositionY);
872
- if (edgeData && this.regulatorService.edgeEditingPage) {
873
- this.regulatorService.setEdgeSessionAsCurrent(edgeData.edge.sessionId, edgeData.clickedPage);
874
- }
875
- else {
876
- this.regulatorService.setMainSessionAsCurrent();
877
- }
878
- this.session.addEventListener('setStyles', this.setStyles);
879
- return null;
880
- }
881
- getCustomElement(element) {
882
- if (element.tagName === this.parentTagName) {
883
- return null;
884
- }
885
- else if (this.customElementTagNames.includes(element.tagName)) {
886
- return element;
887
- }
888
- else {
889
- return this.getCustomElement(element.parentElement);
890
- }
891
- }
892
- getClickedEdgeData(mousePosition) {
893
- const positionY = mousePosition + this.mainSession.scrollTop - this.mainRenderer.container.getBoundingClientRect().top;
894
- const clickedPage = PositionHelper.pixelToPage(positionY, this.mainSession);
895
- const pageWrap = this.mainSession.pagesWrap;
896
- const pageVerticalData = PageHelper.getVerticalData(clickedPage, pageWrap.pagesVerticalData);
897
- const pageStartPosition = (pageWrap.pagesSpace + pageWrap.pageHeight) * (clickedPage - 1) + pageWrap.pagesSpace;
898
- const pageTop = pageStartPosition + pageVerticalData.marginTop;
899
- const pageBottom = pageStartPosition + pageWrap.pageHeight - pageVerticalData.marginBottom;
900
- let component;
901
- if (pageTop >= positionY) {
902
- component = this.mainSession.customComponents.edges.getComponentByPage(clickedPage, EdgeType.Header);
903
- }
904
- else if (pageBottom <= positionY) {
905
- component = this.mainSession.customComponents.edges.getComponentByPage(clickedPage, EdgeType.Footer);
906
- }
907
- return component ? { edge: component.instance, clickedPage } : null;
908
- }
909
- /**
910
- * Returns the string of text currently highlighted.
911
- */
912
- getSelectedText() {
913
- if (this.selection.isEmpty) {
914
- return '';
915
- }
916
- const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.start);
917
- const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.session.wrapParagraphIndex, this.selection.range.end);
918
- let elementIndexes = [];
919
- ContentHelper.setIndexesElementsInInterval(this.session.model.breaks, elementIndexes, startIndex, endIndex);
920
- ContentHelper.setIndexesElementsInInterval(this.session.model.tables, elementIndexes, startIndex, endIndex);
921
- ContentHelper.setIndexesElementsInInterval(this.session.model.images, elementIndexes, startIndex, endIndex);
922
- ContentHelper.setIndexesElementsInInterval(this.session.model.elements, elementIndexes, startIndex, endIndex);
923
- ContentHelper.setIndexesElementsInInterval(this.session.model.tabs, elementIndexes, startIndex, endIndex);
924
- elementIndexes.sort((a, b) => b - a);
925
- let textInterval = this.session.document.getTextRange(this.selection.range);
926
- elementIndexes.forEach(x => {
927
- textInterval = textInterval.slice(0, x) + textInterval.slice(x + 1);
928
- });
929
- return textInterval;
930
- }
931
- initMainSession() {
932
- const pageWidth = this.customPageWidth ?? this.model.pageWidth;
933
- this.container.nativeElement.style.maxWidth = `${pageWidth}px`;
934
- const scalingRatio = this.customPageWidth ? ScalingHelper.getRatio(this.customPageWidth, this.model.pageWidth) : 1;
935
- this.regulatorService.addMainSession(this.model, pageWidth, scalingRatio, this.container);
936
- this.mainSession.addEventListener('changeScrollTop', this.onScrollTopChange);
937
- this.session.addEventListener('setStyles', this.setStyles);
938
- this.mainRenderer.scrollTo(0);
939
- }
940
- onSelectionChange() {
941
- this.session.processSelectionStyles();
942
- this.renderer.updateSelection(this.selection.range);
943
- if (this.selection.isEmpty) {
944
- this.renderer.updateCursor();
945
- }
946
- this.editorService.setHasSelection(!this.selection.isEmpty);
947
- this.rerenderMarker();
948
- }
949
- destroyMainSessionListeners() {
950
- this.mainSession.removeEventListener('changeScrollTop', this.onScrollTopChange);
951
- }
952
- focusCustomComponent(element) {
953
- const index = +element.attributes.getNamedItem('data-insert-index').value;
954
- const component = this.session.customComponents.images.find(x => x.instance.insertIndex === index) ??
955
- this.session.customComponents.tables.find(x => x.instance.insertIndex === index) ??
956
- this.session.customComponents.customElements.find(x => x.instance.insertIndex === index);
957
- if (!component || component === this.focusedComponent) {
958
- return;
959
- }
960
- this.focusedComponent?.instance.blur();
961
- component.instance.focus();
962
- this.focusedComponent = component;
963
- const position = this.session.document.indexToPosition(index, 0);
964
- this.selection.placeCursor(position);
965
- this.onSelectionChange();
966
- }
967
- blurCustomComponent() {
968
- if (this.focusedComponent) {
969
- this.focusedComponent.instance.blur();
970
- this.focusedComponent = null;
971
- }
972
- }
973
- isEmptyNumberingParagraph(paragraphIndex) {
974
- const currentLine = this.session.document.getLine(this.session.document.lines, paragraphIndex);
975
- return currentLine.length === 0 && this.session.model.paragraphs[paragraphIndex].paragraphStyle.numberingId !== null;
976
- }
977
- scrollCursorIntoMainView(offset) {
978
- if (this.session !== this.mainSession) {
979
- return;
980
- }
981
- this.mainRenderer.scrollCursorIntoView(null, offset);
982
- }
983
- changedTableSize(insertIndex, sessionId) {
984
- const session = this.regulatorService.getSession(sessionId);
985
- const paragraph = ContentHelper.documentIndexToParagraphIndex(session.wrapParagraphIndex, insertIndex).row;
986
- session.updateWrapData(paragraph, paragraph);
987
- this.textInput.input.focus();
988
- }
989
- insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, sessionId) {
990
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
991
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.wrapParagraphIndex, insertIndex);
992
- this.selection.placeCursor(beforeTable);
993
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
994
- this.history.pushInsertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex, table);
995
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableRowsCommand(rowsCount, inheritIndex, insertIndex, targetIndex, this.targets));
996
- this.session.insertTableRows(insertIndex, rowsCount, targetIndex, inheritIndex);
997
- this.changedTableSize(insertIndex, sessionId);
998
- }
999
- insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, sessionId) {
1000
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1001
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.wrapParagraphIndex, insertIndex);
1002
- this.selection.placeCursor(beforeTable);
1003
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1004
- this.history.pushInsertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex, table);
1005
- this.commandsService.createCommand(SaveCommandsHelper.getInsertTableColumnsCommand(columnsCount, inheritIndex, insertIndex, targetIndex, this.targets));
1006
- this.session.insertTableColumns(insertIndex, columnsCount, targetIndex, inheritIndex);
1007
- this.changedTableSize(insertIndex, sessionId);
1008
- }
1009
- removeTableRows(insertIndex, startIndex, endIndex, sessionId) {
1010
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1011
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.wrapParagraphIndex, insertIndex);
1012
- this.selection.placeCursor(beforeTable);
1013
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1014
- this.history.pushRemoveTableRows(insertIndex, startIndex, endIndex, table);
1015
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableRowsCommand(startIndex, endIndex, insertIndex, this.targets));
1016
- this.session.removeTableRows(insertIndex, startIndex, endIndex);
1017
- this.changedTableSize(insertIndex, sessionId);
1018
- }
1019
- removeTableColumns(insertIndex, startIndex, endIndex, sessionId) {
1020
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1021
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.wrapParagraphIndex, insertIndex);
1022
- this.selection.placeCursor(beforeTable);
1023
- const table = this.session.model.tables.find(x => x.insertIndex === insertIndex);
1024
- this.history.pushRemoveTableColumns(insertIndex, startIndex, endIndex, table);
1025
- this.commandsService.createCommand(SaveCommandsHelper.getRemoveTableColumnsCommand(startIndex, endIndex, insertIndex, this.targets));
1026
- this.session.removeTableColumns(insertIndex, startIndex, endIndex);
1027
- this.changedTableSize(insertIndex, sessionId);
1028
- }
1029
- removeImage(insertIndex) {
1030
- const range = this.session.document.indexesToRange(insertIndex, insertIndex + 1);
1031
- this.saveRemoveToHistory(range);
1032
- this.session.remove(range);
1033
- this.renderer.updateCursor();
1034
- this.textInput.input.focus();
1035
- }
1036
- resizeTableColumns(resizeTableColumns, sessionId) {
1037
- this.regulatorService.setCustomSessionAsCurrent(sessionId);
1038
- const beforeTable = ContentHelper.documentIndexToParagraphIndex(this.session.wrapParagraphIndex, resizeTableColumns.insertIndex);
1039
- this.selection.placeCursor(beforeTable);
1040
- this.history.pushResizeTableColumns(resizeTableColumns);
1041
- this.session.resizeTableColumns(resizeTableColumns);
1042
- this.changedTableSize(resizeTableColumns.insertIndex, sessionId);
1043
- }
1044
- onMousePressedMove(x, y) {
1045
- const position = this.renderer.screenToTextCoordinates(x, y);
1046
- this.selection.moveSelection(position);
1047
- this.onSelectionChange();
1048
- this.scrollCursorIntoMainView();
1049
- }
1050
- searchOptionSubscription() {
1051
- return this.editorService.searchOptions$.subscribe(searchOptions => {
1052
- this.find(searchOptions);
1053
- this.editorService.searchIteration = this.updateCounter();
1054
- });
1055
- }
1056
- replaceSubscription() {
1057
- return this.editorService.replace$.subscribe(replace => {
1058
- this.replace(replace.searchValue, replace.replaceValue);
1059
- this.editorService.searchIteration = this.updateCounter();
1060
- });
1061
- }
1062
- setTextStylesSubscription() {
1063
- return this.editorService.setTextStyles$.subscribe(textStyles => {
1064
- this.applyTextStyles(textStyles);
1065
- this.focus();
1066
- });
1067
- }
1068
- setParagraphStylesSubscription() {
1069
- return this.editorService.setParagraphStyles$.subscribe(paragraphStyles => {
1070
- this.applyParagraphStyles(paragraphStyles);
1071
- this.focus();
1072
- });
1073
- }
1074
- setNumberingTemplateTypeSubscription() {
1075
- return this.editorService.setNumberingTemplateType$.subscribe(numberingTemplateType => {
1076
- this.setNumberingTemplate(numberingTemplateType);
1077
- this.focus();
1078
- });
1079
- }
1080
- removeNumberingsSubscription() {
1081
- return this.editorService.removeNumberings$.subscribe(() => {
1082
- this.removeNumberingsFromParagraphs();
1083
- this.focus();
1084
- });
1085
- }
1086
- setImageStyleSubscription() {
1087
- return this.editorService.setImageStyle$.subscribe(image => {
1088
- this.applyImageStyles(image);
1089
- this.focus();
1090
- });
1091
- }
1092
- changeElementStyleSubscription() {
1093
- return this.editorService.changeElementStyle$.subscribe(x => this.applyElementStyle(x));
1094
- }
1095
- createCustomComponentSubscription() {
1096
- return this.editorService.createCustomComponent$.subscribe(model => {
1097
- this.createCustomElement(model);
1098
- this.focus();
1099
- });
1100
- }
1101
- insertBreakSubscription() {
1102
- return this.editorService.insertBreak$.subscribe(breakType => {
1103
- this.insertBreak(breakType);
1104
- this.focus();
1105
- });
1106
- }
1107
- insertImageSubscription() {
1108
- return this.editorService.insertImage$.subscribe(imageData => {
1109
- this.insertImage(imageData);
1110
- this.focus();
1111
- });
1112
- }
1113
- insertLinkSubscription() {
1114
- return this.editorService.insertLink$.subscribe(linkData => {
1115
- this.insertLink(linkData);
1116
- this.focus();
1117
- });
1118
- }
1119
- endMousePressSubscription() {
1120
- return this.editorService.endMousePress$.subscribe(() => {
1121
- this.mouseHandler.endMousePress();
1122
- });
1123
- }
1124
- clearSelectionSubscription() {
1125
- return this.editorService.clearSelection$.subscribe(() => {
1126
- this.selection.clearSelection();
1127
- this.onSelectionChange();
1128
- });
1129
- }
1130
- changedTableSizeSubscription() {
1131
- return this.editorService.changedTableSize$.subscribe(data => {
1132
- this.changedTableSize(data.insertIndex, data.sessionId);
1133
- });
1134
- }
1135
- insertTableRowsSubscription() {
1136
- return this.editorService.insertTableRows$.subscribe(data => {
1137
- this.insertTableRows(data.insertIndex, data.rowsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1138
- });
1139
- }
1140
- insertTableColumnsSubscription() {
1141
- return this.editorService.insertTableColumns$.subscribe(data => {
1142
- this.insertTableColumns(data.insertIndex, data.columnsCount, data.targetIndex, data.inheritIndex, data.sessionId);
1143
- });
1144
- }
1145
- removeTableRowsSubscription() {
1146
- return this.editorService.removeTableRows$.subscribe(data => {
1147
- this.removeTableRows(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1148
- });
1149
- }
1150
- removeTableColumnsSubscription() {
1151
- return this.editorService.removeTableColumns$.subscribe(data => {
1152
- this.removeTableColumns(data.insertIndex, data.startIndex, data.endIndex, data.sessionId);
1153
- });
1154
- }
1155
- removedImageSubscription() {
1156
- return this.editorService.removeImage$.subscribe(data => {
1157
- this.removeImage(data.insertIndex);
1158
- });
1159
- }
1160
- resizeTableColumnsSubscription() {
1161
- return this.editorService.resizeTableColumns$.subscribe(data => {
1162
- this.resizeTableColumns(data.resizeTableColumns, data.sessionId);
1163
- });
1164
- }
1165
- insertTableSubscription() {
1166
- return this.editorService.insertTable$.subscribe(data => {
1167
- this.insertTable(data);
1168
- });
1169
- }
1170
- rendererUpdatedSubscription() {
1171
- return this.editorService.rendererUpdated$.subscribe(sessionId => {
1172
- const edgeTarget = this.regulatorService.getEdgeTarget(sessionId);
1173
- if (edgeTarget !== null) {
1174
- this.mainRenderer.edgesLayer.updateByLocation(edgeTarget.edgeData.pageType);
1175
- }
1176
- });
1177
- }
1178
- edgeElementCopyUpdatedSubscription() {
1179
- return this.editorService.edgeElementCopyUpdated$.subscribe(data => {
1180
- if (this.regulatorService.edgeEditingPage !== data.page) {
1181
- return;
1182
- }
1183
- const edgeSessionId = +data.newElementCopy.attributes.getNamedItem('data-session-id').value;
1184
- const edgeSession = this.regulatorService.sessions.find(x => x.sessionId === edgeSessionId);
1185
- edgeSession.renderer.container = data.newElementCopy.firstChild;
1186
- });
1187
- }
1188
- changedEdgeHeightSubscription() {
1189
- return this.editorService.changedEdgeHeight$.subscribe(edgeType => {
1190
- this.mainSession.pagesWrap.updatePageVerticalData(edgeType, this.regulatorService.edgeEditingPage, this.session.wrapParagraphIndex);
1191
- });
1192
- }
1193
- undoSubscription() {
1194
- return this.editorService.undo$.subscribe(() => {
1195
- this.undo();
1196
- this.focus();
1197
- this.scrollCursorIntoMainView();
1198
- });
1199
- }
1200
- redoSubscription() {
1201
- return this.editorService.redo$.subscribe(() => {
1202
- this.redo();
1203
- this.focus();
1204
- this.scrollCursorIntoMainView();
1205
- });
1206
- }
1207
- printSubscription() {
1208
- return this.editorService.print$.subscribe(() => {
1209
- PrintHelper.printDocument(this.mainSession, this.editorService);
1210
- });
1211
- }
1212
- cutSelectedSubscription() {
1213
- return this.editorService.cutSelected$.subscribe(() => {
1214
- this.onCut(new ClipboardEvent(ClipboardEventTypes.cut));
1215
- });
1216
- }
1217
- copySelectedSubscription() {
1218
- return this.editorService.copySelected$.subscribe(() => {
1219
- this.onCopy(new ClipboardEvent(ClipboardEventTypes.copy));
1220
- });
1221
- }
1222
- pasteFromClipboardSubscription() {
1223
- return this.editorService.pasteFromClipboard$.subscribe(() => {
1224
- this.readClipboard()
1225
- .then(data => this.pasteData(data))
1226
- .catch(() => {
1227
- // continue regardless error
1228
- });
1229
- });
1230
- }
1231
- async readClipboard() {
1232
- const read = await navigator.permissions.query({ name: 'clipboard-read' });
1233
- return new Promise(resolve => {
1234
- if (navigator.clipboard && read.state != 'denied') {
1235
- navigator.clipboard
1236
- .readText()
1237
- .then(data => {
1238
- resolve(data);
1239
- })
1240
- .catch(() => {
1241
- // continue regardless error
1242
- });
1243
- }
1244
- else {
1245
- resolve(this.clipboardData);
1246
- }
1247
- });
1248
- }
1249
- pasteData(data) {
1250
- if (!data) {
1251
- return;
1252
- }
1253
- const text = data.replace(/\r\n/g, '\n').replace(/\t/g, ' ');
1254
- this.insert(text);
1255
- this.scrollCursorIntoMainView();
1256
- }
1257
- selectAllSubscription() {
1258
- return this.editorService.selectAll$.subscribe(() => {
1259
- this.selection.selectAll(this.session.model);
1260
- this.onSelectionChange();
1261
- });
1262
- }
1263
- removeSelectedSubscription() {
1264
- return this.editorService.removeSelected$.subscribe(() => {
1265
- this.removeSelected();
1266
- });
1267
- }
1268
- clipboardDataSubscription() {
1269
- return this.editorService.clipboardData$.subscribe(data => {
1270
- this.clipboardData = data;
1271
- });
1272
- }
1273
- }
1274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LW5vZGVyL3NyYy9saWIvK3NoYXJlZC9lZGl0b3IvY29yZS9lZGl0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDekYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFDakcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFFdkYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxNQUFNLG9FQUFvRSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRTVFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFckUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3hELE9BQU8sRUFBRSxVQUFVLEVBQUUs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QzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLDBCQUEwQjtRQUM5QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDckQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHlCQUF5QjtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUN0RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgQWRkTnVtYmVyaW5nTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2FkZC1udW1iZXJpbmcubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktZWxlbWVudC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBBcHBseUltYWdlU3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktaW1hZ2Utc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9hcHBseS1wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgQXBwbHlUZXh0U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvYXBwbHktdGV4dC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBCYXNlTm9kZXJDb21wb25lbnQgfSBmcm9tICcuLi9jdXN0b20tY29tcG9uZW50cy9zaGFyZWQvYWJzdHJhY3QvYmFzZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnJlYWtIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2JyZWFrLmhlbHBlcic7XG5pbXBvcnQgeyBCcmVha01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9icmVhay5tb2RlbCc7XG5pbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi9lbnVtcy9icmVhay10eXBlcy5lbnVtJztcbmltcG9ydCB7IENVU1RPTV9FTEVNRU5UX01BUktFUiwgVEFCTEVfTUFSS0VSIH0gZnJvbSAnLi4vY3VzdG9tLWNvbXBvbmVudHMvc2hhcmVkL2NvbnN0YW50cy9jdXN0b20tY29udGVudC1tYXJrZXJzLmNvbnN0JztcbmltcG9ydCB7IENsaXBib2FyZEV2ZW50VHlwZXMgfSBmcm9tICcuL2NvbnN0YW50cy9jbGlwYm9hcmRFdmVudFR5cGVzLmNvbnN0JztcbmltcG9ydCB7IENvbW1hbmRzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1hbmRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29udGVudEhlbHBlciB9IGZyb20gJy4uL2hlbHBlcnMvY29udGVudC5oZWxwZXInO1xuaW1wb3J0IHsgRGVsZXRlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2RlbGV0ZS5tb2RlbCc7XG5pbXBvcnQgeyBEb2N4TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2RvY3gubW9kZWwnO1xuaW1wb3J0IHsgRWRnZVR5cGUgfSBmcm9tICcuL2NvbXBvbmVudHMvZWRnZXMvZWRnZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgRWRpdFNlc3Npb24gfSBmcm9tICcuL2VkaXQuc2Vzc2lvbic7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vZWRpdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgRWxlbWVudERhdGFNb2RlbCB9IGZyb20gJy4uL2N1c3RvbS1jb21wb25lbnRzL2V4dGVybmFsLWVsZW1lbnQvbW9kZWxzL2VsZW1lbnQtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBFbGVtZW50TW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2VsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGluZyB9IGZyb20gJy4vYmFzZS9ldmVudC1lbWl0dGluZyc7XG5pbXBvcnQgeyBGb3JtYXRIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXJzL2Zvcm1hdC5oZWxwZXInO1xuaW1wb3J0IHsgSVRvb2xiYXJTdHlsZXMgfSBmcm9tICcuL2ludGVyZmFjZXMvdG9vbGJhci1zdHlsZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IEltYWdlRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbWFnZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IEltYWdlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2ltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluZGV4ZWRFbGVtZW50SGVscGVyIH0gZnJvbSAnLi4vaGVscGVycy9pbmRleGVkLWVsZW1lbnQuaGVscGVyJztcbmltcG9ydCB7IElucHV0SGFuZGxlciB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2lucHV0LmhhbmRsZXInO1xuaW1wb3J0IHsgSW5zZXJ0QnJlYWtNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWJyZWFrLm1vZGVsJztcbmltcG9ydCB7IEluc2VydEVsZW1lbnRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWVsZW1lbnQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0SW1hZ2VNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWltYWdlLm1vZGVsJztcbmltcG9ydCB7IEluc2VydExpbmtNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LWxpbmsubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0U3R5bGVkVGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtc3R5bGVkLXRleHQubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFiTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWIubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IEluc2VydFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL2luc2VydC10YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBJbnNlcnRUYWJsZVJvd3NNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvaW5zZXJ0LXRhYmxlLXJvd3MubW9kZWwnO1xuaW1wb3J0IHsgSW5zZXJ0VGV4dE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9pbnNlcnQtdGV4dC5tb2RlbCc7XG5pbXBvcnQgeyBMaW5rRGF0YU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9saW5rLWRhdGEubW9kZWwnO1xuaW1wb3J0IHsgTW91c2VIYW5kbGVyIH0gZnJvbSAnLi4vaW50ZXJhY3Rpb24vbW91c2UuaGFuZGxlcic7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuL2NvbnN0YW50cy9lZGl0b3IuY29uc3QnO1xuaW1wb3J0IHsgTm9kZXJFZGdlQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2VkZ2VzL2VkZ2UuY29tcG9uZW50JztcbmltcG9ydCB7IE51bWJlcmluZ0xldmVsTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL251bWJlcmluZy1sZXZlbC5tb2RlbCc7XG5pbXBvcnQgeyBPcGVyYXRpb24gfSBmcm9tICcuLi9vcGVyYXRpb24taGlzdG9yeS9vcGVyYXRpb24udHlwZSc7XG5pbXBvcnQgeyBPcGVyYXRpb25IaXN0b3J5IH0gZnJvbSAnLi4vb3BlcmF0aW9uLWhpc3Rvcnkvb3BlcmF0aW9uLWhpc3RvcnknO1xuaW1wb3J0IHsgUGFnZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9wYWdlLmhlbHBlcic7XG5pbXBvcnQgeyBQYWdlVHlwZSB9IGZyb20gJy4vZW51bXMvcGFnZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgUGFyYWdyYXBoTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3BhcmFncmFwaC5tb2RlbCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhTdHlsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9wYXJhZ3JhcGgtc3R5bGUubW9kZWwnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuL3BvaW50JztcbmltcG9ydCB7IFBvc2l0aW9uSGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL3Bvc2l0aW9uLmhlbHBlcic7XG5pbXBvcnQgeyBQcmludEhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvcHJpbnQuaGVscGVyJztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi9yYW5nZSc7XG5pbXBvcnQgeyBSZWd1bGF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vZXhlY3V0aW9uL3JlZ3VsYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IFJlbW92ZU51bWJlcmluZ3NNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVtb3ZlLW51bWJlcmluZ3MubW9kZWwnO1xuaW1wb3J0IHsgUmVtb3ZlVGFibGVDb2x1bW5zTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3JlbW92ZS10YWJsZS1jb2x1bW5zLm1vZGVsJztcbmltcG9ydCB7IFJlbW92ZVRhYmxlUm93c01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZW1vdmUtdGFibGUtcm93cy5tb2RlbCc7XG5pbXBvcnQgeyBSZW5kZXJlciB9IGZyb20gJy4vcmVuZGVyZXInO1xuaW1wb3J0IHsgUmVwbGFjZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXBsYWNlLm1vZGVsJztcbmltcG9ydCB7IFJlc2l6ZVRhYmxlQ29sdW1uc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXNpemUtdGFibGUtY29sdW1ucy5tb2RlbCc7XG5pbXBvcnQgeyBSZXN0b3JlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUubW9kZWwnO1xuaW1wb3J0IHsgUmVzdG9yZU51bWJlcmluZ3NNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS1udW1iZXJpbmdzLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVQYXJhZ3JhcGhTdHlsZXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvcmVzdG9yZS1wYXJhZ3JhcGgtc3R5bGVzLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC9yZXN0b3JlLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IFJlc3RvcmVUZXh0U3R5bGVzTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3Jlc3RvcmUtdGV4dC1zdHlsZXMubW9kZWwnO1xuaW1wb3J0IHsgU2F2ZUNvbW1hbmRzSGVscGVyIH0gZnJvbSAnLi4vb3BlcmF0aW9ucy9oZWxwZXJzL3NhdmUtY29tbWFuZHMuaGVscGVyJztcbmltcG9ydCB7IFNjYWxpbmdIZWxwZXIgfSBmcm9tICcuLi8uLi9oZWxwZXJzL3NjYWxpbmcuaGVscGVyJztcbmltcG9ydCB7IFNlYXJjaCwgU2VhcmNoT3B0aW9ucyB9IGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB7IFNlYXJjaEl0ZXJhdGlvbiB9IGZyb20gJy4vaW50ZXJmYWNlcy9zZWFyY2gtaXRlcmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb24gfSBmcm9tICcuLi9wb3NpdGlvbmluZy9zZWxlY3Rpb24nO1xuaW1wb3J0IHsgVGFiTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZ2VuZXJhdGVkL3RhYi5tb2RlbCc7XG5pbXBvcnQgeyBUYWJsZU1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2dlbmVyYXRlZC90YWJsZS5tb2RlbCc7XG5pbXBvcnQgeyBUYXJnZXRNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGFyZ2V0Lm1vZGVsJztcbmltcG9ydCB7IFRleHRJbnB1dCB9IGZyb20gJy4va2V5Ym9hcmQvdGV4dC1pbnB1dCc7XG5pbXBvcnQgeyBUZXh0U3R5bGVNb2RlbCB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9nZW5lcmF0ZWQvdGV4dC1zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBWaXJ0dWFsUmVuZGVyZXIgfSBmcm9tICcuL3ZpcnR1YWwucmVuZGVyZXInO1xuXG5leHBvcnQgY2xhc3MgRWRpdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGluZyB7XG4gICAgcmVhZG9ubHkgTUFYX0NPVU5UID0gOTk5O1xuXG4gICAgcmVhZG9ubHkgcGFyZW50VGFnTmFtZSA9ICdBUFAtRURJVE9SJztcblxuICAgIHJlYWRvbmx5IHRhYmxlQ2VsbFRhZ05hbWUgPSAnQVBQLU5PREVSLVRBQkxFLUNFTEwnO1xuXG4gICAgcmVhZG9ubHkgY3VzdG9tRWxlbWVudFRhZ05hbWVzV2l0aG91dFRhYmxlID0gWydBUFAtTk9ERVItSU5QVVQnLCAnQVBQLU5PREVSLUlNQUdFJywgJ0FQUC1OT0RFUi1TSUdOQVRVUkUnLCAnQVBQLU5PREVSLURBVEVQSUNLRVInXTtcblxuICAgIHJlYWRvbmx5IGN1c3RvbUVsZW1lbnRUYWdOYW1lcyA9IFsuLi50aGlzLmN1c3RvbUVsZW1lbnRUYWdOYW1lc1dpdGhvdXRUYWJsZSwgdGhpcy50YWJsZUNlbGxUYWdOYW1lXTtcblxuICAgIHJlYWRvbmx5IGhpc3Rvcnk6IE9wZXJhdGlvbkhpc3Rvcnk7XG5cbiAgICBnZXQgbWFpblNlc3Npb24oKTogRWRpdFNlc3Npb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLm1haW5TZXNzaW9uLnNlc3Npb247XG4gICAgfVxuXG4gICAgZ2V0IG1haW5SZW5kZXJlcigpOiBWaXJ0dWFsUmVuZGVyZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLm1haW5TZXNzaW9uLnJlbmRlcmVyIGFzIFZpcnR1YWxSZW5kZXJlcjtcbiAgICB9XG5cbiAgICBnZXQgc2Vzc2lvbigpOiBFZGl0U2Vzc2lvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuY3VycmVudFNlc3Npb24uc2Vzc2lvbjtcbiAgICB9XG5cbiAgICBnZXQgcmVuZGVyZXIoKTogUmVuZGVyZXIgfCBWaXJ0dWFsUmVuZGVyZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmN1cnJlbnRTZXNzaW9uLnJlbmRlcmVyO1xuICAgIH1cblxuICAgIGdldCBpc1ZpZXdPbmx5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmlzVmlld09ubHk7XG4gICAgfVxuXG4gICAgZ2V0IHRhcmdldHMoKTogVGFyZ2V0TW9kZWxbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuZ2V0Q3VycmVudFNlc3Npb25UYXJnZXRzKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0aW9uOiBTZWxlY3Rpb247XG5cbiAgICBtb3VzZUhhbmRsZXI6IE1vdXNlSGFuZGxlcjtcblxuICAgIGlucHV0SGFuZGxlcjogSW5wdXRIYW5kbGVyO1xuXG4gICAgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIHByaXZhdGUgc2VhcmNoOiBTZWFyY2g7XG5cbiAgICBwcml2YXRlIHRleHRJbnB1dDogVGV4dElucHV0O1xuXG4gICAgcHJpdmF0ZSBmb2N1c2VkQ29tcG9uZW50OiBDb21wb25lbnRSZWY8QmFzZU5vZGVyQ29tcG9uZW50PjtcblxuICAgIHByaXZhdGUgY2xpcGJvYXJkRGF0YTogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgbW9kZWw6IERvY3hNb2RlbCxcbiAgICAgICAgcHJpdmF0ZSBjb250YWluZXI6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgICAgICBwcml2YXRlIGVkaXRvclNlcnZpY2U6IEVkaXRvclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVndWxhdG9yU2VydmljZTogUmVndWxhdG9yU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjb21tYW5kc1NlcnZpY2U6IENvbW1hbmRzU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjbGlwYm9hcmQ6IENsaXBib2FyZCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21QYWdlV2lkdGg/OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLmhpc3RvcnkgPSBuZXcgT3BlcmF0aW9uSGlzdG9yeShlZGl0b3JTZXJ2aWNlLCByZWd1bGF0b3JTZXJ2aWNlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uKCk7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRTZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pO1xuICAgICAgICB0aGlzLmluaXRNYWluU2Vzc2lvbigpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dCA9IG5ldyBUZXh0SW5wdXQodGhpcy5tYWluUmVuZGVyZXIuY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci50ZXh0YXJlYSA9IHRoaXMudGV4dElucHV0LmlucHV0O1xuICAgICAgICB0aGlzLm1vdXNlSGFuZGxlciA9IG5ldyBNb3VzZUhhbmRsZXIodGhpcy5yZW5kZXJlci5jb250YWluZXIsIHRoaXMpO1xuICAgICAgICB0aGlzLmlucHV0SGFuZGxlciA9IG5ldyBJbnB1dEhhbmRsZXIodGhpcy50ZXh0SW5wdXQuaW5wdXQsIHRoaXMpO1xuICAgICAgICB0aGlzLmluaXRSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2ggPSBuZXcgU2VhcmNoKCk7XG4gICAgICAgIHRoaXMuc2VhcmNoLnNldCh7IHdyYXA6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5zZWFyY2hPcHRpb25TdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5zZXRUZXh0U3R5bGVzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnNldFBhcmFncmFwaFN0eWxlc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VFbGVtZW50U3R5bGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlbW92ZU51bWJlcmluZ3NTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuc2V0SW1hZ2VTdHlsZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21Db21wb25lbnRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0QnJlYWtTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0SW1hZ2VTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGlua1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5lbmRNb3VzZVByZXNzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVSb3dzU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmluc2VydFRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZVJvd3NTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGFibGVDb2x1bW5zU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnJlbW92ZWRJbWFnZVN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZXNpemVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGVTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXJVcGRhdGVkU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmVkZ2VFbGVtZW50Q29weVVwZGF0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZEVkZ2VIZWlnaHRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMudW5kb1N1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5yZWRvU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZERhdGFTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY3V0U2VsZWN0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMuY29weVNlbGVjdGVkU3Vic2NyaXB0aW9uKCksXG4gICAgICAgICAgICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZFN1YnNjcmlwdGlvbigpLFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RBbGxTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRTdWJzY3JpcHRpb24oKSxcbiAgICAgICAgICAgIHRoaXMucHJpbnRTdWJzY3JpcHRpb24oKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgIHRoaXMuZGVzdHJveVJlc2l6ZUxpc3RlbmVyKCk7XG4gICAgICAgIHRoaXMuZGVzdHJveU1haW5TZXNzaW9uTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMubW91c2VIYW5kbGVyLmRlc3Ryb3koKTtcbiAgICAgICAgdGhpcy5pbnB1dEhhbmRsZXIuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2V0U3R5bGVzJywgdGhpcy5zZXRTdHlsZXMpO1xuICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICB9XG5cbiAgICBzZWxlY3RQYWdlRG93bigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5tYWluUmVuZGVyZXIubGF5ZXJDb25maWc7XG4gICAgICAgIGNvbnN0IGxpbmUgPSBjb25maWcudmlzaWJsZVJhbmdlLmVuZFNjcmVlbkxpbmU7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gUG9zaXRpb25IZWxwZXIuc2NyZWVuVG9Eb2N1bWVudCh0aGlzLm1haW5TZXNzaW9uLCBsaW5lLCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEJ5KGNvbmZpZy5oZWlnaHQpO1xuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygwLjUpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgc2VsZWN0UGFnZVVwKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm1haW5SZW5kZXJlci5sYXllckNvbmZpZztcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbmZpZy52aXNpYmxlUmFuZ2Uuc3RhcnRTY3JlZW5MaW5lO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IFBvc2l0aW9uSGVscGVyLnNjcmVlblRvRG9jdW1lbnQodGhpcy5tYWluU2Vzc2lvbiwgbGluZSwgMCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLm1vdmVTZWxlY3Rpb24ocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeSgtY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBnb3RvUGFnZURvd24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMubWFpblJlbmRlcmVyLmxheWVyQ29uZmlnO1xuICAgICAgICBjb25zdCBsaW5lID0gY29uZmlnLnZpc2libGVSYW5nZS5lbmRTY3JlZW5MaW5lO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IFBvc2l0aW9uSGVscGVyLnNjcmVlblRvRG9jdW1lbnQodGhpcy5tYWluU2Vzc2lvbiwgbGluZSwgMCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQnkoY29uZmlnLmhlaWdodCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuNSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBnb3RvUGFnZVVwKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjb25maWcgPSB0aGlzLm1haW5SZW5kZXJlci5sYXllckNvbmZpZztcbiAgICAgICAgY29uc3QgbGluZSA9IGNvbmZpZy52aXNpYmxlUmFuZ2Uuc3RhcnRTY3JlZW5MaW5lO1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IFBvc2l0aW9uSGVscGVyLnNjcmVlblRvRG9jdW1lbnQodGhpcy5tYWluU2Vzc2lvbiwgbGluZSwgMCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsQnkoLWNvbmZpZy5oZWlnaHQpO1xuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygwLjUpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgY3V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0KHRleHQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRUZXh0KHRleHQsIHRoaXMuc2Vzc2lvbi5jdXJzb3JTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFRleHQgPSBuZXcgSW5zZXJ0VGV4dE1vZGVsKHsgaW5zZXJ0SW5kZXgsIHRleHQgfSk7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGV4dCB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbnNlcnRUZXh0KHRleHQ6IHN0cmluZywgdGV4dFN0eWxlOiBUZXh0U3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvcjtcbiAgICAgICAgaWYgKHRleHRTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5zYXZlSW5zZXJ0U3R5bGVkVGV4dFRvSGlzdG9yeShwb3NpdGlvbi5yb3csIHBvc2l0aW9uLmNvbHVtbiwgdGV4dCwgdGV4dFN0eWxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUluc2VydFRleHRUb0hpc3RvcnkocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4sIHRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUZXh0KHBvc2l0aW9uLCB0ZXh0LCB0ZXh0U3R5bGUpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVwbGFjZVRleHQodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRvb2xiYXJTdHlsZSA9IG5ldyBUZXh0U3R5bGVNb2RlbCh0aGlzLnNlc3Npb24uc3R5bGVzTWFwKTtcbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgICAgICB0aGlzLmluc2VydFRleHQodGV4dCwgdG9vbGJhclN0eWxlKTtcbiAgICB9XG5cbiAgICByZW1vdmVMZWZ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICByZW1vdmVSaWdodCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdFJpZ2h0KHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIGluc2VydEJyZWFrKGJyZWFrVHlwZTogQnJlYWtUeXBlcyk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRCcmVhayA9IG5ldyBJbnNlcnRCcmVha01vZGVsKHsgaW5zZXJ0SW5kZXgsIGJyZWFrVHlwZSB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0QnJlYWsgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5Db2x1bW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydEJyZWFrVG9IaXN0b3J5KGluc2VydEJyZWFrKTtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzLnNlc3Npb24uaW5zZXJ0QnJlYWsodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBicmVha1R5cGUpO1xuICAgICAgICBsZXQgbGFzdFJvdyA9IHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3cgPT09IGVuZFBvaW50LnJvdyA/IGVuZFBvaW50LnJvdyA6IEluZmluaXR5O1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHRoaXMuc2VsZWN0aW9uLmN1cnNvci5yb3csIGxhc3RSb3cpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpO1xuICAgICAgICB0aGlzLnJlcmVuZGVyTWFya2VyKCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KDAuMSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFiKCkge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRUYWIgPSBuZXcgSW5zZXJ0VGFiTW9kZWwoeyBpbnNlcnRJbmRleCB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFiIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydFRhYlRvSGlzdG9yeShpbnNlcnRUYWIpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWIodGhpcy5zZWxlY3Rpb24uY3Vyc29yKTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50Q2hhbmdlKG5ldyBSYW5nZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGVuZFBvaW50KSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRJbWFnZShpbWFnZURhdGE6IEltYWdlRGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgoXG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQucm93LFxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQuY29sdW1uXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGluc2VydEltYWdlID0gbmV3IEluc2VydEltYWdlTW9kZWwoeyBpbnNlcnRJbmRleCwgaW1hZ2VEYXRhIH0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUJ5KG5ldyBSZXBsYWNlTW9kZWwoeyBpbnNlcnRJbWFnZSB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVJbnNlcnRJbWFnZVRvSGlzdG9yeShpbnNlcnRJbWFnZSk7XG4gICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpcy5zZXNzaW9uLmluc2VydEltYWdlKHRoaXMuc2VsZWN0aW9uLmN1cnNvciwgaW1hZ2VEYXRhKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIGluc2VydExpbmsobGlua0RhdGFNb2RlbDogTGlua0RhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRMaW5rID0gbmV3IEluc2VydExpbmtNb2RlbCh7IGluc2VydEluZGV4LCBlbmRJbmRleDogaW5zZXJ0SW5kZXggKyBsaW5rRGF0YU1vZGVsLnRleHQubGVuZ3RoLCBsaW5rRGF0YU1vZGVsIH0pO1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZUJ5KG5ldyBSZXBsYWNlTW9kZWwoeyBpbnNlcnRMaW5rIH0pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2F2ZUluc2VydExpbmtUb0hpc3RvcnkoaW5zZXJ0TGluayk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRMaW5rKHRoaXMuc2VsZWN0aW9uLmN1cnNvciwgbGlua0RhdGFNb2RlbCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgICAgIHRoaXMucmVyZW5kZXJNYXJrZXIoKTtcbiAgICB9XG5cbiAgICBpbnNlcnRUYWJsZSh0YWJsZURhdGE6IHsgcm93czogbnVtYmVyOyBjb2x1bW5zOiBudW1iZXIgfSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBsZXQgdGV4dFRvSW5zZXJ0ID0gVEFCTEVfTUFSS0VSO1xuICAgICAgICBsZXQgaW5zZXJ0VGFibGVJbmRleCA9IGluc2VydEluZGV4O1xuICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXguc29tZSh4ID0+IHggPT09IGluc2VydEluZGV4KSkge1xuICAgICAgICAgICAgdGV4dFRvSW5zZXJ0ID0gTkVXX0xJTkVfTUFSS1VQICsgdGV4dFRvSW5zZXJ0O1xuICAgICAgICAgICAgaW5zZXJ0VGFibGVJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlc3Npb24uZG9jdW1lbnQuaXNOZXdMaW5lU3ltYm9sKGluc2VydEluZGV4KSkge1xuICAgICAgICAgICAgdGV4dFRvSW5zZXJ0ID0gdGV4dFRvSW5zZXJ0ICsgTkVXX0xJTkVfTUFSS1VQO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaW5zZXJ0VGFibGUgPSBuZXcgSW5zZXJ0VGFibGVNb2RlbCh7XG4gICAgICAgICAgICBpbnNlcnRJbmRleCxcbiAgICAgICAgICAgIGluc2VydFRhYmxlSW5kZXgsXG4gICAgICAgICAgICByb3dzQ291bnQ6IHRhYmxlRGF0YS5yb3dzLFxuICAgICAgICAgICAgY29sdW1uc0NvdW50OiB0YWJsZURhdGEuY29sdW1ucyxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRleHRUb0luc2VydFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0VGFibGUgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zYXZlSW5zZXJ0VGFibGVUb0hpc3RvcnkoaW5zZXJ0VGFibGUpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJsZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGluc2VydFRhYmxlKTtcbiAgICAgICAgbGV0IGxhc3RSb3cgPSB0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93ID09PSBlbmRQb2ludC5yb3cgPyBlbmRQb2ludC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93LCBsYXN0Um93KTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICAgICAgdGhpcy5yZXJlbmRlck1hcmtlcigpO1xuICAgIH1cblxuICAgIHJlcGxhY2VCeShtb2RlbDogUmVwbGFjZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuc2VsZWN0aW9uLnJhbmdlLmVuZCkgLSAxO1xuICAgICAgICBtb2RlbC5kZWxldGUgPSBuZXcgRGVsZXRlTW9kZWwoeyBzdGFydEluZGV4LCBlbmRJbmRleCB9KTtcbiAgICAgICAgdGhpcy5zYXZlUmVwbGFjZVRvSGlzdG9yeSh0aGlzLnNlbGVjdGlvbi5yYW5nZSwgbW9kZWwpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5yZXBsYWNlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5vbkRvY3VtZW50Q2hhbmdlKG5ldyBSYW5nZSh0aGlzLnNlbGVjdGlvbi5jdXJzb3IsIGVuZFBvaW50KSk7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUb0xpbmVTdGFydCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCh0aGlzLnNlc3Npb24pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgICByZW1vdmVUb0xpbmVFbmQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lRW5kKHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIHJlbW92ZVdvcmRMZWZ0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZExlZnQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlV29yZFJpZ2h0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZFJpZ2h0KHRoaXMuc2Vzc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgIH1cblxuICAgIGFwcGx5VGV4dFN0eWxlcyh0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGlmICghdGV4dFN0eWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gQ29udGVudEhlbHBlci5wYXJhZ3JhcGhUb0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCwgcmFuZ2UuZW5kLnJvdywgcmFuZ2UuZW5kLmNvbHVtbikgLSAxO1xuICAgICAgICAgICAgdGhpcy5zYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldFRleHRTdHlsZSh0ZXh0U3R5bGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGV4dFN0eWxlKHRleHRTdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFBvc2l0aW9uVG9Eb2N1bWVudEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIHRoaXMuc2VsZWN0aW9uLmN1cnNvcik7XG4gICAgICAgIGNvbnN0IGlzUGFyYWdyYXBoID0gdGhpcy5zZXNzaW9uLm1vZGVsLmNvbnRlbnRMZW5ndGggPT09IGluZGV4IHx8IHRoaXMuc2Vzc2lvbi5tb2RlbC5jb250ZW50W2luZGV4XSA9PT0gTkVXX0xJTkVfTUFSS1VQO1xuICAgICAgICBpZiAoaXNQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUFwcGx5VGV4dFN0eWxlVG9IaXN0b3J5KGluZGV4LCBpbmRleCwgdGV4dFN0eWxlKTtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseVRleHRTdHlsZShpbmRleCwgaW5kZXgsIHRleHRTdHlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0VGV4dFN0eWxlKHRleHRTdHlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBhcHBseVBhcmFncmFwaFN0eWxlcyhwYXJhZ3JhcGhTdHlsZTogUGFyYWdyYXBoU3R5bGVNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2VsZWN0aW9uLnJhbmdlO1xuICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2Uuc3RhcnQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5lbmQucm93XS5pbnNlcnRJbmRleDtcbiAgICAgICAgdGhpcy5zYXZlQXBwbHlQYXJhZ3JhcGhTdHlsZVRvSGlzdG9yeShzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUpO1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUpO1xuICAgIH1cblxuICAgIGFwcGx5RWxlbWVudFN0eWxlKGN1cnJlbnQ6IEVsZW1lbnRNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlFbGVtZW50U3R5bGUobmV3IEFwcGx5RWxlbWVudFN0eWxlTW9kZWwoY3VycmVudCkpO1xuICAgIH1cblxuICAgIGhhbmRsZUltYWdlU3R5bGVDaGFuZ2UocHJldmlvdXM6IEltYWdlTW9kZWwsIGN1cnJlbnQ6IEltYWdlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hBcHBseUltYWdlU3R5bGUocHJldmlvdXMsIGN1cnJlbnQpO1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5pbmRleFRvUG9zaXRpb24oY3VycmVudC5pbnNlcnRJbmRleCwgMCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi51cGRhdGVXcmFwRGF0YShzdGFydC5yb3csIHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5saW5lcy5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICBzZXROdW1iZXJpbmdUZW1wbGF0ZSh0ZW1wbGF0ZUxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gdGhpcy5zZWxlY3Rpb24ucmFuZ2U7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBoc1tyYW5nZS5zdGFydC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLmVuZC5yb3ddLmluc2VydEluZGV4O1xuICAgICAgICB0aGlzLnNhdmVBZGROdW1iZXJpbmdUb0hpc3RvcnkodGVtcGxhdGVMZXZlbHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZE51bWJlcmluZyh0ZW1wbGF0ZUxldmVscywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIHJlbW92ZU51bWJlcmluZ3NGcm9tUGFyYWdyYXBocygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnNlbGVjdGlvbi5yYW5nZTtcbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5wYXJhZ3JhcGhzW3JhbmdlLnN0YXJ0LnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcmFuZ2UuZW5kLnJvd10uaW5zZXJ0SW5kZXg7XG4gICAgICAgIHRoaXMuc2F2ZVJlbW92ZU51bWJlcmluZ1RvSGlzdG9yeShzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVOdW1iZXJpbmdzKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICBhcHBseUltYWdlU3R5bGVzKGltYWdlOiBJbWFnZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2F2ZUFwcGx5SW1hZ2VTdHlsZVRvSGlzdG9yeShpbWFnZSk7XG4gICAgICAgIGNvbnN0IGltYWdlU3R5bGUgPSBuZXcgQXBwbHlJbWFnZVN0eWxlTW9kZWwoeyBpbnNlcnRJbmRleDogaW1hZ2UuaW5zZXJ0SW5kZXgsIGhlaWdodDogaW1hZ2UuaGVpZ2h0LCB3aWR0aDogaW1hZ2Uud2lkdGggfSk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseUltYWdlU3R5bGUoaW1hZ2VTdHlsZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudGV4dElucHV0LmlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgb3BlblNlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLm9wZW5TZWFyY2hEaWFsb2cgPSB0cnVlO1xuICAgIH1cblxuICAgIGZpbmQob3B0aW9uczogU2VhcmNoT3B0aW9ucyk6IFJhbmdlIHtcbiAgICAgICAgbGV0IHJhbmdlID0gdGhpcy5zZWxlY3Rpb24ucmFuZ2U7XG4gICAgICAgIGlmIChvcHRpb25zLnRlcm0gPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHRlcm0gPSB0aGlzLnNlc3Npb24uZG9jdW1lbnQuZ2V0VGV4dFJhbmdlKHJhbmdlKSB8fCB0aGlzLnNlYXJjaC5vcHRpb25zLnRlcm07XG4gICAgICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgICAgICByYW5nZSA9IHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UocmFuZ2Uuc3RhcnQucm93LCByYW5nZS5zdGFydC5jb2x1bW4pO1xuICAgICAgICAgICAgICAgIHRlcm0gPSB0aGlzLnNlc3Npb24uZG9jdW1lbnQuZ2V0VGV4dFJhbmdlKHJhbmdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMudGVybSA9IHRlcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuc3RhcnQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuc3RhcnQgPSByYW5nZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VhcmNoLnNldChvcHRpb25zKTtcblxuICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTtcbiAgICAgICAgaWYgKG5ld1JhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbihyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlc3Npb24gPT09IHRoaXMubWFpblNlc3Npb24pIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCAwLjUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ld1JhbmdlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmFuZ2UuZW5kID0gcmFuZ2Uuc3RhcnQ7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnBsYWNlQ3Vyc29yKHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB1cGRhdGVDb3VudGVyKCk6IFNlYXJjaEl0ZXJhdGlvbiB7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gdGhpcy5zZWFyY2gub3B0aW9ucy5yZWdleCBhcyBSZWdFeHA7XG4gICAgICAgIGxldCBhbGwgPSAwO1xuICAgICAgICBsZXQgY3VycmVudCA9IDA7XG4gICAgICAgIGlmICghcmVnZXgpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGN1cnJlbnQ6IDAsIHRvdGFsOiAwIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5nZXRBbGxMaW5lcygpLmpvaW4oJ1xcbicpO1xuXG4gICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLnNlc3Npb24uZG9jdW1lbnQucG9zaXRpb25Ub0luZGV4KHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5saW5lcywgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQpO1xuXG4gICAgICAgIHJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGxldCByZWdleFJlc3VsdDtcbiAgICAgICAgd2hpbGUgKChyZWdleFJlc3VsdCA9IHJlZ2V4LmV4ZWModmFsdWUpKSkge1xuICAgICAgICAgICAgYWxsKys7XG4gICAgICAgICAgICBsZXQgbGFzdCA9IHJlZ2V4UmVzdWx0LmluZGV4O1xuICAgICAgICAgICAgaWYgKGxhc3QgPD0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgY3VycmVudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFsbCA+IHRoaXMuTUFYX0NPVU5UKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBjdXJyZW50OiBjdXJyZW50LCB0b3RhbDogYWxsID4gdGhpcy5NQVhfQ09VTlQgPyB0aGlzLk1BWF9DT1VOVCA6IGFsbCB9O1xuICAgIH1cblxuICAgIHJlcGxhY2Uoc2VhcmNoOiBzdHJpbmcsIHJlcGxhY2U6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlYXJjaCAhPT0gcmVwbGFjZSkge1xuICAgICAgICAgICAgaWYgKHJlcGxhY2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VUZXh0KHJlcGxhY2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbmQoeyB0ZXJtOiBzZWFyY2gsIHNraXBDdXJyZW50OiB0cnVlLCBiYWNrd2FyZHM6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHVuZG8oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVuZG8gPSB0aGlzLmhpc3RvcnkucG9wVW5kb09wZXJhdGlvbigpO1xuICAgICAgICBpZiAoIXVuZG8pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0VGFyZ2V0ZWRTZXNzaW9uQXNDdXJyZW50KHVuZG8udGFyZ2V0cyk7XG4gICAgICAgIHRoaXMuYXBwbHlPcGVyYXRpb24odW5kby5vcGVyYXRpb24pO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbih1bmRvLmN1cnNvciwgdW5kby5hbmNob3IpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVkbygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVkbyA9IHRoaXMuaGlzdG9yeS5wb3BSZWRvT3BlcmF0aW9uKCk7XG4gICAgICAgIGlmICghcmVkbykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRUYXJnZXRlZFNlc3Npb25Bc0N1cnJlbnQocmVkby50YXJnZXRzKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VTZWxlY3Rpb24ocmVkby5jdXJzb3IsIHJlZG8uYW5jaG9yKTtcbiAgICAgICAgdGhpcy5hcHBseU9wZXJhdGlvbihyZWRvLm9wZXJhdGlvbik7XG4gICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICB9XG5cbiAgICBhcHBseU9wZXJhdGlvbihvcGVyYXRpb246IE9wZXJhdGlvbik6IHZvaWQge1xuICAgICAgICBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0VGV4dE1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGV4dEJ5RG9jdW1lbnRJbmRleChvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi50ZXh0LCBudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBEZWxldGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZUJ5RG9jdW1lbnRJbmRleGVzKG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFN0eWxlZFRleHRNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRleHRCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uLmluc2VydEluZGV4LCBvcGVyYXRpb24udGV4dCwgbmV3IFRleHRTdHlsZU1vZGVsKG9wZXJhdGlvbi50ZXh0U3R5bGUpKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZShkZWVwQ29weSk7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXN0b3JlQ29tbWFuZChkZWVwQ29weSkpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFwcGx5VGV4dFN0eWxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5hcHBseVRleHRTdHlsZShvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4LCBuZXcgVGV4dFN0eWxlTW9kZWwob3BlcmF0aW9uLnRleHRTdHlsZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFwcGx5UGFyYWdyYXBoU3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgY29uc3QgY29weSA9IG5ldyBQYXJhZ3JhcGhTdHlsZU1vZGVsKG9wZXJhdGlvbi5wYXJhZ3JhcGhTdHlsZSk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYXBwbHlQYXJhZ3JhcGhTdHlsZShvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4LCBjb3B5KTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlVGV4dFN0eWxlc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBkZWVwQ29weSA9IHN0cnVjdHVyZWRDbG9uZShvcGVyYXRpb24pO1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlc3RvcmVUZXh0U3R5bGVzKGRlZXBDb3B5LmZvcm1hdHMpO1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzdG9yZVRleHRTdHlsZXNDb21tYW5kKGRlZXBDb3B5LmZvcm1hdHMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlUGFyYWdyYXBoU3R5bGVzTW9kZWwpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZXBDb3B5ID0gc3RydWN0dXJlZENsb25lKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVzdG9yZVBhcmFncmFwaFN0eWxlcyhkZWVwQ29weS5wYXJhZ3JhcGhzKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlc3RvcmVQYXJhZ3JhcGhTdHlsZXNDb21tYW5kKGRlZXBDb3B5LnBhcmFncmFwaHMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRFbGVtZW50TW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRFbGVtZW50QnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0QnJlYWtNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydEJyZWFrQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgQXBwbHlFbGVtZW50U3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5RWxlbWVudFN0eWxlKG9wZXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0VGFiTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5pbnNlcnRUYWJCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnNlcnRJbWFnZU1vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0SW1hZ2VCeURvY3VtZW50SW5kZXgob3BlcmF0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBBcHBseUltYWdlU3R5bGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmFwcGx5SW1hZ2VTdHlsZShvcGVyYXRpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEFkZE51bWJlcmluZ01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYWRkTnVtYmVyaW5nKG9wZXJhdGlvbi5sZXZlbHMsIG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlc3RvcmVOdW1iZXJpbmdzTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXN0b3JlTnVtYmVyaW5ncyhvcGVyYXRpb24ucGFyYWdyYXBocywgb3BlcmF0aW9uLm51bWJlcmluZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRhYmxlQ29sdW1uc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVDb2x1bW5zKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLmNvbHVtbnNDb3VudCwgb3BlcmF0aW9uLnRhcmdldEluZGV4LCBvcGVyYXRpb24uaW5oZXJpdEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIEluc2VydFRhYmxlUm93c01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVSb3dzKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLnJvd3NDb3VudCwgb3BlcmF0aW9uLnRhcmdldEluZGV4LCBvcGVyYXRpb24uaW5oZXJpdEluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIFJlbW92ZVRhYmxlQ29sdW1uc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlVGFibGVDb2x1bW5zKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgb3BlcmF0aW9uLnN0YXJ0SW5kZXgsIG9wZXJhdGlvbi5lbmRJbmRleCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZW1vdmVUYWJsZVJvd3NNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVRhYmxlUm93cyhvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi5zdGFydEluZGV4LCBvcGVyYXRpb24uZW5kSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKG9wZXJhdGlvbi5pbnNlcnRJbmRleCwgdGhpcy5zZXNzaW9uLnNlc3Npb25JZCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVzaXplVGFibGVDb2x1bW5zTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXNpemVUYWJsZUNvbHVtbnMob3BlcmF0aW9uKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIHRoaXMuc2Vzc2lvbi5zZXNzaW9uSWQpO1xuICAgICAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVzaXplVGFibGVDb2x1bW5zQ29tbWFuZChvcGVyYXRpb24pKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXN0b3JlVGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlc3RvcmVUYWJsZShvcGVyYXRpb24uaW5zZXJ0SW5kZXgsIG9wZXJhdGlvbi5vbGRUYWJsZSk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUob3BlcmF0aW9uLmluc2VydEluZGV4LCB0aGlzLnNlc3Npb24uc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlc3RvcmVUYWJsZUNvbW1hbmQob3BlcmF0aW9uKSk7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zZXJ0VGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmluc2VydFRhYmxlQnlEb2N1bWVudEluZGV4KG9wZXJhdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uIGluc3RhbmNlb2YgUmVtb3ZlTnVtYmVyaW5nc01vZGVsKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlTnVtYmVyaW5ncyhvcGVyYXRpb24uc3RhcnRJbmRleCwgb3BlcmF0aW9uLmVuZEluZGV4KTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb24gaW5zdGFuY2VvZiBSZXBsYWNlTW9kZWwpIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5yZXBsYWNlKG9wZXJhdGlvbik7XG4gICAgICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRSZXBsYWNlQ29tbWFuZChvcGVyYXRpb24sIHRoaXMudGFyZ2V0cykpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfVxuXG4gICAgc2F2ZVJlbW92ZVRvSGlzdG9yeShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzdG9yZU1vZGVsID0gdGhpcy5jcmVhdGVSZXN0b3JlRnJvbVNsaWNlKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSByZXN0b3JlTW9kZWwuZW5kSW5kZXg7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoRGVsZXRlKHJlc3RvcmVNb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldERlbGV0ZUNvbW1hbmQocmVzdG9yZU1vZGVsLnN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0VGV4dFRvSGlzdG9yeShwYXJhZ3JhcGg6IG51bWJlciwgaW5kZXhJblBhcmFncmFwaDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LCBwYXJhZ3JhcGgsIGluZGV4SW5QYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRleHQoaW5kZXgsIHRleHQpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFNhdmVDb21tYW5kc0hlbHBlci5nZXRJbnNlcnRUZXh0Q29tbWFuZCh0ZXh0LCBpbmRleCwgdGhpcy50YXJnZXRzKSk7XG4gICAgfVxuXG4gICAgc2F2ZUluc2VydFN0eWxlZFRleHRUb0hpc3RvcnkocGFyYWdyYXBoOiBudW1iZXIsIGluZGV4SW5QYXJhZ3JhcGg6IG51bWJlciwgdGV4dDogc3RyaW5nLCBzdHlsZTogVGV4dFN0eWxlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LCBwYXJhZ3JhcGgsIGluZGV4SW5QYXJhZ3JhcGgpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFN0eWxlZFRleHQoaW5kZXgsIHRleHQsIHN0eWxlKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0U3R5bGVkVGV4dENvbW1hbmQodGV4dCwgaW5kZXgsIHN0eWxlLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0RWxlbWVudFRvSGlzdG9yeShtb2RlbDogSW5zZXJ0RWxlbWVudE1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0RWxlbWVudChtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydEVsZW1lbnRDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0QnJlYWtUb0hpc3RvcnkobW9kZWw6IEluc2VydEJyZWFrTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgbW9kZWwuaXNPbk5ld1BhcmFncmFwaCA9XG4gICAgICAgICAgICBtb2RlbC5icmVha1R5cGUgPT09IEJyZWFrVHlwZXMuUGFnZSAmJlxuICAgICAgICAgICAgQnJlYWtIZWxwZXIuZ2V0QnJlYWtUeXBlKHRoaXMuc2Vzc2lvbi5tb2RlbCwgQ1VTVE9NX0VMRU1FTlRfTUFSS0VSLCBtb2RlbC5pbnNlcnRJbmRleCAtIDEpICE9PSBCcmVha1R5cGVzLlBhZ2U7XG4gICAgICAgIGNvbnN0IGVuZEluZGV4ID0gbW9kZWwuaXNPbk5ld1BhcmFncmFwaCA/IG1vZGVsLmluc2VydEluZGV4ICsgTkVXX0xJTkVfTUFSS1VQLmxlbmd0aCArIDEgOiBtb2RlbC5pbnNlcnRJbmRleCArIDE7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0QnJlYWsobW9kZWwsIGVuZEluZGV4KTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0QnJlYWtDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0VGFiVG9IaXN0b3J5KG1vZGVsOiBJbnNlcnRUYWJNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYihtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYkNvbW1hbmQobW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRJbWFnZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0SW1hZ2VNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydEltYWdlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0SW1hZ2VDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlSW5zZXJ0TGlua1RvSGlzdG9yeShtb2RlbDogSW5zZXJ0TGlua01vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoSW5zZXJ0TGluayhtb2RlbCk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydExpbmtPcGVyYXRpb24obW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVJbnNlcnRUYWJsZVRvSGlzdG9yeShtb2RlbDogSW5zZXJ0VGFibGVNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaEluc2VydFRhYmxlKG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0SW5zZXJ0VGFibGVDb21tYW5kKG1vZGVsLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlQXBwbHlUZXh0U3R5bGVUb0hpc3Rvcnkoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyLCB0ZXh0U3R5bGU6IFRleHRTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlUZXh0U3R5bGUoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHRTdHlsZSwgZm9ybWF0cyk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldEFwcGx5VGV4dFN0eWxlQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgdGV4dFN0eWxlLCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBzYXZlQXBwbHlQYXJhZ3JhcGhTdHlsZVRvSGlzdG9yeShzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIsIHBhcmFncmFwaFN0eWxlOiBQYXJhZ3JhcGhTdHlsZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoc0RlZXBDb3B5ID0gcGFyYWdyYXBocy5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiB4Lmluc2VydEluZGV4LCBwYXJhZ3JhcGhTdHlsZTogbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwoeyAuLi54LnBhcmFncmFwaFN0eWxlIH0pIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlQYXJhZ3JhcGhTdHlsZShzdGFydEluZGV4LCBlbmRJbmRleCwgcGFyYWdyYXBoU3R5bGUsIHBhcmFncmFwaHNEZWVwQ29weSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlQYXJhZ3JhcGhTdHlsZUNvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIHBhcmFncmFwaFN0eWxlLCB0aGlzLnRhcmdldHMpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2F2ZUFkZE51bWJlcmluZ1RvSGlzdG9yeSh0ZW1wbGF0ZUxldmVsczogTnVtYmVyaW5nTGV2ZWxNb2RlbFtdLCBzdGFydEluZGV4OiBudW1iZXIsIGVuZEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBocyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwucGFyYWdyYXBocywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBjb25zdCBwYXJhZ3JhcGhzRGVlcENvcHkgPSBwYXJhZ3JhcGhzLm1hcChcbiAgICAgICAgICAgIHggPT4gbmV3IFBhcmFncmFwaE1vZGVsKHsgaW5zZXJ0SW5kZXg6IHguaW5zZXJ0SW5kZXgsIHBhcmFncmFwaFN0eWxlOiBuZXcgUGFyYWdyYXBoU3R5bGVNb2RlbCh7IC4uLngucGFyYWdyYXBoU3R5bGUgfSkgfSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVtb3ZlZE51bWJlcmluZ0lkcyA9IFsuLi5uZXcgU2V0KHBhcmFncmFwaHMubWFwKHggPT4geC5wYXJhZ3JhcGhTdHlsZS5udW1iZXJpbmdJZCkpXTtcbiAgICAgICAgY29uc3QgbnVtYmVyaW5ncyA9IHRoaXMuc2Vzc2lvbi5wcm9wZXJ0aWVzLm51bWJlcmluZ3MuZmlsdGVyKHggPT4gcmVtb3ZlZE51bWJlcmluZ0lkcy5pbmNsdWRlcyh4Lm51bWJlcmluZ0lkKSk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQWRkTnVtYmVyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0ZW1wbGF0ZUxldmVscywgcGFyYWdyYXBoc0RlZXBDb3B5LCBudW1iZXJpbmdzKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QWRkTnVtYmVyaW5nQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgdGVtcGxhdGVMZXZlbHMsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHNhdmVSZW1vdmVOdW1iZXJpbmdUb0hpc3Rvcnkoc3RhcnRJbmRleDogbnVtYmVyLCBlbmRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoc0RlZXBDb3B5ID0gcGFyYWdyYXBocy5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh7IGluc2VydEluZGV4OiB4Lmluc2VydEluZGV4LCBwYXJhZ3JhcGhTdHlsZTogbmV3IFBhcmFncmFwaFN0eWxlTW9kZWwoeyAuLi54LnBhcmFncmFwaFN0eWxlIH0pIH0pXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlbW92ZWROdW1iZXJpbmdJZHMgPSBbLi4ubmV3IFNldChwYXJhZ3JhcGhzLm1hcCh4ID0+IHgucGFyYWdyYXBoU3R5bGUubnVtYmVyaW5nSWQpKV07XG4gICAgICAgIGNvbnN0IG51bWJlcmluZ3MgPSB0aGlzLnNlc3Npb24ucHJvcGVydGllcy5udW1iZXJpbmdzLmZpbHRlcih4ID0+IHJlbW92ZWROdW1iZXJpbmdJZHMuaW5jbHVkZXMoeC5udW1iZXJpbmdJZCkpO1xuICAgICAgICB0aGlzLmhpc3RvcnkucHVzaFJlbW92ZU51bWJlcmluZ3Moc3RhcnRJbmRleCwgZW5kSW5kZXgsIG51bWJlcmluZ3MsIHBhcmFncmFwaHNEZWVwQ29weSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZU51bWJlcmluZ3NDb21tYW5kKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNhdmVBcHBseUltYWdlU3R5bGVUb0hpc3RvcnkoaW1hZ2U6IEltYWdlTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLnNlc3Npb24ubW9kZWwuaW1hZ2VzLmZpbmQoeCA9PiB4Lmluc2VydEluZGV4ID09PSBpbWFnZS5pbnNlcnRJbmRleCk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoQXBwbHlJbWFnZVN0eWxlKHByZXZpb3VzLCBpbWFnZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0QXBwbHlJbWFnZVN0eWxlQ29tbWFuZChpbWFnZS5oZWlnaHQsIGltYWdlLndpZHRoLCBpbWFnZS5pbnNlcnRJbmRleCwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2F2ZVJlcGxhY2VUb0hpc3RvcnkocmFuZ2U6IFJhbmdlLCBtb2RlbDogUmVwbGFjZU1vZGVsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3RvcmVNb2RlbCA9IHRoaXMuY3JlYXRlUmVzdG9yZUZyb21TbGljZShyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLnJvdywgcmFuZ2UuZW5kLmNvbHVtbik7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoUmVwbGFjZShyZXN0b3JlTW9kZWwsIG1vZGVsKTtcbiAgICAgICAgdGhpcy5jb21tYW5kc1NlcnZpY2UuY3JlYXRlQ29tbWFuZChTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVwbGFjZUNvbW1hbmQobW9kZWwsIHRoaXMudGFyZ2V0cykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlUmVzdG9yZUZyb21TbGljZShwYXJhZ3JhcGhTdGFydDogbnVtYmVyLCBpbmRleEluU3RhcnQ6IG51bWJlciwgcGFyYWdyYXBoRW5kOiBudW1iZXIsIGluZGV4SW5FbmQ6IG51bWJlcik6IFJlc3RvcmVNb2RlbCB7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LCBwYXJhZ3JhcGhTdGFydCwgaW5kZXhJblN0YXJ0KTtcbiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBDb250ZW50SGVscGVyLnBhcmFncmFwaFRvRG9jdW1lbnRJbmRleCh0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LCBwYXJhZ3JhcGhFbmQsIGluZGV4SW5FbmQpIC0gMTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMuc2Vzc2lvbi5tb2RlbC5jb250ZW50LnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSBGb3JtYXRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5mb3JtYXRzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGNvbnN0IHBhcmFncmFwaHMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoXG4gICAgICAgICAgICB4ID0+IG5ldyBQYXJhZ3JhcGhNb2RlbCh4KVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbWFnZXMgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmltYWdlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBJbWFnZU1vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFibGVzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KS5tYXAoeCA9PiBuZXcgVGFibGVNb2RlbCh4KSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gSW5kZXhlZEVsZW1lbnRIZWxwZXIuc2xpY2VTZWN0aW9uKHRoaXMuc2Vzc2lvbi5tb2RlbC5lbGVtZW50cywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBFbGVtZW50TW9kZWwoeCkpO1xuICAgICAgICBjb25zdCBicmVha3MgPSBJbmRleGVkRWxlbWVudEhlbHBlci5zbGljZVNlY3Rpb24odGhpcy5zZXNzaW9uLm1vZGVsLmJyZWFrcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBCcmVha01vZGVsKHgpKTtcbiAgICAgICAgY29uc3QgdGFicyA9IEluZGV4ZWRFbGVtZW50SGVscGVyLnNsaWNlU2VjdGlvbih0aGlzLnNlc3Npb24ubW9kZWwudGFicywgc3RhcnRJbmRleCwgZW5kSW5kZXgpLm1hcCh4ID0+IG5ldyBUYWJNb2RlbCh4KSk7XG4gICAgICAgIHJldHVybiBuZXcgUmVzdG9yZU1vZGVsKHsgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHRleHQsIGZvcm1hdHMsIHBhcmFncmFwaHMsIGltYWdlcywgdGFibGVzLCBlbGVtZW50cywgYnJlYWtzLCB0YWJzIH0pO1xuICAgIH1cblxuICAgIGNyZWF0ZUN1c3RvbUVsZW1lbnQoZGF0YTogRWxlbWVudERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpbnNlcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoVG9Eb2N1bWVudEluZGV4KFxuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LnJvdyxcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnJhbmdlLnN0YXJ0LmNvbHVtblxuICAgICAgICApO1xuICAgICAgICBjb25zdCBpbnNlcnRFbGVtZW50ID0gbmV3IEluc2VydEVsZW1lbnRNb2RlbCh7IGVsZW1lbnQ6IG5ldyBFbGVtZW50TW9kZWwoeyAuLi5kYXRhLCBpbnNlcnRJbmRleCB9KSB9KTtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VCeShuZXcgUmVwbGFjZU1vZGVsKHsgaW5zZXJ0RWxlbWVudCB9KSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVJbnNlcnRFbGVtZW50VG9IaXN0b3J5KGluc2VydEVsZW1lbnQpO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuc2Vzc2lvbi5pbnNlcnRFbGVtZW50KHRoaXMuc2VsZWN0aW9uLmN1cnNvciwgZGF0YSk7XG4gICAgICAgIHRoaXMub25Eb2N1bWVudENoYW5nZShuZXcgUmFuZ2UodGhpcy5zZWxlY3Rpb24uY3Vyc29yLCBlbmRQb2ludCkpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlU2VsZWN0ZWQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNhdmVSZW1vdmVUb0hpc3RvcnkodGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uSW5wdXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnRleHRJbnB1dC5nZXRJbnNlcnRUZXh0KCk7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaCA9IHRoaXMuaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaCh0aGlzLnNlbGVjdGlvbi5jdXJzb3Iucm93KTtcbiAgICAgICAgaWYgKHRleHQgPT09IE5FV19MSU5FX01BUktVUCAmJiB0aGlzLnNlbGVjdGlvbi5pc0VtcHR5ICYmIGlzRW1wdHlOdW1iZXJpbmdQYXJhZ3JhcGgpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlTnVtYmVyaW5nc0Zyb21QYXJhZ3JhcGhzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluc2VydCh0ZXh0KTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkN1dChldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRDbGlwYm9hcmREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmNsaXBib2FyZC5jb3B5KGRhdGEpO1xuICAgICAgICB0aGlzLmN1dCgpO1xuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgIH1cblxuICAgIG9uQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCk7XG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRDbGlwYm9hcmREYXRhKGRhdGEpO1xuICAgICAgICB0aGlzLmNsaXBib2FyZC5jb3B5KGRhdGEpO1xuICAgIH1cblxuICAgIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnRleHRJbnB1dC5nZXRDbGlwYm9hcmREYXRhKGV2ZW50KTtcbiAgICAgICAgdGhpcy5wYXN0ZURhdGEoZGF0YSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0UmVzaXplTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLnJlcmVuZGVyUmVzaXplKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMucmVyZW5kZXJSZXNpemUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVyZW5kZXJNYXJrZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIubG9vcC5zY2hlZHVsZSh7IG1hcmtlcjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcmVuZGVyUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5vblJlc2l6ZSh0cnVlKTtcbiAgICB9O1xuXG4gICAgb25CbHVyKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMudGV4dElucHV0LmlzRm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuaGlkZUN1cnNvcigpO1xuICAgIH1cblxuICAgIG9uRm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYmx1ckN1c3RvbUNvbXBvbmVudCgpO1xuICAgICAgICB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNob3dDdXJzb3IoKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQuY2xpZW50WSwgZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZW1pdCgnZm9jdXNFZGl0b3InKTtcbiAgICB9XG5cbiAgICBvbkxlZnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50ID0gdGhpcy5zZXRDdXJyZW50U2Vzc2lvbihldmVudC5jbGllbnRZLCBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB0aGlzLmVtaXQoJ2ZvY3VzRWRpdG9yJyk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dElucHV0LmlucHV0LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ubW92ZVNlbGVjdGlvbihwb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgICAgICAgICAgY29uc3QgbGlua01vZGVsID0gdGhpcy5zZXNzaW9uLmdldExpbmtNb2RlbChwb3NpdGlvbik7XG4gICAgICAgICAgICBpZiAobGlua01vZGVsKSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4obGlua01vZGVsLmxpbmspO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm1vdXNlSGFuZGxlci5zdGFydE1vdXNlUHJlc3ModGhpcyk7XG4gICAgfVxuXG4gICAgb25Eb3VibGVDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2V0U3R5bGVzJywgdGhpcy5zZXRTdHlsZXMpO1xuICAgICAgICBsZXQgaXNTdGFydEVkaXRFZGdlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTZXNzaW9uSWQgPSArY3VzdG9tRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnZGF0YS1zZXNzaW9uLWlkJykudmFsdWU7XG4gICAgICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0Q3VzdG9tU2Vzc2lvbkFzQ3VycmVudChlbGVtZW50U2Vzc2lvbklkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VEYXRhID0gdGhpcy5nZXRDbGlja2VkRWRnZURhdGEoZXZlbnQuY2xpZW50WSk7XG4gICAgICAgICAgICBpZiAoZWRnZURhdGEpIHtcbiAgICAgICAgICAgICAgICBpc1N0YXJ0RWRpdEVkZ2UgPSAhdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmVkZ2VFZGl0aW5nUGFnZTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2Uuc2V0RWRnZVNlc3Npb25Bc0N1cnJlbnQoZWRnZURhdGEuZWRnZS5zZXNzaW9uSWQsIGVkZ2VEYXRhLmNsaWNrZWRQYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldE1haW5TZXNzaW9uQXNDdXJyZW50KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3NldFN0eWxlcycsIHRoaXMuc2V0U3R5bGVzKTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBpZiAoaXNTdGFydEVkaXRFZGdlKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihwb3NpdGlvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4pO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VTZWxlY3Rpb24ocmFuZ2Uuc3RhcnQsIHJhbmdlLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uVHJpcGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudCA9IHRoaXMuc2V0Q3VycmVudFNlc3Npb24oZXZlbnQuY2xpZW50WSwgZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGN1c3RvbUVsZW1lbnQgJiYgY3VzdG9tRWxlbWVudC50YWdOYW1lICE9PSB0aGlzLnRhYmxlQ2VsbFRhZ05hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNDdXN0b21Db21wb25lbnQoY3VzdG9tRWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJsdXJDdXN0b21Db21wb25lbnQoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBQb2ludChwb3NpdGlvbi5yb3csIDApO1xuICAgICAgICBjb25zdCBlbmQgPSBuZXcgUG9pbnQocG9zaXRpb24ucm93LCB0aGlzLnNlc3Npb24uZG9jdW1lbnQubGluZXNbcG9zaXRpb24ucm93XS5sZW5ndGgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZVNlbGVjdGlvbihzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH1cblxuICAgIG9uUXVhZENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLnNldEN1cnJlbnRTZXNzaW9uKGV2ZW50LmNsaWVudFksIGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50ICYmIGN1c3RvbUVsZW1lbnQudGFnTmFtZSAhPT0gdGhpcy50YWJsZUNlbGxUYWdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQ3VzdG9tQ29tcG9uZW50KGN1c3RvbUVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5ibHVyQ3VzdG9tQ29tcG9uZW50KCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdEFsbCh0aGlzLnNlc3Npb24ubW9kZWwpO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgb25Nb3VzZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmYWN0b3IgPSAwLjM1O1xuICAgICAgICBjb25zdCBzY3JvbGxTcGVlZCA9IDQ7XG4gICAgICAgIGNvbnN0IGRlbHRhWSA9IGV2ZW50LmRlbHRhWSAqIGZhY3RvciAqIHNjcm9sbFNwZWVkO1xuICAgICAgICB0aGlzLm1haW5SZW5kZXJlci5zY3JvbGxCeShkZWx0YVkpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBzZXRDdXJyZW50U2Vzc2lvbihjbGlja1Bvc2l0aW9uWTogbnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdzZXRTdHlsZXMnLCB0aGlzLnNldFN0eWxlcyk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnQgPSB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGlmIChjdXN0b21FbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50U2Vzc2lvbklkID0gK2N1c3RvbUVsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtc2Vzc2lvbi1pZCcpLnZhbHVlO1xuICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoZWxlbWVudFNlc3Npb25JZCk7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignc2V0U3R5bGVzJywgdGhpcy5zZXRTdHlsZXMpO1xuICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlZGdlRGF0YSA9IHRoaXMuZ2V0Q2xpY2tlZEVkZ2VEYXRhKGNsaWNrUG9zaXRpb25ZKTtcbiAgICAgICAgaWYgKGVkZ2VEYXRhICYmIHRoaXMucmVndWxhdG9yU2VydmljZS5lZGdlRWRpdGluZ1BhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRFZGdlU2Vzc2lvbkFzQ3VycmVudChlZGdlRGF0YS5lZGdlLnNlc3Npb25JZCwgZWRnZURhdGEuY2xpY2tlZFBhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldE1haW5TZXNzaW9uQXNDdXJyZW50KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lcignc2V0U3R5bGVzJywgdGhpcy5zZXRTdHlsZXMpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBnZXRDdXN0b21FbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gdGhpcy5wYXJlbnRUYWdOYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbUVsZW1lbnRUYWdOYW1lcy5pbmNsdWRlcyhlbGVtZW50LnRhZ05hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEN1c3RvbUVsZW1lbnQoZWxlbWVudC5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldENsaWNrZWRFZGdlRGF0YShtb3VzZVBvc2l0aW9uOiBudW1iZXIpOiB7IGVkZ2U6IE5vZGVyRWRnZUNvbXBvbmVudDsgY2xpY2tlZFBhZ2U6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uWSA9IG1vdXNlUG9zaXRpb24gKyB0aGlzLm1haW5TZXNzaW9uLnNjcm9sbFRvcCAtIHRoaXMubWFpblJlbmRlcmVyLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3A7XG4gICAgICAgIGNvbnN0IGNsaWNrZWRQYWdlID0gUG9zaXRpb25IZWxwZXIucGl4ZWxUb1BhZ2UocG9zaXRpb25ZLCB0aGlzLm1haW5TZXNzaW9uKTtcbiAgICAgICAgY29uc3QgcGFnZVdyYXAgPSB0aGlzLm1haW5TZXNzaW9uLnBhZ2VzV3JhcDtcbiAgICAgICAgY29uc3QgcGFnZVZlcnRpY2FsRGF0YSA9IFBhZ2VIZWxwZXIuZ2V0VmVydGljYWxEYXRhKGNsaWNrZWRQYWdlLCBwYWdlV3JhcC5wYWdlc1ZlcnRpY2FsRGF0YSk7XG4gICAgICAgIGNvbnN0IHBhZ2VTdGFydFBvc2l0aW9uID0gKHBhZ2VXcmFwLnBhZ2VzU3BhY2UgKyBwYWdlV3JhcC5wYWdlSGVpZ2h0KSAqIChjbGlja2VkUGFnZSAtIDEpICsgcGFnZVdyYXAucGFnZXNTcGFjZTtcbiAgICAgICAgY29uc3QgcGFnZVRvcCA9IHBhZ2VTdGFydFBvc2l0aW9uICsgcGFnZVZlcnRpY2FsRGF0YS5tYXJnaW5Ub3A7XG4gICAgICAgIGNvbnN0IHBhZ2VCb3R0b20gPSBwYWdlU3RhcnRQb3NpdGlvbiArIHBhZ2VXcmFwLnBhZ2VIZWlnaHQgLSBwYWdlVmVydGljYWxEYXRhLm1hcmdpbkJvdHRvbTtcbiAgICAgICAgbGV0IGNvbXBvbmVudDogQ29tcG9uZW50UmVmPE5vZGVyRWRnZUNvbXBvbmVudD47XG4gICAgICAgIGlmIChwYWdlVG9wID49IHBvc2l0aW9uWSkge1xuICAgICAgICAgICAgY29tcG9uZW50ID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmdldENvbXBvbmVudEJ5UGFnZShjbGlja2VkUGFnZSwgRWRnZVR5cGUuSGVhZGVyKTtcbiAgICAgICAgfSBlbHNlIGlmIChwYWdlQm90dG9tIDw9IHBvc2l0aW9uWSkge1xuICAgICAgICAgICAgY29tcG9uZW50ID0gdGhpcy5tYWluU2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmVkZ2VzLmdldENvbXBvbmVudEJ5UGFnZShjbGlja2VkUGFnZSwgRWRnZVR5cGUuRm9vdGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgPyB7IGVkZ2U6IGNvbXBvbmVudC5pbnN0YW5jZSwgY2xpY2tlZFBhZ2UgfSA6IG51bGw7XG4gICAgfVxuXG4gICAgc2V0U3R5bGVzID0gKHN0eWxlczogSVRvb2xiYXJTdHlsZXMpID0+IHtcbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnN0eWxlcyA9IHN0eWxlcztcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgc3RyaW5nIG9mIHRleHQgY3VycmVudGx5IGhpZ2hsaWdodGVkLlxuICAgICAqL1xuICAgIGdldFNlbGVjdGVkVGV4dCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5zZWxlY3Rpb24ucmFuZ2Uuc3RhcnQpO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IENvbnRlbnRIZWxwZXIucGFyYWdyYXBoUG9zaXRpb25Ub0RvY3VtZW50SW5kZXgodGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCwgdGhpcy5zZWxlY3Rpb24ucmFuZ2UuZW5kKTtcbiAgICAgICAgbGV0IGVsZW1lbnRJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLmJyZWFrcywgZWxlbWVudEluZGV4ZXMsIHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICAgICAgQ29udGVudEhlbHBlci5zZXRJbmRleGVzRWxlbWVudHNJbkludGVydmFsKHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIENvbnRlbnRIZWxwZXIuc2V0SW5kZXhlc0VsZW1lbnRzSW5JbnRlcnZhbCh0aGlzLnNlc3Npb24ubW9kZWwuaW1hZ2VzLCBlbGVtZW50SW5kZXhlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLmVsZW1lbnRzLCBlbGVtZW50SW5kZXhlcywgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICBDb250ZW50SGVscGVyLnNldEluZGV4ZXNFbGVtZW50c0luSW50ZXJ2YWwodGhpcy5zZXNzaW9uLm1vZGVsLnRhYnMsIGVsZW1lbnRJbmRleGVzLCBzdGFydEluZGV4LCBlbmRJbmRleCk7XG4gICAgICAgIGVsZW1lbnRJbmRleGVzLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcbiAgICAgICAgbGV0IHRleHRJbnRlcnZhbCA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5nZXRUZXh0UmFuZ2UodGhpcy5zZWxlY3Rpb24ucmFuZ2UpO1xuICAgICAgICBlbGVtZW50SW5kZXhlcy5mb3JFYWNoKHggPT4ge1xuICAgICAgICAgICAgdGV4dEludGVydmFsID0gdGV4dEludGVydmFsLnNsaWNlKDAsIHgpICsgdGV4dEludGVydmFsLnNsaWNlKHggKyAxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRleHRJbnRlcnZhbDtcbiAgICB9XG5cbiAgICBpbml0TWFpblNlc3Npb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhZ2VXaWR0aCA9IHRoaXMuY3VzdG9tUGFnZVdpZHRoID8/IHRoaXMubW9kZWwucGFnZVdpZHRoO1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLm1heFdpZHRoID0gYCR7cGFnZVdpZHRofXB4YDtcbiAgICAgICAgY29uc3Qgc2NhbGluZ1JhdGlvID0gdGhpcy5jdXN0b21QYWdlV2lkdGggPyBTY2FsaW5nSGVscGVyLmdldFJhdGlvKHRoaXMuY3VzdG9tUGFnZVdpZHRoLCB0aGlzLm1vZGVsLnBhZ2VXaWR0aCkgOiAxO1xuICAgICAgICB0aGlzLnJlZ3VsYXRvclNlcnZpY2UuYWRkTWFpblNlc3Npb24odGhpcy5tb2RlbCwgcGFnZVdpZHRoLCBzY2FsaW5nUmF0aW8sIHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5tYWluU2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2VTY3JvbGxUb3AnLCB0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoJ3NldFN0eWxlcycsIHRoaXMuc2V0U3R5bGVzKTtcbiAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuc2Nyb2xsVG8oMCk7XG4gICAgfVxuXG4gICAgb25TZWxlY3Rpb25DaGFuZ2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5wcm9jZXNzU2VsZWN0aW9uU3R5bGVzKCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlU2VsZWN0aW9uKHRoaXMuc2VsZWN0aW9uLnJhbmdlKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEhhc1NlbGVjdGlvbighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSk7XG4gICAgICAgIHRoaXMucmVyZW5kZXJNYXJrZXIoKTtcbiAgICB9XG5cbiAgICBvblNjcm9sbFRvcENoYW5nZSA9ICh2YWx1ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbFRvKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkRvY3VtZW50Q2hhbmdlID0gKHJhbmdlOiBSYW5nZSk6IHZvaWQgPT4ge1xuICAgICAgICBsZXQgbGFzdFJvdyA9IHJhbmdlLnN0YXJ0LnJvdyA9PT0gcmFuZ2UuZW5kLnJvdyA/IHJhbmdlLmVuZC5yb3cgOiBJbmZpbml0eTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyhyYW5nZS5zdGFydC5yb3csIGxhc3RSb3cpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBjdXJzb3IgYmVjYXVzZSB0YWIgY2hhcmFjdGVycyBjYW4gaW5mbHVlbmNlIHRoZSBjdXJzb3IgcG9zaXRpb24uXG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgfTtcblxuICAgIGRlc3Ryb3lNYWluU2Vzc2lvbkxpc3RlbmVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYWluU2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2VTY3JvbGxUb3AnLCB0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZvY3VzQ3VzdG9tQ29tcG9uZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gK2VsZW1lbnQuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtaW5zZXJ0LWluZGV4JykudmFsdWU7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9XG4gICAgICAgICAgICB0aGlzLnNlc3Npb24uY3VzdG9tQ29tcG9uZW50cy5pbWFnZXMuZmluZCh4ID0+IHguaW5zdGFuY2UuaW5zZXJ0SW5kZXggPT09IGluZGV4KSA/P1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLmN1c3RvbUNvbXBvbmVudHMudGFibGVzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbmRleCkgPz9cbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbi5jdXN0b21Db21wb25lbnRzLmN1c3RvbUVsZW1lbnRzLmZpbmQoeCA9PiB4Lmluc3RhbmNlLmluc2VydEluZGV4ID09PSBpbmRleCk7XG4gICAgICAgIGlmICghY29tcG9uZW50IHx8IGNvbXBvbmVudCA9PT0gdGhpcy5mb2N1c2VkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvY3VzZWRDb21wb25lbnQ/Lmluc3RhbmNlLmJsdXIoKTtcbiAgICAgICAgY29tcG9uZW50Lmluc3RhbmNlLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuZm9jdXNlZENvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnNlc3Npb24uZG9jdW1lbnQuaW5kZXhUb1Bvc2l0aW9uKGluZGV4LCAwKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IocG9zaXRpb24pO1xuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBibHVyQ3VzdG9tQ29tcG9uZW50KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5mb2N1c2VkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRDb21wb25lbnQuaW5zdGFuY2UuYmx1cigpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaXNFbXB0eU51bWJlcmluZ1BhcmFncmFwaChwYXJhZ3JhcGhJbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRMaW5lID0gdGhpcy5zZXNzaW9uLmRvY3VtZW50LmdldExpbmUodGhpcy5zZXNzaW9uLmRvY3VtZW50LmxpbmVzLCBwYXJhZ3JhcGhJbmRleCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50TGluZS5sZW5ndGggPT09IDAgJiYgdGhpcy5zZXNzaW9uLm1vZGVsLnBhcmFncmFwaHNbcGFyYWdyYXBoSW5kZXhdLnBhcmFncmFwaFN0eWxlLm51bWJlcmluZ0lkICE9PSBudWxsO1xuICAgIH1cblxuICAgIHNjcm9sbEN1cnNvckludG9NYWluVmlldyhvZmZzZXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbiAhPT0gdGhpcy5tYWluU2Vzc2lvbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWFpblJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgY2hhbmdlZFRhYmxlU2l6ZShpbnNlcnRJbmRleDogbnVtYmVyLCBzZXNzaW9uSWQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmdldFNlc3Npb24oc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgcGFyYWdyYXBoID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleChzZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleCwgaW5zZXJ0SW5kZXgpLnJvdztcbiAgICAgICAgc2Vzc2lvbi51cGRhdGVXcmFwRGF0YShwYXJhZ3JhcGgsIHBhcmFncmFwaCk7XG4gICAgICAgIHRoaXMudGV4dElucHV0LmlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHJvd3NDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRUYWJsZVJvd3MoaW5zZXJ0SW5kZXgsIHJvd3NDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCwgdGFibGUpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFxuICAgICAgICAgICAgU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYmxlUm93c0NvbW1hbmQocm93c0NvdW50LCBpbmhlcml0SW5kZXgsIGluc2VydEluZGV4LCB0YXJnZXRJbmRleCwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVSb3dzKGluc2VydEluZGV4LCByb3dzQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIGNvbHVtbnNDb3VudDogbnVtYmVyLCB0YXJnZXRJbmRleDogbnVtYmVyLCBpbmhlcml0SW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hJbnNlcnRUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXgsIGNvbHVtbnNDb3VudCwgdGFyZ2V0SW5kZXgsIGluaGVyaXRJbmRleCwgdGFibGUpO1xuICAgICAgICB0aGlzLmNvbW1hbmRzU2VydmljZS5jcmVhdGVDb21tYW5kKFxuICAgICAgICAgICAgU2F2ZUNvbW1hbmRzSGVscGVyLmdldEluc2VydFRhYmxlQ29sdW1uc0NvbW1hbmQoY29sdW1uc0NvdW50LCBpbmhlcml0SW5kZXgsIGluc2VydEluZGV4LCB0YXJnZXRJbmRleCwgdGhpcy50YXJnZXRzKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNlc3Npb24uaW5zZXJ0VGFibGVDb2x1bW5zKGluc2VydEluZGV4LCBjb2x1bW5zQ291bnQsIHRhcmdldEluZGV4LCBpbmhlcml0SW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGFibGVSb3dzKGluc2VydEluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hSZW1vdmVUYWJsZVJvd3MoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0YWJsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoU2F2ZUNvbW1hbmRzSGVscGVyLmdldFJlbW92ZVRhYmxlUm93c0NvbW1hbmQoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGluc2VydEluZGV4LCB0aGlzLnRhcmdldHMpKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVRhYmxlUm93cyhpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlVGFibGVDb2x1bW5zKGluc2VydEluZGV4OiBudW1iZXIsIHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlciwgc2Vzc2lvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNldEN1c3RvbVNlc3Npb25Bc0N1cnJlbnQoc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgYmVmb3JlVGFibGUgPSBDb250ZW50SGVscGVyLmRvY3VtZW50SW5kZXhUb1BhcmFncmFwaEluZGV4KHRoaXMuc2Vzc2lvbi53cmFwUGFyYWdyYXBoSW5kZXgsIGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb24ucGxhY2VDdXJzb3IoYmVmb3JlVGFibGUpO1xuICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuc2Vzc2lvbi5tb2RlbC50YWJsZXMuZmluZCh4ID0+IHguaW5zZXJ0SW5kZXggPT09IGluc2VydEluZGV4KTtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2hSZW1vdmVUYWJsZUNvbHVtbnMoaW5zZXJ0SW5kZXgsIHN0YXJ0SW5kZXgsIGVuZEluZGV4LCB0YWJsZSk7XG4gICAgICAgIHRoaXMuY29tbWFuZHNTZXJ2aWNlLmNyZWF0ZUNvbW1hbmQoXG4gICAgICAgICAgICBTYXZlQ29tbWFuZHNIZWxwZXIuZ2V0UmVtb3ZlVGFibGVDb2x1bW5zQ29tbWFuZChzdGFydEluZGV4LCBlbmRJbmRleCwgaW5zZXJ0SW5kZXgsIHRoaXMudGFyZ2V0cylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZVRhYmxlQ29sdW1ucyhpbnNlcnRJbmRleCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgICAgICB0aGlzLmNoYW5nZWRUYWJsZVNpemUoaW5zZXJ0SW5kZXgsIHNlc3Npb25JZCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlSW1hZ2UoaW5zZXJ0SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCByYW5nZSA9IHRoaXMuc2Vzc2lvbi5kb2N1bWVudC5pbmRleGVzVG9SYW5nZShpbnNlcnRJbmRleCwgaW5zZXJ0SW5kZXggKyAxKTtcbiAgICAgICAgdGhpcy5zYXZlUmVtb3ZlVG9IaXN0b3J5KHJhbmdlKTtcbiAgICAgICAgdGhpcy5zZXNzaW9uLnJlbW92ZShyYW5nZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCk7XG4gICAgICAgIHRoaXMudGV4dElucHV0LmlucHV0LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgcmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1uczogUmVzaXplVGFibGVDb2x1bW5zTW9kZWwsIHNlc3Npb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5zZXRDdXN0b21TZXNzaW9uQXNDdXJyZW50KHNlc3Npb25JZCk7XG4gICAgICAgIGNvbnN0IGJlZm9yZVRhYmxlID0gQ29udGVudEhlbHBlci5kb2N1bWVudEluZGV4VG9QYXJhZ3JhcGhJbmRleCh0aGlzLnNlc3Npb24ud3JhcFBhcmFncmFwaEluZGV4LCByZXNpemVUYWJsZUNvbHVtbnMuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5wbGFjZUN1cnNvcihiZWZvcmVUYWJsZSk7XG4gICAgICAgIHRoaXMuaGlzdG9yeS5wdXNoUmVzaXplVGFibGVDb2x1bW5zKHJlc2l6ZVRhYmxlQ29sdW1ucyk7XG4gICAgICAgIHRoaXMuc2Vzc2lvbi5yZXNpemVUYWJsZUNvbHVtbnMocmVzaXplVGFibGVDb2x1bW5zKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkVGFibGVTaXplKHJlc2l6ZVRhYmxlQ29sdW1ucy5pbnNlcnRJbmRleCwgc2Vzc2lvbklkKTtcbiAgICB9XG5cbiAgICBvbk1vdXNlUHJlc3NlZE1vdmUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHgsIHkpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5tb3ZlU2VsZWN0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgIH1cblxuICAgIHNlYXJjaE9wdGlvblN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnNlYXJjaE9wdGlvbnMkLnN1YnNjcmliZShzZWFyY2hPcHRpb25zID0+IHtcbiAgICAgICAgICAgIHRoaXMuZmluZChzZWFyY2hPcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZWFyY2hJdGVyYXRpb24gPSB0aGlzLnVwZGF0ZUNvdW50ZXIoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVwbGFjZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlcGxhY2UkLnN1YnNjcmliZShyZXBsYWNlID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZShyZXBsYWNlLnNlYXJjaFZhbHVlLCByZXBsYWNlLnJlcGxhY2VWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2Uuc2VhcmNoSXRlcmF0aW9uID0gdGhpcy51cGRhdGVDb3VudGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFRleHRTdHlsZXNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5zZXRUZXh0U3R5bGVzJC5zdWJzY3JpYmUodGV4dFN0eWxlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcGx5VGV4dFN0eWxlcyh0ZXh0U3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0UGFyYWdyYXBoU3R5bGVzU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0UGFyYWdyYXBoU3R5bGVzJC5zdWJzY3JpYmUocGFyYWdyYXBoU3R5bGVzID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlQYXJhZ3JhcGhTdHlsZXMocGFyYWdyYXBoU3R5bGVzKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0TnVtYmVyaW5nVGVtcGxhdGVUeXBlJC5zdWJzY3JpYmUobnVtYmVyaW5nVGVtcGxhdGVUeXBlID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0TnVtYmVyaW5nVGVtcGxhdGUobnVtYmVyaW5nVGVtcGxhdGVUeXBlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlTnVtYmVyaW5nc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZU51bWJlcmluZ3MkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZU51bWJlcmluZ3NGcm9tUGFyYWdyYXBocygpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZVN0eWxlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2Uuc2V0SW1hZ2VTdHlsZSQuc3Vic2NyaWJlKGltYWdlID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlJbWFnZVN0eWxlcyhpbWFnZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoYW5nZUVsZW1lbnRTdHlsZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZUVsZW1lbnRTdHlsZSQuc3Vic2NyaWJlKHggPT4gdGhpcy5hcHBseUVsZW1lbnRTdHlsZSh4KSk7XG4gICAgfVxuXG4gICAgY3JlYXRlQ3VzdG9tQ29tcG9uZW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY3JlYXRlQ3VzdG9tQ29tcG9uZW50JC5zdWJzY3JpYmUobW9kZWwgPT4ge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDdXN0b21FbGVtZW50KG1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5zZXJ0QnJlYWtTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5pbnNlcnRCcmVhayQuc3Vic2NyaWJlKGJyZWFrVHlwZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmluc2VydEJyZWFrKGJyZWFrVHlwZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydEltYWdlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0SW1hZ2UkLnN1YnNjcmliZShpbWFnZURhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRJbWFnZShpbWFnZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnNlcnRMaW5rU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0TGluayQuc3Vic2NyaWJlKGxpbmtEYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0TGluayhsaW5rRGF0YSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGVuZE1vdXNlUHJlc3NTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5lbmRNb3VzZVByZXNzJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tb3VzZUhhbmRsZXIuZW5kTW91c2VQcmVzcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBjbGVhclNlbGVjdGlvblN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNsZWFyU2VsZWN0aW9uJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hhbmdlZFRhYmxlU2l6ZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmNoYW5nZWRUYWJsZVNpemUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlZFRhYmxlU2l6ZShkYXRhLmluc2VydEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlUm93c1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydFRhYmxlUm93cyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZVJvd3MoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5yb3dzQ291bnQsIGRhdGEudGFyZ2V0SW5kZXgsIGRhdGEuaW5oZXJpdEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydFRhYmxlQ29sdW1ucyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbnNlcnRUYWJsZUNvbHVtbnMoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5jb2x1bW5zQ291bnQsIGRhdGEudGFyZ2V0SW5kZXgsIGRhdGEuaW5oZXJpdEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlUm93c1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVRhYmxlUm93cyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZVJvd3MoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5zdGFydEluZGV4LCBkYXRhLmVuZEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVRhYmxlQ29sdW1uc1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVRhYmxlQ29sdW1ucyQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVUYWJsZUNvbHVtbnMoZGF0YS5pbnNlcnRJbmRleCwgZGF0YS5zdGFydEluZGV4LCBkYXRhLmVuZEluZGV4LCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZWRJbWFnZVN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZUltYWdlJC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUltYWdlKGRhdGEuaW5zZXJ0SW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXNpemVUYWJsZUNvbHVtbnNTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZXNpemVUYWJsZUNvbHVtbnMkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVzaXplVGFibGVDb2x1bW5zKGRhdGEucmVzaXplVGFibGVDb2x1bW5zLCBkYXRhLnNlc3Npb25JZCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGluc2VydFRhYmxlU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0VGFibGUkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5zZXJ0VGFibGUoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcmVyVXBkYXRlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbmRlcmVyVXBkYXRlZCQuc3Vic2NyaWJlKHNlc3Npb25JZCA9PiB7XG4gICAgICAgICAgICBjb25zdCBlZGdlVGFyZ2V0ID0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLmdldEVkZ2VUYXJnZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgICAgIGlmIChlZGdlVGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tYWluUmVuZGVyZXIuZWRnZXNMYXllci51cGRhdGVCeUxvY2F0aW9uKGVkZ2VUYXJnZXQuZWRnZURhdGEucGFnZVR5cGUgYXMgUGFnZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBlZGdlRWxlbWVudENvcHlVcGRhdGVkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuZWRnZUVsZW1lbnRDb3B5VXBkYXRlZCQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVndWxhdG9yU2VydmljZS5lZGdlRWRpdGluZ1BhZ2UgIT09IGRhdGEucGFnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZWRnZVNlc3Npb25JZCA9ICtkYXRhLm5ld0VsZW1lbnRDb3B5LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCdkYXRhLXNlc3Npb24taWQnKS52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IGVkZ2VTZXNzaW9uID0gdGhpcy5yZWd1bGF0b3JTZXJ2aWNlLnNlc3Npb25zLmZpbmQoeCA9PiB4LnNlc3Npb25JZCA9PT0gZWRnZVNlc3Npb25JZCk7XG4gICAgICAgICAgICBlZGdlU2Vzc2lvbi5yZW5kZXJlci5jb250YWluZXIgPSBkYXRhLm5ld0VsZW1lbnRDb3B5LmZpcnN0Q2hpbGQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNoYW5nZWRFZGdlSGVpZ2h0U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY2hhbmdlZEVkZ2VIZWlnaHQkLnN1YnNjcmliZShlZGdlVHlwZSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1haW5TZXNzaW9uLnBhZ2VzV3JhcC51cGRhdGVQYWdlVmVydGljYWxEYXRhKFxuICAgICAgICAgICAgICAgIGVkZ2VUeXBlLFxuICAgICAgICAgICAgICAgIHRoaXMucmVndWxhdG9yU2VydmljZS5lZGdlRWRpdGluZ1BhZ2UsXG4gICAgICAgICAgICAgICAgdGhpcy5zZXNzaW9uLndyYXBQYXJhZ3JhcGhJbmRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdW5kb1N1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnVuZG8kLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVuZG8oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlZG9TdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5yZWRvJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWRvKCk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEN1cnNvckludG9NYWluVmlldygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByaW50U3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UucHJpbnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBQcmludEhlbHBlci5wcmludERvY3VtZW50KHRoaXMubWFpblNlc3Npb24sIHRoaXMuZWRpdG9yU2VydmljZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3V0U2VsZWN0ZWRTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5jdXRTZWxlY3RlZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25DdXQobmV3IENsaXBib2FyZEV2ZW50KENsaXBib2FyZEV2ZW50VHlwZXMuY3V0KSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY29weVNlbGVjdGVkU3Vic2NyaXB0aW9uKCk6IFN1YnNjcmlwdGlvbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRvclNlcnZpY2UuY29weVNlbGVjdGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vbkNvcHkobmV3IENsaXBib2FyZEV2ZW50KENsaXBib2FyZEV2ZW50VHlwZXMuY29weSkpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhc3RlRnJvbUNsaXBib2FyZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnBhc3RlRnJvbUNsaXBib2FyZCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVhZENsaXBib2FyZCgpXG4gICAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB0aGlzLnBhc3RlRGF0YShkYXRhKSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIGVycm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcmVhZENsaXBib2FyZCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZWFkID0gYXdhaXQgbmF2aWdhdG9yLnBlcm1pc3Npb25zLnF1ZXJ5KHsgbmFtZTogJ2NsaXBib2FyZC1yZWFkJyBhcyBQZXJtaXNzaW9uTmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci5jbGlwYm9hcmQgJiYgcmVhZC5zdGF0ZSAhPSAnZGVuaWVkJykge1xuICAgICAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmRcbiAgICAgICAgICAgICAgICAgICAgLnJlYWRUZXh0KClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBlcnJvclxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmNsaXBib2FyZERhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHBhc3RlRGF0YShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGV4dCA9IGRhdGEucmVwbGFjZSgvXFxyXFxuL2csICdcXG4nKS5yZXBsYWNlKC9cXHQvZywgJyAnKTtcbiAgICAgICAgdGhpcy5pbnNlcnQodGV4dCk7XG4gICAgICAgIHRoaXMuc2Nyb2xsQ3Vyc29ySW50b01haW5WaWV3KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3RBbGxTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5zZWxlY3RBbGwkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwodGhpcy5zZXNzaW9uLm1vZGVsKTtcbiAgICAgICAgICAgIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW1vdmVTZWxlY3RlZFN1YnNjcmlwdGlvbigpOiBTdWJzY3JpcHRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0b3JTZXJ2aWNlLnJlbW92ZVNlbGVjdGVkJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsaXBib2FyZERhdGFTdWJzY3JpcHRpb24oKTogU3Vic2NyaXB0aW9uIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdG9yU2VydmljZS5jbGlwYm9hcmREYXRhJC5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsaXBib2FyZERhdGEgPSBkYXRhO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=