@plait/mind 0.8.0 → 0.10.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.
- package/README.md +132 -13
- package/base/base.drawer.d.ts +4 -3
- package/constants/default.d.ts +1 -1
- package/constants/node-topic-style.d.ts +1 -0
- package/drawer/node-active.drawer.d.ts +13 -0
- package/drawer/node-collapse.drawer.d.ts +8 -0
- package/drawer/{emojis.drawer.d.ts → node-emojis.drawer.d.ts} +1 -1
- package/drawer/{quick-insert.drawer.d.ts → node-insert.drawer.d.ts} +2 -2
- package/esm2020/base/base.drawer.mjs +13 -1
- package/esm2020/constants/default.mjs +2 -2
- package/esm2020/constants/node-rule.mjs +1 -1
- package/esm2020/constants/node-topic-style.mjs +2 -1
- package/esm2020/drawer/node-active.drawer.mjs +43 -0
- package/esm2020/drawer/node-collapse.drawer.mjs +108 -0
- package/esm2020/drawer/node-emojis.drawer.mjs +72 -0
- package/esm2020/drawer/node-insert.drawer.mjs +98 -0
- package/esm2020/interfaces/element.mjs +5 -2
- package/esm2020/mind.component.mjs +2 -1
- package/esm2020/mind.module.mjs +5 -5
- package/esm2020/node.component.mjs +57 -424
- package/esm2020/plugins/with-abstract-resize.mjs +3 -3
- package/esm2020/plugins/with-mind-create.mjs +23 -15
- package/esm2020/plugins/with-mind.mjs +9 -8
- package/esm2020/plugins/with-node-dnd.mjs +7 -4
- package/esm2020/plugins/with-node-hover.mjs +65 -0
- package/esm2020/transforms/node.mjs +10 -7
- package/esm2020/utils/abstract/resize.mjs +4 -6
- package/esm2020/utils/dnd/common.mjs +8 -2
- package/esm2020/utils/draw/node-dnd.mjs +3 -3
- package/esm2020/utils/mind.mjs +4 -4
- package/esm2020/utils/node/adjust-node.mjs +4 -5
- package/esm2020/utils/node/common.mjs +3 -3
- package/esm2020/utils/node/create-node.mjs +4 -3
- package/fesm2015/plait-mind.mjs +567 -857
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +567 -845
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/interfaces/element.d.ts +1 -0
- package/mind.module.d.ts +2 -2
- package/node.component.d.ts +15 -31
- package/package.json +1 -1
- package/plugins/with-mind-create.d.ts +3 -5
- package/plugins/with-node-dnd.d.ts +1 -1
- package/plugins/with-node-hover.d.ts +5 -0
- package/styles/mixins.scss +13 -15
- package/styles/styles.scss +12 -16
- package/utils/abstract/resize.d.ts +2 -2
- package/utils/node/common.d.ts +1 -1
- package/esm2020/drawer/emojis.drawer.mjs +0 -72
- package/esm2020/drawer/quick-insert.drawer.mjs +0 -211
- package/esm2020/utils/draw/node-topic.mjs +0 -32
- package/utils/draw/node-topic.d.ts +0 -16
package/interfaces/element.d.ts
CHANGED
|
@@ -39,6 +39,7 @@ export declare const MindElement: {
|
|
|
39
39
|
findParentNode(element: MindElement): import("@plait/mind").MindNode | undefined;
|
|
40
40
|
hasEmojis(element: MindElement): element is MindElement<EmojiData>;
|
|
41
41
|
getEmojis(element: MindElement<EmojiData>): import("./element-data").EmojiItem[];
|
|
42
|
+
getEditor(element: MindElement): import("slate").BaseEditor & import("slate-angular").AngularEditor & import("slate-history").HistoryEditor;
|
|
42
43
|
};
|
|
43
44
|
export declare enum MindElementShape {
|
|
44
45
|
roundRectangle = "round-rectangle",
|
package/mind.module.d.ts
CHANGED
|
@@ -2,10 +2,10 @@ import * as i0 from "@angular/core";
|
|
|
2
2
|
import * as i1 from "./mind.component";
|
|
3
3
|
import * as i2 from "./node.component";
|
|
4
4
|
import * as i3 from "@angular/common";
|
|
5
|
-
import * as i4 from "@plait/
|
|
5
|
+
import * as i4 from "@plait/text";
|
|
6
6
|
import * as i5 from "@plait/core";
|
|
7
7
|
export declare class MindModule {
|
|
8
8
|
static ɵfac: i0.ɵɵFactoryDeclaration<MindModule, never>;
|
|
9
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<MindModule, [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent], [typeof i3.CommonModule, typeof i4.
|
|
9
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<MindModule, [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent], [typeof i3.CommonModule, typeof i4.TextModule, typeof i5.PlaitModule], [typeof i1.PlaitMindComponent, typeof i2.MindNodeComponent]>;
|
|
10
10
|
static ɵinj: i0.ɵɵInjectorDeclaration<MindModule>;
|
|
11
11
|
}
|
package/node.component.d.ts
CHANGED
|
@@ -1,61 +1,45 @@
|
|
|
1
|
-
import { ChangeDetectorRef,
|
|
1
|
+
import { ChangeDetectorRef, OnDestroy, OnInit, ViewContainerRef } from '@angular/core';
|
|
2
2
|
import { PlaitPluginElementComponent, PlaitPluginElementContext, OnContextChanged } from '@plait/core';
|
|
3
|
-
import {
|
|
3
|
+
import { TextManage } from '@plait/text';
|
|
4
4
|
import { RoughSVG } from 'roughjs/bin/svg';
|
|
5
5
|
import { Subject } from 'rxjs';
|
|
6
6
|
import { MindElement } from './interfaces/element';
|
|
7
7
|
import { MindNode } from './interfaces/node';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { NodeEmojisDrawer } from './drawer/node-emojis.drawer';
|
|
9
|
+
import { NodeInsertDrawer } from './drawer/node-insert.drawer';
|
|
10
10
|
import { PlaitMindBoard } from './plugins/with-mind.board';
|
|
11
|
-
import {
|
|
11
|
+
import { NodeActiveDrawer } from './drawer/node-active.drawer';
|
|
12
|
+
import { CollapseDrawer } from './drawer/node-collapse.drawer';
|
|
12
13
|
import * as i0 from "@angular/core";
|
|
13
14
|
export declare class MindNodeComponent extends PlaitPluginElementComponent<MindElement, PlaitMindBoard> implements OnInit, OnDestroy, OnContextChanged<MindElement, PlaitMindBoard> {
|
|
14
15
|
private viewContainerRef;
|
|
15
16
|
protected cdr: ChangeDetectorRef;
|
|
16
|
-
private render2;
|
|
17
|
-
private ngZone;
|
|
18
|
-
isEditable: boolean;
|
|
19
17
|
roughSVG: RoughSVG;
|
|
20
18
|
node: MindNode;
|
|
21
19
|
index: number;
|
|
22
|
-
abstractIncludedOutlineG?: SVGGElement;
|
|
23
20
|
parentG: SVGGElement;
|
|
24
|
-
activeG: SVGGElement[];
|
|
25
21
|
shapeG: SVGGElement | null;
|
|
26
22
|
linkG?: SVGGElement;
|
|
27
|
-
richtextG?: SVGGElement;
|
|
28
|
-
foreignObject?: SVGForeignObjectElement;
|
|
29
23
|
extendG?: SVGGElement;
|
|
30
|
-
maskG: SVGGElement;
|
|
31
|
-
richtextComponentRef?: ComponentRef<PlaitRichtextComponent>;
|
|
32
24
|
destroy$: Subject<void>;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
25
|
+
nodeEmojisDrawer: NodeEmojisDrawer;
|
|
26
|
+
nodeInsertDrawer: NodeInsertDrawer;
|
|
27
|
+
textManage: TextManage;
|
|
28
|
+
activeDrawer: NodeActiveDrawer;
|
|
29
|
+
collapseDrawer: CollapseDrawer;
|
|
30
|
+
constructor(viewContainerRef: ViewContainerRef, cdr: ChangeDetectorRef);
|
|
31
|
+
initializeDrawer(): void;
|
|
37
32
|
ngOnInit(): void;
|
|
33
|
+
editTopic(): void;
|
|
38
34
|
onContextChanged(value: PlaitPluginElementContext<MindElement, PlaitMindBoard>, previous: PlaitPluginElementContext<MindElement, PlaitMindBoard>): void;
|
|
39
35
|
drawEmojis(): void;
|
|
40
|
-
drawQuickInsert(): void;
|
|
41
36
|
drawShape(): void;
|
|
42
37
|
destroyShape(): void;
|
|
43
38
|
drawLink(): void;
|
|
44
39
|
destroyLine(): void;
|
|
45
|
-
drawMaskG(): void;
|
|
46
|
-
destroyMaskG(): void;
|
|
47
|
-
enableMaskG(): void;
|
|
48
|
-
disabledMaskG(): void;
|
|
49
|
-
drawActiveG(): void;
|
|
50
|
-
destroyActiveG(): void;
|
|
51
|
-
updateActiveClass(): void;
|
|
52
|
-
drawRichtext(): void;
|
|
53
40
|
drawExtend(): void;
|
|
54
41
|
destroyExtend(): void;
|
|
55
|
-
|
|
56
|
-
updateAbstractIncludedOutline(activeHandlePosition?: AbstractHandlePosition, resizingLocation?: number): void;
|
|
57
|
-
updateRichtext(): void;
|
|
58
|
-
startEditText(isEnd: boolean, isClear: boolean): void;
|
|
42
|
+
drawText(): void;
|
|
59
43
|
trackBy: (index: number, node: MindNode) => string;
|
|
60
44
|
ngOnDestroy(): void;
|
|
61
45
|
static ɵfac: i0.ɵɵFactoryDeclaration<MindNodeComponent, never>;
|
package/package.json
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
2
|
import { PlaitMindBoard } from './with-mind.board';
|
|
3
|
-
import {
|
|
4
|
-
import { PlaitRichtextComponent } from '@plait/richtext';
|
|
3
|
+
import { TextManage } from '@plait/text';
|
|
5
4
|
export interface FakeCreateNodeRef {
|
|
5
|
+
g: SVGGElement;
|
|
6
6
|
nodeG: SVGGElement;
|
|
7
|
-
|
|
8
|
-
foreignObject: SVGForeignObjectElement;
|
|
9
|
-
topicG: SVGGElement;
|
|
7
|
+
textManage: TextManage;
|
|
10
8
|
}
|
|
11
9
|
export declare const withCreateMind: (board: PlaitBoard) => PlaitBoard & PlaitMindBoard;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { PlaitBoard } from '@plait/core';
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const withNodeDnd: (board: PlaitBoard) => PlaitBoard;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PlaitBoard } from '@plait/core';
|
|
2
|
+
import { MindElement } from '../interfaces/element';
|
|
3
|
+
export declare const withNodeHover: (board: PlaitBoard) => PlaitBoard;
|
|
4
|
+
export declare const addHovered: (element: MindElement) => void;
|
|
5
|
+
export declare const removeHovered: (element: MindElement) => void;
|
package/styles/mixins.scss
CHANGED
|
@@ -1,31 +1,29 @@
|
|
|
1
|
-
@mixin node-color{
|
|
1
|
+
@mixin node-color {
|
|
2
2
|
&.theme-default,
|
|
3
3
|
&.theme-soft {
|
|
4
|
-
.
|
|
5
|
-
color: #333333;
|
|
6
|
-
}
|
|
7
|
-
.child-node {
|
|
4
|
+
.plait-richtext-container {
|
|
8
5
|
color: #333333;
|
|
9
6
|
}
|
|
10
7
|
}
|
|
11
8
|
|
|
12
9
|
&.theme-colorful,
|
|
13
10
|
&.theme-retro {
|
|
14
|
-
.root
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
color: #333333;
|
|
11
|
+
.root {
|
|
12
|
+
.plait-richtext-container {
|
|
13
|
+
color: #ffffff;
|
|
14
|
+
}
|
|
19
15
|
}
|
|
20
16
|
}
|
|
21
17
|
|
|
22
18
|
&.theme-dark,
|
|
23
19
|
&.theme-starry {
|
|
24
|
-
.
|
|
25
|
-
color: #333333;
|
|
26
|
-
}
|
|
27
|
-
.child-node {
|
|
20
|
+
.plait-richtext-container {
|
|
28
21
|
color: #ffffff;
|
|
29
22
|
}
|
|
23
|
+
.root {
|
|
24
|
+
.plait-richtext-container {
|
|
25
|
+
color: #333333;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
30
28
|
}
|
|
31
|
-
}
|
|
29
|
+
}
|
package/styles/styles.scss
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
$primary: #4e8afa;
|
|
4
4
|
|
|
5
5
|
g[plait-mindmap='true'] {
|
|
6
|
-
.
|
|
6
|
+
.slate-editable-container {
|
|
7
7
|
cursor: default;
|
|
8
8
|
min-width: 5px;
|
|
9
|
-
&[
|
|
9
|
+
&[contenteditable='true'] {
|
|
10
10
|
cursor: text;
|
|
11
11
|
max-width: 34em;
|
|
12
12
|
}
|
|
@@ -29,7 +29,7 @@ g[plait-mindmap='true'] {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
.plait-board-container {
|
|
32
|
-
&.focused:not(.selection-moving):not(.element-moving):not(.abstract-resizing-horizontal):not(.abstract-resizing-vertical):not(.pointer-mind) {
|
|
32
|
+
&.focused:not(.selection-moving):not(.element-moving):not(.abstract-resizing-horizontal):not(.abstract-resizing-vertical):not(.pointer-mind):not(.mind-node-dragging) {
|
|
33
33
|
.extend {
|
|
34
34
|
cursor: pointer;
|
|
35
35
|
&:hover {
|
|
@@ -47,14 +47,9 @@ g[plait-mindmap='true'] {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
&.pointer-hand {
|
|
50
|
-
svg {
|
|
50
|
+
.board-host-svg {
|
|
51
51
|
cursor: grab;
|
|
52
52
|
}
|
|
53
|
-
.zoom-toolbar {
|
|
54
|
-
svg {
|
|
55
|
-
cursor: pointer;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
53
|
.collapsed {
|
|
59
54
|
.extend:hover {
|
|
60
55
|
cursor: grab;
|
|
@@ -98,13 +93,6 @@ g[plait-mindmap='true'] {
|
|
|
98
93
|
position: initial;
|
|
99
94
|
align-items: center;
|
|
100
95
|
height: 100%;
|
|
101
|
-
::-moz-selection {
|
|
102
|
-
/* Code for Firefox */
|
|
103
|
-
background: none;
|
|
104
|
-
}
|
|
105
|
-
::selection {
|
|
106
|
-
background: none;
|
|
107
|
-
}
|
|
108
96
|
}
|
|
109
97
|
|
|
110
98
|
.fake-node {
|
|
@@ -117,5 +105,13 @@ g[plait-mindmap='true'] {
|
|
|
117
105
|
}
|
|
118
106
|
}
|
|
119
107
|
|
|
108
|
+
.root {
|
|
109
|
+
.plait-richtext-container {
|
|
110
|
+
font-size: 18px;
|
|
111
|
+
min-height: 25px;
|
|
112
|
+
line-height: 25px;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
120
116
|
@include mixins.node-color();
|
|
121
117
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PlaitBoard,
|
|
1
|
+
import { PlaitBoard, Point, RectangleClient } from '@plait/core';
|
|
2
2
|
import { MindElement } from '../../interfaces';
|
|
3
3
|
import { LayoutNode } from '@plait/layouts';
|
|
4
4
|
import { AbstractHandlePosition } from '../../plugins/with-abstract-resize.board';
|
|
@@ -20,4 +20,4 @@ export declare const getAbstractHandleRectangle: (rectangle: RectangleClient, is
|
|
|
20
20
|
width: number;
|
|
21
21
|
};
|
|
22
22
|
export declare function findLocationLeftIndex(board: PlaitBoard, parentChildren: MindElement[], location: number, isHorizontal: boolean): number;
|
|
23
|
-
export declare function handleTouchedAbstract(board: PlaitBoard, touchedAbstract:
|
|
23
|
+
export declare function handleTouchedAbstract(board: PlaitBoard, touchedAbstract: MindElement | undefined, endPoint: Point): MindElement<import("../../interfaces").BaseData> | undefined;
|
package/utils/node/common.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { MindElement } from '../../interfaces/element';
|
|
2
|
-
export declare function
|
|
2
|
+
export declare function editTopic(element: MindElement): void;
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { MindElement } from '../interfaces';
|
|
2
|
-
import { createForeignObject, createG } from '@plait/core';
|
|
3
|
-
import { getEmojiFontSize } from '../utils/space/emoji';
|
|
4
|
-
import { getEmojiForeignRectangle } from '../utils/position/emoji';
|
|
5
|
-
class EmojiDrawer {
|
|
6
|
-
constructor(board, viewContainerRef) {
|
|
7
|
-
this.board = board;
|
|
8
|
-
this.viewContainerRef = viewContainerRef;
|
|
9
|
-
this.componentRef = null;
|
|
10
|
-
}
|
|
11
|
-
draw(emoji, element) {
|
|
12
|
-
this.destroy();
|
|
13
|
-
const componentType = this.board.drawEmoji(emoji, element);
|
|
14
|
-
this.componentRef = this.viewContainerRef.createComponent(componentType);
|
|
15
|
-
this.componentRef.instance.emojiItem = emoji;
|
|
16
|
-
this.componentRef.instance.board = this.board;
|
|
17
|
-
this.componentRef.instance.element = element;
|
|
18
|
-
this.componentRef.instance.fontSize = getEmojiFontSize(element);
|
|
19
|
-
}
|
|
20
|
-
get nativeElement() {
|
|
21
|
-
if (this.componentRef) {
|
|
22
|
-
return this.componentRef.instance.nativeElement;
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
destroy() {
|
|
29
|
-
if (this.componentRef) {
|
|
30
|
-
this.componentRef.destroy();
|
|
31
|
-
this.componentRef = null;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export class EmojisDrawer {
|
|
36
|
-
constructor(board, viewContainerRef) {
|
|
37
|
-
this.board = board;
|
|
38
|
-
this.viewContainerRef = viewContainerRef;
|
|
39
|
-
this.emojiDrawers = [];
|
|
40
|
-
}
|
|
41
|
-
drawEmojis(element) {
|
|
42
|
-
this.destroy();
|
|
43
|
-
if (MindElement.hasEmojis(element)) {
|
|
44
|
-
this.g = createG();
|
|
45
|
-
this.g.classList.add('emojis');
|
|
46
|
-
const foreignRectangle = getEmojiForeignRectangle(this.board, element);
|
|
47
|
-
const foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
|
|
48
|
-
this.g.append(foreignObject);
|
|
49
|
-
const container = document.createElement('div');
|
|
50
|
-
container.classList.add('node-emojis-container');
|
|
51
|
-
foreignObject.append(container);
|
|
52
|
-
this.emojiDrawers = element.data.emojis.map(emojiItem => {
|
|
53
|
-
const drawer = new EmojiDrawer(this.board, this.viewContainerRef);
|
|
54
|
-
drawer.draw(emojiItem, element);
|
|
55
|
-
return drawer;
|
|
56
|
-
});
|
|
57
|
-
this.emojiDrawers.forEach(drawer => {
|
|
58
|
-
container.append(drawer.nativeElement);
|
|
59
|
-
});
|
|
60
|
-
return this.g;
|
|
61
|
-
}
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
destroy() {
|
|
65
|
-
if (this.g) {
|
|
66
|
-
this.g.remove();
|
|
67
|
-
}
|
|
68
|
-
this.emojiDrawers.forEach(drawer => drawer.destroy());
|
|
69
|
-
this.emojiDrawers = [];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1vamlzLmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9lbW9qaXMuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBd0IsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHbkUsTUFBTSxXQUFXO0lBR2IsWUFBb0IsS0FBcUIsRUFBVSxnQkFBa0M7UUFBakUsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFBVSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBRnJGLGlCQUFZLEdBQWdELElBQUksQ0FBQztJQUV1QixDQUFDO0lBRXpGLElBQUksQ0FBQyxLQUFnQixFQUFFLE9BQStCO1FBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNmLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFFB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bmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbW9qaURhdGEsIEVtb2ppSXRlbSwgTWluZEVsZW1lbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1pbmRFbW9qaUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9iYXNlL2Vtb2ppLWJhc2UuY29tcG9uZW50JztcbmltcG9ydCB7IGNyZWF0ZUZvcmVpZ25PYmplY3QsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBnZXRFbW9qaUZvbnRTaXplIH0gZnJvbSAnLi4vdXRpbHMvc3BhY2UvZW1vamknO1xuaW1wb3J0IHsgZ2V0RW1vamlGb3JlaWduUmVjdGFuZ2xlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vZW1vamknO1xuaW1wb3J0IHsgUGxhaXRNaW5kQm9hcmQgfSBmcm9tICcuLi9wbHVnaW5zL3dpdGgtbWluZC5ib2FyZCc7XG5cbmNsYXNzIEVtb2ppRHJhd2VyIHtcbiAgICBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNaW5kRW1vamlCYXNlQ29tcG9uZW50PiB8IG51bGwgPSBudWxsO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBib2FyZDogUGxhaXRNaW5kQm9hcmQsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICAgIGRyYXcoZW1vamk6IEVtb2ppSXRlbSwgZWxlbWVudDogTWluZEVsZW1lbnQ8RW1vamlEYXRhPikge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgY29tcG9uZW50VHlwZSA9IHRoaXMuYm9hcmQuZHJhd0Vtb2ppKGVtb2ppLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbW9qaUl0ZW0gPSBlbW9qaTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuYm9hcmQgPSB0aGlzLmJvYXJkO1xuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuZm9udFNpemUgPSBnZXRFbW9qaUZvbnRTaXplKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIGdldCBuYXRpdmVFbGVtZW50KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5uYXRpdmVFbGVtZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVtb2ppc0RyYXdlciB7XG4gICAgZW1vamlEcmF3ZXJzOiBFbW9qaURyYXdlcltdID0gW107XG5cbiAgICBnPzogU1ZHR0VsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJvYXJkOiBQbGFpdE1pbmRCb2FyZCwgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7fVxuXG4gICAgZHJhd0Vtb2ppcyhlbGVtZW50OiBNaW5kRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgaWYgKE1pbmRFbGVtZW50Lmhhc0Vtb2ppcyhlbGVtZW50KSkge1xuICAgICAgICAgICAgdGhpcy5nID0gY3JlYXRlRygpO1xuICAgICAgICAgICAgdGhpcy5nLmNsYXNzTGlzdC5hZGQoJ2Vtb2ppcycpO1xuICAgICAgICAgICAgY29uc3QgZm9yZWlnblJlY3RhbmdsZSA9IGdldEVtb2ppRm9yZWlnblJlY3RhbmdsZSh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25PYmplY3QgPSBjcmVhdGVGb3JlaWduT2JqZWN0KFxuICAgICAgICAgICAgICAgIGZvcmVpZ25SZWN0YW5nbGUueCxcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLnksXG4gICAgICAgICAgICAgICAgZm9yZWlnblJlY3RhbmdsZS53aWR0aCxcbiAgICAgICAgICAgICAgICBmb3JlaWduUmVjdGFuZ2xlLmhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZy5hcHBlbmQoZm9yZWlnbk9iamVjdCk7XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdub2RlLWVtb2ppcy1jb250YWluZXInKTtcbiAgICAgICAgICAgIGZvcmVpZ25PYmplY3QuYXBwZW5kKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB0aGlzLmVtb2ppRHJhd2VycyA9IGVsZW1lbnQuZGF0YS5lbW9qaXMubWFwKGVtb2ppSXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHJhd2VyID0gbmV3IEVtb2ppRHJhd2VyKHRoaXMuYm9hcmQsIHRoaXMudmlld0NvbnRhaW5lclJlZik7XG4gICAgICAgICAgICAgICAgZHJhd2VyLmRyYXcoZW1vamlJdGVtLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhd2VyO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmVtb2ppRHJhd2Vycy5mb3JFYWNoKGRyYXdlciA9PiB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChkcmF3ZXIubmF0aXZlRWxlbWVudCEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZykge1xuICAgICAgICAgICAgdGhpcy5nLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1vamlEcmF3ZXJzLmZvckVhY2goZHJhd2VyID0+IGRyYXdlci5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLmVtb2ppRHJhd2VycyA9IFtdO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
import { PlaitBoard, createG } from '@plait/core';
|
|
2
|
-
import { MindElement, PlaitMind, MindElementShape } from '../interfaces';
|
|
3
|
-
import { BaseDrawer } from '../base/base.drawer';
|
|
4
|
-
import { getRectangleByNode } from '../utils/position/node';
|
|
5
|
-
import { getShapeByElement } from '../utils/node-style/shape';
|
|
6
|
-
import { EXTEND_RADIUS, QUICK_INSERT_CIRCLE_COLOR, QUICK_INSERT_CIRCLE_OFFSET, QUICK_INSERT_INNER_CROSS_COLOR } from '../constants/default';
|
|
7
|
-
import { MindLayoutType, isStandardLayout } from '@plait/layouts';
|
|
8
|
-
import { MindQueries } from '../queries';
|
|
9
|
-
import { fromEvent } from 'rxjs';
|
|
10
|
-
import { insertMindElement } from '../utils/mind';
|
|
11
|
-
import { take } from 'rxjs/operators';
|
|
12
|
-
import { findNewChildNodePath } from '../utils/path';
|
|
13
|
-
import { getBranchColorByMindElement, getBranchWidthByMindElement, getNextBranchColor } from '../utils/node-style/branch';
|
|
14
|
-
export class QuickInsertDrawer extends BaseDrawer {
|
|
15
|
-
canDraw(element) {
|
|
16
|
-
if (PlaitBoard.isReadonly(this.board) || element?.isCollapsed) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
return true;
|
|
20
|
-
}
|
|
21
|
-
draw(element) {
|
|
22
|
-
let offset = element.children.length > 0 && !element.isRoot ? EXTEND_RADIUS : 0;
|
|
23
|
-
const quickInsertG = createG();
|
|
24
|
-
this.g = quickInsertG;
|
|
25
|
-
quickInsertG.classList.add('quick-insert');
|
|
26
|
-
const node = MindElement.getNode(element);
|
|
27
|
-
const { x, y, width, height } = getRectangleByNode(node);
|
|
28
|
-
/**
|
|
29
|
-
* 方位:
|
|
30
|
-
* 1. 左、左上、左下
|
|
31
|
-
* 2. 右、右上、右下
|
|
32
|
-
* 3. 上、上左、上右
|
|
33
|
-
* 4. 下、下左、下右
|
|
34
|
-
*/
|
|
35
|
-
const shape = getShapeByElement(this.board, element);
|
|
36
|
-
// 形状是矩形要偏移边框的线宽
|
|
37
|
-
const branchWidth = getBranchWidthByMindElement(this.board, element);
|
|
38
|
-
let offsetBorderLineWidth = 0;
|
|
39
|
-
if (shape === MindElementShape.roundRectangle && offset === 0) {
|
|
40
|
-
offsetBorderLineWidth = branchWidth;
|
|
41
|
-
}
|
|
42
|
-
let offsetRootBorderLineWidth = 0;
|
|
43
|
-
if (element.isRoot) {
|
|
44
|
-
offsetRootBorderLineWidth = branchWidth;
|
|
45
|
-
}
|
|
46
|
-
// 当没有子节点时,需要缩小的偏移量
|
|
47
|
-
const extraOffset = 3;
|
|
48
|
-
const underlineCoordinates = {
|
|
49
|
-
// 画线方向:右向左 <--
|
|
50
|
-
[MindLayoutType.left]: {
|
|
51
|
-
// EXTEND_RADIUS * 0.5 是 左方向,折叠/收起的偏移量
|
|
52
|
-
startX: x - (offset > 0 ? offset + EXTEND_RADIUS * 0.5 : 0) - offsetRootBorderLineWidth,
|
|
53
|
-
startY: y + height,
|
|
54
|
-
endX: x -
|
|
55
|
-
offsetBorderLineWidth -
|
|
56
|
-
offsetRootBorderLineWidth -
|
|
57
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
|
|
58
|
-
EXTEND_RADIUS,
|
|
59
|
-
endY: y + height
|
|
60
|
-
},
|
|
61
|
-
// 画线方向:左向右 -->
|
|
62
|
-
[MindLayoutType.right]: {
|
|
63
|
-
startX: x + width + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
64
|
-
startY: y + height,
|
|
65
|
-
endX: x +
|
|
66
|
-
width +
|
|
67
|
-
offsetBorderLineWidth +
|
|
68
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
69
|
-
EXTEND_RADIUS +
|
|
70
|
-
offsetRootBorderLineWidth,
|
|
71
|
-
endY: y + height
|
|
72
|
-
},
|
|
73
|
-
// 画线方向:下向上 -->
|
|
74
|
-
[MindLayoutType.upward]: {
|
|
75
|
-
startX: x + width * 0.5,
|
|
76
|
-
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
77
|
-
endX: x + width * 0.5,
|
|
78
|
-
endY: y -
|
|
79
|
-
offsetBorderLineWidth -
|
|
80
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) -
|
|
81
|
-
EXTEND_RADIUS -
|
|
82
|
-
offsetRootBorderLineWidth
|
|
83
|
-
},
|
|
84
|
-
// 画线方向:上向下 -->
|
|
85
|
-
[MindLayoutType.downward]: {
|
|
86
|
-
startX: x + width * 0.5,
|
|
87
|
-
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
88
|
-
endX: x + width * 0.5,
|
|
89
|
-
endY: y +
|
|
90
|
-
height +
|
|
91
|
-
offsetBorderLineWidth +
|
|
92
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
93
|
-
EXTEND_RADIUS +
|
|
94
|
-
offsetRootBorderLineWidth
|
|
95
|
-
},
|
|
96
|
-
[MindLayoutType.leftBottomIndented]: {
|
|
97
|
-
startX: x + width * 0.5,
|
|
98
|
-
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
99
|
-
endX: x + width * 0.5,
|
|
100
|
-
endY: y +
|
|
101
|
-
height +
|
|
102
|
-
offsetBorderLineWidth +
|
|
103
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
104
|
-
EXTEND_RADIUS +
|
|
105
|
-
offsetRootBorderLineWidth
|
|
106
|
-
},
|
|
107
|
-
[MindLayoutType.leftTopIndented]: {
|
|
108
|
-
startX: x + width * 0.5,
|
|
109
|
-
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
110
|
-
endX: x + width * 0.5,
|
|
111
|
-
endY: y -
|
|
112
|
-
offsetBorderLineWidth -
|
|
113
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
|
|
114
|
-
EXTEND_RADIUS -
|
|
115
|
-
offsetRootBorderLineWidth
|
|
116
|
-
},
|
|
117
|
-
[MindLayoutType.rightBottomIndented]: {
|
|
118
|
-
startX: x + width * 0.5,
|
|
119
|
-
startY: y + height + offsetBorderLineWidth + (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) + offsetRootBorderLineWidth,
|
|
120
|
-
endX: x + width * 0.5,
|
|
121
|
-
endY: y +
|
|
122
|
-
height +
|
|
123
|
-
offsetBorderLineWidth +
|
|
124
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET - extraOffset : 0) +
|
|
125
|
-
EXTEND_RADIUS +
|
|
126
|
-
offsetRootBorderLineWidth
|
|
127
|
-
},
|
|
128
|
-
[MindLayoutType.rightTopIndented]: {
|
|
129
|
-
startX: x + width * 0.5,
|
|
130
|
-
startY: y - offsetBorderLineWidth - (offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) - offsetRootBorderLineWidth,
|
|
131
|
-
endX: x + width * 0.5,
|
|
132
|
-
endY: y -
|
|
133
|
-
offsetBorderLineWidth -
|
|
134
|
-
(offset > 0 ? offset + QUICK_INSERT_CIRCLE_OFFSET : 0) -
|
|
135
|
-
EXTEND_RADIUS -
|
|
136
|
-
offsetRootBorderLineWidth
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
if (shape === MindElementShape.roundRectangle || element.isRoot) {
|
|
140
|
-
underlineCoordinates[MindLayoutType.left].startY -= height * 0.5;
|
|
141
|
-
underlineCoordinates[MindLayoutType.left].endY -= height * 0.5;
|
|
142
|
-
underlineCoordinates[MindLayoutType.right].startY -= height * 0.5;
|
|
143
|
-
underlineCoordinates[MindLayoutType.right].endY -= height * 0.5;
|
|
144
|
-
}
|
|
145
|
-
const branchColor = PlaitMind.isMind(element)
|
|
146
|
-
? getNextBranchColor(this.board, element)
|
|
147
|
-
: getBranchColorByMindElement(this.board, element);
|
|
148
|
-
let nodeLayout = MindQueries.getCorrectLayoutByElement(this.board, element);
|
|
149
|
-
if (element.isRoot && isStandardLayout(nodeLayout)) {
|
|
150
|
-
const root = element;
|
|
151
|
-
nodeLayout = root.children.length >= root.rightNodeCount ? MindLayoutType.left : MindLayoutType.right;
|
|
152
|
-
}
|
|
153
|
-
const underlineCoordinate = underlineCoordinates[nodeLayout];
|
|
154
|
-
if (underlineCoordinate) {
|
|
155
|
-
const underline = PlaitBoard.getRoughSVG(this.board).line(underlineCoordinate.startX, underlineCoordinate.startY, underlineCoordinate.endX, underlineCoordinate.endY, { stroke: branchColor, strokeWidth: branchWidth });
|
|
156
|
-
const circleCoordinates = {
|
|
157
|
-
startX: underlineCoordinate.endX,
|
|
158
|
-
startY: underlineCoordinate.endY
|
|
159
|
-
};
|
|
160
|
-
const circle = PlaitBoard.getRoughSVG(this.board).circle(circleCoordinates.startX, circleCoordinates.startY, EXTEND_RADIUS, {
|
|
161
|
-
fill: QUICK_INSERT_CIRCLE_COLOR,
|
|
162
|
-
stroke: QUICK_INSERT_CIRCLE_COLOR,
|
|
163
|
-
fillStyle: 'solid'
|
|
164
|
-
});
|
|
165
|
-
const innerCrossCoordinates = {
|
|
166
|
-
horizontal: {
|
|
167
|
-
startX: circleCoordinates.startX - EXTEND_RADIUS * 0.5 + 3,
|
|
168
|
-
startY: circleCoordinates.startY,
|
|
169
|
-
endX: circleCoordinates.startX + EXTEND_RADIUS * 0.5 - 3,
|
|
170
|
-
endY: circleCoordinates.startY
|
|
171
|
-
},
|
|
172
|
-
vertical: {
|
|
173
|
-
startX: circleCoordinates.startX,
|
|
174
|
-
startY: circleCoordinates.startY - EXTEND_RADIUS * 0.5 + 3,
|
|
175
|
-
endX: circleCoordinates.startX,
|
|
176
|
-
endY: circleCoordinates.startY + EXTEND_RADIUS * 0.5 - 3
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
const innerCrossHLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.horizontal.startX, innerCrossCoordinates.horizontal.startY, innerCrossCoordinates.horizontal.endX, innerCrossCoordinates.horizontal.endY, {
|
|
180
|
-
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
181
|
-
strokeWidth: 2
|
|
182
|
-
});
|
|
183
|
-
const innerRingVLine = PlaitBoard.getRoughSVG(this.board).line(innerCrossCoordinates.vertical.startX, innerCrossCoordinates.vertical.startY, innerCrossCoordinates.vertical.endX, innerCrossCoordinates.vertical.endY, {
|
|
184
|
-
stroke: QUICK_INSERT_INNER_CROSS_COLOR,
|
|
185
|
-
strokeWidth: 2
|
|
186
|
-
});
|
|
187
|
-
quickInsertG.appendChild(underline);
|
|
188
|
-
quickInsertG.appendChild(circle);
|
|
189
|
-
quickInsertG.appendChild(innerCrossHLine);
|
|
190
|
-
quickInsertG.appendChild(innerRingVLine);
|
|
191
|
-
}
|
|
192
|
-
return quickInsertG;
|
|
193
|
-
}
|
|
194
|
-
afterDraw(element) {
|
|
195
|
-
if (!this.g) {
|
|
196
|
-
throw new Error(`can not find quick insert g`);
|
|
197
|
-
}
|
|
198
|
-
fromEvent(this.g, 'mousedown')
|
|
199
|
-
.pipe(take(1))
|
|
200
|
-
.subscribe(e => {
|
|
201
|
-
e.stopPropagation();
|
|
202
|
-
});
|
|
203
|
-
fromEvent(this.g, 'mouseup')
|
|
204
|
-
.pipe(take(1))
|
|
205
|
-
.subscribe(() => {
|
|
206
|
-
const path = findNewChildNodePath(this.board, element);
|
|
207
|
-
insertMindElement(this.board, element, path);
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpY2staW5zZXJ0LmRyYXdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL21pbmQvc3JjL2RyYXdlci9xdWljay1pbnNlcnQuZHJhd2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQTZELFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQWEsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSx5QkFBeUIsRUFBRSwwQkFBMEIsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVJLE9BQU8sRUFBRSxjQUFjLEVBQWMsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLDJCQUEyQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFMUgsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFVBQVU7SUFDN0MsT0FBTyxDQUFDLE9BQThCO1FBQ2xDLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxFQUFFLFdBQVcsRUFBRTtZQUMzRCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBOEI7UUFDL0IsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEYsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUM7UUFDdEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDM0MsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFekQ7Ozs7OztXQU1HO1FBQ0gsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxnQkFBZ0I7UUFDaEIsTUFBTSxXQUFXLEdBQUcsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRSxJQUFJLHFCQUFxQixHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQyxjQUFjLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMzRCxxQkFBcUIsR0FBRyxXQUFXLENBQUM7U0FDdkM7UUFDRCxJQUFJLHlCQUF5QixHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDaEIseUJBQXlCLEdBQUcsV0FBVyxDQUFDO1NBQzNDO1FBQ0QsbUJBQW1CO1FBQ25CLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztRQUN0QixNQUFNLG9CQUFvQixHQUFrQztZQUN4RCxlQUFlO1lBQ2YsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ25CLHNDQUFzQztnQkFDdEMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyx5QkFBeUI7Z0JBQ3ZGLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTTtnQkFDbEIsSUFBSSxFQUNBLENBQUM7b0JBQ0QscUJBQXFCO29CQUNyQix5QkFBeUI7b0JBQ3pCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxhQUFhO2dCQUNqQixJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU07YUFDbkI7WUFDRCxlQUFlO1lBQ2YsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLE1BQU0sRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyx5QkFBeUI7Z0JBQ3RHLE1BQU0sRUFBRSxDQUFDLEdBQUcsTUFBTTtnQkFDbEIsSUFBSSxFQUNBLENBQUM7b0JBQ0QsS0FBSztvQkFDTCxxQkFBcUI7b0JBQ3JCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxhQUFhO29CQUNiLHlCQUF5QjtnQkFDN0IsSUFBSSxFQUFFLENBQUMsR0FBRyxNQUFNO2FBQ25CO1lBQ0QsZUFBZTtZQUNmLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUN2QixNQUFNLEVBQUUsQ0FBQyxHQUFHLHFCQUFxQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyx5QkFBeUI7Z0JBQ3RILElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUc7Z0JBQ3JCLElBQUksRUFDQSxDQUFDO29CQUNELHFCQUFxQjtvQkFDckIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLGFBQWE7b0JBQ2IseUJBQXlCO2FBQ2hDO1lBQ0QsZUFBZTtZQUNmLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUN2QixNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUN2QixNQUFNLEVBQ0YsQ0FBQyxHQUFHLE1BQU0sR0FBRyxxQkFBcUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcseUJBQXlCO2dCQUMzSCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUNyQixJQUFJLEVBQ0EsQ0FBQztvQkFDRCxNQUFNO29CQUNOLHFCQUFxQjtvQkFDckIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLGFBQWE7b0JBQ2IseUJBQXlCO2FBQ2hDO1lBQ0QsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDakMsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRztnQkFDdkIsTUFBTSxFQUNGLENBQUMsR0FBRyxNQUFNLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLHlCQUF5QjtnQkFDM0gsSUFBSSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRztnQkFDckIsSUFBSSxFQUNBLENBQUM7b0JBQ0QsTUFBTTtvQkFDTixxQkFBcUI7b0JBQ3JCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxhQUFhO29CQUNiLHlCQUF5QjthQUNoQztZQUNELENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxFQUFFO2dCQUM5QixNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUN2QixNQUFNLEVBQUUsQ0FBQyxHQUFHLHFCQUFxQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyx5QkFBeUI7Z0JBQ3RILElBQUksRUFBRSxDQUFDLEdBQUcsS0FBSyxHQUFHLEdBQUc7Z0JBQ3JCLElBQUksRUFDQSxDQUFDO29CQUNELHFCQUFxQjtvQkFDckIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEQsYUFBYTtvQkFDYix5QkFBeUI7YUFDaEM7WUFDRCxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO2dCQUNsQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUN2QixNQUFNLEVBQ0YsQ0FBQyxHQUFHLE1BQU0sR0FBRyxxQkFBcUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcseUJBQXlCO2dCQUMzSCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUNyQixJQUFJLEVBQ0EsQ0FBQztvQkFDRCxNQUFNO29CQUNOLHFCQUFxQjtvQkFDckIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsMEJBQTBCLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLGFBQWE7b0JBQ2IseUJBQXlCO2FBQ2hDO1lBQ0QsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFDL0IsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsR0FBRztnQkFDdkIsTUFBTSxFQUFFLENBQUMsR0FBRyxxQkFBcUIsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcseUJBQXlCO2dCQUN0SCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQUssR0FBRyxHQUFHO2dCQUNyQixJQUFJLEVBQ0EsQ0FBQztvQkFDRCxxQkFBcUI7b0JBQ3JCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RELGFBQWE7b0JBQ2IseUJBQXlCO2FBQ2hDO1NBQ0osQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLGdCQUFnQixDQUFDLGNBQWMsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQzdELG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqRSxvQkFBb0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLE1BQU0sR0FBRyxHQUFHLENBQUM7WUFDL0Qsb0JBQW9CLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO1lBQ2xFLG9CQUFvQixDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztTQUNuRTtRQUNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBQ3pDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN6QyxDQUFDLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2RCxJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQXFCLENBQUM7UUFDaEcsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sSUFBSSxHQUFHLE9BQXFCLENBQUM7WUFDbkMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7U0FDekc7UUFDRCxNQUFNLG1CQUFtQixHQUFHLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksbUJBQW1CLEVBQUU7WUFDckIsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUNyRCxtQkFBbUIsQ0FBQyxNQUFNLEVBQzFCLG1CQUFtQixDQUFDLE1BQU0sRUFDMUIsbUJBQW1CLENBQUMsSUFBSSxFQUN4QixtQkFBbUIsQ0FBQyxJQUFJLEVBQ3hCLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQ3BELENBQUM7WUFDRixNQUFNLGlCQUFpQixHQUFHO2dCQUN0QixNQUFNLEVBQUUsbUJBQW1CLENBQUMsSUFBSTtnQkFDaEMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLElBQUk7YUFDbkMsQ0FBQztZQUNGLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRTtnQkFDeEgsSUFBSSxFQUFFLHlCQUF5QjtnQkFDL0IsTUFBTSxFQUFFLHlCQUF5QjtnQkFDakMsU0FBUyxFQUFFLE9BQU87YUFDckIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxxQkFBcUIsR0FBRztnQkFDMUIsVUFBVSxFQUFFO29CQUNSLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUMxRCxNQUFNLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtvQkFDaEMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUM7b0JBQ3hELElBQUksRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO2lCQUNqQztnQkFDRCxRQUFRLEVBQUU7b0JBQ04sTUFBTSxFQUFFLGlCQUFpQixDQUFDLE1BQU07b0JBQ2hDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsYUFBYSxHQUFHLEdBQUcsR0FBRyxDQUFDO29CQUMxRCxJQUFJLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtvQkFDOUIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxhQUFhLEdBQUcsR0FBRyxHQUFHLENBQUM7aUJBQzNEO2FBQ0osQ0FBQztZQUNGLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FDM0QscUJBQXFCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdkMscUJBQXFCLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFDdkMscUJBQXFCLENBQUMsVUFBVSxDQUFDLElBQUksRUFDckMscUJBQXFCLENBQUMsVUFBVSxDQUFDLElBQUksRUFDckM7Z0JBQ0ksTUFBTSxFQUFFLDhCQUE4QjtnQkFDdEMsV0FBVyxFQUFFLENBQUM7YUFDakIsQ0FDSixDQUFDO1lBQ0YsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUMxRCxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUNyQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUNyQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUNuQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUNuQztnQkFDSSxNQUFNLEVBQUUsOEJBQThCO2dCQUN0QyxXQUFXLEVBQUUsQ0FBQzthQUNqQixDQUNKLENBQUM7WUFDRixZQUFZLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMxQyxZQUFZLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzVDO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDeEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUFvQjtRQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtZQUNULE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUNsRDtRQUNELFNBQVMsQ0FBYSxJQUFJLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQzthQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2IsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1gsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ1AsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDO2FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1osTUFBTSxJQUFJLEdBQUcsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN2RCxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsYWl0Qm9hcmQsIGNyZWF0ZUcgfSBmcm9tICdAcGxhaXQvY29yZSc7XG5pbXBvcnQgeyBNaW5kRWxlbWVudCwgQmFzZURhdGEsIEV4dGVuZFVuZGVybGluZUNvb3JkaW5hdGVUeXBlLCBFeHRlbmRMYXlvdXRUeXBlLCBQbGFpdE1pbmQsIE1pbmRFbGVtZW50U2hhcGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFmdGVyRHJhdywgQmFzZURyYXdlciB9IGZyb20gJy4uL2Jhc2UvYmFzZS5kcmF3ZXInO1xuaW1wb3J0IHsgZ2V0UmVjdGFuZ2xlQnlOb2RlIH0gZnJvbSAnLi4vdXRpbHMvcG9zaXRpb24vbm9kZSc7XG5pbXBvcnQgeyBnZXRTaGFwZUJ5RWxlbWVudCB9IGZyb20gJy4uL3V0aWxzL25vZGUtc3R5bGUvc2hhcGUnO1xuaW1wb3J0IHsgRVhURU5EX1JBRElVUywgUVVJQ0tfSU5TRVJUX0NJUkNMRV9DT0xPUiwgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQsIFFVSUNLX0lOU0VSVF9JTk5FUl9DUk9TU19DT0xPUiB9IGZyb20gJy4uL2NvbnN0YW50cy9kZWZhdWx0JztcbmltcG9ydCB7IE1pbmRMYXlvdXRUeXBlLCBPcmlnaW5Ob2RlLCBpc1N0YW5kYXJkTGF5b3V0IH0gZnJvbSAnQHBsYWl0L2xheW91dHMnO1xuaW1wb3J0IHsgTWluZFF1ZXJpZXMgfSBmcm9tICcuLi9xdWVyaWVzJztcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5zZXJ0TWluZEVsZW1lbnQgfSBmcm9tICcuLi91dGlscy9taW5kJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBmaW5kTmV3Q2hpbGROb2RlUGF0aCB9IGZyb20gJy4uL3V0aWxzL3BhdGgnO1xuaW1wb3J0IHsgZ2V0QnJhbmNoQ29sb3JCeU1pbmRFbGVtZW50LCBnZXRCcmFuY2hXaWR0aEJ5TWluZEVsZW1lbnQsIGdldE5leHRCcmFuY2hDb2xvciB9IGZyb20gJy4uL3V0aWxzL25vZGUtc3R5bGUvYnJhbmNoJztcblxuZXhwb3J0IGNsYXNzIFF1aWNrSW5zZXJ0RHJhd2VyIGV4dGVuZHMgQmFzZURyYXdlciBpbXBsZW1lbnRzIEFmdGVyRHJhdyB7XG4gICAgY2FuRHJhdyhlbGVtZW50OiBNaW5kRWxlbWVudDxCYXNlRGF0YT4pOiBib29sZWFuIHtcbiAgICAgICAgaWYgKFBsYWl0Qm9hcmQuaXNSZWFkb25seSh0aGlzLmJvYXJkKSB8fCBlbGVtZW50Py5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGRyYXcoZWxlbWVudDogTWluZEVsZW1lbnQ8QmFzZURhdGE+KTogU1ZHR0VsZW1lbnQge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gZWxlbWVudC5jaGlsZHJlbi5sZW5ndGggPiAwICYmICFlbGVtZW50LmlzUm9vdCA/IEVYVEVORF9SQURJVVMgOiAwO1xuICAgICAgICBjb25zdCBxdWlja0luc2VydEcgPSBjcmVhdGVHKCk7XG4gICAgICAgIHRoaXMuZyA9IHF1aWNrSW5zZXJ0RztcbiAgICAgICAgcXVpY2tJbnNlcnRHLmNsYXNzTGlzdC5hZGQoJ3F1aWNrLWluc2VydCcpO1xuICAgICAgICBjb25zdCBub2RlID0gTWluZEVsZW1lbnQuZ2V0Tm9kZShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgeyB4LCB5LCB3aWR0aCwgaGVpZ2h0IH0gPSBnZXRSZWN0YW5nbGVCeU5vZGUobm9kZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIOaWueS9je+8mlxuICAgICAgICAgKiAgICAxLiDlt6bjgIHlt6bkuIrjgIHlt6bkuItcbiAgICAgICAgICogICAgMi4g5Y+z44CB5Y+z5LiK44CB5Y+z5LiLXG4gICAgICAgICAqICAgIDMuIOS4iuOAgeS4iuW3puOAgeS4iuWPs1xuICAgICAgICAgKiAgICA0LiDkuIvjgIHkuIvlt6bjgIHkuIvlj7NcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVCeUVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCk7XG4gICAgICAgIC8vIOW9oueKtuaYr+efqeW9ouimgeWBj+enu+i+ueahhueahOe6v+WuvVxuICAgICAgICBjb25zdCBicmFuY2hXaWR0aCA9IGdldEJyYW5jaFdpZHRoQnlNaW5kRWxlbWVudCh0aGlzLmJvYXJkLCBlbGVtZW50KTtcbiAgICAgICAgbGV0IG9mZnNldEJvcmRlckxpbmVXaWR0aCA9IDA7XG4gICAgICAgIGlmIChzaGFwZSA9PT0gTWluZEVsZW1lbnRTaGFwZS5yb3VuZFJlY3RhbmdsZSAmJiBvZmZzZXQgPT09IDApIHtcbiAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCA9IGJyYW5jaFdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoID0gMDtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNSb290KSB7XG4gICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoID0gYnJhbmNoV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5b2T5rKh5pyJ5a2Q6IqC54K55pe277yM6ZyA6KaB57yp5bCP55qE5YGP56e76YePXG4gICAgICAgIGNvbnN0IGV4dHJhT2Zmc2V0ID0gMztcbiAgICAgICAgY29uc3QgdW5kZXJsaW5lQ29vcmRpbmF0ZXM6IEV4dGVuZFVuZGVybGluZUNvb3JkaW5hdGVUeXBlID0ge1xuICAgICAgICAgICAgLy8g55S757q/5pa55ZCR77ya5Y+z5ZCR5bemIDwtLVxuICAgICAgICAgICAgW01pbmRMYXlvdXRUeXBlLmxlZnRdOiB7XG4gICAgICAgICAgICAgICAgLy8gRVhURU5EX1JBRElVUyAqIDAuNSDmmK8g5bem5pa55ZCR77yM5oqY5Y+gL+aUtui1t+eahOWBj+enu+mHj1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCAtIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgRVhURU5EX1JBRElVUyAqIDAuNSA6IDApIC0gb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBzdGFydFk6IHkgKyBoZWlnaHQsXG4gICAgICAgICAgICAgICAgZW5kWDpcbiAgICAgICAgICAgICAgICAgICAgeCAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSAtXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMsXG4gICAgICAgICAgICAgICAgZW5kWTogeSArIGhlaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIOeUu+e6v+aWueWQke+8muW3puWQkeWPsyAtLT5cbiAgICAgICAgICAgIFtNaW5kTGF5b3V0VHlwZS5yaWdodF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCArIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSArIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5ICsgaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGVuZFg6XG4gICAgICAgICAgICAgICAgICAgIHggK1xuICAgICAgICAgICAgICAgICAgICB3aWR0aCArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgLSBleHRyYU9mZnNldCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWTogeSArIGhlaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIOeUu+e6v+aWueWQke+8muS4i+WQkeS4iiAtLT5cbiAgICAgICAgICAgIFtNaW5kTGF5b3V0VHlwZS51cHdhcmRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB5IC0gb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC0gKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC0gb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgLSBleHRyYU9mZnNldCA6IDApIC1cbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyDnlLvnur/mlrnlkJHvvJrkuIrlkJHkuIsgLS0+XG4gICAgICAgICAgICBbTWluZExheW91dFR5cGUuZG93bndhcmRdOiB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgc3RhcnRZOlxuICAgICAgICAgICAgICAgICAgICB5ICsgaGVpZ2h0ICsgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICsgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApICsgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICBlbmRYOiB4ICsgd2lkdGggKiAwLjUsXG4gICAgICAgICAgICAgICAgZW5kWTpcbiAgICAgICAgICAgICAgICAgICAgeSArXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldEJvcmRlckxpbmVXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgLSBleHRyYU9mZnNldCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTWluZExheW91dFR5cGUubGVmdEJvdHRvbUluZGVudGVkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTpcbiAgICAgICAgICAgICAgICAgICAgeSArIGhlaWdodCArIG9mZnNldEJvcmRlckxpbmVXaWR0aCArIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSArIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgK1xuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggK1xuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIC0gZXh0cmFPZmZzZXQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIEVYVEVORF9SQURJVVMgK1xuICAgICAgICAgICAgICAgICAgICBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW01pbmRMYXlvdXRUeXBlLmxlZnRUb3BJbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6IHkgLSBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLSAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgLSBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5IC1cbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCA6IDApIC1cbiAgICAgICAgICAgICAgICAgICAgRVhURU5EX1JBRElVUyAtXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGhcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTWluZExheW91dFR5cGUucmlnaHRCb3R0b21JbmRlbnRlZF06IHtcbiAgICAgICAgICAgICAgICBzdGFydFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBzdGFydFk6XG4gICAgICAgICAgICAgICAgICAgIHkgKyBoZWlnaHQgKyBvZmZzZXRCb3JkZXJMaW5lV2lkdGggKyAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgKyBvZmZzZXRSb290Qm9yZGVyTGluZVdpZHRoLFxuICAgICAgICAgICAgICAgIGVuZFg6IHggKyB3aWR0aCAqIDAuNSxcbiAgICAgICAgICAgICAgICBlbmRZOlxuICAgICAgICAgICAgICAgICAgICB5ICtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Qm9yZGVyTGluZVdpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgKG9mZnNldCA+IDAgPyBvZmZzZXQgKyBRVUlDS19JTlNFUlRfQ0lSQ0xFX09GRlNFVCAtIGV4dHJhT2Zmc2V0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtNaW5kTGF5b3V0VHlwZS5yaWdodFRvcEluZGVudGVkXToge1xuICAgICAgICAgICAgICAgIHN0YXJ0WDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIHN0YXJ0WTogeSAtIG9mZnNldEJvcmRlckxpbmVXaWR0aCAtIChvZmZzZXQgPiAwID8gb2Zmc2V0ICsgUVVJQ0tfSU5TRVJUX0NJUkNMRV9PRkZTRVQgOiAwKSAtIG9mZnNldFJvb3RCb3JkZXJMaW5lV2lkdGgsXG4gICAgICAgICAgICAgICAgZW5kWDogeCArIHdpZHRoICogMC41LFxuICAgICAgICAgICAgICAgIGVuZFk6XG4gICAgICAgICAgICAgICAgICAgIHkgLVxuICAgICAgICAgICAgICAgICAgICBvZmZzZXRCb3JkZXJMaW5lV2lkdGggLVxuICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4gMCA/IG9mZnNldCArIFFVSUNLX0lOU0VSVF9DSVJDTEVfT0ZGU0VUIDogMCkgLVxuICAgICAgICAgICAgICAgICAgICBFWFRFTkRfUkFESVVTIC1cbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Um9vdEJvcmRlckxpbmVXaWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoc2hhcGUgPT09IE1pbmRFbGVtZW50U2hhcGUucm91bmRSZWN0YW5nbGUgfHwgZWxlbWVudC5pc1Jvb3QpIHtcbiAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGVzW01pbmRMYXlvdXRUeXBlLmxlZnRdLnN0YXJ0WSAtPSBoZWlnaHQgKiAwLjU7XG4gICAgICAgICAgICB1bmRlcmxpbmVDb29yZGluYXRlc1tNaW5kTGF5b3V0VHlwZS5sZWZ0XS5lbmRZIC09IGhlaWdodCAqIDAuNTtcbiAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGVzW01pbmRMYXlvdXRUeXBlLnJpZ2h0XS5zdGFydFkgLT0gaGVpZ2h0ICogMC41O1xuICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZXNbTWluZExheW91dFR5cGUucmlnaHRdLmVuZFkgLT0gaGVpZ2h0ICogMC41O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJyYW5jaENvbG9yID0gUGxhaXRNaW5kLmlzTWluZChlbGVtZW50KVxuICAgICAgICAgICAgPyBnZXROZXh0QnJhbmNoQ29sb3IodGhpcy5ib2FyZCwgZWxlbWVudClcbiAgICAgICAgICAgIDogZ2V0QnJhbmNoQ29sb3JCeU1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICBsZXQgbm9kZUxheW91dCA9IE1pbmRRdWVyaWVzLmdldENvcnJlY3RMYXlvdXRCeUVsZW1lbnQodGhpcy5ib2FyZCwgZWxlbWVudCkgYXMgRXh0ZW5kTGF5b3V0VHlwZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaXNSb290ICYmIGlzU3RhbmRhcmRMYXlvdXQobm9kZUxheW91dCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50IGFzIE9yaWdpbk5vZGU7XG4gICAgICAgICAgICBub2RlTGF5b3V0ID0gcm9vdC5jaGlsZHJlbi5sZW5ndGggPj0gcm9vdC5yaWdodE5vZGVDb3VudCA/IE1pbmRMYXlvdXRUeXBlLmxlZnQgOiBNaW5kTGF5b3V0VHlwZS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmRlcmxpbmVDb29yZGluYXRlID0gdW5kZXJsaW5lQ29vcmRpbmF0ZXNbbm9kZUxheW91dF07XG4gICAgICAgIGlmICh1bmRlcmxpbmVDb29yZGluYXRlKSB7XG4gICAgICAgICAgICBjb25zdCB1bmRlcmxpbmUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmxpbmUoXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFgsXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5zdGFydFksXG4gICAgICAgICAgICAgICAgdW5kZXJsaW5lQ29vcmRpbmF0ZS5lbmRYLFxuICAgICAgICAgICAgICAgIHVuZGVybGluZUNvb3JkaW5hdGUuZW5kWSxcbiAgICAgICAgICAgICAgICB7IHN0cm9rZTogYnJhbmNoQ29sb3IsIHN0cm9rZVdpZHRoOiBicmFuY2hXaWR0aCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgY2lyY2xlQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRYOiB1bmRlcmxpbmVDb29yZGluYXRlLmVuZFgsXG4gICAgICAgICAgICAgICAgc3RhcnRZOiB1bmRlcmxpbmVDb29yZGluYXRlLmVuZFlcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBjaXJjbGUgPSBQbGFpdEJvYXJkLmdldFJvdWdoU1ZHKHRoaXMuYm9hcmQpLmNpcmNsZShjaXJjbGVDb29yZGluYXRlcy5zdGFydFgsIGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSwgRVhURU5EX1JBRElVUywge1xuICAgICAgICAgICAgICAgIGZpbGw6IFFVSUNLX0lOU0VSVF9DSVJDTEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiBRVUlDS19JTlNFUlRfQ0lSQ0xFX0NPTE9SLFxuICAgICAgICAgICAgICAgIGZpbGxTdHlsZTogJ3NvbGlkJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpbm5lckNyb3NzQ29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgICAgICAgaG9yaXpvbnRhbDoge1xuICAgICAgICAgICAgICAgICAgICBzdGFydFg6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WCAtIEVYVEVORF9SQURJVVMgKiAwLjUgKyAzLFxuICAgICAgICAgICAgICAgICAgICBzdGFydFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WSxcbiAgICAgICAgICAgICAgICAgICAgZW5kWDogY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRYICsgRVhURU5EX1JBRElVUyAqIDAuNSAtIDMsXG4gICAgICAgICAgICAgICAgICAgIGVuZFk6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdmVydGljYWw6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnRYOiBjaXJjbGVDb29yZGluYXRlcy5zdGFydFgsXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0WTogY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRZIC0gRVhURU5EX1JBRElVUyAqIDAuNSArIDMsXG4gICAgICAgICAgICAgICAgICAgIGVuZFg6IGNpcmNsZUNvb3JkaW5hdGVzLnN0YXJ0WCxcbiAgICAgICAgICAgICAgICAgICAgZW5kWTogY2lyY2xlQ29vcmRpbmF0ZXMuc3RhcnRZICsgRVhURU5EX1JBRElVUyAqIDAuNSAtIDNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgaW5uZXJDcm9zc0hMaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5saW5lKFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy5ob3Jpem9udGFsLnN0YXJ0WCxcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMuaG9yaXpvbnRhbC5zdGFydFksXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLmhvcml6b250YWwuZW5kWCxcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMuaG9yaXpvbnRhbC5lbmRZLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBRVUlDS19JTlNFUlRfSU5ORVJfQ1JPU1NfQ09MT1IsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGlubmVyUmluZ1ZMaW5lID0gUGxhaXRCb2FyZC5nZXRSb3VnaFNWRyh0aGlzLmJvYXJkKS5saW5lKFxuICAgICAgICAgICAgICAgIGlubmVyQ3Jvc3NDb29yZGluYXRlcy52ZXJ0aWNhbC5zdGFydFgsXG4gICAgICAgICAgICAgICAgaW5uZXJDcm9zc0Nvb3JkaW5hdGVzLnZlcnRpY2FsLnN0YXJ0WSxcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMudmVydGljYWwuZW5kWCxcbiAgICAgICAgICAgICAgICBpbm5lckNyb3NzQ29vcmRpbmF0ZXMudmVydGljYWwuZW5kWSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogUVVJQ0tfSU5TRVJUX0lOTkVSX0NST1NTX0NPTE9SLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBxdWlja0luc2VydEcuYXBwZW5kQ2hpbGQodW5kZXJsaW5lKTtcbiAgICAgICAgICAgIHF1aWNrSW5zZXJ0Ry5hcHBlbmRDaGlsZChjaXJjbGUpO1xuICAgICAgICAgICAgcXVpY2tJbnNlcnRHLmFwcGVuZENoaWxkKGlubmVyQ3Jvc3NITGluZSk7XG4gICAgICAgICAgICBxdWlja0luc2VydEcuYXBwZW5kQ2hpbGQoaW5uZXJSaW5nVkxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWlja0luc2VydEc7XG4gICAgfVxuXG4gICAgYWZ0ZXJEcmF3KGVsZW1lbnQ6IE1pbmRFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNhbiBub3QgZmluZCBxdWljayBpbnNlcnQgZ2ApO1xuICAgICAgICB9XG4gICAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmcsICdtb3VzZWRvd24nKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBmcm9tRXZlbnQodGhpcy5nLCAnbW91c2V1cCcpXG4gICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGZpbmROZXdDaGlsZE5vZGVQYXRoKHRoaXMuYm9hcmQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGluc2VydE1pbmRFbGVtZW50KHRoaXMuYm9hcmQsIGVsZW1lbnQsIHBhdGgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|