@worktile/theia 3.0.8 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/README.md +11 -11
  2. package/bundles/worktile-theia.umd.js +14357 -14343
  3. package/bundles/worktile-theia.umd.js.map +1 -1
  4. package/components/color-select/color-select.component.d.ts +32 -32
  5. package/components/color-select/color-select.component.scss +107 -107
  6. package/components/column-resize/column-resize-notifier.d.ts +35 -35
  7. package/components/column-resize/column-resize.directive.d.ts +26 -26
  8. package/components/column-resize/column-resize.module.d.ts +14 -14
  9. package/components/column-resize/event-dispatcher.d.ts +31 -31
  10. package/components/column-resize/overlay-handle.component.d.ts +33 -33
  11. package/components/column-resize/resize-ref.d.ts +25 -25
  12. package/components/column-resize/resizing.store.d.ts +28 -28
  13. package/components/column-resize/selectors.d.ts +3 -3
  14. package/components/contextmenu/contextmenu.component.d.ts +22 -22
  15. package/components/conversion-hint/conversion-hint.component.d.ts +18 -18
  16. package/components/conversion-hint/conversion-hint.component.scss +11 -11
  17. package/components/element/element.component.d.ts +7 -7
  18. package/components/inline-toolbar/inline-toolbar.component.d.ts +26 -26
  19. package/components/nav-split-line/nav-split-line.component.d.ts +13 -13
  20. package/components/table-select/table-select.component.d.ts +20 -20
  21. package/components/table-select/table-select.component.scss +35 -35
  22. package/components/template/template.component.d.ts +15 -15
  23. package/components/text/text.component.d.ts +14 -14
  24. package/components/toolbar/toolbar.component.d.ts +65 -65
  25. package/components/toolbar-dropdown/toolbar-dropdown.component.d.ts +33 -33
  26. package/components/toolbar-dropdown/toolbar-dropdown.component.scss +0 -1
  27. package/components/toolbar-group/toolbar-group.component.d.ts +33 -33
  28. package/components/toolbar-group/toolbar-group.component.scss +17 -17
  29. package/components/toolbar-item/toolbar-item.component.d.ts +18 -18
  30. package/constants/auto-format-rules.d.ts +2 -2
  31. package/constants/code.d.ts +9 -9
  32. package/constants/color-select.d.ts +14 -14
  33. package/constants/default.d.ts +9 -9
  34. package/constants/error.d.ts +5 -5
  35. package/constants/index.d.ts +5 -5
  36. package/constants/node-types.d.ts +99 -99
  37. package/constants/selector.d.ts +2 -2
  38. package/constants/toolbar.d.ts +17 -17
  39. package/core/create-plugin.d.ts +2 -2
  40. package/core/create-toolbar.d.ts +5 -5
  41. package/core/index.d.ts +4 -4
  42. package/core/toolbar-item/base-toolbar-item.d.ts +29 -29
  43. package/core/utils/combine-plugins.d.ts +2 -2
  44. package/core/utils/flatten-deep-plugins.d.ts +6 -6
  45. package/core/utils/get-plugin-options.d.ts +2 -2
  46. package/core/utils/get-plugin.d.ts +2 -2
  47. package/core/utils/get-plugins.d.ts +2 -2
  48. package/core/utils/index.d.ts +10 -10
  49. package/core/utils/merge-array.d.ts +1 -1
  50. package/core/utils/merge-deep-plugins.d.ts +2 -2
  51. package/core/utils/merge-options.d.ts +2 -2
  52. package/core/utils/nested-structure-by-key.d.ts +2 -2
  53. package/core/utils/plugins-by-key.d.ts +2 -2
  54. package/core/with-theia.d.ts +4 -4
  55. package/custom-types.d.ts +131 -131
  56. package/editor.component.d.ts +92 -92
  57. package/editor.module.d.ts +98 -98
  58. package/esm2015/components/color-select/color-select.component.js +112 -112
  59. package/esm2015/components/column-resize/column-resize-notifier.js +31 -31
  60. package/esm2015/components/column-resize/column-resize.directive.js +98 -98
  61. package/esm2015/components/column-resize/column-resize.module.js +34 -34
  62. package/esm2015/components/column-resize/event-dispatcher.js +55 -55
  63. package/esm2015/components/column-resize/overlay-handle.component.js +139 -139
  64. package/esm2015/components/column-resize/resize-ref.js +25 -25
  65. package/esm2015/components/column-resize/resizing.store.js +154 -154
  66. package/esm2015/components/column-resize/selectors.js +4 -4
  67. package/esm2015/components/contextmenu/contextmenu.component.js +64 -64
  68. package/esm2015/components/conversion-hint/conversion-hint.component.js +59 -59
  69. package/esm2015/components/element/element.component.js +23 -23
  70. package/esm2015/components/inline-toolbar/inline-toolbar.component.js +126 -126
  71. package/esm2015/components/nav-split-line/nav-split-line.component.js +36 -36
  72. package/esm2015/components/table-select/table-select.component.js +53 -53
  73. package/esm2015/components/template/template.component.js +66 -66
  74. package/esm2015/components/text/text.component.js +57 -57
  75. package/esm2015/components/toolbar/toolbar.component.js +250 -250
  76. package/esm2015/components/toolbar-dropdown/toolbar-dropdown.component.js +132 -132
  77. package/esm2015/components/toolbar-group/toolbar-group.component.js +116 -116
  78. package/esm2015/components/toolbar-item/toolbar-item.component.js +64 -64
  79. package/esm2015/constants/auto-format-rules.js +166 -166
  80. package/esm2015/constants/code.js +88 -88
  81. package/esm2015/constants/color-select.js +61 -61
  82. package/esm2015/constants/default.js +9 -9
  83. package/esm2015/constants/error.js +7 -7
  84. package/esm2015/constants/index.js +5 -5
  85. package/esm2015/constants/node-types.js +132 -132
  86. package/esm2015/constants/selector.js +3 -3
  87. package/esm2015/constants/toolbar.js +69 -69
  88. package/esm2015/core/create-plugin.js +4 -4
  89. package/esm2015/core/create-toolbar.js +56 -56
  90. package/esm2015/core/index.js +4 -4
  91. package/esm2015/core/toolbar-item/base-toolbar-item.js +91 -91
  92. package/esm2015/core/utils/combine-plugins.js +9 -9
  93. package/esm2015/core/utils/flatten-deep-plugins.js +18 -18
  94. package/esm2015/core/utils/get-plugin-options.js +2 -2
  95. package/esm2015/core/utils/get-plugin.js +1 -1
  96. package/esm2015/core/utils/get-plugins.js +4 -4
  97. package/esm2015/core/utils/index.js +10 -10
  98. package/esm2015/core/utils/merge-array.js +17 -17
  99. package/esm2015/core/utils/merge-deep-plugins.js +13 -13
  100. package/esm2015/core/utils/merge-options.js +19 -19
  101. package/esm2015/core/utils/nested-structure-by-key.js +10 -10
  102. package/esm2015/core/utils/plugins-by-key.js +9 -9
  103. package/esm2015/core/with-theia.js +22 -22
  104. package/esm2015/custom-types.js +1 -1
  105. package/esm2015/editor.component.js +439 -439
  106. package/esm2015/editor.module.js +201 -201
  107. package/esm2015/interfaces/auto-format.js +1 -1
  108. package/esm2015/interfaces/editor.js +22 -22
  109. package/esm2015/interfaces/element.js +1 -1
  110. package/esm2015/interfaces/image.js +2 -2
  111. package/esm2015/interfaces/index.js +8 -8
  112. package/esm2015/interfaces/plugins/index.js +4 -4
  113. package/esm2015/interfaces/plugins/no-infer.js +1 -1
  114. package/esm2015/interfaces/plugins/plugin-key.js +39 -39
  115. package/esm2015/interfaces/plugins/plugins.js +1 -1
  116. package/esm2015/interfaces/plugins/with-override.js +1 -1
  117. package/esm2015/interfaces/reset-block-type-plugin-options.js +2 -2
  118. package/esm2015/interfaces/toolbar.js +11 -11
  119. package/esm2015/interfaces/upload.js +2 -2
  120. package/esm2015/interfaces/utility/index.js +3 -3
  121. package/esm2015/interfaces/utility/nested-structure-by-key.js +1 -1
  122. package/esm2015/interfaces/utility/override-by-key.js +1 -1
  123. package/esm2015/interfaces/utility/types.js +1 -1
  124. package/esm2015/interfaces/valid-children-types.js +35 -35
  125. package/esm2015/interfaces/view-base.js +21 -21
  126. package/esm2015/pipes.js +42 -42
  127. package/esm2015/plugins/align/align.editor.js +47 -47
  128. package/esm2015/plugins/align/align.plugin.js +63 -63
  129. package/esm2015/plugins/autoformat/autoformat.plugin.js +109 -109
  130. package/esm2015/plugins/autoformat/transforms/auto-format-block.js +14 -14
  131. package/esm2015/plugins/autoformat/transforms/auto-format-inline.js +77 -77
  132. package/esm2015/plugins/blockquote/blockquote.component.js +21 -21
  133. package/esm2015/plugins/blockquote/blockquote.editor.js +20 -20
  134. package/esm2015/plugins/blockquote/blockquote.plugin.js +70 -70
  135. package/esm2015/plugins/code/code.component.js +244 -244
  136. package/esm2015/plugins/code/code.editor.js +47 -47
  137. package/esm2015/plugins/code/code.plugin.js +41 -41
  138. package/esm2015/plugins/color/color.editor.js +44 -44
  139. package/esm2015/plugins/color/color.plugin.js +27 -27
  140. package/esm2015/plugins/color/toolbar-item.component.js +79 -79
  141. package/esm2015/plugins/common/auto-insert-data..js +77 -77
  142. package/esm2015/plugins/common/block-card.plugin.js +286 -286
  143. package/esm2015/plugins/common/get-fragment.plugin.js +24 -24
  144. package/esm2015/plugins/common/history.plugin.js +30 -30
  145. package/esm2015/plugins/common/move-selection.plugin.js +89 -89
  146. package/esm2015/plugins/common/remove-empty.plugin.js +59 -59
  147. package/esm2015/plugins/common/remove-void.plugin.js +56 -56
  148. package/esm2015/plugins/common/reset-type.plugin.js +34 -34
  149. package/esm2015/plugins/common/transforms.plugin.js +17 -17
  150. package/esm2015/plugins/deserializers/deserialize-html.plugin.js +38 -38
  151. package/esm2015/plugins/deserializers/deserialize-md.plugin.js +121 -121
  152. package/esm2015/plugins/font-size/font-size.editor.js +97 -97
  153. package/esm2015/plugins/heading/heading.editor.js +53 -53
  154. package/esm2015/plugins/heading/heading.plugin.js +84 -84
  155. package/esm2015/plugins/hr/hr.component.js +40 -40
  156. package/esm2015/plugins/hr/hr.editor.js +7 -7
  157. package/esm2015/plugins/hr/hr.plugin.js +41 -41
  158. package/esm2015/plugins/image/image.component.js +369 -369
  159. package/esm2015/plugins/image/image.editor.js +57 -57
  160. package/esm2015/plugins/image/image.plugin.js +57 -57
  161. package/esm2015/plugins/indent/indent.editor.js +72 -72
  162. package/esm2015/plugins/indent/indent.plugin.js +59 -59
  163. package/esm2015/plugins/indent/on-keydown-indent.js +53 -53
  164. package/esm2015/plugins/index.js +70 -70
  165. package/esm2015/plugins/inline-code/inline-code.component.js +21 -21
  166. package/esm2015/plugins/inline-code/inline-code.editor.js +48 -48
  167. package/esm2015/plugins/inline-code/inline-code.plugin.js +65 -65
  168. package/esm2015/plugins/link/edit/link-edit.component.js +108 -108
  169. package/esm2015/plugins/link/hover/link-hover.component.js +39 -39
  170. package/esm2015/plugins/link/link.component.js +162 -162
  171. package/esm2015/plugins/link/link.editor.js +66 -66
  172. package/esm2015/plugins/link/link.plugin.js +58 -58
  173. package/esm2015/plugins/link/link.types.js +12 -12
  174. package/esm2015/plugins/list/components/bulleted-list.component.js +33 -33
  175. package/esm2015/plugins/list/components/list-item.component.js +94 -94
  176. package/esm2015/plugins/list/components/numbered-list.component.js +39 -39
  177. package/esm2015/plugins/list/list.editor.js +125 -125
  178. package/esm2015/plugins/list/list.plugin.js +280 -280
  179. package/esm2015/plugins/list/normalizers/get-list-normalizer.js +39 -39
  180. package/esm2015/plugins/list/normalizers/normalize-list-item.js +19 -19
  181. package/esm2015/plugins/list/normalizers/normalize-no.js +42 -42
  182. package/esm2015/plugins/list/on-key-down-list.js +32 -32
  183. package/esm2015/plugins/list/queries/get-list-item-entry.js +27 -27
  184. package/esm2015/plugins/list/queries/get-list-item-sublist.js +12 -12
  185. package/esm2015/plugins/list/queries/get-list-types.js +5 -5
  186. package/esm2015/plugins/list/queries/get-start-list-item.js +26 -26
  187. package/esm2015/plugins/list/queries/has-list-in-list-item.js +27 -27
  188. package/esm2015/plugins/list/queries/is-in-list.js +5 -5
  189. package/esm2015/plugins/list/queries/is-list-nested.js +10 -10
  190. package/esm2015/plugins/list/queries/is-list.js +5 -5
  191. package/esm2015/plugins/list/queries/is-node-type-list.js +4 -4
  192. package/esm2015/plugins/list/queries/is-selection-at-list-item-start.js +12 -12
  193. package/esm2015/plugins/list/queries/is-selection-in-same-list-item.js +16 -16
  194. package/esm2015/plugins/list/queries/is-single-list-item.js +9 -9
  195. package/esm2015/plugins/list/transforms/insert-list-data.js +71 -71
  196. package/esm2015/plugins/list/transforms/insert-list-item.js +72 -72
  197. package/esm2015/plugins/list/transforms/move-list-item-down.js +41 -41
  198. package/esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.js +42 -42
  199. package/esm2015/plugins/list/transforms/move-list-item-sublist-items-to-list.js +29 -29
  200. package/esm2015/plugins/list/transforms/move-list-item-up.js +77 -77
  201. package/esm2015/plugins/list/transforms/unwrap-list.js +9 -9
  202. package/esm2015/plugins/list/types.js +2 -2
  203. package/esm2015/plugins/mark/mark.editor.js +28 -28
  204. package/esm2015/plugins/mark/mark.plugin.js +101 -101
  205. package/esm2015/plugins/node-id/node-id.plugin.js +68 -68
  206. package/esm2015/plugins/normalizers/insert-paragraph-nodes.js +28 -28
  207. package/esm2015/plugins/normalizers/remove-empty-nodes.js +17 -17
  208. package/esm2015/plugins/normalizers/trailing-node.plugin.js +33 -33
  209. package/esm2015/plugins/paint-format/paint-format.editor.js +122 -122
  210. package/esm2015/plugins/public-api.js +15 -15
  211. package/esm2015/plugins/quick-insert/components/quick-insert.component.js +101 -101
  212. package/esm2015/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.js +83 -83
  213. package/esm2015/plugins/quick-insert/quick-insert.editor.js +52 -52
  214. package/esm2015/plugins/quick-insert/quick-insert.plugin.js +74 -74
  215. package/esm2015/plugins/soft-break/soft-break.plugin.js +36 -36
  216. package/esm2015/plugins/soft-break/soft-break.types.js +1 -1
  217. package/esm2015/plugins/table/components/insert-mark/insert-mark.component.js +102 -102
  218. package/esm2015/plugins/table/components/row/row.component.js +46 -46
  219. package/esm2015/plugins/table/components/table.component.js +469 -469
  220. package/esm2015/plugins/table/components/td/td.component.js +698 -698
  221. package/esm2015/plugins/table/components/toolbar/table-options.component.js +67 -67
  222. package/esm2015/plugins/table/components/toolbar/table-toolbar.component.js +161 -161
  223. package/esm2015/plugins/table/table.editor.js +182 -182
  224. package/esm2015/plugins/table/table.plugin.js +423 -423
  225. package/esm2015/plugins/table/table.service.js +102 -102
  226. package/esm2015/plugins/table/table.store.js +479 -479
  227. package/esm2015/plugins/table/table.types.js +33 -33
  228. package/esm2015/plugins/table/toolbar-item.component.js +61 -61
  229. package/esm2015/plugins/table/transforms/clear-cell.js +11 -11
  230. package/esm2015/plugins/table/transforms/clear-table-node.js +27 -27
  231. package/esm2015/plugins/table/transforms/insert-column.js +57 -57
  232. package/esm2015/plugins/table/transforms/insert-row.js +42 -42
  233. package/esm2015/plugins/table/transforms/insert-table.js +14 -14
  234. package/esm2015/plugins/table/transforms/remove-column.js +51 -51
  235. package/esm2015/plugins/table/transforms/remove-row.js +50 -50
  236. package/esm2015/plugins/table/transforms/remove-table.js +49 -49
  237. package/esm2015/plugins/table/utils/add-columns.js +28 -28
  238. package/esm2015/plugins/table/utils/calc-anchor-position.js +24 -24
  239. package/esm2015/plugins/table/utils/calc-span.js +72 -72
  240. package/esm2015/plugins/table/utils/create-cell.js +19 -19
  241. package/esm2015/plugins/table/utils/create-row.js +12 -12
  242. package/esm2015/plugins/table/utils/create-table.js +13 -13
  243. package/esm2015/plugins/table/utils/get-base-height.js +22 -22
  244. package/esm2015/plugins/table/utils/get-select-cell-node.js +16 -16
  245. package/esm2015/plugins/table/utils/index.js +8 -8
  246. package/esm2015/plugins/table/utils/is-range-in-table.js +16 -16
  247. package/esm2015/plugins/table/utils/is-selection-in-table.js +11 -11
  248. package/esm2015/plugins/table/utils/is-virtual-key.js +13 -13
  249. package/esm2015/plugins/table/utils/merge-cell.js +90 -90
  250. package/esm2015/plugins/table/utils/next-path.js +5 -5
  251. package/esm2015/plugins/table/utils/normalize-table.js +30 -30
  252. package/esm2015/plugins/table/utils/remove-columns.js +23 -23
  253. package/esm2015/plugins/table/utils/set-menu-cell-invisibility.js +15 -15
  254. package/esm2015/plugins/table/utils/split-cell.js +31 -31
  255. package/esm2015/plugins/table/utils/table-position.js +242 -242
  256. package/esm2015/plugins/todo-item/todo-item.component.js +55 -55
  257. package/esm2015/plugins/todo-item/todo-item.editor.js +31 -31
  258. package/esm2015/plugins/todo-item/todo-item.plugin.js +78 -78
  259. package/esm2015/plugins/vertical-align/toolbar-item.component.js +89 -89
  260. package/esm2015/plugins/vertical-align/vertical-align.editor.js +54 -54
  261. package/esm2015/public-api.js +23 -23
  262. package/esm2015/queries/anchor-block-entry.js +13 -13
  263. package/esm2015/queries/anchor-block.js +6 -6
  264. package/esm2015/queries/anchor-inline-entry.js +10 -10
  265. package/esm2015/queries/find-descendant.js +47 -47
  266. package/esm2015/queries/find-node.js +45 -45
  267. package/esm2015/queries/find-path.js +28 -28
  268. package/esm2015/queries/get-above-by-type.js +10 -10
  269. package/esm2015/queries/get-above.js +9 -9
  270. package/esm2015/queries/get-anchor-block-entry.js +8 -8
  271. package/esm2015/queries/get-block-above.js +7 -7
  272. package/esm2015/queries/get-block-card-above.js +7 -7
  273. package/esm2015/queries/get-block-card-cursor.js +5 -5
  274. package/esm2015/queries/get-container-blocks.js +11 -11
  275. package/esm2015/queries/get-directly-parent.js +11 -11
  276. package/esm2015/queries/get-insert-elements-path.js +43 -43
  277. package/esm2015/queries/get-last-child-path.js +9 -9
  278. package/esm2015/queries/get-last-node.js +17 -17
  279. package/esm2015/queries/get-next-sibling-nodes.js +17 -17
  280. package/esm2015/queries/get-node.js +10 -10
  281. package/esm2015/queries/get-nodes-by-type.js +12 -12
  282. package/esm2015/queries/get-nodes.js +7 -7
  283. package/esm2015/queries/get-parent.js +12 -12
  284. package/esm2015/queries/get-plain-text.js +16 -16
  285. package/esm2015/queries/get-plugin-by-toolbar.js +12 -12
  286. package/esm2015/queries/get-point-before.js +62 -62
  287. package/esm2015/queries/get-point-from-location.js +15 -15
  288. package/esm2015/queries/get-previous-path.js +9 -9
  289. package/esm2015/queries/get-rang-from-block-start.js +16 -16
  290. package/esm2015/queries/get-range-before.js +17 -17
  291. package/esm2015/queries/get-selection-marks.js +19 -19
  292. package/esm2015/queries/get-selection-nodes-by-type.js +29 -29
  293. package/esm2015/queries/get-text.js +9 -9
  294. package/esm2015/queries/get-toolbar-disabled.js +13 -13
  295. package/esm2015/queries/index.js +59 -58
  296. package/esm2015/queries/is-across-blocks.js +7 -7
  297. package/esm2015/queries/is-ancestor-empty.js +6 -6
  298. package/esm2015/queries/is-ancestor.js +3 -3
  299. package/esm2015/queries/is-block-above-empty.js +11 -11
  300. package/esm2015/queries/is-block-active.js +7 -7
  301. package/esm2015/queries/is-block-card-cursor.js +4 -4
  302. package/esm2015/queries/is-block-text-empty-after-selection.js +31 -31
  303. package/esm2015/queries/is-collapsed.js +7 -7
  304. package/esm2015/queries/is-contain-nested-type.js +28 -28
  305. package/esm2015/queries/is-container-type.js +2 -2
  306. package/esm2015/queries/is-descendant.js +3 -3
  307. package/esm2015/queries/is-empty-content.js +15 -0
  308. package/esm2015/queries/is-empty-paragraph-by-path.js +7 -7
  309. package/esm2015/queries/is-empty-paragraph.js +11 -11
  310. package/esm2015/queries/is-first-child.js +5 -5
  311. package/esm2015/queries/is-include-types.js +11 -11
  312. package/esm2015/queries/is-node-type-in.js +9 -9
  313. package/esm2015/queries/is-node-type.js +15 -15
  314. package/esm2015/queries/is-paragraph.js +9 -9
  315. package/esm2015/queries/is-point-at-root.js +2 -2
  316. package/esm2015/queries/is-range-across-blocks.js +18 -18
  317. package/esm2015/queries/is-range-at-root.js +3 -3
  318. package/esm2015/queries/is-start.js +6 -6
  319. package/esm2015/queries/some-node.js +9 -9
  320. package/esm2015/services/color-select.service.js +49 -49
  321. package/esm2015/services/context.service.js +59 -59
  322. package/esm2015/services/table-contextmenu.service.js +189 -189
  323. package/esm2015/services/toolbar.service.js +47 -47
  324. package/esm2015/shortcuts/index.js +5 -5
  325. package/esm2015/shortcuts/mark.js +24 -24
  326. package/esm2015/transforms/apply-deep-to-nodes.js +21 -21
  327. package/esm2015/transforms/clear-marks.js +23 -23
  328. package/esm2015/transforms/close-conversion-hint.js +8 -8
  329. package/esm2015/transforms/delete-element.js +11 -11
  330. package/esm2015/transforms/handle-continual-delete-backward.js +17 -17
  331. package/esm2015/transforms/handle-continual-insert-break.js +19 -19
  332. package/esm2015/transforms/index.js +18 -18
  333. package/esm2015/transforms/insert-elements.js +34 -34
  334. package/esm2015/transforms/insert-paragraph.js +6 -6
  335. package/esm2015/transforms/merge-deep-to-nodes.js +8 -8
  336. package/esm2015/transforms/move-children.js +21 -21
  337. package/esm2015/transforms/on-keydown-reset-block-type.js +22 -22
  338. package/esm2015/transforms/set-end-selection.js +10 -10
  339. package/esm2015/transforms/set-marks.js +9 -9
  340. package/esm2015/transforms/set-node.js +5 -5
  341. package/esm2015/transforms/split-node.js +31 -31
  342. package/esm2015/transforms/un-hang-range.js +11 -11
  343. package/esm2015/transforms/un-wrap.js +11 -11
  344. package/esm2015/transforms/unwrap-nodes-by-type.js +11 -11
  345. package/esm2015/utils/auto-focus.js +13 -13
  346. package/esm2015/utils/auto-scroll-view.js +24 -24
  347. package/esm2015/utils/cast-array.js +7 -7
  348. package/esm2015/utils/common.js +2 -2
  349. package/esm2015/utils/create-empty-paragraph.js +14 -14
  350. package/esm2015/utils/data-transform.js +48 -48
  351. package/esm2015/utils/dom.js +46 -46
  352. package/esm2015/utils/editor-uuid.js +8 -8
  353. package/esm2015/utils/fragment.js +65 -65
  354. package/esm2015/utils/get-editable-element-height.js +6 -6
  355. package/esm2015/utils/get-toolbar-class.js +6 -6
  356. package/esm2015/utils/id-creator.js +11 -11
  357. package/esm2015/utils/index.js +13 -13
  358. package/esm2015/utils/is-clean-empty-paragraph.js +36 -36
  359. package/esm2015/utils/is-inline.js +9 -9
  360. package/esm2015/utils/lodash.js +3 -3
  361. package/esm2015/utils/match.js +29 -29
  362. package/esm2015/utils/merge-element-options.js +19 -19
  363. package/esm2015/utils/weak-maps.js +3 -3
  364. package/esm2015/worktile-theia.js +4 -4
  365. package/fesm2015/worktile-theia.js +13156 -13142
  366. package/fesm2015/worktile-theia.js.map +1 -1
  367. package/interfaces/auto-format.d.ts +64 -64
  368. package/interfaces/editor.d.ts +146 -146
  369. package/interfaces/element.d.ts +9 -9
  370. package/interfaces/image.d.ts +25 -25
  371. package/interfaces/index.d.ts +8 -8
  372. package/interfaces/plugins/index.d.ts +4 -4
  373. package/interfaces/plugins/no-infer.d.ts +1 -1
  374. package/interfaces/plugins/plugin-key.d.ts +48 -48
  375. package/interfaces/plugins/plugins.d.ts +45 -45
  376. package/interfaces/plugins/with-override.d.ts +7 -7
  377. package/interfaces/reset-block-type-plugin-options.d.ts +23 -23
  378. package/interfaces/toolbar.d.ts +64 -64
  379. package/interfaces/upload.d.ts +11 -11
  380. package/interfaces/utility/index.d.ts +3 -3
  381. package/interfaces/utility/nested-structure-by-key.d.ts +3 -3
  382. package/interfaces/utility/override-by-key.d.ts +3 -3
  383. package/interfaces/utility/types.d.ts +1 -1
  384. package/interfaces/valid-children-types.d.ts +9 -9
  385. package/interfaces/view-base.d.ts +9 -9
  386. package/package.json +1 -1
  387. package/pipes.d.ts +16 -16
  388. package/plugins/align/align.editor.d.ts +7 -7
  389. package/plugins/align/align.plugin.d.ts +2 -2
  390. package/plugins/autoformat/autoformat.plugin.d.ts +6 -6
  391. package/plugins/autoformat/transforms/auto-format-block.d.ts +5 -5
  392. package/plugins/autoformat/transforms/auto-format-inline.d.ts +9 -9
  393. package/plugins/blockquote/blockquote.component.d.ts +11 -11
  394. package/plugins/blockquote/blockquote.editor.d.ts +4 -4
  395. package/plugins/blockquote/blockquote.plugin.d.ts +2 -2
  396. package/plugins/code/code.component.d.ts +65 -65
  397. package/plugins/code/code.editor.d.ts +8 -8
  398. package/plugins/code/code.plugin.d.ts +2 -2
  399. package/plugins/color/color.editor.d.ts +8 -8
  400. package/plugins/color/color.plugin.d.ts +1 -1
  401. package/plugins/color/toolbar-item.component.d.ts +16 -16
  402. package/plugins/common/auto-insert-data..d.ts +2 -2
  403. package/plugins/common/block-card.plugin.d.ts +2 -2
  404. package/plugins/common/get-fragment.plugin.d.ts +6 -6
  405. package/plugins/common/history.plugin.d.ts +9 -9
  406. package/plugins/common/move-selection.plugin.d.ts +2 -2
  407. package/plugins/common/remove-empty.plugin.d.ts +2 -2
  408. package/plugins/common/remove-void.plugin.d.ts +2 -2
  409. package/plugins/common/reset-type.plugin.d.ts +2 -2
  410. package/plugins/common/transforms.plugin.d.ts +8 -8
  411. package/plugins/deserializers/deserialize-html.plugin.d.ts +2 -2
  412. package/plugins/deserializers/deserialize-md.plugin.d.ts +2 -2
  413. package/plugins/font-size/font-size.editor.d.ts +10 -10
  414. package/plugins/heading/heading.editor.d.ts +9 -9
  415. package/plugins/heading/heading.plugin.d.ts +7 -7
  416. package/plugins/hr/hr.component.d.ts +12 -12
  417. package/plugins/hr/hr.editor.d.ts +4 -4
  418. package/plugins/hr/hr.plugin.d.ts +2 -2
  419. package/plugins/image/image.component.d.ts +74 -74
  420. package/plugins/image/image.editor.d.ts +12 -12
  421. package/plugins/image/image.plugin.d.ts +7 -7
  422. package/plugins/indent/indent.editor.d.ts +10 -10
  423. package/plugins/indent/indent.plugin.d.ts +8 -8
  424. package/plugins/indent/on-keydown-indent.d.ts +3 -3
  425. package/plugins/index.d.ts +1 -1
  426. package/plugins/inline-code/inline-code.component.d.ts +9 -9
  427. package/plugins/inline-code/inline-code.editor.d.ts +7 -7
  428. package/plugins/inline-code/inline-code.plugin.d.ts +2 -2
  429. package/plugins/link/edit/link-edit.component.d.ts +36 -36
  430. package/plugins/link/hover/link-hover.component.d.ts +15 -15
  431. package/plugins/link/link.component.d.ts +39 -39
  432. package/plugins/link/link.editor.d.ts +7 -7
  433. package/plugins/link/link.plugin.d.ts +2 -2
  434. package/plugins/link/link.types.d.ts +9 -9
  435. package/plugins/list/components/bulleted-list.component.d.ts +15 -15
  436. package/plugins/list/components/list-item.component.d.ts +20 -20
  437. package/plugins/list/components/numbered-list.component.d.ts +16 -16
  438. package/plugins/list/list.editor.d.ts +12 -12
  439. package/plugins/list/list.plugin.d.ts +3 -3
  440. package/plugins/list/normalizers/get-list-normalizer.d.ts +6 -6
  441. package/plugins/list/normalizers/normalize-list-item.d.ts +5 -5
  442. package/plugins/list/normalizers/normalize-no.d.ts +2 -2
  443. package/plugins/list/on-key-down-list.d.ts +2 -2
  444. package/plugins/list/queries/get-list-item-entry.d.ts +10 -10
  445. package/plugins/list/queries/get-list-item-sublist.d.ts +6 -6
  446. package/plugins/list/queries/get-list-types.d.ts +2 -2
  447. package/plugins/list/queries/get-start-list-item.d.ts +8 -8
  448. package/plugins/list/queries/has-list-in-list-item.d.ts +15 -15
  449. package/plugins/list/queries/is-in-list.d.ts +2 -2
  450. package/plugins/list/queries/is-list-nested.d.ts +5 -5
  451. package/plugins/list/queries/is-list.d.ts +2 -2
  452. package/plugins/list/queries/is-node-type-list.d.ts +2 -2
  453. package/plugins/list/queries/is-selection-at-list-item-start.d.ts +5 -5
  454. package/plugins/list/queries/is-selection-in-same-list-item.d.ts +5 -5
  455. package/plugins/list/queries/is-single-list-item.d.ts +5 -5
  456. package/plugins/list/transforms/insert-list-data.d.ts +12 -12
  457. package/plugins/list/transforms/insert-list-item.d.ts +5 -5
  458. package/plugins/list/transforms/move-list-item-down.d.ts +6 -6
  459. package/plugins/list/transforms/move-list-item-sublist-items-to-list-item-sublist.d.ts +20 -20
  460. package/plugins/list/transforms/move-list-item-sublist-items-to-list.d.ts +19 -19
  461. package/plugins/list/transforms/move-list-item-up.d.ts +10 -10
  462. package/plugins/list/transforms/unwrap-list.d.ts +2 -2
  463. package/plugins/list/types.d.ts +7 -7
  464. package/plugins/mark/mark.editor.d.ts +8 -8
  465. package/plugins/mark/mark.plugin.d.ts +3 -3
  466. package/plugins/node-id/node-id.plugin.d.ts +8 -8
  467. package/plugins/normalizers/insert-paragraph-nodes.d.ts +7 -7
  468. package/plugins/normalizers/remove-empty-nodes.d.ts +7 -7
  469. package/plugins/normalizers/trailing-node.plugin.d.ts +9 -9
  470. package/plugins/paint-format/paint-format.editor.d.ts +8 -8
  471. package/plugins/public-api.d.ts +15 -15
  472. package/plugins/quick-insert/components/quick-insert.component.d.ts +28 -28
  473. package/plugins/quick-insert/components/quick-toolbar/quick-toolbar.component.d.ts +28 -28
  474. package/plugins/quick-insert/quick-insert.editor.d.ts +7 -7
  475. package/plugins/quick-insert/quick-insert.plugin.d.ts +10 -10
  476. package/plugins/soft-break/soft-break.plugin.d.ts +5 -5
  477. package/plugins/soft-break/soft-break.types.d.ts +8 -8
  478. package/plugins/table/components/insert-mark/insert-mark.component.d.ts +24 -24
  479. package/plugins/table/components/row/row.component.d.ts +14 -14
  480. package/plugins/table/components/table.component.d.ts +79 -79
  481. package/plugins/table/components/td/td.component.d.ts +95 -95
  482. package/plugins/table/components/toolbar/table-options.component.d.ts +20 -20
  483. package/plugins/table/components/toolbar/table-toolbar.component.d.ts +38 -38
  484. package/plugins/table/table.editor.d.ts +25 -25
  485. package/plugins/table/table.plugin.d.ts +3 -3
  486. package/plugins/table/table.service.d.ts +30 -30
  487. package/plugins/table/table.store.d.ts +71 -71
  488. package/plugins/table/table.types.d.ts +67 -67
  489. package/plugins/table/toolbar-item.component.d.ts +17 -17
  490. package/plugins/table/transforms/clear-cell.d.ts +6 -6
  491. package/plugins/table/transforms/clear-table-node.d.ts +6 -6
  492. package/plugins/table/transforms/insert-column.d.ts +12 -12
  493. package/plugins/table/transforms/insert-row.d.ts +6 -6
  494. package/plugins/table/transforms/insert-table.d.ts +6 -6
  495. package/plugins/table/transforms/remove-column.d.ts +3 -3
  496. package/plugins/table/transforms/remove-row.d.ts +3 -3
  497. package/plugins/table/transforms/remove-table.d.ts +3 -3
  498. package/plugins/table/utils/add-columns.d.ts +2 -2
  499. package/plugins/table/utils/calc-anchor-position.d.ts +6 -6
  500. package/plugins/table/utils/calc-span.d.ts +11 -11
  501. package/plugins/table/utils/create-cell.d.ts +16 -16
  502. package/plugins/table/utils/create-row.d.ts +7 -7
  503. package/plugins/table/utils/create-table.d.ts +7 -7
  504. package/plugins/table/utils/get-base-height.d.ts +9 -9
  505. package/plugins/table/utils/get-select-cell-node.d.ts +7 -7
  506. package/plugins/table/utils/index.d.ts +7 -7
  507. package/plugins/table/utils/is-range-in-table.d.ts +6 -6
  508. package/plugins/table/utils/is-selection-in-table.d.ts +6 -6
  509. package/plugins/table/utils/is-virtual-key.d.ts +1 -1
  510. package/plugins/table/utils/merge-cell.d.ts +21 -21
  511. package/plugins/table/utils/next-path.d.ts +2 -2
  512. package/plugins/table/utils/normalize-table.d.ts +2 -2
  513. package/plugins/table/utils/remove-columns.d.ts +2 -2
  514. package/plugins/table/utils/set-menu-cell-invisibility.d.ts +3 -3
  515. package/plugins/table/utils/split-cell.d.ts +4 -4
  516. package/plugins/table/utils/table-position.d.ts +97 -97
  517. package/plugins/todo-item/todo-item.component.d.ts +21 -21
  518. package/plugins/todo-item/todo-item.editor.d.ts +5 -5
  519. package/plugins/todo-item/todo-item.plugin.d.ts +5 -5
  520. package/plugins/vertical-align/toolbar-item.component.d.ts +25 -25
  521. package/plugins/vertical-align/vertical-align.editor.d.ts +7 -7
  522. package/public-api.d.ts +20 -20
  523. package/queries/anchor-block-entry.d.ts +2 -2
  524. package/queries/anchor-block.d.ts +2 -2
  525. package/queries/anchor-inline-entry.d.ts +2 -2
  526. package/queries/find-descendant.d.ts +10 -10
  527. package/queries/find-node.d.ts +15 -15
  528. package/queries/find-path.d.ts +6 -6
  529. package/queries/get-above-by-type.d.ts +6 -6
  530. package/queries/get-above.d.ts +6 -6
  531. package/queries/get-anchor-block-entry.d.ts +2 -2
  532. package/queries/get-block-above.d.ts +7 -7
  533. package/queries/get-block-card-above.d.ts +7 -7
  534. package/queries/get-block-card-cursor.d.ts +2 -2
  535. package/queries/get-container-blocks.d.ts +2 -2
  536. package/queries/get-directly-parent.d.ts +2 -2
  537. package/queries/get-insert-elements-path.d.ts +7 -7
  538. package/queries/get-last-child-path.d.ts +6 -6
  539. package/queries/get-last-node.d.ts +2 -2
  540. package/queries/get-next-sibling-nodes.d.ts +7 -7
  541. package/queries/get-node.d.ts +2 -2
  542. package/queries/get-nodes-by-type.d.ts +6 -6
  543. package/queries/get-nodes.d.ts +4 -4
  544. package/queries/get-parent.d.ts +7 -7
  545. package/queries/get-plain-text.d.ts +6 -6
  546. package/queries/get-plugin-by-toolbar.d.ts +3 -3
  547. package/queries/get-point-before.d.ts +38 -38
  548. package/queries/get-point-from-location.d.ts +5 -5
  549. package/queries/get-previous-path.d.ts +2 -2
  550. package/queries/get-rang-from-block-start.d.ts +9 -9
  551. package/queries/get-range-before.d.ts +7 -7
  552. package/queries/get-selection-marks.d.ts +12 -12
  553. package/queries/get-selection-nodes-by-type.d.ts +3 -3
  554. package/queries/get-text.d.ts +6 -6
  555. package/queries/get-toolbar-disabled.d.ts +4 -4
  556. package/queries/index.d.ts +58 -57
  557. package/queries/is-across-blocks.d.ts +2 -2
  558. package/queries/is-ancestor-empty.d.ts +5 -5
  559. package/queries/is-ancestor.d.ts +2 -2
  560. package/queries/is-block-above-empty.d.ts +5 -5
  561. package/queries/is-block-active.d.ts +3 -3
  562. package/queries/is-block-card-cursor.d.ts +2 -2
  563. package/queries/is-block-text-empty-after-selection.d.ts +7 -7
  564. package/queries/is-collapsed.d.ts +6 -6
  565. package/queries/is-contain-nested-type.d.ts +2 -2
  566. package/queries/is-container-type.d.ts +2 -2
  567. package/queries/is-descendant.d.ts +2 -2
  568. package/queries/is-empty-content.d.ts +2 -0
  569. package/queries/is-empty-paragraph-by-path.d.ts +2 -2
  570. package/queries/is-empty-paragraph.d.ts +2 -2
  571. package/queries/is-first-child.d.ts +5 -5
  572. package/queries/is-include-types.d.ts +3 -3
  573. package/queries/is-node-type-in.d.ts +6 -6
  574. package/queries/is-node-type.d.ts +6 -6
  575. package/queries/is-paragraph.d.ts +2 -2
  576. package/queries/is-point-at-root.d.ts +2 -2
  577. package/queries/is-range-across-blocks.d.ts +8 -8
  578. package/queries/is-range-at-root.d.ts +2 -2
  579. package/queries/is-start.d.ts +5 -5
  580. package/queries/some-node.d.ts +7 -7
  581. package/services/color-select.service.d.ts +20 -20
  582. package/services/context.service.d.ts +49 -49
  583. package/services/table-contextmenu.service.d.ts +25 -25
  584. package/services/toolbar.service.d.ts +9 -9
  585. package/shortcuts/index.d.ts +2 -2
  586. package/shortcuts/mark.d.ts +2 -2
  587. package/transforms/apply-deep-to-nodes.d.ts +12 -12
  588. package/transforms/clear-marks.d.ts +2 -2
  589. package/transforms/close-conversion-hint.d.ts +2 -2
  590. package/transforms/delete-element.d.ts +2 -2
  591. package/transforms/handle-continual-delete-backward.d.ts +3 -3
  592. package/transforms/handle-continual-insert-break.d.ts +3 -3
  593. package/transforms/index.d.ts +18 -18
  594. package/transforms/insert-elements.d.ts +2 -2
  595. package/transforms/insert-paragraph.d.ts +2 -2
  596. package/transforms/merge-deep-to-nodes.d.ts +5 -5
  597. package/transforms/move-children.d.ts +24 -24
  598. package/transforms/on-keydown-reset-block-type.d.ts +3 -3
  599. package/transforms/set-end-selection.d.ts +2 -2
  600. package/transforms/set-marks.d.ts +12 -12
  601. package/transforms/set-node.d.ts +2 -2
  602. package/transforms/split-node.d.ts +3 -3
  603. package/transforms/un-hang-range.d.ts +10 -10
  604. package/transforms/un-wrap.d.ts +3 -3
  605. package/transforms/unwrap-nodes-by-type.d.ts +6 -6
  606. package/utils/auto-focus.d.ts +2 -2
  607. package/utils/auto-scroll-view.d.ts +6 -6
  608. package/utils/cast-array.d.ts +1 -1
  609. package/utils/common.d.ts +2 -2
  610. package/utils/create-empty-paragraph.d.ts +2 -2
  611. package/utils/data-transform.d.ts +6 -6
  612. package/utils/dom.d.ts +10 -10
  613. package/utils/editor-uuid.d.ts +3 -3
  614. package/utils/fragment.d.ts +10 -10
  615. package/utils/get-editable-element-height.d.ts +2 -2
  616. package/utils/get-toolbar-class.d.ts +2 -2
  617. package/utils/id-creator.d.ts +1 -1
  618. package/utils/index.d.ts +13 -13
  619. package/utils/is-clean-empty-paragraph.d.ts +9 -9
  620. package/utils/is-inline.d.ts +2 -2
  621. package/utils/lodash.d.ts +1 -1
  622. package/utils/match.d.ts +18 -18
  623. package/utils/merge-element-options.d.ts +2 -2
  624. package/utils/weak-maps.d.ts +5 -5
  625. package/worktile-theia.d.ts +5 -5
