slate-angular 17.0.0 → 17.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/components/children/children-outlet.component.d.ts +9 -0
  2. package/components/children/children.component.d.ts +1 -6
  3. package/components/editable/editable.component.d.ts +15 -5
  4. package/components/leaf/token.d.ts +4 -0
  5. package/components/leaves/leaves.component.d.ts +1 -14
  6. package/components/string/default-string.component.d.ts +1 -1
  7. package/components/string/string.component.d.ts +8 -0
  8. package/components/text/token.d.ts +5 -0
  9. package/components/text/void-text.component.d.ts +0 -1
  10. package/esm2022/components/block-card/block-card.component.mjs +2 -2
  11. package/esm2022/components/children/children-outlet.component.mjs +22 -0
  12. package/esm2022/components/children/children.component.mjs +5 -33
  13. package/esm2022/components/editable/editable.component.mjs +141 -48
  14. package/esm2022/components/element/default-element.component.mjs +3 -3
  15. package/esm2022/components/element/element.component.mjs +3 -3
  16. package/esm2022/components/leaf/token.mjs +3 -0
  17. package/esm2022/components/leaves/leaves.component.mjs +5 -50
  18. package/esm2022/components/string/default-string.component.mjs +1 -1
  19. package/esm2022/components/string/string.component.mjs +16 -6
  20. package/esm2022/components/text/default-text.component.mjs +3 -3
  21. package/esm2022/components/text/token.mjs +4 -0
  22. package/esm2022/components/text/void-text.component.mjs +3 -7
  23. package/esm2022/module.mjs +7 -22
  24. package/esm2022/plugins/angular-editor.mjs +65 -20
  25. package/esm2022/plugins/with-angular.mjs +5 -4
  26. package/esm2022/public-api.mjs +3 -2
  27. package/esm2022/utils/constants.mjs +2 -0
  28. package/esm2022/utils/index.mjs +2 -1
  29. package/esm2022/utils/throttle.mjs +18 -0
  30. package/esm2022/view/base.mjs +71 -17
  31. package/esm2022/view/container.mjs +2 -82
  32. package/esm2022/view/context-change.mjs +13 -0
  33. package/esm2022/view/context.mjs +1 -1
  34. package/esm2022/view/render/leaves-render.mjs +107 -0
  35. package/esm2022/view/render/list-render.mjs +292 -0
  36. package/esm2022/view/render/utils.mjs +115 -0
  37. package/fesm2022/slate-angular.mjs +1159 -786
  38. package/fesm2022/slate-angular.mjs.map +1 -1
  39. package/module.d.ts +7 -8
  40. package/package.json +7 -7
  41. package/plugins/angular-editor.d.ts +16 -5
  42. package/public-api.d.ts +2 -1
  43. package/utils/constants.d.ts +1 -0
  44. package/utils/index.d.ts +1 -0
  45. package/utils/throttle.d.ts +2 -0
  46. package/view/base.d.ts +17 -4
  47. package/view/container.d.ts +3 -7
  48. package/view/{before-context-change.d.ts → context-change.d.ts} +4 -0
  49. package/view/context.d.ts +7 -2
  50. package/view/render/leaves-render.d.ts +21 -0
  51. package/view/render/list-render.d.ts +35 -0
  52. package/view/render/utils.d.ts +11 -0
  53. package/components/descendant/descendant.component.d.ts +0 -35
  54. package/components/leaf/leaf.component.d.ts +0 -16
  55. package/esm2022/components/descendant/descendant.component.mjs +0 -186
  56. package/esm2022/components/leaf/leaf.component.mjs +0 -38
  57. package/esm2022/view/before-context-change.mjs +0 -7
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3NyYy92aWV3L2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVFbnRyeSwgUmFuZ2UsIEVsZW1lbnQsIEFuY2VzdG9yLCBUZXh0IH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgU2xhdGVTdHJpbmdUZW1wbGF0ZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvc3RyaW5nL3RlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnLi4vcGx1Z2lucy9hbmd1bGFyLWVkaXRvcic7XG5pbXBvcnQgeyBWaWV3VHlwZSB9IGZyb20gJy4uL3R5cGVzL3ZpZXcnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNsYXRlVmlld0NvbnRleHQ8VCBleHRlbmRzIEFuZ3VsYXJFZGl0b3IgPSBBbmd1bGFyRWRpdG9yPiB7XG4gICAgZWRpdG9yOiBUO1xuICAgIHRlbXBsYXRlQ29tcG9uZW50OiBTbGF0ZVN0cmluZ1RlbXBsYXRlO1xuICAgIHRyYWNrQnk6IChlbGVtZW50OiBFbGVtZW50KSA9PiBhbnk7XG4gICAgcmVuZGVyRWxlbWVudD86IChlbGVtZW50OiBFbGVtZW50KSA9PiBWaWV3VHlwZTtcbiAgICByZW5kZXJMZWFmPzogKHRleHQ6IFRleHQpID0+IFZpZXdUeXBlO1xuICAgIHJlbmRlclRleHQ/OiAodGV4dDogVGV4dCkgPT4gVmlld1R5cGU7XG4gICAgaXNTdHJpY3REZWNvcmF0ZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZUNoaWxkcmVuQ29udGV4dCB7XG4gICAgcGFyZW50OiBBbmNlc3RvcjtcbiAgICBzZWxlY3Rpb246IFJhbmdlO1xuICAgIGRlY29yYXRpb25zOiBSYW5nZVtdO1xuICAgIGRlY29yYXRlOiAoZW50cnk6IE5vZGVFbnRyeSkgPT4gUmFuZ2VbXTtcbiAgICByZWFkb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZUVsZW1lbnRDb250ZXh0PFQgZXh0ZW5kcyBFbGVtZW50ID0gRWxlbWVudD4ge1xuICAgIGVsZW1lbnQ6IFQ7XG4gICAgc2VsZWN0aW9uOiBSYW5nZSB8IG51bGw7XG4gICAgZGVjb3JhdGlvbnM6IFJhbmdlW107XG4gICAgYXR0cmlidXRlczogU2xhdGVFbGVtZW50QXR0cmlidXRlcztcbiAgICBkZWNvcmF0ZTogKGVudHJ5OiBOb2RlRW50cnkpID0+IFJhbmdlW107XG4gICAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVUZXh0Q29udGV4dDxUIGV4dGVuZHMgVGV4dCA9IFRleHQ+IHtcbiAgICB0ZXh0OiBUO1xuICAgIGRlY29yYXRpb25zOiBSYW5nZVtdO1xuICAgIGlzTGFzdDogYm9vbGVhbjtcbiAgICBwYXJlbnQ6IEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVMZWFmQ29udGV4dCB7XG4gICAgbGVhZjogVGV4dDtcbiAgICB0ZXh0OiBUZXh0O1xuICAgIHBhcmVudDogRWxlbWVudDtcbiAgICBpc0xhc3Q6IGJvb2xlYW47XG4gICAgaW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZUVsZW1lbnRBdHRyaWJ1dGVzIHtcbiAgICAnZGF0YS1zbGF0ZS1ub2RlJzogJ2VsZW1lbnQnO1xuICAgICdkYXRhLXNsYXRlLXZvaWQnPzogYm9vbGVhbjtcbiAgICAnZGF0YS1zbGF0ZS1pbmxpbmUnPzogYm9vbGVhbjtcbiAgICBjb250ZW50ZWRpdGFibGU/OiBib29sZWFuO1xuICAgICdkYXRhLXNsYXRlLWtleSc/OiBzdHJpbmc7XG4gICAgZGlyPzogJ3J0bCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVTdHJpbmdDb250ZXh0IHtcbiAgICB0ZXh0OiBzdHJpbmc7XG4gICAgZWxlbWVudFN0cmluZ0xlbmd0aDogbnVtYmVyO1xuICAgIHR5cGU6ICdzdHJpbmcnIHwgJ2xpbmVCcmVha0VtcHR5U3RyaW5nJztcbn1cbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3BhY2thZ2VzL3NyYy92aWV3L2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vZGVFbnRyeSwgUmFuZ2UsIEVsZW1lbnQsIEFuY2VzdG9yLCBUZXh0LCBQYXRoIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgU2xhdGVTdHJpbmdUZW1wbGF0ZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvc3RyaW5nL3RlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBbmd1bGFyRWRpdG9yIH0gZnJvbSAnLi4vcGx1Z2lucy9hbmd1bGFyLWVkaXRvcic7XG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBWaWV3VHlwZSB9IGZyb20gJy4uL3R5cGVzL3ZpZXcnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnRDb21wb25lbnQsIEJhc2VMZWFmQ29tcG9uZW50LCBCYXNlVGV4dENvbXBvbmVudCB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVWaWV3Q29udGV4dDxUIGV4dGVuZHMgQW5ndWxhckVkaXRvciA9IEFuZ3VsYXJFZGl0b3I+IHtcbiAgICBlZGl0b3I6IFQ7XG4gICAgdGVtcGxhdGVDb21wb25lbnQ6IFNsYXRlU3RyaW5nVGVtcGxhdGU7XG4gICAgZGVmYXVsdEVsZW1lbnQ6IENvbXBvbmVudFR5cGU8QmFzZUVsZW1lbnRDb21wb25lbnQ+O1xuICAgIGRlZmF1bHRUZXh0OiBDb21wb25lbnRUeXBlPEJhc2VUZXh0Q29tcG9uZW50PjtcbiAgICBkZWZhdWx0Vm9pZFRleHQ6IENvbXBvbmVudFR5cGU8QmFzZVRleHRDb21wb25lbnQ+O1xuICAgIGRlZmF1bHRMZWFmOiBDb21wb25lbnRUeXBlPEJhc2VMZWFmQ29tcG9uZW50PjtcbiAgICB0cmFja0J5OiAoZWxlbWVudDogRWxlbWVudCkgPT4gYW55O1xuICAgIHJlbmRlckVsZW1lbnQ/OiAoZWxlbWVudDogRWxlbWVudCkgPT4gVmlld1R5cGU7XG4gICAgcmVuZGVyTGVhZj86ICh0ZXh0OiBUZXh0KSA9PiBWaWV3VHlwZTtcbiAgICByZW5kZXJUZXh0PzogKHRleHQ6IFRleHQpID0+IFZpZXdUeXBlO1xuICAgIGlzU3RyaWN0RGVjb3JhdGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVDaGlsZHJlbkNvbnRleHQge1xuICAgIHBhcmVudDogQW5jZXN0b3I7XG4gICAgc2VsZWN0aW9uOiBSYW5nZTtcbiAgICBkZWNvcmF0aW9uczogUmFuZ2VbXTtcbiAgICBkZWNvcmF0ZTogKGVudHJ5OiBOb2RlRW50cnkpID0+IFJhbmdlW107XG4gICAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVFbGVtZW50Q29udGV4dDxUIGV4dGVuZHMgRWxlbWVudCA9IEVsZW1lbnQ+IHtcbiAgICBlbGVtZW50OiBUO1xuICAgIHNlbGVjdGlvbjogUmFuZ2UgfCBudWxsO1xuICAgIGRlY29yYXRpb25zOiBSYW5nZVtdO1xuICAgIGF0dHJpYnV0ZXM6IFNsYXRlRWxlbWVudEF0dHJpYnV0ZXM7XG4gICAgY29udGVudEVkaXRhYmxlPzogYm9vbGVhbjtcbiAgICBkZWNvcmF0ZTogKGVudHJ5OiBOb2RlRW50cnkpID0+IFJhbmdlW107XG4gICAgcmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVUZXh0Q29udGV4dDxUIGV4dGVuZHMgVGV4dCA9IFRleHQ+IHtcbiAgICB0ZXh0OiBUO1xuICAgIGRlY29yYXRpb25zOiBSYW5nZVtdO1xuICAgIGlzTGFzdDogYm9vbGVhbjtcbiAgICBwYXJlbnQ6IEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xhdGVMZWFmQ29udGV4dCB7XG4gICAgbGVhZjogVGV4dDtcbiAgICB0ZXh0OiBUZXh0O1xuICAgIHBhcmVudDogRWxlbWVudDtcbiAgICBpc0xhc3Q6IGJvb2xlYW47XG4gICAgaW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbGF0ZUVsZW1lbnRBdHRyaWJ1dGVzIHtcbiAgICAnZGF0YS1zbGF0ZS1ub2RlJzogJ2VsZW1lbnQnO1xuICAgICdkYXRhLXNsYXRlLXZvaWQnPzogYm9vbGVhbjtcbiAgICAnZGF0YS1zbGF0ZS1pbmxpbmUnPzogYm9vbGVhbjtcbiAgICAnZGF0YS1zbGF0ZS1rZXknPzogc3RyaW5nO1xuICAgIGRpcj86ICdydGwnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYXRlU3RyaW5nQ29udGV4dCB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGVsZW1lbnRTdHJpbmdMZW5ndGg6IG51bWJlcjtcbiAgICB0eXBlOiAnc3RyaW5nJyB8ICdsaW5lQnJlYWtFbXB0eVN0cmluZyc7XG59XG4iXX0=
@@ -0,0 +1,107 @@
1
+ import { Text } from 'slate';
2
+ import { IterableDiffers } from '@angular/core';
3
+ import { createEmbeddedViewOrComponent, getRootNodes, mount, mountOnItemChange, updateContext } from './utils';
4
+ export class LeavesRender {
5
+ constructor(viewContext, viewContainerRef, getOutletParent, getOutletElement) {
6
+ this.viewContext = viewContext;
7
+ this.viewContainerRef = viewContainerRef;
8
+ this.getOutletParent = getOutletParent;
9
+ this.getOutletElement = getOutletElement;
10
+ this.views = [];
11
+ this.contexts = [];
12
+ this.viewTypes = [];
13
+ }
14
+ initialize(context) {
15
+ const { leaves, contexts } = this.getLeaves(context);
16
+ this.leaves = leaves;
17
+ this.contexts = contexts;
18
+ this.leaves.forEach((leaf, index) => {
19
+ const context = getContext(index, this.contexts);
20
+ const viewType = getViewType(context, this.viewContext);
21
+ const view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
22
+ this.views.push(view);
23
+ this.contexts.push(context);
24
+ this.viewTypes.push(viewType);
25
+ });
26
+ mount(this.views, null, this.getOutletParent(), this.getOutletElement());
27
+ const newDiffers = this.viewContainerRef.injector.get(IterableDiffers);
28
+ this.differ = newDiffers.find(this.leaves).create(trackBy(this.viewContext));
29
+ this.differ.diff(this.leaves);
30
+ }
31
+ update(context) {
32
+ const { leaves, contexts } = this.getLeaves(context);
33
+ const outletParent = this.getOutletParent();
34
+ const diffResult = this.differ.diff(leaves);
35
+ if (diffResult) {
36
+ let firstRootNode = getRootNodes(this.views[0])[0];
37
+ const newContexts = [];
38
+ const newViewTypes = [];
39
+ const newViews = [];
40
+ diffResult.forEachItem(record => {
41
+ let context = getContext(record.currentIndex, contexts);
42
+ const viewType = getViewType(context, this.viewContext);
43
+ newViewTypes.push(viewType);
44
+ let view;
45
+ if (record.previousIndex === null) {
46
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
47
+ newContexts.push(context);
48
+ newViews.push(view);
49
+ mountOnItemChange(record.currentIndex, record.item, newViews, null, outletParent, firstRootNode, this.viewContext);
50
+ }
51
+ else {
52
+ const previousView = this.views[record.previousIndex];
53
+ const previousViewType = this.viewTypes[record.previousIndex];
54
+ if (previousViewType !== viewType) {
55
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
56
+ const firstRootNode = getRootNodes(previousView, null)[0];
57
+ const newRootNodes = getRootNodes(view, null);
58
+ firstRootNode.replaceWith(...newRootNodes);
59
+ previousView.destroy();
60
+ }
61
+ else {
62
+ view = previousView;
63
+ updateContext(previousView, context, this.viewContext);
64
+ }
65
+ newContexts.push(context);
66
+ newViews.push(view);
67
+ }
68
+ });
69
+ diffResult.forEachRemovedItem(record => {
70
+ const view = this.views[record.previousIndex];
71
+ view.destroy();
72
+ });
73
+ diffResult.forEachMovedItem(record => {
74
+ mountOnItemChange(record.currentIndex, record.item, newViews, null, outletParent, firstRootNode, this.viewContext);
75
+ });
76
+ this.viewTypes = newViewTypes;
77
+ this.views = newViews;
78
+ this.contexts = newContexts;
79
+ this.leaves = leaves;
80
+ }
81
+ }
82
+ getLeaves(context) {
83
+ const leaves = Text.decorations(context.text, context.decorations);
84
+ const contexts = leaves.map((leaf, index) => {
85
+ return {
86
+ leaf,
87
+ text: context.text,
88
+ parent: context.parent,
89
+ index,
90
+ isLast: context.isLast && index === leaves.length - 1
91
+ };
92
+ });
93
+ return { leaves, contexts };
94
+ }
95
+ }
96
+ export function getContext(index, leafContexts) {
97
+ return leafContexts[index];
98
+ }
99
+ export function getViewType(leafContext, viewContext) {
100
+ return (viewContext.renderLeaf && viewContext.renderLeaf(leafContext.leaf)) || viewContext.defaultLeaf;
101
+ }
102
+ export function trackBy(viewContext) {
103
+ return (index, node) => {
104
+ return index;
105
+ };
106
+ }
107
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVhdmVzLXJlbmRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3NyYy92aWV3L3JlbmRlci9sZWF2ZXMtcmVuZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDN0IsT0FBTyxFQUFpRCxlQUFlLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBR2pILE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUvRyxNQUFNLE9BQU8sWUFBWTtJQU9yQixZQUNZLFdBQTZCLEVBQzdCLGdCQUFrQyxFQUNsQyxlQUFrQyxFQUNsQyxnQkFBbUM7UUFIbkMsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFUdkMsVUFBSyxHQUFpRCxFQUFFLENBQUM7UUFDekQsYUFBUSxHQUF1QixFQUFFLENBQUM7UUFDbEMsY0FBUyxHQUFlLEVBQUUsQ0FBQztJQVFoQyxDQUFDO0lBRUcsVUFBVSxDQUFDLE9BQXlCO1FBQ3ZDLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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SUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDO0FBQzNHLENBQUM7QUFFRCxNQUFNLFVBQVUsT0FBTyxDQUFDLFdBQTZCO0lBQ2pELE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDbkIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRleHQgfSBmcm9tICdzbGF0ZSc7XG5pbXBvcnQgeyBDb21wb25lbnRSZWYsIEVtYmVkZGVkVmlld1JlZiwgSXRlcmFibGVEaWZmZXIsIEl0ZXJhYmxlRGlmZmVycywgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICcuLi8uLi90eXBlcy92aWV3JztcbmltcG9ydCB7IFNsYXRlTGVhZkNvbnRleHQsIFNsYXRlVGV4dENvbnRleHQsIFNsYXRlVmlld0NvbnRleHQgfSBmcm9tICcuLi9jb250ZXh0JztcbmltcG9ydCB7IGNyZWF0ZUVtYmVkZGVkVmlld09yQ29tcG9uZW50LCBnZXRSb290Tm9kZXMsIG1vdW50LCBtb3VudE9uSXRlbUNoYW5nZSwgdXBkYXRlQ29udGV4dCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgTGVhdmVzUmVuZGVyIHtcbiAgICBwcml2YXRlIGxlYXZlczogVGV4dFtdO1xuICAgIHByaXZhdGUgdmlld3M6IChFbWJlZGRlZFZpZXdSZWY8YW55PiB8IENvbXBvbmVudFJlZjxhbnk+KVtdID0gW107XG4gICAgcHJpdmF0ZSBjb250ZXh0czogU2xhdGVMZWFmQ29udGV4dFtdID0gW107XG4gICAgcHJpdmF0ZSB2aWV3VHlwZXM6IFZpZXdUeXBlW10gPSBbXTtcbiAgICBwcml2YXRlIGRpZmZlcjogSXRlcmFibGVEaWZmZXI8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHZpZXdDb250ZXh0OiBTbGF0ZVZpZXdDb250ZXh0LFxuICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByaXZhdGUgZ2V0T3V0bGV0UGFyZW50OiAoKSA9PiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBnZXRPdXRsZXRFbGVtZW50OiAoKSA9PiBIVE1MRWxlbWVudFxuICAgICkge31cblxuICAgIHB1YmxpYyBpbml0aWFsaXplKGNvbnRleHQ6IFNsYXRlVGV4dENvbnRleHQpIHtcbiAgICAgICAgY29uc3QgeyBsZWF2ZXMsIGNvbnRleHRzIH0gPSB0aGlzLmdldExlYXZlcyhjb250ZXh0KTtcbiAgICAgICAgdGhpcy5sZWF2ZXMgPSBsZWF2ZXM7XG4gICAgICAgIHRoaXMuY29udGV4dHMgPSBjb250ZXh0cztcbiAgICAgICAgdGhpcy5sZWF2ZXMuZm9yRWFjaCgobGVhZiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KGluZGV4LCB0aGlzLmNvbnRleHRzKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdUeXBlID0gZ2V0Vmlld1R5cGUoY29udGV4dCwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gY3JlYXRlRW1iZWRkZWRWaWV3T3JDb21wb25lbnQodmlld1R5cGUsIGNvbnRleHQsIHRoaXMudmlld0NvbnRleHQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgICAgICB0aGlzLnZpZXdzLnB1c2godmlldyk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICB0aGlzLnZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vdW50KHRoaXMudmlld3MsIG51bGwsIHRoaXMuZ2V0T3V0bGV0UGFyZW50KCksIHRoaXMuZ2V0T3V0bGV0RWxlbWVudCgpKTtcbiAgICAgICAgY29uc3QgbmV3RGlmZmVycyA9IHRoaXMudmlld0NvbnRhaW5lclJlZi5pbmplY3Rvci5nZXQoSXRlcmFibGVEaWZmZXJzKTtcbiAgICAgICAgdGhpcy5kaWZmZXIgPSBuZXdEaWZmZXJzLmZpbmQodGhpcy5sZWF2ZXMpLmNyZWF0ZSh0cmFja0J5KHRoaXMudmlld0NvbnRleHQpKTtcbiAgICAgICAgdGhpcy5kaWZmZXIuZGlmZih0aGlzLmxlYXZlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShjb250ZXh0OiBTbGF0ZVRleHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IHsgbGVhdmVzLCBjb250ZXh0cyB9ID0gdGhpcy5nZXRMZWF2ZXMoY29udGV4dCk7XG4gICAgICAgIGNvbnN0IG91dGxldFBhcmVudCA9IHRoaXMuZ2V0T3V0bGV0UGFyZW50KCk7XG4gICAgICAgIGNvbnN0IGRpZmZSZXN1bHQgPSB0aGlzLmRpZmZlci5kaWZmKGxlYXZlcyk7XG4gICAgICAgIGlmIChkaWZmUmVzdWx0KSB7XG4gICAgICAgICAgICBsZXQgZmlyc3RSb290Tm9kZSA9IGdldFJvb3ROb2Rlcyh0aGlzLnZpZXdzWzBdKVswXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzID0gW107XG4gICAgICAgICAgICBjb25zdCBuZXdWaWV3VHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZpZXdzID0gW107XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hJdGVtKHJlY29yZCA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBnZXRDb250ZXh0KHJlY29yZC5jdXJyZW50SW5kZXgsIGNvbnRleHRzKTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKGNvbnRleHQsIHRoaXMudmlld0NvbnRleHQpO1xuICAgICAgICAgICAgICAgIG5ld1ZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT4gfCBDb21wb25lbnRSZWY8YW55PjtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldyA9IGNyZWF0ZUVtYmVkZGVkVmlld09yQ29tcG9uZW50KHZpZXdUeXBlLCBjb250ZXh0LCB0aGlzLnZpZXdDb250ZXh0LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgICAgICBuZXdDb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBtb3VudE9uSXRlbUNoYW5nZShyZWNvcmQuY3VycmVudEluZGV4LCByZWNvcmQuaXRlbSwgbmV3Vmlld3MsIG51bGwsIG91dGxldFBhcmVudCwgZmlyc3RSb290Tm9kZSwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNWaWV3ID0gdGhpcy52aWV3c1tyZWNvcmQucHJldmlvdXNJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmlld1R5cGUgPSB0aGlzLnZpZXdUeXBlc1tyZWNvcmQucHJldmlvdXNJbmRleF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1ZpZXdUeXBlICE9PSB2aWV3VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGNyZWF0ZUVtYmVkZGVkVmlld09yQ29tcG9uZW50KHZpZXdUeXBlLCBjb250ZXh0LCB0aGlzLnZpZXdDb250ZXh0LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb290Tm9kZSA9IGdldFJvb3ROb2RlcyhwcmV2aW91c1ZpZXcsIG51bGwpWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Um9vdE5vZGVzID0gZ2V0Um9vdE5vZGVzKHZpZXcsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb290Tm9kZS5yZXBsYWNlV2l0aCguLi5uZXdSb290Tm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBwcmV2aW91c1ZpZXc7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250ZXh0KHByZXZpb3VzVmlldywgY29udGV4dCwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Vmlld3MucHVzaCh2aWV3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRpZmZSZXN1bHQuZm9yRWFjaFJlbW92ZWRJdGVtKHJlY29yZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld3NbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hNb3ZlZEl0ZW0ocmVjb3JkID0+IHtcbiAgICAgICAgICAgICAgICBtb3VudE9uSXRlbUNoYW5nZShyZWNvcmQuY3VycmVudEluZGV4LCByZWNvcmQuaXRlbSwgbmV3Vmlld3MsIG51bGwsIG91dGxldFBhcmVudCwgZmlyc3RSb290Tm9kZSwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudmlld1R5cGVzID0gbmV3Vmlld1R5cGVzO1xuICAgICAgICAgICAgdGhpcy52aWV3cyA9IG5ld1ZpZXdzO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ld0NvbnRleHRzO1xuICAgICAgICAgICAgdGhpcy5sZWF2ZXMgPSBsZWF2ZXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldExlYXZlcyhjb250ZXh0OiBTbGF0ZVRleHRDb250ZXh0KSB7XG4gICAgICAgIGNvbnN0IGxlYXZlcyA9IFRleHQuZGVjb3JhdGlvbnMoY29udGV4dC50ZXh0LCBjb250ZXh0LmRlY29yYXRpb25zKTtcbiAgICAgICAgY29uc3QgY29udGV4dHMgPSBsZWF2ZXMubWFwKChsZWFmLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsZWFmLFxuICAgICAgICAgICAgICAgIHRleHQ6IGNvbnRleHQudGV4dCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGNvbnRleHQucGFyZW50LFxuICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgIGlzTGFzdDogY29udGV4dC5pc0xhc3QgJiYgaW5kZXggPT09IGxlYXZlcy5sZW5ndGggLSAxXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgbGVhdmVzLCBjb250ZXh0cyB9O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRleHQoaW5kZXg6IG51bWJlciwgbGVhZkNvbnRleHRzOiBTbGF0ZUxlYWZDb250ZXh0W10pOiBTbGF0ZUxlYWZDb250ZXh0IHtcbiAgICByZXR1cm4gbGVhZkNvbnRleHRzW2luZGV4XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdUeXBlKGxlYWZDb250ZXh0OiBTbGF0ZUxlYWZDb250ZXh0LCB2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCkge1xuICAgIHJldHVybiAodmlld0NvbnRleHQucmVuZGVyTGVhZiAmJiB2aWV3Q29udGV4dC5yZW5kZXJMZWFmKGxlYWZDb250ZXh0LmxlYWYpKSB8fCB2aWV3Q29udGV4dC5kZWZhdWx0TGVhZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYWNrQnkodmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHQpIHtcbiAgICByZXR1cm4gKGluZGV4LCBub2RlKSA9PiB7XG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9O1xufVxuIl19
@@ -0,0 +1,292 @@
1
+ import { Range, Editor, Element } from 'slate';
2
+ import { IterableDiffers } from '@angular/core';
3
+ import { AngularEditor } from '../../plugins/angular-editor';
4
+ import { SlateErrorCode } from '../../types/error';
5
+ import { NODE_TO_INDEX, NODE_TO_PARENT } from '../../utils/weak-maps';
6
+ import { isDecoratorRangeListEqual } from '../../utils/range-list';
7
+ import { SlateBlockCard } from '../../components/block-card/block-card.component';
8
+ import { createEmbeddedViewOrComponent, executeAfterViewInit, getRootNodes, mount, mountOnItemChange, updateContext } from './utils';
9
+ export class ListRender {
10
+ constructor(viewContext, viewContainerRef, getOutletParent, getOutletElement) {
11
+ this.viewContext = viewContext;
12
+ this.viewContainerRef = viewContainerRef;
13
+ this.getOutletParent = getOutletParent;
14
+ this.getOutletElement = getOutletElement;
15
+ this.views = [];
16
+ this.addedViews = [];
17
+ this.blockCards = [];
18
+ this.contexts = [];
19
+ this.viewTypes = [];
20
+ this.differ = null;
21
+ this.initialized = false;
22
+ }
23
+ initialize(children, parent, childrenContext) {
24
+ this.initialized = true;
25
+ this.children = children;
26
+ const parentPath = AngularEditor.findPath(this.viewContext.editor, parent);
27
+ children.forEach((descendant, index) => {
28
+ NODE_TO_INDEX.set(descendant, index);
29
+ NODE_TO_PARENT.set(descendant, parent);
30
+ const context = getContext(index, descendant, parentPath, childrenContext, this.viewContext);
31
+ const viewType = getViewType(descendant, parent, this.viewContext);
32
+ const view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
33
+ const blockCard = createBlockCard(descendant, view, this.viewContainerRef, this.viewContext);
34
+ this.views.push(view);
35
+ this.addedViews.push(view);
36
+ this.contexts.push(context);
37
+ this.viewTypes.push(viewType);
38
+ this.blockCards.push(blockCard);
39
+ });
40
+ mount(this.views, this.blockCards, this.getOutletParent(), this.getOutletElement());
41
+ const newDiffers = this.viewContainerRef.injector.get(IterableDiffers);
42
+ this.differ = newDiffers.find(children).create(trackBy(this.viewContext));
43
+ this.differ.diff(children);
44
+ if (parent === this.viewContext.editor) {
45
+ this.afterViewInit();
46
+ }
47
+ }
48
+ update(children, parent, childrenContext) {
49
+ if (!this.initialized || this.children.length === 0) {
50
+ this.initialize(children, parent, childrenContext);
51
+ return;
52
+ }
53
+ if (!this.differ) {
54
+ throw new Error('Exception: Can not find differ ');
55
+ }
56
+ const outletParent = this.getOutletParent();
57
+ const diffResult = this.differ.diff(children);
58
+ const parentPath = AngularEditor.findPath(this.viewContext.editor, parent);
59
+ if (diffResult) {
60
+ let firstRootNode = getRootNodes(this.views[0], this.blockCards[0])[0];
61
+ const newContexts = [];
62
+ const newViewTypes = [];
63
+ const newViews = [];
64
+ const newBlockCards = [];
65
+ diffResult.forEachItem(record => {
66
+ NODE_TO_INDEX.set(record.item, record.currentIndex);
67
+ NODE_TO_PARENT.set(record.item, parent);
68
+ let context = getContext(record.currentIndex, record.item, parentPath, childrenContext, this.viewContext);
69
+ const viewType = getViewType(record.item, parent, this.viewContext);
70
+ newViewTypes.push(viewType);
71
+ let view;
72
+ let blockCard;
73
+ if (record.previousIndex === null) {
74
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
75
+ blockCard = createBlockCard(record.item, view, this.viewContainerRef, this.viewContext);
76
+ newContexts.push(context);
77
+ newViews.push(view);
78
+ this.addedViews.push(view);
79
+ newBlockCards.push(blockCard);
80
+ mountOnItemChange(record.currentIndex, record.item, newViews, newBlockCards, outletParent, firstRootNode, this.viewContext);
81
+ }
82
+ else {
83
+ const previousView = this.views[record.previousIndex];
84
+ const previousViewType = this.viewTypes[record.previousIndex];
85
+ const previousContext = this.contexts[record.previousIndex];
86
+ const previousBlockCard = this.blockCards[record.previousIndex];
87
+ if (previousViewType !== viewType) {
88
+ view = createEmbeddedViewOrComponent(viewType, context, this.viewContext, this.viewContainerRef);
89
+ this.addedViews.push(view);
90
+ blockCard = createBlockCard(record.item, view, this.viewContainerRef, this.viewContext);
91
+ const firstRootNode = getRootNodes(previousView, previousBlockCard)[0];
92
+ const newRootNodes = getRootNodes(view, blockCard);
93
+ firstRootNode.replaceWith(...newRootNodes);
94
+ previousView.destroy();
95
+ previousBlockCard?.destroy();
96
+ }
97
+ else {
98
+ view = previousView;
99
+ blockCard = previousBlockCard;
100
+ if (memoizedContext(this.viewContext, record.item, previousContext, context)) {
101
+ context = previousContext;
102
+ }
103
+ else {
104
+ updateContext(previousView, context, this.viewContext);
105
+ }
106
+ }
107
+ newContexts.push(context);
108
+ newViews.push(view);
109
+ newBlockCards.push(blockCard);
110
+ }
111
+ });
112
+ diffResult.forEachOperation(record => {
113
+ // removed
114
+ if (record.currentIndex === null) {
115
+ const view = this.views[record.previousIndex];
116
+ const blockCard = this.blockCards[record.previousIndex];
117
+ view.destroy();
118
+ blockCard?.destroy();
119
+ }
120
+ // moved
121
+ if (record.previousIndex !== null && record.currentIndex !== null) {
122
+ mountOnItemChange(record.currentIndex, record.item, newViews, newBlockCards, outletParent, firstRootNode, this.viewContext);
123
+ // Solve the block-card DOMElement loss when moving nodes
124
+ newBlockCards[record.currentIndex]?.instance.append();
125
+ }
126
+ });
127
+ this.viewTypes = newViewTypes;
128
+ this.views = newViews;
129
+ this.contexts = newContexts;
130
+ this.children = children;
131
+ this.blockCards = newBlockCards;
132
+ if (parent === this.viewContext.editor) {
133
+ this.afterViewInit();
134
+ }
135
+ }
136
+ else {
137
+ const newContexts = [];
138
+ this.children.forEach((child, index) => {
139
+ NODE_TO_INDEX.set(child, index);
140
+ NODE_TO_PARENT.set(child, parent);
141
+ let context = getContext(index, child, parentPath, childrenContext, this.viewContext);
142
+ const previousContext = this.contexts[index];
143
+ if (memoizedContext(this.viewContext, child, previousContext, context)) {
144
+ context = previousContext;
145
+ }
146
+ else {
147
+ updateContext(this.views[index], context, this.viewContext);
148
+ }
149
+ newContexts.push(context);
150
+ });
151
+ this.contexts = newContexts;
152
+ }
153
+ }
154
+ afterViewInit() {
155
+ this.addedViews.forEach(view => {
156
+ executeAfterViewInit(view);
157
+ });
158
+ this.addedViews = [];
159
+ }
160
+ destroy() {
161
+ this.children.forEach((element, index) => {
162
+ if (this.views[index]) {
163
+ this.views[index].destroy();
164
+ }
165
+ if (this.blockCards[index]) {
166
+ this.blockCards[index].destroy();
167
+ }
168
+ });
169
+ this.views = [];
170
+ this.blockCards = [];
171
+ this.contexts = [];
172
+ this.viewTypes = [];
173
+ this.initialized = false;
174
+ this.differ = null;
175
+ }
176
+ }
177
+ export function getContext(index, item, parentPath, childrenContext, viewContext) {
178
+ if (Element.isElement(item)) {
179
+ const computedContext = getCommonContext(index, item, parentPath, viewContext, childrenContext);
180
+ const key = AngularEditor.findKey(viewContext.editor, item);
181
+ const isInline = viewContext.editor.isInline(item);
182
+ const isVoid = viewContext.editor.isVoid(item);
183
+ const elementContext = {
184
+ element: item,
185
+ ...computedContext,
186
+ attributes: {
187
+ 'data-slate-node': 'element',
188
+ 'data-slate-key': key.id
189
+ },
190
+ decorate: childrenContext.decorate,
191
+ readonly: childrenContext.readonly
192
+ };
193
+ if (isInline) {
194
+ elementContext.attributes['data-slate-inline'] = true;
195
+ }
196
+ if (isVoid) {
197
+ elementContext.attributes['data-slate-void'] = true;
198
+ elementContext.contentEditable = false;
199
+ }
200
+ return elementContext;
201
+ }
202
+ else {
203
+ const computedContext = getCommonContext(index, item, parentPath, viewContext, childrenContext);
204
+ const isLeafBlock = AngularEditor.isLeafBlock(viewContext.editor, childrenContext.parent);
205
+ const textContext = {
206
+ decorations: computedContext.decorations,
207
+ isLast: isLeafBlock && index === childrenContext.parent.children.length - 1,
208
+ parent: childrenContext.parent,
209
+ text: item
210
+ };
211
+ return textContext;
212
+ }
213
+ }
214
+ export function getCommonContext(index, item, parentPath, viewContext, childrenContext) {
215
+ const p = parentPath.concat(index);
216
+ try {
217
+ const ds = childrenContext.decorate([item, p]);
218
+ // [list-render] performance optimization: reduce the number of calls to the `Editor.range(viewContext.editor, p)` method
219
+ if (childrenContext.selection || childrenContext.decorations.length > 0) {
220
+ const range = Editor.range(viewContext.editor, p);
221
+ const sel = childrenContext.selection && Range.intersection(range, childrenContext.selection);
222
+ for (const dec of childrenContext.decorations) {
223
+ const d = Range.intersection(dec, range);
224
+ if (d) {
225
+ ds.push(d);
226
+ }
227
+ }
228
+ return { selection: sel, decorations: ds };
229
+ }
230
+ else {
231
+ return { selection: null, decorations: ds };
232
+ }
233
+ }
234
+ catch (error) {
235
+ viewContext.editor.onError({
236
+ code: SlateErrorCode.GetStartPointError,
237
+ nativeError: error
238
+ });
239
+ return { selection: null, decorations: [] };
240
+ }
241
+ }
242
+ export function getViewType(item, parent, viewContext) {
243
+ if (Element.isElement(item)) {
244
+ return (viewContext.renderElement && viewContext.renderElement(item)) || viewContext.defaultElement;
245
+ }
246
+ else {
247
+ const isVoid = viewContext.editor.isVoid(parent);
248
+ return isVoid ? viewContext.defaultVoidText : (viewContext.renderText && viewContext.renderText(item)) || viewContext.defaultText;
249
+ }
250
+ }
251
+ export function createBlockCard(item, view, viewContainerRef, viewContext) {
252
+ const isBlockCard = viewContext.editor.isBlockCard(item);
253
+ if (isBlockCard) {
254
+ const rootNodes = getRootNodes(view);
255
+ const blockCardComponentRef = viewContainerRef.createComponent(SlateBlockCard, {
256
+ injector: viewContainerRef.injector
257
+ });
258
+ blockCardComponentRef.instance.initializeCenter(rootNodes);
259
+ blockCardComponentRef.changeDetectorRef.detectChanges();
260
+ return blockCardComponentRef;
261
+ }
262
+ else {
263
+ return null;
264
+ }
265
+ }
266
+ export function trackBy(viewContext) {
267
+ return (index, node) => {
268
+ return viewContext.trackBy(node) || AngularEditor.findKey(viewContext.editor, node);
269
+ };
270
+ }
271
+ export function memoizedContext(viewContext, descendant, prev, next) {
272
+ if (Element.isElement(descendant)) {
273
+ return memoizedElementContext(viewContext, prev, next);
274
+ }
275
+ else {
276
+ return memoizedTextContext(prev, next);
277
+ }
278
+ }
279
+ export function memoizedElementContext(viewContext, prev, next) {
280
+ return (prev.element === next.element &&
281
+ (!viewContext.isStrictDecorate || prev.decorate === next.decorate) &&
282
+ prev.readonly === next.readonly &&
283
+ isDecoratorRangeListEqual(prev.decorations, next.decorations) &&
284
+ (prev.selection === next.selection || (!!prev.selection && !!next.selection && Range.equals(prev.selection, next.selection))));
285
+ }
286
+ export function memoizedTextContext(prev, next) {
287
+ return (next.parent === prev.parent &&
288
+ next.isLast === prev.isLast &&
289
+ next.text === prev.text &&
290
+ isDecoratorRangeListEqual(next.decorations, prev.decorations));
291
+ }
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1yZW5kZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9zcmMvdmlldy9yZW5kZXIvbGlzdC1yZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3QixLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBUSxNQUFNLE9BQU8sQ0FBQztBQUMzRSxPQUFPLEVBQWlELGVBQWUsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFHakgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsb0JBQW9CLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFckksTUFBTSxPQUFPLFVBQVU7SUFVbkIsWUFDWSxXQUE2QixFQUM3QixnQkFBa0MsRUFDbEMsZUFBa0MsRUFDbEMsZ0JBQTBDO1FBSDFDLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLG9CQUFlLEdBQWYsZUFBZSxDQUFtQjtRQUNsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQTBCO1FBWjlDLFVBQUssR0FBaUQsRUFBRSxDQUFDO1FBQ3pELGVBQVUsR0FBaUQsRUFBRSxDQUFDO1FBQzlELGVBQVUsR0FBNEMsRUFBRSxDQUFDO1FBQ3pELGFBQVEsR0FBK0MsRUFBRSxDQUFDO1FBQzFELGNBQVMsR0FBZSxFQUFFLENBQUM7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QXlCO0lBQ3RILE9BQU8sQ0FDSCxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPO1FBQzdCLENBQUMsQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFFBQVE7UUFDL0IseUJBQXlCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzdELENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQ2hJLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQXNCLEVBQUUsSUFBc0I7SUFDOUUsT0FBTyxDQUNILElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07UUFDM0IsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsTUFBTTtRQUMzQixJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJO1FBQ3ZCLHlCQUF5QixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUNoRSxDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFuY2VzdG9yLCBEZXNjZW5kYW50LCBSYW5nZSwgRWRpdG9yLCBFbGVtZW50LCBQYXRoIH0gZnJvbSAnc2xhdGUnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsIEl0ZXJhYmxlRGlmZmVyLCBJdGVyYWJsZURpZmZlcnMsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZpZXdUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMvdmlldyc7XG5pbXBvcnQgeyBTbGF0ZUNoaWxkcmVuQ29udGV4dCwgU2xhdGVFbGVtZW50Q29udGV4dCwgU2xhdGVUZXh0Q29udGV4dCwgU2xhdGVWaWV3Q29udGV4dCB9IGZyb20gJy4uL2NvbnRleHQnO1xuaW1wb3J0IHsgQW5ndWxhckVkaXRvciB9IGZyb20gJy4uLy4uL3BsdWdpbnMvYW5ndWxhci1lZGl0b3InO1xuaW1wb3J0IHsgU2xhdGVFcnJvckNvZGUgfSBmcm9tICcuLi8uLi90eXBlcy9lcnJvcic7XG5pbXBvcnQgeyBOT0RFX1RPX0lOREVYLCBOT0RFX1RPX1BBUkVOVCB9IGZyb20gJy4uLy4uL3V0aWxzL3dlYWstbWFwcyc7XG5pbXBvcnQgeyBpc0RlY29yYXRvclJhbmdlTGlzdEVxdWFsIH0gZnJvbSAnLi4vLi4vdXRpbHMvcmFuZ2UtbGlzdCc7XG5pbXBvcnQgeyBTbGF0ZUJsb2NrQ2FyZCB9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYmxvY2stY2FyZC9ibG9jay1jYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBjcmVhdGVFbWJlZGRlZFZpZXdPckNvbXBvbmVudCwgZXhlY3V0ZUFmdGVyVmlld0luaXQsIGdldFJvb3ROb2RlcywgbW91bnQsIG1vdW50T25JdGVtQ2hhbmdlLCB1cGRhdGVDb250ZXh0IH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjbGFzcyBMaXN0UmVuZGVyIHtcbiAgICBwcml2YXRlIGNoaWxkcmVuOiBEZXNjZW5kYW50W107XG4gICAgcHJpdmF0ZSB2aWV3czogKEVtYmVkZGVkVmlld1JlZjxhbnk+IHwgQ29tcG9uZW50UmVmPGFueT4pW10gPSBbXTtcbiAgICBwcml2YXRlIGFkZGVkVmlld3M6IChFbWJlZGRlZFZpZXdSZWY8YW55PiB8IENvbXBvbmVudFJlZjxhbnk+KVtdID0gW107XG4gICAgcHJpdmF0ZSBibG9ja0NhcmRzOiAoQ29tcG9uZW50UmVmPFNsYXRlQmxvY2tDYXJkPiB8IG51bGwpW10gPSBbXTtcbiAgICBwcml2YXRlIGNvbnRleHRzOiAoU2xhdGVUZXh0Q29udGV4dCB8IFNsYXRlRWxlbWVudENvbnRleHQpW10gPSBbXTtcbiAgICBwcml2YXRlIHZpZXdUeXBlczogVmlld1R5cGVbXSA9IFtdO1xuICAgIHByaXZhdGUgZGlmZmVyOiBJdGVyYWJsZURpZmZlcjxhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCxcbiAgICAgICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIGdldE91dGxldFBhcmVudDogKCkgPT4gSFRNTEVsZW1lbnQsXG4gICAgICAgIHByaXZhdGUgZ2V0T3V0bGV0RWxlbWVudDogKCkgPT4gSFRNTEVsZW1lbnQgfCBudWxsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGluaXRpYWxpemUoY2hpbGRyZW46IERlc2NlbmRhbnRbXSwgcGFyZW50OiBBbmNlc3RvciwgY2hpbGRyZW5Db250ZXh0OiBTbGF0ZUNoaWxkcmVuQ29udGV4dCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICBjb25zdCBwYXJlbnRQYXRoID0gQW5ndWxhckVkaXRvci5maW5kUGF0aCh0aGlzLnZpZXdDb250ZXh0LmVkaXRvciwgcGFyZW50KTtcbiAgICAgICAgY2hpbGRyZW4uZm9yRWFjaCgoZGVzY2VuZGFudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIE5PREVfVE9fSU5ERVguc2V0KGRlc2NlbmRhbnQsIGluZGV4KTtcbiAgICAgICAgICAgIE5PREVfVE9fUEFSRU5ULnNldChkZXNjZW5kYW50LCBwYXJlbnQpO1xuICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQoaW5kZXgsIGRlc2NlbmRhbnQsIHBhcmVudFBhdGgsIGNoaWxkcmVuQ29udGV4dCwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKGRlc2NlbmRhbnQsIHBhcmVudCwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICBjb25zdCB2aWV3ID0gY3JlYXRlRW1iZWRkZWRWaWV3T3JDb21wb25lbnQodmlld1R5cGUsIGNvbnRleHQsIHRoaXMudmlld0NvbnRleHQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgICAgICBjb25zdCBibG9ja0NhcmQgPSBjcmVhdGVCbG9ja0NhcmQoZGVzY2VuZGFudCwgdmlldywgdGhpcy52aWV3Q29udGFpbmVyUmVmLCB0aGlzLnZpZXdDb250ZXh0KTtcbiAgICAgICAgICAgIHRoaXMudmlld3MucHVzaCh2aWV3KTtcbiAgICAgICAgICAgIHRoaXMuYWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgdGhpcy52aWV3VHlwZXMucHVzaCh2aWV3VHlwZSk7XG4gICAgICAgICAgICB0aGlzLmJsb2NrQ2FyZHMucHVzaChibG9ja0NhcmQpO1xuICAgICAgICB9KTtcbiAgICAgICAgbW91bnQodGhpcy52aWV3cywgdGhpcy5ibG9ja0NhcmRzLCB0aGlzLmdldE91dGxldFBhcmVudCgpLCB0aGlzLmdldE91dGxldEVsZW1lbnQoKSk7XG4gICAgICAgIGNvbnN0IG5ld0RpZmZlcnMgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IuZ2V0KEl0ZXJhYmxlRGlmZmVycyk7XG4gICAgICAgIHRoaXMuZGlmZmVyID0gbmV3RGlmZmVycy5maW5kKGNoaWxkcmVuKS5jcmVhdGUodHJhY2tCeSh0aGlzLnZpZXdDb250ZXh0KSk7XG4gICAgICAgIHRoaXMuZGlmZmVyLmRpZmYoY2hpbGRyZW4pO1xuICAgICAgICBpZiAocGFyZW50ID09PSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvcikge1xuICAgICAgICAgICAgdGhpcy5hZnRlclZpZXdJbml0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdXBkYXRlKGNoaWxkcmVuOiBEZXNjZW5kYW50W10sIHBhcmVudDogQW5jZXN0b3IsIGNoaWxkcmVuQ29udGV4dDogU2xhdGVDaGlsZHJlbkNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkIHx8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemUoY2hpbGRyZW4sIHBhcmVudCwgY2hpbGRyZW5Db250ZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZGlmZmVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4Y2VwdGlvbjogQ2FuIG5vdCBmaW5kIGRpZmZlciAnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvdXRsZXRQYXJlbnQgPSB0aGlzLmdldE91dGxldFBhcmVudCgpO1xuICAgICAgICBjb25zdCBkaWZmUmVzdWx0ID0gdGhpcy5kaWZmZXIuZGlmZihjaGlsZHJlbik7XG4gICAgICAgIGNvbnN0IHBhcmVudFBhdGggPSBBbmd1bGFyRWRpdG9yLmZpbmRQYXRoKHRoaXMudmlld0NvbnRleHQuZWRpdG9yLCBwYXJlbnQpO1xuICAgICAgICBpZiAoZGlmZlJlc3VsdCkge1xuICAgICAgICAgICAgbGV0IGZpcnN0Um9vdE5vZGUgPSBnZXRSb290Tm9kZXModGhpcy52aWV3c1swXSwgdGhpcy5ibG9ja0NhcmRzWzBdKVswXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRleHRzID0gW107XG4gICAgICAgICAgICBjb25zdCBuZXdWaWV3VHlwZXMgPSBbXTtcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZpZXdzID0gW107XG4gICAgICAgICAgICBjb25zdCBuZXdCbG9ja0NhcmRzOiAoQ29tcG9uZW50UmVmPFNsYXRlQmxvY2tDYXJkPiB8IG51bGwpW10gPSBbXTtcbiAgICAgICAgICAgIGRpZmZSZXN1bHQuZm9yRWFjaEl0ZW0ocmVjb3JkID0+IHtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX0lOREVYLnNldChyZWNvcmQuaXRlbSwgcmVjb3JkLmN1cnJlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgTk9ERV9UT19QQVJFTlQuc2V0KHJlY29yZC5pdGVtLCBwYXJlbnQpO1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0ID0gZ2V0Q29udGV4dChyZWNvcmQuY3VycmVudEluZGV4LCByZWNvcmQuaXRlbSwgcGFyZW50UGF0aCwgY2hpbGRyZW5Db250ZXh0LCB0aGlzLnZpZXdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3VHlwZSA9IGdldFZpZXdUeXBlKHJlY29yZC5pdGVtLCBwYXJlbnQsIHRoaXMudmlld0NvbnRleHQpO1xuICAgICAgICAgICAgICAgIG5ld1ZpZXdUeXBlcy5wdXNoKHZpZXdUeXBlKTtcbiAgICAgICAgICAgICAgICBsZXQgdmlldzogRW1iZWRkZWRWaWV3UmVmPGFueT4gfCBDb21wb25lbnRSZWY8YW55PjtcbiAgICAgICAgICAgICAgICBsZXQgYmxvY2tDYXJkOiBDb21wb25lbnRSZWY8U2xhdGVCbG9ja0NhcmQ+IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlldyA9IGNyZWF0ZUVtYmVkZGVkVmlld09yQ29tcG9uZW50KHZpZXdUeXBlLCBjb250ZXh0LCB0aGlzLnZpZXdDb250ZXh0LCB0aGlzLnZpZXdDb250YWluZXJSZWYpO1xuICAgICAgICAgICAgICAgICAgICBibG9ja0NhcmQgPSBjcmVhdGVCbG9ja0NhcmQocmVjb3JkLml0ZW0sIHZpZXcsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1ZpZXdzLnB1c2godmlldyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBuZXdCbG9ja0NhcmRzLnB1c2goYmxvY2tDYXJkKTtcbiAgICAgICAgICAgICAgICAgICAgbW91bnRPbkl0ZW1DaGFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrQ2FyZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGV4dFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzVmlldyA9IHRoaXMudmlld3NbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1ZpZXdUeXBlID0gdGhpcy52aWV3VHlwZXNbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3JlY29yZC5wcmV2aW91c0luZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNCbG9ja0NhcmQgPSB0aGlzLmJsb2NrQ2FyZHNbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNWaWV3VHlwZSAhPT0gdmlld1R5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcgPSBjcmVhdGVFbWJlZGRlZFZpZXdPckNvbXBvbmVudCh2aWV3VHlwZSwgY29udGV4dCwgdGhpcy52aWV3Q29udGV4dCwgdGhpcy52aWV3Q29udGFpbmVyUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tDYXJkID0gY3JlYXRlQmxvY2tDYXJkKHJlY29yZC5pdGVtLCB2aWV3LCB0aGlzLnZpZXdDb250YWluZXJSZWYsIHRoaXMudmlld0NvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RSb290Tm9kZSA9IGdldFJvb3ROb2RlcyhwcmV2aW91c1ZpZXcsIHByZXZpb3VzQmxvY2tDYXJkKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Jvb3ROb2RlcyA9IGdldFJvb3ROb2Rlcyh2aWV3LCBibG9ja0NhcmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb290Tm9kZS5yZXBsYWNlV2l0aCguLi5uZXdSb290Tm9kZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNWaWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQmxvY2tDYXJkPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3ID0gcHJldmlvdXNWaWV3O1xuICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tDYXJkID0gcHJldmlvdXNCbG9ja0NhcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtb2l6ZWRDb250ZXh0KHRoaXMudmlld0NvbnRleHQsIHJlY29yZC5pdGVtLCBwcmV2aW91c0NvbnRleHQgYXMgYW55LCBjb250ZXh0IGFzIGFueSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gcHJldmlvdXNDb250ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250ZXh0KHByZXZpb3VzVmlldywgY29udGV4dCwgdGhpcy52aWV3Q29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3Vmlld3MucHVzaCh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tDYXJkcy5wdXNoKGJsb2NrQ2FyZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkaWZmUmVzdWx0LmZvckVhY2hPcGVyYXRpb24ocmVjb3JkID0+IHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmlldyA9IHRoaXMudmlld3NbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9ja0NhcmQgPSB0aGlzLmJsb2NrQ2FyZHNbcmVjb3JkLnByZXZpb3VzSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tDYXJkPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ICE9PSBudWxsICYmIHJlY29yZC5jdXJyZW50SW5kZXggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbW91bnRPbkl0ZW1DaGFuZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLml0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdWaWV3cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jsb2NrQ2FyZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRsZXRQYXJlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFJvb3ROb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3Q29udGV4dFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAvLyBTb2x2ZSB0aGUgYmxvY2stY2FyZCBET01FbGVtZW50IGxvc3Mgd2hlbiBtb3Zpbmcgbm9kZXNcbiAgICAgICAgICAgICAgICAgICAgbmV3QmxvY2tDYXJkc1tyZWNvcmQuY3VycmVudEluZGV4XT8uaW5zdGFuY2UuYXBwZW5kKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnZpZXdUeXBlcyA9IG5ld1ZpZXdUeXBlcztcbiAgICAgICAgICAgIHRoaXMudmlld3MgPSBuZXdWaWV3cztcbiAgICAgICAgICAgIHRoaXMuY29udGV4dHMgPSBuZXdDb250ZXh0cztcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkcyA9IG5ld0Jsb2NrQ2FyZHM7XG4gICAgICAgICAgICBpZiAocGFyZW50ID09PSB0aGlzLnZpZXdDb250ZXh0LmVkaXRvcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWZ0ZXJWaWV3SW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV3Q29udGV4dHMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgTk9ERV9UT19JTkRFWC5zZXQoY2hpbGQsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBOT0RFX1RPX1BBUkVOVC5zZXQoY2hpbGQsIHBhcmVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBnZXRDb250ZXh0KGluZGV4LCBjaGlsZCwgcGFyZW50UGF0aCwgY2hpbGRyZW5Db250ZXh0LCB0aGlzLnZpZXdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBpZiAobWVtb2l6ZWRDb250ZXh0KHRoaXMudmlld0NvbnRleHQsIGNoaWxkLCBwcmV2aW91c0NvbnRleHQgYXMgYW55LCBjb250ZXh0IGFzIGFueSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IHByZXZpb3VzQ29udGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250ZXh0KHRoaXMudmlld3NbaW5kZXhdLCBjb250ZXh0LCB0aGlzLnZpZXdDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3Q29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0cyA9IG5ld0NvbnRleHRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuYWRkZWRWaWV3cy5mb3JFYWNoKHZpZXcgPT4ge1xuICAgICAgICAgICAgZXhlY3V0ZUFmdGVyVmlld0luaXQodmlldyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZGVkVmlld3MgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChlbGVtZW50OiBFbGVtZW50LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdzW2luZGV4XS5kZXN0cm95KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5ibG9ja0NhcmRzW2luZGV4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYmxvY2tDYXJkc1tpbmRleF0uZGVzdHJveSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy52aWV3cyA9IFtdO1xuICAgICAgICB0aGlzLmJsb2NrQ2FyZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb250ZXh0cyA9IFtdO1xuICAgICAgICB0aGlzLnZpZXdUeXBlcyA9IFtdO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlmZmVyID0gbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250ZXh0KFxuICAgIGluZGV4OiBudW1iZXIsXG4gICAgaXRlbTogRGVzY2VuZGFudCxcbiAgICBwYXJlbnRQYXRoOiBQYXRoLFxuICAgIGNoaWxkcmVuQ29udGV4dDogU2xhdGVDaGlsZHJlbkNvbnRleHQsXG4gICAgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHRcbik6IFNsYXRlRWxlbWVudENvbnRleHQgfCBTbGF0ZVRleHRDb250ZXh0IHtcbiAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQoaXRlbSkpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gZ2V0Q29tbW9uQ29udGV4dChpbmRleCwgaXRlbSwgcGFyZW50UGF0aCwgdmlld0NvbnRleHQsIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IGtleSA9IEFuZ3VsYXJFZGl0b3IuZmluZEtleSh2aWV3Q29udGV4dC5lZGl0b3IsIGl0ZW0pO1xuICAgICAgICBjb25zdCBpc0lubGluZSA9IHZpZXdDb250ZXh0LmVkaXRvci5pc0lubGluZShpdGVtKTtcbiAgICAgICAgY29uc3QgaXNWb2lkID0gdmlld0NvbnRleHQuZWRpdG9yLmlzVm9pZChpdGVtKTtcbiAgICAgICAgY29uc3QgZWxlbWVudENvbnRleHQ6IFNsYXRlRWxlbWVudENvbnRleHQgPSB7XG4gICAgICAgICAgICBlbGVtZW50OiBpdGVtLFxuICAgICAgICAgICAgLi4uY29tcHV0ZWRDb250ZXh0LFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICdkYXRhLXNsYXRlLW5vZGUnOiAnZWxlbWVudCcsXG4gICAgICAgICAgICAgICAgJ2RhdGEtc2xhdGUta2V5Jzoga2V5LmlkXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVjb3JhdGU6IGNoaWxkcmVuQ29udGV4dC5kZWNvcmF0ZSxcbiAgICAgICAgICAgIHJlYWRvbmx5OiBjaGlsZHJlbkNvbnRleHQucmVhZG9ubHlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGlzSW5saW5lKSB7XG4gICAgICAgICAgICBlbGVtZW50Q29udGV4dC5hdHRyaWJ1dGVzWydkYXRhLXNsYXRlLWlubGluZSddID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNWb2lkKSB7XG4gICAgICAgICAgICBlbGVtZW50Q29udGV4dC5hdHRyaWJ1dGVzWydkYXRhLXNsYXRlLXZvaWQnXSA9IHRydWU7XG4gICAgICAgICAgICBlbGVtZW50Q29udGV4dC5jb250ZW50RWRpdGFibGUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudENvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRDb250ZXh0ID0gZ2V0Q29tbW9uQ29udGV4dChpbmRleCwgaXRlbSwgcGFyZW50UGF0aCwgdmlld0NvbnRleHQsIGNoaWxkcmVuQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IGlzTGVhZkJsb2NrID0gQW5ndWxhckVkaXRvci5pc0xlYWZCbG9jayh2aWV3Q29udGV4dC5lZGl0b3IsIGNoaWxkcmVuQ29udGV4dC5wYXJlbnQpO1xuICAgICAgICBjb25zdCB0ZXh0Q29udGV4dDogU2xhdGVUZXh0Q29udGV4dCA9IHtcbiAgICAgICAgICAgIGRlY29yYXRpb25zOiBjb21wdXRlZENvbnRleHQuZGVjb3JhdGlvbnMsXG4gICAgICAgICAgICBpc0xhc3Q6IGlzTGVhZkJsb2NrICYmIGluZGV4ID09PSBjaGlsZHJlbkNvbnRleHQucGFyZW50LmNoaWxkcmVuLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICBwYXJlbnQ6IGNoaWxkcmVuQ29udGV4dC5wYXJlbnQgYXMgRWxlbWVudCxcbiAgICAgICAgICAgIHRleHQ6IGl0ZW1cbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHRleHRDb250ZXh0O1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbW1vbkNvbnRleHQoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBpdGVtOiBEZXNjZW5kYW50LFxuICAgIHBhcmVudFBhdGg6IFBhdGgsXG4gICAgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHQsXG4gICAgY2hpbGRyZW5Db250ZXh0OiBTbGF0ZUNoaWxkcmVuQ29udGV4dFxuKTogeyBzZWxlY3Rpb246IFJhbmdlOyBkZWNvcmF0aW9uczogUmFuZ2VbXSB9IHtcbiAgICBjb25zdCBwID0gcGFyZW50UGF0aC5jb25jYXQoaW5kZXgpO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGRzID0gY2hpbGRyZW5Db250ZXh0LmRlY29yYXRlKFtpdGVtLCBwXSk7XG4gICAgICAgIC8vIFtsaXN0LXJlbmRlcl0gcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uOiByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0byB0aGUgYEVkaXRvci5yYW5nZSh2aWV3Q29udGV4dC5lZGl0b3IsIHApYCBtZXRob2RcbiAgICAgICAgaWYgKGNoaWxkcmVuQ29udGV4dC5zZWxlY3Rpb24gfHwgY2hpbGRyZW5Db250ZXh0LmRlY29yYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gRWRpdG9yLnJhbmdlKHZpZXdDb250ZXh0LmVkaXRvciwgcCk7XG4gICAgICAgICAgICBjb25zdCBzZWwgPSBjaGlsZHJlbkNvbnRleHQuc2VsZWN0aW9uICYmIFJhbmdlLmludGVyc2VjdGlvbihyYW5nZSwgY2hpbGRyZW5Db250ZXh0LnNlbGVjdGlvbik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlYyBvZiBjaGlsZHJlbkNvbnRleHQuZGVjb3JhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkID0gUmFuZ2UuaW50ZXJzZWN0aW9uKGRlYywgcmFuZ2UpO1xuICAgICAgICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRzLnB1c2goZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgc2VsZWN0aW9uOiBzZWwsIGRlY29yYXRpb25zOiBkcyB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2VsZWN0aW9uOiBudWxsLCBkZWNvcmF0aW9uczogZHMgfTtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHZpZXdDb250ZXh0LmVkaXRvci5vbkVycm9yKHtcbiAgICAgICAgICAgIGNvZGU6IFNsYXRlRXJyb3JDb2RlLkdldFN0YXJ0UG9pbnRFcnJvcixcbiAgICAgICAgICAgIG5hdGl2ZUVycm9yOiBlcnJvclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgc2VsZWN0aW9uOiBudWxsLCBkZWNvcmF0aW9uczogW10gfTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWaWV3VHlwZShpdGVtOiBEZXNjZW5kYW50LCBwYXJlbnQ6IEFuY2VzdG9yLCB2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCkge1xuICAgIGlmIChFbGVtZW50LmlzRWxlbWVudChpdGVtKSkge1xuICAgICAgICByZXR1cm4gKHZpZXdDb250ZXh0LnJlbmRlckVsZW1lbnQgJiYgdmlld0NvbnRleHQucmVuZGVyRWxlbWVudChpdGVtKSkgfHwgdmlld0NvbnRleHQuZGVmYXVsdEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaXNWb2lkID0gdmlld0NvbnRleHQuZWRpdG9yLmlzVm9pZChwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIHJldHVybiBpc1ZvaWQgPyB2aWV3Q29udGV4dC5kZWZhdWx0Vm9pZFRleHQgOiAodmlld0NvbnRleHQucmVuZGVyVGV4dCAmJiB2aWV3Q29udGV4dC5yZW5kZXJUZXh0KGl0ZW0pKSB8fCB2aWV3Q29udGV4dC5kZWZhdWx0VGV4dDtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCbG9ja0NhcmQoXG4gICAgaXRlbTogRGVzY2VuZGFudCxcbiAgICB2aWV3OiBFbWJlZGRlZFZpZXdSZWY8YW55PiB8IENvbXBvbmVudFJlZjxhbnk+LFxuICAgIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgdmlld0NvbnRleHQ6IFNsYXRlVmlld0NvbnRleHRcbikge1xuICAgIGNvbnN0IGlzQmxvY2tDYXJkID0gdmlld0NvbnRleHQuZWRpdG9yLmlzQmxvY2tDYXJkKGl0ZW0pO1xuICAgIGlmIChpc0Jsb2NrQ2FyZCkge1xuICAgICAgICBjb25zdCByb290Tm9kZXMgPSBnZXRSb290Tm9kZXModmlldyk7XG4gICAgICAgIGNvbnN0IGJsb2NrQ2FyZENvbXBvbmVudFJlZiA9IHZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50PFNsYXRlQmxvY2tDYXJkPihTbGF0ZUJsb2NrQ2FyZCwge1xuICAgICAgICAgICAgaW5qZWN0b3I6IHZpZXdDb250YWluZXJSZWYuaW5qZWN0b3JcbiAgICAgICAgfSk7XG4gICAgICAgIGJsb2NrQ2FyZENvbXBvbmVudFJlZi5pbnN0YW5jZS5pbml0aWFsaXplQ2VudGVyKHJvb3ROb2Rlcyk7XG4gICAgICAgIGJsb2NrQ2FyZENvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIHJldHVybiBibG9ja0NhcmRDb21wb25lbnRSZWY7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdHJhY2tCeSh2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCkge1xuICAgIHJldHVybiAoaW5kZXgsIG5vZGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHZpZXdDb250ZXh0LnRyYWNrQnkobm9kZSkgfHwgQW5ndWxhckVkaXRvci5maW5kS2V5KHZpZXdDb250ZXh0LmVkaXRvciwgbm9kZSk7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lbW9pemVkQ29udGV4dChcbiAgICB2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCxcbiAgICBkZXNjZW5kYW50OiBEZXNjZW5kYW50LFxuICAgIHByZXY6IFNsYXRlRWxlbWVudENvbnRleHQgfCBTbGF0ZVRleHRDb250ZXh0LFxuICAgIG5leHQ6IFNsYXRlRWxlbWVudENvbnRleHQgfCBTbGF0ZVRleHRDb250ZXh0XG4pOiBib29sZWFuIHtcbiAgICBpZiAoRWxlbWVudC5pc0VsZW1lbnQoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkRWxlbWVudENvbnRleHQodmlld0NvbnRleHQsIHByZXYgYXMgU2xhdGVFbGVtZW50Q29udGV4dCwgbmV4dCBhcyBTbGF0ZUVsZW1lbnRDb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUZXh0Q29udGV4dChwcmV2IGFzIFNsYXRlVGV4dENvbnRleHQsIG5leHQgYXMgU2xhdGVUZXh0Q29udGV4dCk7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZWRFbGVtZW50Q29udGV4dCh2aWV3Q29udGV4dDogU2xhdGVWaWV3Q29udGV4dCwgcHJldjogU2xhdGVFbGVtZW50Q29udGV4dCwgbmV4dDogU2xhdGVFbGVtZW50Q29udGV4dCkge1xuICAgIHJldHVybiAoXG4gICAgICAgIHByZXYuZWxlbWVudCA9PT0gbmV4dC5lbGVtZW50ICYmXG4gICAgICAgICghdmlld0NvbnRleHQuaXNTdHJpY3REZWNvcmF0ZSB8fCBwcmV2LmRlY29yYXRlID09PSBuZXh0LmRlY29yYXRlKSAmJlxuICAgICAgICBwcmV2LnJlYWRvbmx5ID09PSBuZXh0LnJlYWRvbmx5ICYmXG4gICAgICAgIGlzRGVjb3JhdG9yUmFuZ2VMaXN0RXF1YWwocHJldi5kZWNvcmF0aW9ucywgbmV4dC5kZWNvcmF0aW9ucykgJiZcbiAgICAgICAgKHByZXYuc2VsZWN0aW9uID09PSBuZXh0LnNlbGVjdGlvbiB8fCAoISFwcmV2LnNlbGVjdGlvbiAmJiAhIW5leHQuc2VsZWN0aW9uICYmIFJhbmdlLmVxdWFscyhwcmV2LnNlbGVjdGlvbiwgbmV4dC5zZWxlY3Rpb24pKSlcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVtb2l6ZWRUZXh0Q29udGV4dChwcmV2OiBTbGF0ZVRleHRDb250ZXh0LCBuZXh0OiBTbGF0ZVRleHRDb250ZXh0KSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgbmV4dC5wYXJlbnQgPT09IHByZXYucGFyZW50ICYmXG4gICAgICAgIG5leHQuaXNMYXN0ID09PSBwcmV2LmlzTGFzdCAmJlxuICAgICAgICBuZXh0LnRleHQgPT09IHByZXYudGV4dCAmJlxuICAgICAgICBpc0RlY29yYXRvclJhbmdlTGlzdEVxdWFsKG5leHQuZGVjb3JhdGlvbnMsIHByZXYuZGVjb3JhdGlvbnMpXG4gICAgKTtcbn1cbiJdfQ==