@@ -1,287 +1,287 @@
1
- import { Editor, Node, Range, Path, Transforms } from 'slate';
2
- import { HistoryEditor } from 'slate-history';
3
- import { AngularEditor, hotkeys, hasBlockCard, isCardLeft, FAKE_RIGHT_BLOCK_CARD_OFFSET } from 'slate-angular';
4
- import { PluginKeys } from '../../interfaces';
5
- import { createPluginFactory } from '../../core';
6
- import { createEmptyParagraph } from '../../utils/create-empty-paragraph';
7
- import { insertParagraph } from '../../transforms/insert-paragraph';
8
- import * as TheTransforms from '../../transforms';
9
- import * as TheQueries from '../../queries';
10
- export const withBlockCard = (editor) => {
11
- const { insertBreak, deleteBackward, onKeydown, deleteForward, insertData, insertText } = editor;
12
- editor.insertBreak = () => {
13
- const domSelection = window.getSelection();
14
- const anchorNode = domSelection.anchorNode;
15
- if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
16
- const isLeftCursor = isCardLeft(anchorNode);
17
- const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
18
- const cursorRootPath = cardEntry[1];
19
- TheTransforms.insertParagraph(editor, isLeftCursor ? cursorRootPath : Path.next(cursorRootPath));
20
- if (!isLeftCursor) {
21
- Transforms.select(editor, Path.next(cursorRootPath));
22
- }
23
- return;
24
- }
25
- insertBreak();
26
- };
27
- editor.deleteBackward = unit => {
28
- const domSelection = window.getSelection();
29
- const anchorNode = domSelection.anchorNode;
30
- if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
31
- const isLeftCursor = isCardLeft(anchorNode);
32
- const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
33
- const cursorRootPath = cardEntry[1];
34
- if (isLeftCursor) {
35
- const previousPath = Path.hasPrevious(cursorRootPath) && Path.previous(cursorRootPath);
36
- if (!previousPath) {
37
- return;
38
- }
39
- if (previousPath && TheQueries.isEmptyParagraphByPath(editor, previousPath)) {
40
- Transforms.removeNodes(editor, {
41
- at: previousPath
42
- });
43
- return;
44
- }
45
- HistoryEditor.withoutMerging(editor, () => {
46
- Transforms.select(editor, Editor.end(editor, previousPath));
47
- });
48
- return;
49
- }
50
- else {
51
- TheTransforms.insertParagraph(editor, cursorRootPath);
52
- Transforms.select(editor, cursorRootPath);
53
- Transforms.removeNodes(editor, { at: Path.next(cursorRootPath) });
54
- return;
55
- }
56
- }
57
- const blockCard = TheQueries.getBlockCardAbove(editor);
58
- const beforePoint = Editor.before(editor, editor.selection.anchor);
59
- const beforeBlockCard = TheQueries.getBlockCardAbove(editor, { at: beforePoint });
60
- if (!blockCard && beforeBlockCard) {
61
- if (TheQueries.isBlockAboveEmpty(editor)) {
62
- const [node, path] = Editor.parent(editor, editor.selection.anchor.path);
63
- HistoryEditor.withoutMerging(editor, () => {
64
- const rightCursor = { path: beforeBlockCard[1], offset: FAKE_RIGHT_BLOCK_CARD_OFFSET };
65
- Transforms.select(editor, { anchor: rightCursor, focus: rightCursor });
66
- });
67
- Transforms.delete(editor, { at: path });
68
- return;
69
- }
70
- else {
71
- Transforms.delete(editor, { at: beforeBlockCard[1] });
72
- }
73
- return;
74
- }
75
- deleteBackward(unit);
76
- };
77
- editor.deleteForward = unit => {
78
- const domSelection = window.getSelection();
79
- const anchorNode = domSelection.anchorNode;
80
- if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
81
- const isLeftCursor = isCardLeft(anchorNode);
82
- const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
83
- const cursorRootPath = cardEntry[1];
84
- if (isLeftCursor) {
85
- TheTransforms.insertParagraph(editor, cursorRootPath);
86
- Transforms.select(editor, cursorRootPath);
87
- Transforms.removeNodes(editor, { at: Path.next(cursorRootPath) });
88
- return;
89
- }
90
- else {
91
- const nextPath = Path.next(cursorRootPath);
92
- HistoryEditor.withoutMerging(editor, () => {
93
- Transforms.select(editor, Editor.start(editor, nextPath));
94
- });
95
- return;
96
- }
97
- }
98
- const blockCard = TheQueries.getBlockCardAbove(editor);
99
- const afterPoint = Editor.after(editor, editor.selection.anchor);
100
- const afterBlockCard = TheQueries.getBlockCardAbove(editor, { at: afterPoint });
101
- if (!blockCard && afterBlockCard) {
102
- if (TheQueries.isBlockAboveEmpty(editor)) {
103
- HistoryEditor.withoutMerging(editor, () => {
104
- const leftCursor = { path: afterBlockCard[1], offset: -1 };
105
- Transforms.select(editor, { anchor: leftCursor, focus: leftCursor });
106
- });
107
- Transforms.delete(editor, { at: Path.previous(afterBlockCard[1]) });
108
- return;
109
- }
110
- return;
111
- }
112
- deleteForward(unit);
113
- };
114
- editor.onKeydown = (event) => {
115
- const domSelection = window.getSelection();
116
- const anchorNode = domSelection.anchorNode;
117
- const nativeEvent = event;
118
- const { selection } = editor;
119
- const isMoveBackward = hotkeys.isMoveBackward(nativeEvent);
120
- const isMoveForward = hotkeys.isMoveForward(nativeEvent);
121
- const isMoveUp = hotkeys.isMoveUp(nativeEvent);
122
- const isMoveDown = hotkeys.isMoveDown(nativeEvent);
123
- const isCollapsed = selection && Range.isCollapsed(selection);
124
- const anchorEntry = TheQueries.anchorBlockEntry(editor);
125
- // block card cursor
126
- if (anchorNode && hasBlockCard(domSelection)) {
127
- const isCardLeftCursor = isCardLeft(anchorNode);
128
- if (isMoveUp) {
129
- const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
130
- const previousPath = Path.hasPrevious(path) && Path.previous(path);
131
- const previousNode = previousPath && TheQueries.getNode(editor, previousPath);
132
- if (previousNode && editor.isBlockCard(previousNode)) {
133
- AngularEditor.moveBlockCard(editor, previousNode, { direction: isCardLeftCursor ? 'left' : 'right' });
134
- }
135
- else {
136
- const before = Editor.before(editor, path);
137
- if (before) {
138
- Transforms.select(editor, before);
139
- }
140
- }
141
- nativeEvent.preventDefault();
142
- return;
143
- }
144
- if (isMoveDown) {
145
- const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
146
- const nextPath = Path.next(path);
147
- const nextNode = TheQueries.getNode(editor, nextPath);
148
- if (nextNode && editor.isBlockCard(nextNode)) {
149
- AngularEditor.moveBlockCard(editor, nextNode, { direction: isCardLeftCursor ? 'left' : 'right' });
150
- }
151
- else {
152
- const after = Editor.after(editor, path);
153
- if (after) {
154
- Transforms.select(editor, Editor.after(editor, path));
155
- }
156
- }
157
- nativeEvent.preventDefault();
158
- return;
159
- }
160
- // → + right-block-card
161
- if (isMoveForward && !isCardLeftCursor) {
162
- nativeEvent.preventDefault();
163
- const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
164
- const nextPath = Path.next(path);
165
- const nextNode = TheQueries.getNode(editor, nextPath);
166
- if (nextNode && editor.isBlockCard(nextNode)) {
167
- event.preventDefault();
168
- AngularEditor.moveBlockCard(editor, nextNode, { direction: 'left' });
169
- return;
170
- }
171
- const after = Editor.after(editor, path);
172
- if (after) {
173
- Transforms.select(editor, Editor.after(editor, path));
174
- }
175
- return;
176
- }
177
- // ← + left-block-card
178
- if (isMoveBackward && isCardLeftCursor) {
179
- nativeEvent.preventDefault();
180
- const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
181
- const previousPath = Path.hasPrevious(path) && Path.previous(path);
182
- const previousNode = previousPath && TheQueries.getNode(editor, previousPath);
183
- if (previousNode && editor.isBlockCard(previousNode)) {
184
- event.preventDefault();
185
- AngularEditor.moveBlockCard(editor, previousNode, { direction: 'right' });
186
- return;
187
- }
188
- const before = Editor.before(editor, path);
189
- if (before) {
190
- Transforms.select(editor, before);
191
- }
192
- return;
193
- }
194
- // move to card center
195
- if ((isCardLeftCursor && isMoveForward) || (!isCardLeftCursor && isMoveBackward)) {
196
- nativeEvent.preventDefault();
197
- const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
198
- Transforms.select(editor, isCardLeftCursor ? Editor.start(editor, path) : Editor.end(editor, path));
199
- return;
200
- }
201
- }
202
- // block card center
203
- if (isCollapsed && (isMoveUp || isMoveDown) && anchorEntry) {
204
- const [block, path] = anchorEntry;
205
- if (editor.isBlockCard(block)) {
206
- event.preventDefault();
207
- Transforms.select(editor, isMoveUp ? Editor.before(editor, path) : Editor.after(editor, path));
208
- return;
209
- }
210
- }
211
- if (isCollapsed && (isMoveBackward || isMoveForward) && anchorEntry) {
212
- const [block] = anchorEntry;
213
- if (editor.isBlockCard(block)) {
214
- event.preventDefault();
215
- AngularEditor.moveBlockCard(editor, block, { direction: isMoveBackward ? 'left' : 'right' });
216
- return;
217
- }
218
- }
219
- // move to block card cursor
220
- if (isCollapsed && isMoveBackward && Editor.isStart(editor, selection.anchor, selection.anchor.path.slice(0, 1))) {
221
- const currentPath = selection.anchor.path.slice(0, 1);
222
- if (currentPath[0] > 0) {
223
- const previousNode = Node.get(editor, Path.previous(currentPath));
224
- if (previousNode && editor.isBlockCard(previousNode)) {
225
- event.preventDefault();
226
- AngularEditor.moveBlockCard(editor, previousNode, { direction: 'right' });
227
- return;
228
- }
229
- }
230
- }
231
- if (isCollapsed && isMoveForward && Editor.isEnd(editor, selection.anchor, selection.anchor.path.slice(0, 1))) {
232
- const currentPath = selection.anchor.path.slice(0, 1);
233
- if (currentPath[0] < editor.children.length - 1) {
234
- const previousNode = Node.get(editor, Path.next(currentPath));
235
- if (previousNode && editor.isBlockCard(previousNode)) {
236
- event.preventDefault();
237
- AngularEditor.moveBlockCard(editor, previousNode, { direction: 'left' });
238
- return;
239
- }
240
- }
241
- }
242
- onKeydown(event);
243
- };
244
- editor.insertData = (data) => {
245
- const domSelection = window.getSelection();
246
- const anchorNode = domSelection.anchorNode;
247
- if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
248
- const isLeftCursor = isCardLeft(anchorNode);
249
- const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
250
- const cursorRootPath = cardEntry[1];
251
- if (isLeftCursor) {
252
- Transforms.insertNodes(editor, createEmptyParagraph(), { at: cursorRootPath });
253
- Transforms.select(editor, cursorRootPath);
254
- }
255
- else {
256
- Transforms.insertNodes(editor, createEmptyParagraph(), { at: Path.next(cursorRootPath) });
257
- Transforms.select(editor, Path.next(cursorRootPath));
258
- }
259
- }
260
- insertData(data);
261
- };
262
- editor.insertText = (text) => {
263
- const domSelection = window.getSelection();
264
- const anchorNode = domSelection === null || domSelection === void 0 ? void 0 : domSelection.anchorNode;
265
- if (AngularEditor.isBlockCardLeftCursor(editor) || AngularEditor.isBlockCardRightCursor(editor)) {
266
- const isLeftCursor = isCardLeft(anchorNode);
267
- const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
268
- const cursorRootPath = cardEntry[1];
269
- if (isLeftCursor) {
270
- insertParagraph(editor, cursorRootPath);
271
- Transforms.select(editor, cursorRootPath);
272
- }
273
- else {
274
- const nextPath = Path.next(cursorRootPath);
275
- insertParagraph(editor, nextPath);
276
- Transforms.select(editor, nextPath);
277
- }
278
- }
279
- insertText(text);
280
- };
281
- return editor;
282
- };
283
- export const createBlockCardPlugin = createPluginFactory({
284
- key: PluginKeys.blockCard,
285
- withOverrides: withBlockCard
286
- });
1
+ import { Editor, Node, Range, Path, Transforms } from 'slate';
2
+ import { HistoryEditor } from 'slate-history';
3
+ import { AngularEditor, hotkeys, hasBlockCard, isCardLeft, FAKE_RIGHT_BLOCK_CARD_OFFSET } from 'slate-angular';
4
+ import { PluginKeys } from '../../interfaces';
5
+ import { createPluginFactory } from '../../core';
6
+ import { createEmptyParagraph } from '../../utils/create-empty-paragraph';
7
+ import { insertParagraph } from '../../transforms/insert-paragraph';
8
+ import * as TheTransforms from '../../transforms';
9
+ import * as TheQueries from '../../queries';
10
+ export const withBlockCard = (editor) => {
11
+ const { insertBreak, deleteBackward, onKeydown, deleteForward, insertData, insertText } = editor;
12
+ editor.insertBreak = () => {
13
+ const domSelection = window.getSelection();
14
+ const anchorNode = domSelection.anchorNode;
15
+ if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
16
+ const isLeftCursor = isCardLeft(anchorNode);
17
+ const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
18
+ const cursorRootPath = cardEntry[1];
19
+ TheTransforms.insertParagraph(editor, isLeftCursor ? cursorRootPath : Path.next(cursorRootPath));
20
+ if (!isLeftCursor) {
21
+ Transforms.select(editor, Path.next(cursorRootPath));
22
+ }
23
+ return;
24
+ }
25
+ insertBreak();
26
+ };
27
+ editor.deleteBackward = unit => {
28
+ const domSelection = window.getSelection();
29
+ const anchorNode = domSelection.anchorNode;
30
+ if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
31
+ const isLeftCursor = isCardLeft(anchorNode);
32
+ const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
33
+ const cursorRootPath = cardEntry[1];
34
+ if (isLeftCursor) {
35
+ const previousPath = Path.hasPrevious(cursorRootPath) && Path.previous(cursorRootPath);
36
+ if (!previousPath) {
37
+ return;
38
+ }
39
+ if (previousPath && TheQueries.isEmptyParagraphByPath(editor, previousPath)) {
40
+ Transforms.removeNodes(editor, {
41
+ at: previousPath
42
+ });
43
+ return;
44
+ }
45
+ HistoryEditor.withoutMerging(editor, () => {
46
+ Transforms.select(editor, Editor.end(editor, previousPath));
47
+ });
48
+ return;
49
+ }
50
+ else {
51
+ TheTransforms.insertParagraph(editor, cursorRootPath);
52
+ Transforms.select(editor, cursorRootPath);
53
+ Transforms.removeNodes(editor, { at: Path.next(cursorRootPath) });
54
+ return;
55
+ }
56
+ }
57
+ const blockCard = TheQueries.getBlockCardAbove(editor);
58
+ const beforePoint = Editor.before(editor, editor.selection.anchor);
59
+ const beforeBlockCard = TheQueries.getBlockCardAbove(editor, { at: beforePoint });
60
+ if (!blockCard && beforeBlockCard) {
61
+ if (TheQueries.isBlockAboveEmpty(editor)) {
62
+ const [node, path] = Editor.parent(editor, editor.selection.anchor.path);
63
+ HistoryEditor.withoutMerging(editor, () => {
64
+ const rightCursor = { path: beforeBlockCard[1], offset: FAKE_RIGHT_BLOCK_CARD_OFFSET };
65
+ Transforms.select(editor, { anchor: rightCursor, focus: rightCursor });
66
+ });
67
+ Transforms.delete(editor, { at: path });
68
+ return;
69
+ }
70
+ else {
71
+ Transforms.delete(editor, { at: beforeBlockCard[1] });
72
+ }
73
+ return;
74
+ }
75
+ deleteBackward(unit);
76
+ };
77
+ editor.deleteForward = unit => {
78
+ const domSelection = window.getSelection();
79
+ const anchorNode = domSelection.anchorNode;
80
+ if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
81
+ const isLeftCursor = isCardLeft(anchorNode);
82
+ const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
83
+ const cursorRootPath = cardEntry[1];
84
+ if (isLeftCursor) {
85
+ TheTransforms.insertParagraph(editor, cursorRootPath);
86
+ Transforms.select(editor, cursorRootPath);
87
+ Transforms.removeNodes(editor, { at: Path.next(cursorRootPath) });
88
+ return;
89
+ }
90
+ else {
91
+ const nextPath = Path.next(cursorRootPath);
92
+ HistoryEditor.withoutMerging(editor, () => {
93
+ Transforms.select(editor, Editor.start(editor, nextPath));
94
+ });
95
+ return;
96
+ }
97
+ }
98
+ const blockCard = TheQueries.getBlockCardAbove(editor);
99
+ const afterPoint = Editor.after(editor, editor.selection.anchor);
100
+ const afterBlockCard = TheQueries.getBlockCardAbove(editor, { at: afterPoint });
101
+ if (!blockCard && afterBlockCard) {
102
+ if (TheQueries.isBlockAboveEmpty(editor)) {
103
+ HistoryEditor.withoutMerging(editor, () => {
104
+ const leftCursor = { path: afterBlockCard[1], offset: -1 };
105
+ Transforms.select(editor, { anchor: leftCursor, focus: leftCursor });
106
+ });
107
+ Transforms.delete(editor, { at: Path.previous(afterBlockCard[1]) });
108
+ return;
109
+ }
110
+ return;
111
+ }
112
+ deleteForward(unit);
113
+ };
114
+ editor.onKeydown = (event) => {
115
+ const domSelection = window.getSelection();
116
+ const anchorNode = domSelection.anchorNode;
117
+ const nativeEvent = event;
118
+ const { selection } = editor;
119
+ const isMoveBackward = hotkeys.isMoveBackward(nativeEvent);
120
+ const isMoveForward = hotkeys.isMoveForward(nativeEvent);
121
+ const isMoveUp = hotkeys.isMoveUp(nativeEvent);
122
+ const isMoveDown = hotkeys.isMoveDown(nativeEvent);
123
+ const isCollapsed = selection && Range.isCollapsed(selection);
124
+ const anchorEntry = TheQueries.anchorBlockEntry(editor);
125
+ // block card cursor
126
+ if (anchorNode && hasBlockCard(domSelection)) {
127
+ const isCardLeftCursor = isCardLeft(anchorNode);
128
+ if (isMoveUp) {
129
+ const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
130
+ const previousPath = Path.hasPrevious(path) && Path.previous(path);
131
+ const previousNode = previousPath && TheQueries.getNode(editor, previousPath);
132
+ if (previousNode && editor.isBlockCard(previousNode)) {
133
+ AngularEditor.moveBlockCard(editor, previousNode, { direction: isCardLeftCursor ? 'left' : 'right' });
134
+ }
135
+ else {
136
+ const before = Editor.before(editor, path);
137
+ if (before) {
138
+ Transforms.select(editor, before);
139
+ }
140
+ }
141
+ nativeEvent.preventDefault();
142
+ return;
143
+ }
144
+ if (isMoveDown) {
145
+ const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
146
+ const nextPath = Path.next(path);
147
+ const nextNode = TheQueries.getNode(editor, nextPath);
148
+ if (nextNode && editor.isBlockCard(nextNode)) {
149
+ AngularEditor.moveBlockCard(editor, nextNode, { direction: isCardLeftCursor ? 'left' : 'right' });
150
+ }
151
+ else {
152
+ const after = Editor.after(editor, path);
153
+ if (after) {
154
+ Transforms.select(editor, Editor.after(editor, path));
155
+ }
156
+ }
157
+ nativeEvent.preventDefault();
158
+ return;
159
+ }
160
+ // → + right-block-card
161
+ if (isMoveForward && !isCardLeftCursor) {
162
+ nativeEvent.preventDefault();
163
+ const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
164
+ const nextPath = Path.next(path);
165
+ const nextNode = TheQueries.getNode(editor, nextPath);
166
+ if (nextNode && editor.isBlockCard(nextNode)) {
167
+ event.preventDefault();
168
+ AngularEditor.moveBlockCard(editor, nextNode, { direction: 'left' });
169
+ return;
170
+ }
171
+ const after = Editor.after(editor, path);
172
+ if (after) {
173
+ Transforms.select(editor, Editor.after(editor, path));
174
+ }
175
+ return;
176
+ }
177
+ // ← + left-block-card
178
+ if (isMoveBackward && isCardLeftCursor) {
179
+ nativeEvent.preventDefault();
180
+ const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
181
+ const previousPath = Path.hasPrevious(path) && Path.previous(path);
182
+ const previousNode = previousPath && TheQueries.getNode(editor, previousPath);
183
+ if (previousNode && editor.isBlockCard(previousNode)) {
184
+ event.preventDefault();
185
+ AngularEditor.moveBlockCard(editor, previousNode, { direction: 'right' });
186
+ return;
187
+ }
188
+ const before = Editor.before(editor, path);
189
+ if (before) {
190
+ Transforms.select(editor, before);
191
+ }
192
+ return;
193
+ }
194
+ // move to card center
195
+ if ((isCardLeftCursor && isMoveForward) || (!isCardLeftCursor && isMoveBackward)) {
196
+ nativeEvent.preventDefault();
197
+ const [, path] = AngularEditor.toSlateCardEntry(editor, anchorNode);
198
+ Transforms.select(editor, isCardLeftCursor ? Editor.start(editor, path) : Editor.end(editor, path));
199
+ return;
200
+ }
201
+ }
202
+ // block card center
203
+ if (isCollapsed && (isMoveUp || isMoveDown) && anchorEntry) {
204
+ const [block, path] = anchorEntry;
205
+ if (editor.isBlockCard(block)) {
206
+ event.preventDefault();
207
+ Transforms.select(editor, isMoveUp ? Editor.before(editor, path) : Editor.after(editor, path));
208
+ return;
209
+ }
210
+ }
211
+ if (isCollapsed && (isMoveBackward || isMoveForward) && anchorEntry) {
212
+ const [block] = anchorEntry;
213
+ if (editor.isBlockCard(block)) {
214
+ event.preventDefault();
215
+ AngularEditor.moveBlockCard(editor, block, { direction: isMoveBackward ? 'left' : 'right' });
216
+ return;
217
+ }
218
+ }
219
+ // move to block card cursor
220
+ if (isCollapsed && isMoveBackward && Editor.isStart(editor, selection.anchor, selection.anchor.path.slice(0, 1))) {
221
+ const currentPath = selection.anchor.path.slice(0, 1);
222
+ if (currentPath[0] > 0) {
223
+ const previousNode = Node.get(editor, Path.previous(currentPath));
224
+ if (previousNode && editor.isBlockCard(previousNode)) {
225
+ event.preventDefault();
226
+ AngularEditor.moveBlockCard(editor, previousNode, { direction: 'right' });
227
+ return;
228
+ }
229
+ }
230
+ }
231
+ if (isCollapsed && isMoveForward && Editor.isEnd(editor, selection.anchor, selection.anchor.path.slice(0, 1))) {
232
+ const currentPath = selection.anchor.path.slice(0, 1);
233
+ if (currentPath[0] < editor.children.length - 1) {
234
+ const previousNode = Node.get(editor, Path.next(currentPath));
235
+ if (previousNode && editor.isBlockCard(previousNode)) {
236
+ event.preventDefault();
237
+ AngularEditor.moveBlockCard(editor, previousNode, { direction: 'left' });
238
+ return;
239
+ }
240
+ }
241
+ }
242
+ onKeydown(event);
243
+ };
244
+ editor.insertData = (data) => {
245
+ const domSelection = window.getSelection();
246
+ const anchorNode = domSelection.anchorNode;
247
+ if (domSelection && domSelection.isCollapsed && hasBlockCard(domSelection)) {
248
+ const isLeftCursor = isCardLeft(anchorNode);
249
+ const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
250
+ const cursorRootPath = cardEntry[1];
251
+ if (isLeftCursor) {
252
+ Transforms.insertNodes(editor, createEmptyParagraph(), { at: cursorRootPath });
253
+ Transforms.select(editor, cursorRootPath);
254
+ }
255
+ else {
256
+ Transforms.insertNodes(editor, createEmptyParagraph(), { at: Path.next(cursorRootPath) });
257
+ Transforms.select(editor, Path.next(cursorRootPath));
258
+ }
259
+ }
260
+ insertData(data);
261
+ };
262
+ editor.insertText = (text) => {
263
+ const domSelection = window.getSelection();
264
+ const anchorNode = domSelection === null || domSelection === void 0 ? void 0 : domSelection.anchorNode;
265
+ if (AngularEditor.isBlockCardLeftCursor(editor) || AngularEditor.isBlockCardRightCursor(editor)) {
266
+ const isLeftCursor = isCardLeft(anchorNode);
267
+ const cardEntry = AngularEditor.toSlateCardEntry(editor, anchorNode);
268
+ const cursorRootPath = cardEntry[1];
269
+ if (isLeftCursor) {
270
+ insertParagraph(editor, cursorRootPath);
271
+ Transforms.select(editor, cursorRootPath);
272
+ }
273
+ else {
274
+ const nextPath = Path.next(cursorRootPath);
275
+ insertParagraph(editor, nextPath);
276
+ Transforms.select(editor, nextPath);
277
+ }
278
+ }
279
+ insertText(text);
280
+ };
281
+ return editor;
282
+ };
283
+ export const createBlockCardPlugin = createPluginFactory({
284
+ key: PluginKeys.blockCard,
285
+ withOverrides: withBlockCard
286
+ });
287
287
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2stY2FyZC5wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvcGx1Z2lucy9jb21tb24vYmxvY2stY2FyZC5wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDakQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDMUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxLQUFLLFVBQVUsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQW1CLE1BQVMsRUFBSyxFQUFFO0lBQzVELE1BQU0sRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUVqRyxNQUFNLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRTtRQUN0QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUMzQyxJQUFJLFlBQVksSUFBSSxZ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Q0FBQztZQUM1QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQyxJQUFJLFlBQVksRUFBRTtnQkFDZCxlQUFlLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUN4QyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUMsQ0FBQzthQUM3QztpQkFBTTtnQkFDSCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUMzQyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN2QztTQUNKO1FBQ0QsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0lBQ3JELEdBQUcsRUFBRSxVQUFVLENBQUMsU0FBUztJQUN6QixhQUFhLEVBQUUsYUFBYTtDQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFZGl0b3IsIE5vZGUsIFJhbmdlLCBQYXRoLCBUcmFuc2Zvcm1zIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgSGlzdG9yeUVkaXRvciB9IGZyb20gJ3NsYXRlLWhpc3RvcnknO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciwgaG90a2V5cywgaGFzQmxvY2tDYXJkLCBpc0NhcmRMZWZ0LCBGQUtFX1JJR0hUX0JMT0NLX0NBUkRfT0ZGU0VUIH0gZnJvbSAnc2xhdGUtYW5ndWxhcic7XG5pbXBvcnQgeyBQbHVnaW5LZXlzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBjcmVhdGVQbHVnaW5GYWN0b3J5IH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVFbXB0eVBhcmFncmFwaCB9IGZyb20gJy4uLy4uL3V0aWxzL2NyZWF0ZS1lbXB0eS1wYXJhZ3JhcGgnO1xuaW1wb3J0IHsgaW5zZXJ0UGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vdHJhbnNmb3Jtcy9pbnNlcnQtcGFyYWdyYXBoJztcbmltcG9ydCAqIGFzIFRoZVRyYW5zZm9ybXMgZnJvbSAnLi4vLi4vdHJhbnNmb3Jtcyc7XG5pbXBvcnQgKiBhcyBUaGVRdWVyaWVzIGZyb20gJy4uLy4uL3F1ZXJpZXMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEJsb2NrQ2FyZCA9IDxUIGV4dGVuZHMgRWRpdG9yPihlZGl0b3I6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7IGluc2VydEJyZWFrLCBkZWxldGVCYWNrd2FyZCwgb25LZXlkb3duLCBkZWxldGVGb3J3YXJkLCBpbnNlcnREYXRhLCBpbnNlcnRUZXh0IH0gPSBlZGl0b3I7XG5cbiAgICBlZGl0b3IuaW5zZXJ0QnJlYWsgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRvbVNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICBpZiAoZG9tU2VsZWN0aW9uICYmIGRvbVNlbGVjdGlvbi5pc0NvbGxhcHNlZCAmJiBoYXNCbG9ja0NhcmQoZG9tU2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgaXNMZWZ0Q3Vyc29yID0gaXNDYXJkTGVmdChhbmNob3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhcmRFbnRyeSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZUNhcmRFbnRyeShlZGl0b3IsIGFuY2hvck5vZGUpO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUm9vdFBhdGggPSBjYXJkRW50cnlbMV07XG4gICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLmluc2VydFBhcmFncmFwaChlZGl0b3IsIGlzTGVmdEN1cnNvciA/IGN1cnNvclJvb3RQYXRoIDogUGF0aC5uZXh0KGN1cnNvclJvb3RQYXRoKSk7XG4gICAgICAgICAgICBpZiAoIWlzTGVmdEN1cnNvcikge1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgUGF0aC5uZXh0KGN1cnNvclJvb3RQYXRoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaW5zZXJ0QnJlYWsoKTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmRlbGV0ZUJhY2t3YXJkID0gdW5pdCA9PiB7XG4gICAgICAgIGNvbnN0IGRvbVNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IGRvbVNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICAgICAgICBpZiAoZG9tU2VsZWN0aW9uICYmIGRvbVNlbGVjdGlvbi5pc0NvbGxhcHNlZCAmJiBoYXNCbG9ja0NhcmQoZG9tU2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgaXNMZWZ0Q3Vyc29yID0gaXNDYXJkTGVmdChhbmNob3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhcmRFbnRyeSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZUNhcmRFbnRyeShlZGl0b3IsIGFuY2hvck5vZGUpO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUm9vdFBhdGggPSBjYXJkRW50cnlbMV07XG4gICAgICAgICAgICBpZiAoaXNMZWZ0Q3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQYXRoID0gUGF0aC5oYXNQcmV2aW91cyhjdXJzb3JSb290UGF0aCkgJiYgUGF0aC5wcmV2aW91cyhjdXJzb3JSb290UGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwcmV2aW91c1BhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNQYXRoICYmIFRoZVF1ZXJpZXMuaXNFbXB0eVBhcmFncmFwaEJ5UGF0aChlZGl0b3IsIHByZXZpb3VzUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5yZW1vdmVOb2RlcyhlZGl0b3IsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0OiBwcmV2aW91c1BhdGhcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgSGlzdG9yeUVkaXRvci53aXRob3V0TWVyZ2luZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBFZGl0b3IuZW5kKGVkaXRvciwgcHJldmlvdXNQYXRoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLmluc2VydFBhcmFncmFwaChlZGl0b3IsIGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwgeyBhdDogUGF0aC5uZXh0KGN1cnNvclJvb3RQYXRoKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBibG9ja0NhcmQgPSBUaGVRdWVyaWVzLmdldEJsb2NrQ2FyZEFib3ZlKGVkaXRvcik7XG4gICAgICAgIGNvbnN0IGJlZm9yZVBvaW50ID0gRWRpdG9yLmJlZm9yZShlZGl0b3IsIGVkaXRvci5zZWxlY3Rpb24uYW5jaG9yKTtcbiAgICAgICAgY29uc3QgYmVmb3JlQmxvY2tDYXJkID0gVGhlUXVlcmllcy5nZXRCbG9ja0NhcmRBYm92ZShlZGl0b3IsIHsgYXQ6IGJlZm9yZVBvaW50IH0pO1xuICAgICAgICBpZiAoIWJsb2NrQ2FyZCAmJiBiZWZvcmVCbG9ja0NhcmQpIHtcbiAgICAgICAgICAgIGlmIChUaGVRdWVyaWVzLmlzQmxvY2tBYm92ZUVtcHR5KGVkaXRvcikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBbbm9kZSwgcGF0aF0gPSBFZGl0b3IucGFyZW50KGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbi5hbmNob3IucGF0aCk7XG4gICAgICAgICAgICAgICAgSGlzdG9yeUVkaXRvci53aXRob3V0TWVyZ2luZyhlZGl0b3IsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHRDdXJzb3IgPSB7IHBhdGg6IGJlZm9yZUJsb2NrQ2FyZFsxXSwgb2Zmc2V0OiBGQUtFX1JJR0hUX0JMT0NLX0NBUkRfT0ZGU0VUIH07XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgeyBhbmNob3I6IHJpZ2h0Q3Vyc29yLCBmb2N1czogcmlnaHRDdXJzb3IgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiBwYXRoIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5kZWxldGUoZWRpdG9yLCB7IGF0OiBiZWZvcmVCbG9ja0NhcmRbMV0gfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGVCYWNrd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLmRlbGV0ZUZvcndhcmQgPSB1bml0ID0+IHtcbiAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBjb25zdCBhbmNob3JOb2RlID0gZG9tU2VsZWN0aW9uLmFuY2hvck5vZGU7XG4gICAgICAgIGlmIChkb21TZWxlY3Rpb24gJiYgZG9tU2VsZWN0aW9uLmlzQ29sbGFwc2VkICYmIGhhc0Jsb2NrQ2FyZChkb21TZWxlY3Rpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBpc0xlZnRDdXJzb3IgPSBpc0NhcmRMZWZ0KGFuY2hvck5vZGUpO1xuICAgICAgICAgICAgY29uc3QgY2FyZEVudHJ5ID0gQW5ndWxhckVkaXRvci50b1NsYXRlQ2FyZEVudHJ5KGVkaXRvciwgYW5jaG9yTm9kZSk7XG4gICAgICAgICAgICBjb25zdCBjdXJzb3JSb290UGF0aCA9IGNhcmRFbnRyeVsxXTtcbiAgICAgICAgICAgIGlmIChpc0xlZnRDdXJzb3IpIHtcbiAgICAgICAgICAgICAgICBUaGVUcmFuc2Zvcm1zLmluc2VydFBhcmFncmFwaChlZGl0b3IsIGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnJlbW92ZU5vZGVzKGVkaXRvciwgeyBhdDogUGF0aC5uZXh0KGN1cnNvclJvb3RQYXRoKSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRQYXRoID0gUGF0aC5uZXh0KGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgICAgICBIaXN0b3J5RWRpdG9yLndpdGhvdXRNZXJnaW5nKGVkaXRvciwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIEVkaXRvci5zdGFydChlZGl0b3IsIG5leHRQYXRoKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmxvY2tDYXJkID0gVGhlUXVlcmllcy5nZXRCbG9ja0NhcmRBYm92ZShlZGl0b3IpO1xuICAgICAgICBjb25zdCBhZnRlclBvaW50ID0gRWRpdG9yLmFmdGVyKGVkaXRvciwgZWRpdG9yLnNlbGVjdGlvbi5hbmNob3IpO1xuICAgICAgICBjb25zdCBhZnRlckJsb2NrQ2FyZCA9IFRoZVF1ZXJpZXMuZ2V0QmxvY2tDYXJkQWJvdmUoZWRpdG9yLCB7IGF0OiBhZnRlclBvaW50IH0pO1xuICAgICAgICBpZiAoIWJsb2NrQ2FyZCAmJiBhZnRlckJsb2NrQ2FyZCkge1xuICAgICAgICAgICAgaWYgKFRoZVF1ZXJpZXMuaXNCbG9ja0Fib3ZlRW1wdHkoZWRpdG9yKSkge1xuICAgICAgICAgICAgICAgIEhpc3RvcnlFZGl0b3Iud2l0aG91dE1lcmdpbmcoZWRpdG9yLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRDdXJzb3IgPSB7IHBhdGg6IGFmdGVyQmxvY2tDYXJkWzFdLCBvZmZzZXQ6IC0xIH07XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgeyBhbmNob3I6IGxlZnRDdXJzb3IsIGZvY3VzOiBsZWZ0Q3Vyc29yIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuZGVsZXRlKGVkaXRvciwgeyBhdDogUGF0aC5wcmV2aW91cyhhZnRlckJsb2NrQ2FyZFsxXSkgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlRm9yd2FyZCh1bml0KTtcbiAgICB9O1xuXG4gICAgZWRpdG9yLm9uS2V5ZG93biA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSBkb21TZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgICAgICAgY29uc3QgbmF0aXZlRXZlbnQgPSBldmVudDtcbiAgICAgICAgY29uc3QgeyBzZWxlY3Rpb24gfSA9IGVkaXRvcjtcblxuICAgICAgICBjb25zdCBpc01vdmVCYWNrd2FyZCA9IGhvdGtleXMuaXNNb3ZlQmFja3dhcmQobmF0aXZlRXZlbnQpO1xuICAgICAgICBjb25zdCBpc01vdmVGb3J3YXJkID0gaG90a2V5cy5pc01vdmVGb3J3YXJkKG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlVXAgPSBob3RrZXlzLmlzTW92ZVVwKG5hdGl2ZUV2ZW50KTtcbiAgICAgICAgY29uc3QgaXNNb3ZlRG93biA9IGhvdGtleXMuaXNNb3ZlRG93bihuYXRpdmVFdmVudCk7XG4gICAgICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gc2VsZWN0aW9uICYmIFJhbmdlLmlzQ29sbGFwc2VkKHNlbGVjdGlvbik7XG4gICAgICAgIGNvbnN0IGFuY2hvckVudHJ5ID0gVGhlUXVlcmllcy5hbmNob3JCbG9ja0VudHJ5KGVkaXRvcik7XG5cbiAgICAgICAgLy8gYmxvY2sgY2FyZCBjdXJzb3JcbiAgICAgICAgaWYgKGFuY2hvck5vZGUgJiYgaGFzQmxvY2tDYXJkKGRvbVNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzQ2FyZExlZnRDdXJzb3IgPSBpc0NhcmRMZWZ0KGFuY2hvck5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzTW92ZVVwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgcGF0aF0gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhdGggPSBQYXRoLmhhc1ByZXZpb3VzKHBhdGgpICYmIFBhdGgucHJldmlvdXMocGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlID0gcHJldmlvdXNQYXRoICYmIFRoZVF1ZXJpZXMuZ2V0Tm9kZShlZGl0b3IsIHByZXZpb3VzUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9kZSAmJiBlZGl0b3IuaXNCbG9ja0NhcmQocHJldmlvdXNOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLm1vdmVCbG9ja0NhcmQoZWRpdG9yLCBwcmV2aW91c05vZGUsIHsgZGlyZWN0aW9uOiBpc0NhcmRMZWZ0Q3Vyc29yID8gJ2xlZnQnIDogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmUgPSBFZGl0b3IuYmVmb3JlKGVkaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYmVmb3JlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc01vdmVEb3duKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgcGF0aF0gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFBhdGgubmV4dChwYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IFRoZVF1ZXJpZXMuZ2V0Tm9kZShlZGl0b3IsIG5leHRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dE5vZGUgJiYgZWRpdG9yLmlzQmxvY2tDYXJkKG5leHROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLm1vdmVCbG9ja0NhcmQoZWRpdG9yLCBuZXh0Tm9kZSwgeyBkaXJlY3Rpb246IGlzQ2FyZExlZnRDdXJzb3IgPyAnbGVmdCcgOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyID0gRWRpdG9yLmFmdGVyKGVkaXRvciwgcGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhZnRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBFZGl0b3IuYWZ0ZXIoZWRpdG9yLCBwYXRoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmF0aXZlRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDihpIgKyByaWdodC1ibG9jay1jYXJkXG4gICAgICAgICAgICBpZiAoaXNNb3ZlRm9yd2FyZCAmJiAhaXNDYXJkTGVmdEN1cnNvcikge1xuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgcGF0aF0gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFBhdGgubmV4dChwYXRoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IFRoZVF1ZXJpZXMuZ2V0Tm9kZShlZGl0b3IsIG5leHRQYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAobmV4dE5vZGUgJiYgZWRpdG9yLmlzQmxvY2tDYXJkKG5leHROb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLm1vdmVCbG9ja0NhcmQoZWRpdG9yLCBuZXh0Tm9kZSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBhZnRlciA9IEVkaXRvci5hZnRlcihlZGl0b3IsIHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChhZnRlcikge1xuICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIEVkaXRvci5hZnRlcihlZGl0b3IsIHBhdGgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8g4oaQICsgbGVmdC1ibG9jay1jYXJkXG4gICAgICAgICAgICBpZiAoaXNNb3ZlQmFja3dhcmQgJiYgaXNDYXJkTGVmdEN1cnNvcikge1xuICAgICAgICAgICAgICAgIG5hdGl2ZUV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgWywgcGF0aF0gPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhdGggPSBQYXRoLmhhc1ByZXZpb3VzKHBhdGgpICYmIFBhdGgucHJldmlvdXMocGF0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlID0gcHJldmlvdXNQYXRoICYmIFRoZVF1ZXJpZXMuZ2V0Tm9kZShlZGl0b3IsIHByZXZpb3VzUGF0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzTm9kZSAmJiBlZGl0b3IuaXNCbG9ja0NhcmQocHJldmlvdXNOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBBbmd1bGFyRWRpdG9yLm1vdmVCbG9ja0NhcmQoZWRpdG9yLCBwcmV2aW91c05vZGUsIHsgZGlyZWN0aW9uOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZSA9IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoYmVmb3JlKSB7XG4gICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgYmVmb3JlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gbW92ZSB0byBjYXJkIGNlbnRlclxuICAgICAgICAgICAgaWYgKChpc0NhcmRMZWZ0Q3Vyc29yICYmIGlzTW92ZUZvcndhcmQpIHx8ICghaXNDYXJkTGVmdEN1cnNvciAmJiBpc01vdmVCYWNrd2FyZCkpIHtcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFssIHBhdGhdID0gQW5ndWxhckVkaXRvci50b1NsYXRlQ2FyZEVudHJ5KGVkaXRvciwgYW5jaG9yTm9kZSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBpc0NhcmRMZWZ0Q3Vyc29yID8gRWRpdG9yLnN0YXJ0KGVkaXRvciwgcGF0aCkgOiBFZGl0b3IuZW5kKGVkaXRvciwgcGF0aCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBibG9jayBjYXJkIGNlbnRlclxuICAgICAgICBpZiAoaXNDb2xsYXBzZWQgJiYgKGlzTW92ZVVwIHx8IGlzTW92ZURvd24pICYmIGFuY2hvckVudHJ5KSB7XG4gICAgICAgICAgICBjb25zdCBbYmxvY2ssIHBhdGhdID0gYW5jaG9yRW50cnk7XG4gICAgICAgICAgICBpZiAoZWRpdG9yLmlzQmxvY2tDYXJkKGJsb2NrKSkge1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBpc01vdmVVcCA/IEVkaXRvci5iZWZvcmUoZWRpdG9yLCBwYXRoKSA6IEVkaXRvci5hZnRlcihlZGl0b3IsIHBhdGgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzQ29sbGFwc2VkICYmIChpc01vdmVCYWNrd2FyZCB8fCBpc01vdmVGb3J3YXJkKSAmJiBhbmNob3JFbnRyeSkge1xuICAgICAgICAgICAgY29uc3QgW2Jsb2NrXSA9IGFuY2hvckVudHJ5O1xuICAgICAgICAgICAgaWYgKGVkaXRvci5pc0Jsb2NrQ2FyZChibG9jaykpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIGJsb2NrLCB7IGRpcmVjdGlvbjogaXNNb3ZlQmFja3dhcmQgPyAnbGVmdCcgOiAncmlnaHQnIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBtb3ZlIHRvIGJsb2NrIGNhcmQgY3Vyc29yXG4gICAgICAgIGlmIChpc0NvbGxhcHNlZCAmJiBpc01vdmVCYWNrd2FyZCAmJiBFZGl0b3IuaXNTdGFydChlZGl0b3IsIHNlbGVjdGlvbi5hbmNob3IsIHNlbGVjdGlvbi5hbmNob3IucGF0aC5zbGljZSgwLCAxKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gc2VsZWN0aW9uLmFuY2hvci5wYXRoLnNsaWNlKDAsIDEpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXRoWzBdID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTm9kZSA9IE5vZGUuZ2V0KGVkaXRvciwgUGF0aC5wcmV2aW91cyhjdXJyZW50UGF0aCkpO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGUgJiYgZWRpdG9yLmlzQmxvY2tDYXJkKHByZXZpb3VzTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgQW5ndWxhckVkaXRvci5tb3ZlQmxvY2tDYXJkKGVkaXRvciwgcHJldmlvdXNOb2RlLCB7IGRpcmVjdGlvbjogJ3JpZ2h0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNDb2xsYXBzZWQgJiYgaXNNb3ZlRm9yd2FyZCAmJiBFZGl0b3IuaXNFbmQoZWRpdG9yLCBzZWxlY3Rpb24uYW5jaG9yLCBzZWxlY3Rpb24uYW5jaG9yLnBhdGguc2xpY2UoMCwgMSkpKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aCA9IHNlbGVjdGlvbi5hbmNob3IucGF0aC5zbGljZSgwLCAxKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UGF0aFswXSA8IGVkaXRvci5jaGlsZHJlbi5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNOb2RlID0gTm9kZS5nZXQoZWRpdG9yLCBQYXRoLm5leHQoY3VycmVudFBhdGgpKTtcbiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNOb2RlICYmIGVkaXRvci5pc0Jsb2NrQ2FyZChwcmV2aW91c05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIEFuZ3VsYXJFZGl0b3IubW92ZUJsb2NrQ2FyZChlZGl0b3IsIHByZXZpb3VzTm9kZSwgeyBkaXJlY3Rpb246ICdsZWZ0JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9uS2V5ZG93bihldmVudCk7XG4gICAgfTtcblxuICAgIGVkaXRvci5pbnNlcnREYXRhID0gKGRhdGE6IERhdGFUcmFuc2ZlcikgPT4ge1xuICAgICAgICBjb25zdCBkb21TZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSBkb21TZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgICAgICAgaWYgKGRvbVNlbGVjdGlvbiAmJiBkb21TZWxlY3Rpb24uaXNDb2xsYXBzZWQgJiYgaGFzQmxvY2tDYXJkKGRvbVNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTGVmdEN1cnNvciA9IGlzQ2FyZExlZnQoYW5jaG9yTm9kZSk7XG4gICAgICAgICAgICBjb25zdCBjYXJkRW50cnkgPSBBbmd1bGFyRWRpdG9yLnRvU2xhdGVDYXJkRW50cnkoZWRpdG9yLCBhbmNob3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclJvb3RQYXRoID0gY2FyZEVudHJ5WzFdO1xuICAgICAgICAgICAgaWYgKGlzTGVmdEN1cnNvcikge1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuaW5zZXJ0Tm9kZXMoZWRpdG9yLCBjcmVhdGVFbXB0eVBhcmFncmFwaCgpLCB7IGF0OiBjdXJzb3JSb290UGF0aCB9KTtcbiAgICAgICAgICAgICAgICBUcmFuc2Zvcm1zLnNlbGVjdChlZGl0b3IsIGN1cnNvclJvb3RQYXRoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5pbnNlcnROb2RlcyhlZGl0b3IsIGNyZWF0ZUVtcHR5UGFyYWdyYXBoKCksIHsgYXQ6IFBhdGgubmV4dChjdXJzb3JSb290UGF0aCkgfSk7XG4gICAgICAgICAgICAgICAgVHJhbnNmb3Jtcy5zZWxlY3QoZWRpdG9yLCBQYXRoLm5leHQoY3Vyc29yUm9vdFBhdGgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpbnNlcnREYXRhKGRhdGEpO1xuICAgIH07XG5cbiAgICBlZGl0b3IuaW5zZXJ0VGV4dCA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgZG9tU2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgICBjb25zdCBhbmNob3JOb2RlID0gZG9tU2VsZWN0aW9uPy5hbmNob3JOb2RlO1xuICAgICAgICBpZiAoQW5ndWxhckVkaXRvci5pc0Jsb2NrQ2FyZExlZnRDdXJzb3IoZWRpdG9yKSB8fCBBbmd1bGFyRWRpdG9yLmlzQmxvY2tDYXJkUmlnaHRDdXJzb3IoZWRpdG9yKSkge1xuICAgICAgICAgICAgY29uc3QgaXNMZWZ0Q3Vyc29yID0gaXNDYXJkTGVmdChhbmNob3JOb2RlKTtcbiAgICAgICAgICAgIGNvbnN0IGNhcmRFbnRyeSA9IEFuZ3VsYXJFZGl0b3IudG9TbGF0ZUNhcmRFbnRyeShlZGl0b3IsIGFuY2hvck5vZGUpO1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yUm9vdFBhdGggPSBjYXJkRW50cnlbMV07XG4gICAgICAgICAgICBpZiAoaXNMZWZ0Q3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgaW5zZXJ0UGFyYWdyYXBoKGVkaXRvciwgY3Vyc29yUm9vdFBhdGgpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgY3Vyc29yUm9vdFBhdGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0UGF0aCA9IFBhdGgubmV4dChjdXJzb3JSb290UGF0aCk7XG4gICAgICAgICAgICAgICAgaW5zZXJ0UGFyYWdyYXBoKGVkaXRvciwgbmV4dFBhdGgpO1xuICAgICAgICAgICAgICAgIFRyYW5zZm9ybXMuc2VsZWN0KGVkaXRvciwgbmV4dFBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGluc2VydFRleHQodGV4dCk7XG4gICAgfTtcblxuICAgIHJldHVybiBlZGl0b3I7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlQmxvY2tDYXJkUGx1Z2luID0gY3JlYXRlUGx1Z2luRmFjdG9yeSh7XG4gICAga2V5OiBQbHVnaW5LZXlzLmJsb2NrQ2FyZCxcbiAgICB3aXRoT3ZlcnJpZGVzOiB3aXRoQmxvY2tDYXJkXG59KTtcbiJdfQ==