@schneideress/dashboardframework 17.0.47 → 20.0.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/fesm2022/schneideress-dashboardframework.mjs +47 -47
- package/fesm2022/schneideress-dashboardframework.mjs.map +1 -1
- package/index.d.ts +1255 -5
- package/package.json +11 -7
- package/esm2022/gridster/index.mjs +0 -12
- package/esm2022/gridster/lib/gridster.component.mjs +0 -627
- package/esm2022/gridster/lib/gridster.interface.mjs +0 -3
- package/esm2022/gridster/lib/gridster.module.mjs +0 -17
- package/esm2022/gridster/lib/gridsterCompact.service.mjs +0 -126
- package/esm2022/gridster/lib/gridsterConfig.constant.mjs +0 -118
- package/esm2022/gridster/lib/gridsterConfig.interface.mjs +0 -37
- package/esm2022/gridster/lib/gridsterConfigS.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterDraggable.service.mjs +0 -405
- package/esm2022/gridster/lib/gridsterEmptyCell.service.mjs +0 -255
- package/esm2022/gridster/lib/gridsterItem.component.mjs +0 -231
- package/esm2022/gridster/lib/gridsterItem.interface.mjs +0 -3
- package/esm2022/gridster/lib/gridsterPreview.component.mjs +0 -36
- package/esm2022/gridster/lib/gridsterPush.service.mjs +0 -316
- package/esm2022/gridster/lib/gridsterPushResize.service.mjs +0 -225
- package/esm2022/gridster/lib/gridsterRenderer.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterRenderer.service.mjs +0 -274
- package/esm2022/gridster/lib/gridsterResizable.service.mjs +0 -470
- package/esm2022/gridster/lib/gridsterResizeEventType.interface.mjs +0 -2
- package/esm2022/gridster/lib/gridsterScroll.service.mjs +0 -134
- package/esm2022/gridster/lib/gridsterSwap.service.mjs +0 -87
- package/esm2022/gridster/lib/gridsterUtils.service.mjs +0 -92
- package/esm2022/lib/custom.notifier.options.mjs +0 -41
- package/esm2022/lib/ra-dashboard-area/ra.dashboard.area.mjs +0 -639
- package/esm2022/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.mjs +0 -43
- package/esm2022/lib/ra-widget-container/ra.widget.container.component.mjs +0 -964
- package/esm2022/lib/ra.base.dashboard.filter.mjs +0 -46
- package/esm2022/lib/ra.base.dashboard.template.mjs +0 -45
- package/esm2022/lib/ra.dashbard.event.bus.mjs +0 -46
- package/esm2022/lib/ra.dashboard.module.mjs +0 -55
- package/esm2022/lib/ra.dashboard.responsive.service.mjs +0 -149
- package/esm2022/lib/ra.dashboard.service.mjs +0 -84
- package/esm2022/lib/ra.event.enum.mjs +0 -75
- package/esm2022/lib/ra.gridster.config.mjs +0 -56
- package/esm2022/public-api.mjs +0 -13
- package/esm2022/schneideress-dashboardframework.mjs +0 -5
- package/gridster/index.d.ts +0 -9
- package/gridster/lib/gridster.component.d.ts +0 -79
- package/gridster/lib/gridster.interface.d.ts +0 -49
- package/gridster/lib/gridster.module.d.ts +0 -8
- package/gridster/lib/gridsterCompact.service.d.ts +0 -11
- package/gridster/lib/gridsterConfig.constant.d.ts +0 -2
- package/gridster/lib/gridsterConfig.interface.d.ts +0 -155
- package/gridster/lib/gridsterConfigS.interface.d.ts +0 -107
- package/gridster/lib/gridsterDraggable.service.d.ts +0 -68
- package/gridster/lib/gridsterEmptyCell.service.d.ts +0 -31
- package/gridster/lib/gridsterItem.component.d.ts +0 -61
- package/gridster/lib/gridsterItem.interface.d.ts +0 -67
- package/gridster/lib/gridsterPreview.component.d.ts +0 -17
- package/gridster/lib/gridsterPush.service.d.ts +0 -34
- package/gridster/lib/gridsterPushResize.service.d.ts +0 -26
- package/gridster/lib/gridsterRenderer.interface.d.ts +0 -14
- package/gridster/lib/gridsterRenderer.service.d.ts +0 -37
- package/gridster/lib/gridsterResizable.service.d.ts +0 -86
- package/gridster/lib/gridsterResizeEventType.interface.d.ts +0 -6
- package/gridster/lib/gridsterScroll.service.d.ts +0 -7
- package/gridster/lib/gridsterSwap.service.d.ts +0 -13
- package/gridster/lib/gridsterUtils.service.d.ts +0 -16
- package/lib/custom.notifier.options.d.ts +0 -2
- package/lib/ra-dashboard-area/ra.dashboard.area.d.ts +0 -132
- package/lib/ra-widget-container/lock-tooltip/lock.tooltip.component.d.ts +0 -20
- package/lib/ra-widget-container/ra.widget.container.component.d.ts +0 -154
- package/lib/ra.base.dashboard.filter.d.ts +0 -19
- package/lib/ra.base.dashboard.template.d.ts +0 -24
- package/lib/ra.dashbard.event.bus.d.ts +0 -23
- package/lib/ra.dashboard.module.d.ts +0 -16
- package/lib/ra.dashboard.responsive.service.d.ts +0 -24
- package/lib/ra.dashboard.service.d.ts +0 -26
- package/lib/ra.event.enum.d.ts +0 -72
- package/lib/ra.gridster.config.d.ts +0 -2
- package/public-api.d.ts +0 -9
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
export class GridsterPushResize {
|
|
2
|
-
constructor(gridsterItem) {
|
|
3
|
-
this.pushedItems = [];
|
|
4
|
-
this.pushedItemsPath = [];
|
|
5
|
-
this.gridsterItem = gridsterItem;
|
|
6
|
-
this.gridster = gridsterItem.gridster;
|
|
7
|
-
this.tryPattern = {
|
|
8
|
-
fromEast: this.tryWest,
|
|
9
|
-
fromWest: this.tryEast,
|
|
10
|
-
fromNorth: this.trySouth,
|
|
11
|
-
fromSouth: this.tryNorth
|
|
12
|
-
};
|
|
13
|
-
this.fromSouth = 'fromSouth';
|
|
14
|
-
this.fromNorth = 'fromNorth';
|
|
15
|
-
this.fromEast = 'fromEast';
|
|
16
|
-
this.fromWest = 'fromWest';
|
|
17
|
-
}
|
|
18
|
-
destroy() {
|
|
19
|
-
this.gridster = this.gridsterItem = null;
|
|
20
|
-
}
|
|
21
|
-
pushItems(direction) {
|
|
22
|
-
if (this.gridster.$options.pushResizeItems) {
|
|
23
|
-
return this.push(this.gridsterItem, direction);
|
|
24
|
-
}
|
|
25
|
-
else {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
restoreItems() {
|
|
30
|
-
let i = 0;
|
|
31
|
-
const l = this.pushedItems.length;
|
|
32
|
-
let pushedItem;
|
|
33
|
-
for (; i < l; i++) {
|
|
34
|
-
pushedItem = this.pushedItems[i];
|
|
35
|
-
pushedItem.$item.x = pushedItem.item.x || 0;
|
|
36
|
-
pushedItem.$item.y = pushedItem.item.y || 0;
|
|
37
|
-
pushedItem.$item.cols = pushedItem.item.cols || 1;
|
|
38
|
-
pushedItem.$item.row = pushedItem.item.row || 1;
|
|
39
|
-
pushedItem.setSize();
|
|
40
|
-
}
|
|
41
|
-
this.pushedItems = [];
|
|
42
|
-
this.pushedItemsPath = [];
|
|
43
|
-
}
|
|
44
|
-
setPushedItems() {
|
|
45
|
-
let i = 0;
|
|
46
|
-
const l = this.pushedItems.length;
|
|
47
|
-
let pushedItem;
|
|
48
|
-
for (; i < l; i++) {
|
|
49
|
-
pushedItem = this.pushedItems[i];
|
|
50
|
-
pushedItem.checkItemChanges(pushedItem.$item, pushedItem.item);
|
|
51
|
-
}
|
|
52
|
-
this.pushedItems = [];
|
|
53
|
-
this.pushedItemsPath = [];
|
|
54
|
-
}
|
|
55
|
-
checkPushBack() {
|
|
56
|
-
let i = this.pushedItems.length - 1;
|
|
57
|
-
let change = false;
|
|
58
|
-
for (; i > -1; i--) {
|
|
59
|
-
if (this.checkPushedItem(this.pushedItems[i], i)) {
|
|
60
|
-
change = true;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
if (change) {
|
|
64
|
-
this.checkPushBack();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
push(gridsterItem, direction) {
|
|
68
|
-
const gridsterItemCollision = this.gridster.checkCollision(gridsterItem.$item);
|
|
69
|
-
if (gridsterItemCollision &&
|
|
70
|
-
gridsterItemCollision !== true &&
|
|
71
|
-
gridsterItemCollision !== this.gridsterItem &&
|
|
72
|
-
gridsterItemCollision.canBeResized()) {
|
|
73
|
-
let tryPattern = this.tryPattern;
|
|
74
|
-
if (tryPattern[direction].call(this, gridsterItemCollision, gridsterItem, direction)) {
|
|
75
|
-
return true;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
else if (gridsterItemCollision === false) {
|
|
79
|
-
return true;
|
|
80
|
-
}
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
trySouth(gridsterItemCollide, gridsterItem, direction) {
|
|
84
|
-
const backUpY = gridsterItemCollide.$item.y;
|
|
85
|
-
const backUpRows = gridsterItemCollide.$item.rows;
|
|
86
|
-
gridsterItemCollide.$item.y =
|
|
87
|
-
gridsterItem.$item.y + gridsterItem.$item.rows;
|
|
88
|
-
gridsterItemCollide.$item.rows =
|
|
89
|
-
backUpRows + backUpY - gridsterItemCollide.$item.y;
|
|
90
|
-
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
91
|
-
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
92
|
-
gridsterItemCollide.setSize();
|
|
93
|
-
this.addToPushed(gridsterItemCollide);
|
|
94
|
-
this.push(gridsterItem, direction);
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
gridsterItemCollide.$item.y = backUpY;
|
|
99
|
-
gridsterItemCollide.$item.rows = backUpRows;
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
}
|
|
103
|
-
tryNorth(gridsterItemCollide, gridsterItem, direction) {
|
|
104
|
-
const backUpRows = gridsterItemCollide.$item.rows;
|
|
105
|
-
gridsterItemCollide.$item.rows =
|
|
106
|
-
gridsterItem.$item.y - gridsterItemCollide.$item.y;
|
|
107
|
-
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
108
|
-
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
109
|
-
gridsterItemCollide.setSize();
|
|
110
|
-
this.addToPushed(gridsterItemCollide);
|
|
111
|
-
this.push(gridsterItem, direction);
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
gridsterItemCollide.$item.rows = backUpRows;
|
|
116
|
-
}
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
tryEast(gridsterItemCollide, gridsterItem, direction) {
|
|
120
|
-
const backUpX = gridsterItemCollide.$item.x;
|
|
121
|
-
const backUpCols = gridsterItemCollide.$item.cols;
|
|
122
|
-
gridsterItemCollide.$item.x =
|
|
123
|
-
gridsterItem.$item.x + gridsterItem.$item.cols;
|
|
124
|
-
gridsterItemCollide.$item.cols =
|
|
125
|
-
backUpCols + backUpX - gridsterItemCollide.$item.x;
|
|
126
|
-
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
127
|
-
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
128
|
-
gridsterItemCollide.setSize();
|
|
129
|
-
this.addToPushed(gridsterItemCollide);
|
|
130
|
-
this.push(gridsterItem, direction);
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
gridsterItemCollide.$item.x = backUpX;
|
|
135
|
-
gridsterItemCollide.$item.cols = backUpCols;
|
|
136
|
-
}
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
tryWest(gridsterItemCollide, gridsterItem, direction) {
|
|
140
|
-
const backUpCols = gridsterItemCollide.$item.cols;
|
|
141
|
-
gridsterItemCollide.$item.cols =
|
|
142
|
-
gridsterItem.$item.x - gridsterItemCollide.$item.x;
|
|
143
|
-
if (!this.gridster.checkCollisionTwoItems(gridsterItemCollide.$item, gridsterItem.$item) &&
|
|
144
|
-
!this.gridster.checkGridCollision(gridsterItemCollide.$item)) {
|
|
145
|
-
gridsterItemCollide.setSize();
|
|
146
|
-
this.addToPushed(gridsterItemCollide);
|
|
147
|
-
this.push(gridsterItem, direction);
|
|
148
|
-
return true;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
gridsterItemCollide.$item.cols = backUpCols;
|
|
152
|
-
}
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
addToPushed(gridsterItem) {
|
|
156
|
-
if (this.pushedItems.indexOf(gridsterItem) < 0) {
|
|
157
|
-
this.pushedItems.push(gridsterItem);
|
|
158
|
-
this.pushedItemsPath.push([
|
|
159
|
-
{
|
|
160
|
-
x: gridsterItem.item.x || 0,
|
|
161
|
-
y: gridsterItem.item.y || 0,
|
|
162
|
-
cols: gridsterItem.item.cols || 0,
|
|
163
|
-
rows: gridsterItem.item.rows || 0
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
x: gridsterItem.$item.x,
|
|
167
|
-
y: gridsterItem.$item.y,
|
|
168
|
-
cols: gridsterItem.$item.cols,
|
|
169
|
-
rows: gridsterItem.$item.rows
|
|
170
|
-
}
|
|
171
|
-
]);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
const i = this.pushedItems.indexOf(gridsterItem);
|
|
175
|
-
this.pushedItemsPath[i].push({
|
|
176
|
-
x: gridsterItem.$item.x,
|
|
177
|
-
y: gridsterItem.$item.y,
|
|
178
|
-
cols: gridsterItem.$item.cols,
|
|
179
|
-
rows: gridsterItem.$item.rows
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
removeFromPushed(i) {
|
|
184
|
-
if (i > -1) {
|
|
185
|
-
this.pushedItems.splice(i, 1);
|
|
186
|
-
this.pushedItemsPath.splice(i, 1);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
checkPushedItem(pushedItem, i) {
|
|
190
|
-
const path = this.pushedItemsPath[i];
|
|
191
|
-
let j = path.length - 2;
|
|
192
|
-
let lastPosition;
|
|
193
|
-
let x;
|
|
194
|
-
let y;
|
|
195
|
-
let cols;
|
|
196
|
-
let rows;
|
|
197
|
-
for (; j > -1; j--) {
|
|
198
|
-
lastPosition = path[j];
|
|
199
|
-
x = pushedItem.$item.x;
|
|
200
|
-
y = pushedItem.$item.y;
|
|
201
|
-
cols = pushedItem.$item.cols;
|
|
202
|
-
rows = pushedItem.$item.rows;
|
|
203
|
-
pushedItem.$item.x = lastPosition.x;
|
|
204
|
-
pushedItem.$item.y = lastPosition.y;
|
|
205
|
-
pushedItem.$item.cols = lastPosition.cols;
|
|
206
|
-
pushedItem.$item.rows = lastPosition.rows;
|
|
207
|
-
if (!this.gridster.findItemWithItem(pushedItem.$item)) {
|
|
208
|
-
pushedItem.setSize();
|
|
209
|
-
path.splice(j + 1, path.length - 1 - j);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
pushedItem.$item.x = x;
|
|
213
|
-
pushedItem.$item.y = y;
|
|
214
|
-
pushedItem.$item.cols = cols;
|
|
215
|
-
pushedItem.$item.rows = rows;
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
if (path.length < 2) {
|
|
219
|
-
this.removeFromPushed(i);
|
|
220
|
-
return true;
|
|
221
|
-
}
|
|
222
|
-
return false;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJQdXNoUmVzaXplLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLGtCQUFrQjtJQWdDN0IsWUFBWSxZQUE0QztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRztZQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdEIsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3RCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDekIsQ0FBQztRQUNGLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUssQ0FBQztJQUM1QyxDQUFDO0lBRUQsU0FBUyxDQUFDLFNBQWlCO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDakQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQzFDLElBQUksVUFBMEMsQ0FBQztRQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztZQUNsRCxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDaEQsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE1BQU0sQ0FBQyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQzFDLElBQUksVUFBMEMsQ0FBQztRQUMvQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQixVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLEdBQVcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRU8sSUFBSSxDQUNWLFlBQTRDLEVBQzVDLFNBQWlCO1FBRWpCLE1BQU0scUJBQXFCLEdBQ3pCLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUNFLHFCQUFxQjtZQUNyQixxQkFBcUIsS0FBSyxJQUFJO1lBQzlCLHFCQUFxQixLQUFLLElBQUksQ0FBQyxZQUFZO1lBQzNDLHFCQUFxQixDQUFDLFlBQVksRUFBRSxFQUNwQyxDQUFDO1lBQ0QsSUFBSSxVQUFVLEdBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUN0QyxJQUNFLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQ3hCLElBQUksRUFDSixxQkFBcUIsRUFDckIsWUFBWSxFQUNaLFNBQVMsQ0FDVixFQUNELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQzthQUFNLElBQUkscUJBQXFCLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sUUFBUSxDQUNkLG1CQUFtRCxFQUNuRCxZQUE0QyxFQUM1QyxTQUFpQjtRQUVqQixNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDbEQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDakQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDNUIsVUFBVSxHQUFHLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQ0UsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUNuQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQ3pCLFlBQVksQ0FBQyxLQUFLLENBQ25CO1lBQ0QsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUM1RCxDQUFDO1lBQ0QsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN0QyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sUUFBUSxDQUNkLG1CQUFtRCxFQUNuRCxZQUE0QyxFQUM1QyxTQUFpQjtRQUVqQixNQUFNLFVBQVUsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ2xELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQzVCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQ25DLG1CQUFtQixDQUFDLEtBQUssRUFDekIsWUFBWSxDQUFDLEtBQUssQ0FDbkI7WUFDRCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQzVELENBQUM7WUFDRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxPQUFPLENBQ2IsbUJBQW1ELEVBQ25ELFlBQTRDLEVBQzVDLFNBQWlCO1FBRWpCLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNsRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUNqRCxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUM1QixVQUFVLEdBQUcsT0FBTyxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQ25DLG1CQUFtQixDQUFDLEtBQUssRUFDekIsWUFBWSxDQUFDLEtBQUssQ0FDbkI7WUFDRCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQzVELENBQUM7WUFDRCxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3RDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxPQUFPLENBQ2IsbUJBQW1ELEVBQ25ELFlBQTRDLEVBQzVDLFNBQWlCO1FBRWpCLE1BQU0sVUFBVSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDbEQsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDNUIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUNFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FDbkMsbUJBQW1CLENBQUMsS0FBSyxFQUN6QixZQUFZLENBQUMsS0FBSyxDQUNuQjtZQUNELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsRUFDNUQsQ0FBQztZQUNELG1CQUFtQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxDQUFDO1lBQ04sbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7UUFDOUMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVPLFdBQVcsQ0FBQyxZQUE0QztRQUM5RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDO2dCQUN4QjtvQkFDRSxDQUFDLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDM0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7b0JBQzNCLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO29CQUNqQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztpQkFDbEM7Z0JBQ0Q7b0JBQ0UsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkIsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDdkIsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDN0IsSUFBSSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSTtpQkFDOUI7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMzQixDQUFDLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixDQUFDLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN2QixJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJO2dCQUM3QixJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJO2FBQzlCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsQ0FBUztRQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQyxDQUFDO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FDckIsVUFBMEMsRUFDMUMsQ0FBUztRQUVULE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxZQUFrRSxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxDQUFDLENBQUM7UUFDTixJQUFJLElBQUksQ0FBQztRQUNULElBQUksSUFBSSxDQUFDO1FBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQixZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN2QixDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQzdCLElBQUksR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztZQUM3QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDcEMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztZQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN0RCxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN2QixVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZCLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDN0IsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1lBQy9CLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgR3JpZHN0ZXJJdGVtLFxyXG4gIEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZVxyXG59IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdyaWRzdGVyUHVzaFJlc2l6ZSB7XHJcbiAgcHVibGljIGZyb21Tb3V0aDogc3RyaW5nO1xyXG4gIHB1YmxpYyBmcm9tTm9ydGg6IHN0cmluZztcclxuICBwdWJsaWMgZnJvbUVhc3Q6IHN0cmluZztcclxuICBwdWJsaWMgZnJvbVdlc3Q6IHN0cmluZztcclxuICBwcml2YXRlIHB1c2hlZEl0ZW1zOiBBcnJheTxHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U+O1xyXG4gIHByaXZhdGUgcHVzaGVkSXRlbXNQYXRoOiBBcnJheTxBcnJheTxHcmlkc3Rlckl0ZW0+PjtcclxuICBwcml2YXRlIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgZ3JpZHN0ZXI6IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gIHByaXZhdGUgdHJ5UGF0dGVybjoge1xyXG4gICAgZnJvbUVhc3Q6IChcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICAgICkgPT4gYm9vbGVhbjtcclxuICAgIGZyb21XZXN0OiAoXHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgICApID0+IGJvb2xlYW47XHJcbiAgICBmcm9tTm9ydGg6IChcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICAgICkgPT4gYm9vbGVhbjtcclxuICAgIGZyb21Tb3V0aDogKFxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICAgKSA9PiBib29sZWFuO1xyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlKSB7XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zID0gW107XHJcbiAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aCA9IFtdO1xyXG4gICAgdGhpcy5ncmlkc3Rlckl0ZW0gPSBncmlkc3Rlckl0ZW07XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gZ3JpZHN0ZXJJdGVtLmdyaWRzdGVyO1xyXG4gICAgdGhpcy50cnlQYXR0ZXJuID0ge1xyXG4gICAgICBmcm9tRWFzdDogdGhpcy50cnlXZXN0LFxyXG4gICAgICBmcm9tV2VzdDogdGhpcy50cnlFYXN0LFxyXG4gICAgICBmcm9tTm9ydGg6IHRoaXMudHJ5U291dGgsXHJcbiAgICAgIGZyb21Tb3V0aDogdGhpcy50cnlOb3J0aFxyXG4gICAgfTtcclxuICAgIHRoaXMuZnJvbVNvdXRoID0gJ2Zyb21Tb3V0aCc7XHJcbiAgICB0aGlzLmZyb21Ob3J0aCA9ICdmcm9tTm9ydGgnO1xyXG4gICAgdGhpcy5mcm9tRWFzdCA9ICdmcm9tRWFzdCc7XHJcbiAgICB0aGlzLmZyb21XZXN0ID0gJ2Zyb21XZXN0JztcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLmdyaWRzdGVyID0gdGhpcy5ncmlkc3Rlckl0ZW0gPSBudWxsITtcclxuICB9XHJcblxyXG4gIHB1c2hJdGVtcyhkaXJlY3Rpb246IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucHVzaFJlc2l6ZUl0ZW1zKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnB1c2godGhpcy5ncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXN0b3JlSXRlbXMoKTogdm9pZCB7XHJcbiAgICBsZXQgaSA9IDA7XHJcbiAgICBjb25zdCBsOiBudW1iZXIgPSB0aGlzLnB1c2hlZEl0ZW1zLmxlbmd0aDtcclxuICAgIGxldCBwdXNoZWRJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2U7XHJcbiAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xyXG4gICAgICBwdXNoZWRJdGVtID0gdGhpcy5wdXNoZWRJdGVtc1tpXTtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0gcHVzaGVkSXRlbS5pdGVtLnggfHwgMDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0gcHVzaGVkSXRlbS5pdGVtLnkgfHwgMDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5jb2xzID0gcHVzaGVkSXRlbS5pdGVtLmNvbHMgfHwgMTtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS5yb3cgPSBwdXNoZWRJdGVtLml0ZW0ucm93IHx8IDE7XHJcbiAgICAgIHB1c2hlZEl0ZW0uc2V0U2l6ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1BhdGggPSBbXTtcclxuICB9XHJcblxyXG4gIHNldFB1c2hlZEl0ZW1zKCk6IHZvaWQge1xyXG4gICAgbGV0IGkgPSAwO1xyXG4gICAgY29uc3QgbDogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGg7XHJcbiAgICBsZXQgcHVzaGVkSXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlO1xyXG4gICAgZm9yICg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgcHVzaGVkSXRlbSA9IHRoaXMucHVzaGVkSXRlbXNbaV07XHJcbiAgICAgIHB1c2hlZEl0ZW0uY2hlY2tJdGVtQ2hhbmdlcyhwdXNoZWRJdGVtLiRpdGVtLCBwdXNoZWRJdGVtLml0ZW0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wdXNoZWRJdGVtcyA9IFtdO1xyXG4gICAgdGhpcy5wdXNoZWRJdGVtc1BhdGggPSBbXTtcclxuICB9XHJcblxyXG4gIGNoZWNrUHVzaEJhY2soKTogdm9pZCB7XHJcbiAgICBsZXQgaTogbnVtYmVyID0gdGhpcy5wdXNoZWRJdGVtcy5sZW5ndGggLSAxO1xyXG4gICAgbGV0IGNoYW5nZSA9IGZhbHNlO1xyXG4gICAgZm9yICg7IGkgPiAtMTsgaS0tKSB7XHJcbiAgICAgIGlmICh0aGlzLmNoZWNrUHVzaGVkSXRlbSh0aGlzLnB1c2hlZEl0ZW1zW2ldLCBpKSkge1xyXG4gICAgICAgIGNoYW5nZSA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2UpIHtcclxuICAgICAgdGhpcy5jaGVja1B1c2hCYWNrKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHB1c2goXHJcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBncmlkc3Rlckl0ZW1Db2xsaXNpb246IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSB8IGJvb2xlYW4gPVxyXG4gICAgICB0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uKGdyaWRzdGVySXRlbS4kaXRlbSk7XHJcbiAgICBpZiAoXHJcbiAgICAgIGdyaWRzdGVySXRlbUNvbGxpc2lvbiAmJlxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaXNpb24gIT09IHRydWUgJiZcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uICE9PSB0aGlzLmdyaWRzdGVySXRlbSAmJlxyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaXNpb24uY2FuQmVSZXNpemVkKClcclxuICAgICkge1xyXG4gICAgICBsZXQgdHJ5UGF0dGVybjogYW55ID0gdGhpcy50cnlQYXR0ZXJuO1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdHJ5UGF0dGVybltkaXJlY3Rpb25dLmNhbGwoXHJcbiAgICAgICAgICB0aGlzLFxyXG4gICAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlzaW9uLFxyXG4gICAgICAgICAgZ3JpZHN0ZXJJdGVtLFxyXG4gICAgICAgICAgZGlyZWN0aW9uXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChncmlkc3Rlckl0ZW1Db2xsaXNpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlTb3V0aChcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGU6IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGdyaWRzdGVySXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZGlyZWN0aW9uOiBzdHJpbmdcclxuICApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGJhY2tVcFkgPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnk7XHJcbiAgICBjb25zdCBiYWNrVXBSb3dzID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID1cclxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgKyBncmlkc3Rlckl0ZW0uJGl0ZW0ucm93cztcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ucm93cyA9XHJcbiAgICAgIGJhY2tVcFJvd3MgKyBiYWNrVXBZIC0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55O1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKFxyXG4gICAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0sXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXHJcbiAgICAgICkgJiZcclxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XHJcbiAgICAgIHRoaXMuYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS55ID0gYmFja1VwWTtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzID0gYmFja1VwUm93cztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJ5Tm9ydGgoXHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBncmlkc3Rlckl0ZW06IEdyaWRzdGVySXRlbUNvbXBvbmVudEludGVyZmFjZSxcclxuICAgIGRpcmVjdGlvbjogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBiYWNrVXBSb3dzID0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5yb3dzID1cclxuICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtLnkgLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnk7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcclxuICAgICAgICBncmlkc3Rlckl0ZW0uJGl0ZW1cclxuICAgICAgKSAmJlxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcclxuICAgICkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgdGhpcy5wdXNoKGdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnJvd3MgPSBiYWNrVXBSb3dzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlFYXN0KFxyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYmFja1VwWCA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0ueDtcclxuICAgIGNvbnN0IGJhY2tVcENvbHMgPSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHM7XHJcbiAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPVxyXG4gICAgICBncmlkc3Rlckl0ZW0uJGl0ZW0ueCArIGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5jb2xzID1cclxuICAgICAgYmFja1VwQ29scyArIGJhY2tVcFggLSBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLng7XHJcbiAgICBpZiAoXHJcbiAgICAgICF0aGlzLmdyaWRzdGVyLmNoZWNrQ29sbGlzaW9uVHdvSXRlbXMoXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSxcclxuICAgICAgICBncmlkc3Rlckl0ZW0uJGl0ZW1cclxuICAgICAgKSAmJlxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0dyaWRDb2xsaXNpb24oZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbSlcclxuICAgICkge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLnNldFNpemUoKTtcclxuICAgICAgdGhpcy5hZGRUb1B1c2hlZChncmlkc3Rlckl0ZW1Db2xsaWRlKTtcclxuICAgICAgdGhpcy5wdXNoKGdyaWRzdGVySXRlbSwgZGlyZWN0aW9uKTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLnggPSBiYWNrVXBYO1xyXG4gICAgICBncmlkc3Rlckl0ZW1Db2xsaWRlLiRpdGVtLmNvbHMgPSBiYWNrVXBDb2xzO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cnlXZXN0KFxyXG4gICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UsXHJcbiAgICBkaXJlY3Rpb246IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgYmFja1VwQ29scyA9IGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scztcclxuICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0uY29scyA9XHJcbiAgICAgIGdyaWRzdGVySXRlbS4kaXRlbS54IC0gZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS54O1xyXG4gICAgaWYgKFxyXG4gICAgICAhdGhpcy5ncmlkc3Rlci5jaGVja0NvbGxpc2lvblR3b0l0ZW1zKFxyXG4gICAgICAgIGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0sXHJcbiAgICAgICAgZ3JpZHN0ZXJJdGVtLiRpdGVtXHJcbiAgICAgICkgJiZcclxuICAgICAgIXRoaXMuZ3JpZHN0ZXIuY2hlY2tHcmlkQ29sbGlzaW9uKGdyaWRzdGVySXRlbUNvbGxpZGUuJGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS5zZXRTaXplKCk7XHJcbiAgICAgIHRoaXMuYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtQ29sbGlkZSk7XHJcbiAgICAgIHRoaXMucHVzaChncmlkc3Rlckl0ZW0sIGRpcmVjdGlvbik7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ3JpZHN0ZXJJdGVtQ29sbGlkZS4kaXRlbS5jb2xzID0gYmFja1VwQ29scztcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkVG9QdXNoZWQoZ3JpZHN0ZXJJdGVtOiBHcmlkc3Rlckl0ZW1Db21wb25lbnRJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnB1c2hlZEl0ZW1zLmluZGV4T2YoZ3JpZHN0ZXJJdGVtKSA8IDApIHtcclxuICAgICAgdGhpcy5wdXNoZWRJdGVtcy5wdXNoKGdyaWRzdGVySXRlbSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnB1c2goW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHg6IGdyaWRzdGVySXRlbS5pdGVtLnggfHwgMCxcclxuICAgICAgICAgIHk6IGdyaWRzdGVySXRlbS5pdGVtLnkgfHwgMCxcclxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS5pdGVtLmNvbHMgfHwgMCxcclxuICAgICAgICAgIHJvd3M6IGdyaWRzdGVySXRlbS5pdGVtLnJvd3MgfHwgMFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgeDogZ3JpZHN0ZXJJdGVtLiRpdGVtLngsXHJcbiAgICAgICAgICB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueSxcclxuICAgICAgICAgIGNvbHM6IGdyaWRzdGVySXRlbS4kaXRlbS5jb2xzLFxyXG4gICAgICAgICAgcm93czogZ3JpZHN0ZXJJdGVtLiRpdGVtLnJvd3NcclxuICAgICAgICB9XHJcbiAgICAgIF0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgaSA9IHRoaXMucHVzaGVkSXRlbXMuaW5kZXhPZihncmlkc3Rlckl0ZW0pO1xyXG4gICAgICB0aGlzLnB1c2hlZEl0ZW1zUGF0aFtpXS5wdXNoKHtcclxuICAgICAgICB4OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueCxcclxuICAgICAgICB5OiBncmlkc3Rlckl0ZW0uJGl0ZW0ueSxcclxuICAgICAgICBjb2xzOiBncmlkc3Rlckl0ZW0uJGl0ZW0uY29scyxcclxuICAgICAgICByb3dzOiBncmlkc3Rlckl0ZW0uJGl0ZW0ucm93c1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVB1c2hlZChpOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGlmIChpID4gLTEpIHtcclxuICAgICAgdGhpcy5wdXNoZWRJdGVtcy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgIHRoaXMucHVzaGVkSXRlbXNQYXRoLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tQdXNoZWRJdGVtKFxyXG4gICAgcHVzaGVkSXRlbTogR3JpZHN0ZXJJdGVtQ29tcG9uZW50SW50ZXJmYWNlLFxyXG4gICAgaTogbnVtYmVyXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5wdXNoZWRJdGVtc1BhdGhbaV07XHJcbiAgICBsZXQgaiA9IHBhdGgubGVuZ3RoIC0gMjtcclxuICAgIGxldCBsYXN0UG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IGNvbHM6IG51bWJlcjsgcm93czogbnVtYmVyIH07XHJcbiAgICBsZXQgeDtcclxuICAgIGxldCB5O1xyXG4gICAgbGV0IGNvbHM7XHJcbiAgICBsZXQgcm93cztcclxuICAgIGZvciAoOyBqID4gLTE7IGotLSkge1xyXG4gICAgICBsYXN0UG9zaXRpb24gPSBwYXRoW2pdO1xyXG4gICAgICB4ID0gcHVzaGVkSXRlbS4kaXRlbS54O1xyXG4gICAgICB5ID0gcHVzaGVkSXRlbS4kaXRlbS55O1xyXG4gICAgICBjb2xzID0gcHVzaGVkSXRlbS4kaXRlbS5jb2xzO1xyXG4gICAgICByb3dzID0gcHVzaGVkSXRlbS4kaXRlbS5yb3dzO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnggPSBsYXN0UG9zaXRpb24ueDtcclxuICAgICAgcHVzaGVkSXRlbS4kaXRlbS55ID0gbGFzdFBvc2l0aW9uLnk7XHJcbiAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0uY29scyA9IGxhc3RQb3NpdGlvbi5jb2xzO1xyXG4gICAgICBwdXNoZWRJdGVtLiRpdGVtLnJvd3MgPSBsYXN0UG9zaXRpb24ucm93cztcclxuICAgICAgaWYgKCF0aGlzLmdyaWRzdGVyLmZpbmRJdGVtV2l0aEl0ZW0ocHVzaGVkSXRlbS4kaXRlbSkpIHtcclxuICAgICAgICBwdXNoZWRJdGVtLnNldFNpemUoKTtcclxuICAgICAgICBwYXRoLnNwbGljZShqICsgMSwgcGF0aC5sZW5ndGggLSAxIC0gaik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS54ID0geDtcclxuICAgICAgICBwdXNoZWRJdGVtLiRpdGVtLnkgPSB5O1xyXG4gICAgICAgIHB1c2hlZEl0ZW0uJGl0ZW0uY29scyA9IGNvbHM7XHJcbiAgICAgICAgcHVzaGVkSXRlbS4kaXRlbS5yb3dzID0gcm93cztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKHBhdGgubGVuZ3RoIDwgMikge1xyXG4gICAgICB0aGlzLnJlbW92ZUZyb21QdXNoZWQoaSk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yYS1kYXNoYm9hcmQtZnJhbWV3b3JrL3NyYy9ncmlkc3Rlci9saWIvZ3JpZHN0ZXJSZW5kZXJlci5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uR3JpZFN0eWxlIHtcclxuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICB3aWR0aDogbnVtYmVyO1xyXG4gIGhlaWdodDogbnVtYmVyO1xyXG4gIHN0eWxlOiBDb21tb25HcmlkU3R5bGU7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZENvbHVtbkNhY2hlZFN0eWxlIGV4dGVuZHMgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICBsZWZ0OiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgR3JpZFJvd0NhY2hlZFN0eWxlIGV4dGVuZHMgQ29tbW9uR3JpZENhY2hlZFN0eWxlIHtcclxuICB0b3A6IG51bWJlcjtcclxufVxyXG4iXX0=
|
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import { DirTypes, GridType } from './gridsterConfig.interface';
|
|
2
|
-
export class GridsterRenderer {
|
|
3
|
-
constructor(gridster) {
|
|
4
|
-
this.gridster = gridster;
|
|
5
|
-
/**
|
|
6
|
-
* Caches the last grid column styles.
|
|
7
|
-
* This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
|
|
8
|
-
*/
|
|
9
|
-
this.lastGridColumnStyles = {};
|
|
10
|
-
/**
|
|
11
|
-
* Caches the last grid column styles.
|
|
12
|
-
* This improves the grid responsiveness by caching and reusing the last style object instead of creating a new one.
|
|
13
|
-
*/
|
|
14
|
-
this.lastGridRowStyles = {};
|
|
15
|
-
}
|
|
16
|
-
destroy() {
|
|
17
|
-
this.gridster = null;
|
|
18
|
-
}
|
|
19
|
-
updateItem(el, item, renderer) {
|
|
20
|
-
if (this.gridster.mobile) {
|
|
21
|
-
this.clearCellPosition(renderer, el);
|
|
22
|
-
if (this.gridster.$options.keepFixedHeightInMobile) {
|
|
23
|
-
renderer.setStyle(el, 'height', (item.rows - 1) * this.gridster.$options.margin +
|
|
24
|
-
item.rows * this.gridster.$options.fixedRowHeight +
|
|
25
|
-
'px');
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
renderer.setStyle(el, 'height', (item.rows * this.gridster.curWidth) / item.cols + 'px');
|
|
29
|
-
}
|
|
30
|
-
if (this.gridster.$options.keepFixedWidthInMobile) {
|
|
31
|
-
renderer.setStyle(el, 'width', this.gridster.$options.fixedColWidth + 'px');
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
renderer.setStyle(el, 'width', '');
|
|
35
|
-
}
|
|
36
|
-
renderer.setStyle(el, 'margin-bottom', this.gridster.$options.margin + 'px');
|
|
37
|
-
renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', '');
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
const x = Math.round(this.gridster.curColWidth * item.x);
|
|
41
|
-
const y = Math.round(this.gridster.curRowHeight * item.y);
|
|
42
|
-
const width = this.gridster.curColWidth * item.cols - this.gridster.$options.margin - 1; // added -1 to avoid the right side of widgets not showing borders
|
|
43
|
-
const height = this.gridster.curRowHeight * item.rows - this.gridster.$options.margin;
|
|
44
|
-
// set the cell style
|
|
45
|
-
this.setCellPosition(renderer, el, x, y);
|
|
46
|
-
renderer.setStyle(el, 'width', width + 'px');
|
|
47
|
-
renderer.setStyle(el, 'height', height + 'px');
|
|
48
|
-
let marginBottom = null;
|
|
49
|
-
let marginRight = null;
|
|
50
|
-
if (this.gridster.$options.outerMargin) {
|
|
51
|
-
if (this.gridster.rows === item.rows + item.y) {
|
|
52
|
-
if (this.gridster.$options.outerMarginBottom !== null) {
|
|
53
|
-
marginBottom = this.gridster.$options.outerMarginBottom + 'px';
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
marginBottom = this.gridster.$options.margin + 'px';
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (this.gridster.columns === item.cols + item.x) {
|
|
60
|
-
if (this.gridster.$options.outerMarginBottom !== null) {
|
|
61
|
-
marginRight = this.gridster.$options.outerMarginRight + 'px';
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
marginRight = this.gridster.$options.margin + 'px';
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
renderer.setStyle(el, 'margin-bottom', marginBottom);
|
|
69
|
-
renderer.setStyle(el, DirTypes.LTR ? 'margin-right' : 'margin-left', marginRight);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
updateGridster() {
|
|
73
|
-
let addClass = '';
|
|
74
|
-
let removeClass1 = '';
|
|
75
|
-
let removeClass2 = '';
|
|
76
|
-
let removeClass3 = '';
|
|
77
|
-
if (this.gridster.$options.gridType === GridType.Fit) {
|
|
78
|
-
addClass = GridType.Fit;
|
|
79
|
-
removeClass1 = GridType.ScrollVertical;
|
|
80
|
-
removeClass2 = GridType.ScrollHorizontal;
|
|
81
|
-
removeClass3 = GridType.Fixed;
|
|
82
|
-
}
|
|
83
|
-
else if (this.gridster.$options.gridType === GridType.ScrollVertical) {
|
|
84
|
-
this.gridster.curRowHeight =
|
|
85
|
-
this.gridster.curColWidth * this.gridster.$options.rowHeightRatio;
|
|
86
|
-
addClass = GridType.ScrollVertical;
|
|
87
|
-
removeClass1 = GridType.Fit;
|
|
88
|
-
removeClass2 = GridType.ScrollHorizontal;
|
|
89
|
-
removeClass3 = GridType.Fixed;
|
|
90
|
-
}
|
|
91
|
-
else if (this.gridster.$options.gridType === GridType.ScrollHorizontal) {
|
|
92
|
-
const widthRatio = this.gridster.$options.rowHeightRatio;
|
|
93
|
-
const calWidthRatio = widthRatio >= 1 ? widthRatio : widthRatio + 1;
|
|
94
|
-
this.gridster.curColWidth = this.gridster.curRowHeight * calWidthRatio;
|
|
95
|
-
addClass = GridType.ScrollHorizontal;
|
|
96
|
-
removeClass1 = GridType.Fit;
|
|
97
|
-
removeClass2 = GridType.ScrollVertical;
|
|
98
|
-
removeClass3 = GridType.Fixed;
|
|
99
|
-
}
|
|
100
|
-
else if (this.gridster.$options.gridType === GridType.Fixed) {
|
|
101
|
-
this.gridster.curColWidth =
|
|
102
|
-
this.gridster.$options.fixedColWidth +
|
|
103
|
-
(this.gridster.$options.ignoreMarginInRow
|
|
104
|
-
? 0
|
|
105
|
-
: this.gridster.$options.margin);
|
|
106
|
-
this.gridster.curRowHeight =
|
|
107
|
-
this.gridster.$options.fixedRowHeight +
|
|
108
|
-
(this.gridster.$options.ignoreMarginInRow
|
|
109
|
-
? 0
|
|
110
|
-
: this.gridster.$options.margin);
|
|
111
|
-
addClass = GridType.Fixed;
|
|
112
|
-
removeClass1 = GridType.Fit;
|
|
113
|
-
removeClass2 = GridType.ScrollVertical;
|
|
114
|
-
removeClass3 = GridType.ScrollHorizontal;
|
|
115
|
-
}
|
|
116
|
-
else if (this.gridster.$options.gridType === GridType.VerticalFixed) {
|
|
117
|
-
this.gridster.curRowHeight =
|
|
118
|
-
this.gridster.$options.fixedRowHeight +
|
|
119
|
-
(this.gridster.$options.ignoreMarginInRow
|
|
120
|
-
? 0
|
|
121
|
-
: this.gridster.$options.margin);
|
|
122
|
-
addClass = GridType.ScrollVertical;
|
|
123
|
-
removeClass1 = GridType.Fit;
|
|
124
|
-
removeClass2 = GridType.ScrollHorizontal;
|
|
125
|
-
removeClass3 = GridType.Fixed;
|
|
126
|
-
}
|
|
127
|
-
else if (this.gridster.$options.gridType === GridType.HorizontalFixed) {
|
|
128
|
-
this.gridster.curColWidth =
|
|
129
|
-
this.gridster.$options.fixedColWidth +
|
|
130
|
-
(this.gridster.$options.ignoreMarginInRow
|
|
131
|
-
? 0
|
|
132
|
-
: this.gridster.$options.margin);
|
|
133
|
-
addClass = GridType.ScrollHorizontal;
|
|
134
|
-
removeClass1 = GridType.Fit;
|
|
135
|
-
removeClass2 = GridType.ScrollVertical;
|
|
136
|
-
removeClass3 = GridType.Fixed;
|
|
137
|
-
}
|
|
138
|
-
if (this.gridster.mobile ||
|
|
139
|
-
(this.gridster.$options.setGridSize &&
|
|
140
|
-
this.gridster.$options.gridType !== GridType.Fit)) {
|
|
141
|
-
this.gridster.renderer.removeClass(this.gridster.el, addClass);
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
this.gridster.renderer.addClass(this.gridster.el, addClass);
|
|
145
|
-
}
|
|
146
|
-
this.gridster.renderer.removeClass(this.gridster.el, removeClass1);
|
|
147
|
-
this.gridster.renderer.removeClass(this.gridster.el, removeClass2);
|
|
148
|
-
this.gridster.renderer.removeClass(this.gridster.el, removeClass3);
|
|
149
|
-
}
|
|
150
|
-
getGridColumnStyle(i) {
|
|
151
|
-
// generates the new style
|
|
152
|
-
const newPos = {
|
|
153
|
-
left: this.gridster.curColWidth * i,
|
|
154
|
-
width: this.gridster.curColWidth - this.gridster.$options.margin,
|
|
155
|
-
height: this.gridster.gridRows.length * this.gridster.curRowHeight -
|
|
156
|
-
this.gridster.$options.margin,
|
|
157
|
-
style: {}
|
|
158
|
-
};
|
|
159
|
-
newPos.style = {
|
|
160
|
-
...this.getLeftPosition(newPos.left),
|
|
161
|
-
width: newPos.width + 'px',
|
|
162
|
-
height: newPos.height + 'px'
|
|
163
|
-
};
|
|
164
|
-
// use the last cached style if it has same values as the generated one
|
|
165
|
-
const last = this.lastGridColumnStyles[i];
|
|
166
|
-
if (last &&
|
|
167
|
-
last.left === newPos.left &&
|
|
168
|
-
last.width === newPos.width &&
|
|
169
|
-
last.height === newPos.height) {
|
|
170
|
-
return last.style;
|
|
171
|
-
}
|
|
172
|
-
// cache and set new style
|
|
173
|
-
this.lastGridColumnStyles[i] = newPos;
|
|
174
|
-
return newPos.style;
|
|
175
|
-
}
|
|
176
|
-
getGridRowStyle(i) {
|
|
177
|
-
// generates the new style
|
|
178
|
-
const newPos = {
|
|
179
|
-
top: this.gridster.curRowHeight * i,
|
|
180
|
-
width: this.gridster.gridColumns.length * this.gridster.curColWidth +
|
|
181
|
-
this.gridster.$options.margin,
|
|
182
|
-
height: this.gridster.curRowHeight - this.gridster.$options.margin,
|
|
183
|
-
style: {}
|
|
184
|
-
};
|
|
185
|
-
newPos.style = {
|
|
186
|
-
...this.getTopPosition(newPos.top),
|
|
187
|
-
width: newPos.width + 'px',
|
|
188
|
-
height: newPos.height + 'px'
|
|
189
|
-
};
|
|
190
|
-
// use the last cached style if it has same values as the generated one
|
|
191
|
-
const last = this.lastGridRowStyles[i];
|
|
192
|
-
if (last &&
|
|
193
|
-
last.top === newPos.top &&
|
|
194
|
-
last.width === newPos.width &&
|
|
195
|
-
last.height === newPos.height) {
|
|
196
|
-
return last.style;
|
|
197
|
-
}
|
|
198
|
-
// cache and set new style
|
|
199
|
-
this.lastGridRowStyles[i] = newPos;
|
|
200
|
-
return newPos.style;
|
|
201
|
-
}
|
|
202
|
-
getLeftPosition(d) {
|
|
203
|
-
const dPosition = this.gridster.$options.dirType === DirTypes.RTL ? -d : d;
|
|
204
|
-
if (this.gridster.$options.useTransformPositioning) {
|
|
205
|
-
return {
|
|
206
|
-
transform: 'translateX(' + dPosition + 'px)'
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
return {
|
|
211
|
-
left: this.getLeftMargin() + dPosition + 'px'
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
getTopPosition(d) {
|
|
216
|
-
if (this.gridster.$options.useTransformPositioning) {
|
|
217
|
-
return {
|
|
218
|
-
transform: 'translateY(' + d + 'px)'
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
return {
|
|
223
|
-
top: this.getTopMargin() + d + 'px'
|
|
224
|
-
};
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
clearCellPosition(renderer, el) {
|
|
228
|
-
if (this.gridster.$options.useTransformPositioning) {
|
|
229
|
-
renderer.setStyle(el, 'transform', '');
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
renderer.setStyle(el, 'top', '');
|
|
233
|
-
renderer.setStyle(el, 'left', '');
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
setCellPosition(renderer, el, x, y) {
|
|
237
|
-
const xPosition = this.gridster.$options.dirType === DirTypes.RTL ? -x : x;
|
|
238
|
-
if (this.gridster.$options.useTransformPositioning) {
|
|
239
|
-
const transform = 'translate3d(' + xPosition + 'px, ' + y + 'px, 0)';
|
|
240
|
-
renderer.setStyle(el, 'transform', transform);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
renderer.setStyle(el, 'left', this.getLeftMargin() + xPosition + 'px');
|
|
244
|
-
renderer.setStyle(el, 'top', this.getTopMargin() + y + 'px');
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
getLeftMargin() {
|
|
248
|
-
if (this.gridster.$options.outerMargin) {
|
|
249
|
-
if (this.gridster.$options.outerMarginLeft !== null) {
|
|
250
|
-
return this.gridster.$options.outerMarginLeft;
|
|
251
|
-
}
|
|
252
|
-
else {
|
|
253
|
-
return this.gridster.$options.margin;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
else {
|
|
257
|
-
return 0;
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
getTopMargin() {
|
|
261
|
-
if (this.gridster.$options.outerMargin) {
|
|
262
|
-
if (this.gridster.$options.outerMarginTop !== null) {
|
|
263
|
-
return this.gridster.$options.outerMarginTop;
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
return this.gridster.$options.margin;
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
return 0;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXJSZW5kZXJlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmEtZGFzaGJvYXJkLWZyYW1ld29yay9zcmMvZ3JpZHN0ZXIvbGliL2dyaWRzdGVyUmVuZGVyZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBUWhFLE1BQU0sT0FBTyxnQkFBZ0I7SUFhM0IsWUFBb0IsUUFBb0M7UUFBcEMsYUFBUSxHQUFSLFFBQVEsQ0FBNEI7UUFaeEQ7OztXQUdHO1FBQ0sseUJBQW9CLEdBQTBDLEVBQUUsQ0FBQztRQUV6RTs7O1dBR0c7UUFDSyxzQkFBaUIsR0FBdUMsRUFBRSxDQUFDO0lBRVIsQ0FBQztJQUU1RCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxFQUFXLEVBQUUsSUFBa0IsRUFBRSxRQUFtQjtRQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNyQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ25ELFFBQVEsQ0FBQyxRQUFRLENBQ2YsRUFBRSxFQUNGLFFBQVEsRUFDUixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTTtvQkFDN0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjO29CQUNqRCxJQUFJLENBQ1AsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixRQUFR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dkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN2QyxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IEdyaWRzdGVyQ29tcG9uZW50SW50ZXJmYWNlIH0gZnJvbSAnLi9ncmlkc3Rlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBEaXJUeXBlcywgR3JpZFR5cGUgfSBmcm9tICcuL2dyaWRzdGVyQ29uZmlnLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEdyaWRzdGVySXRlbSB9IGZyb20gJy4vZ3JpZHN0ZXJJdGVtLmludGVyZmFjZSc7XHJcbmltcG9ydCB7XHJcbiAgQ29tbW9uR3JpZFN0eWxlLFxyXG4gIEdyaWRDb2x1bW5DYWNoZWRTdHlsZSxcclxuICBHcmlkUm93Q2FjaGVkU3R5bGVcclxufSBmcm9tICcuL2dyaWRzdGVyUmVuZGVyZXIuaW50ZXJmYWNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmlkc3RlclJlbmRlcmVyIHtcclxuICAvKipcclxuICAgKiBDYWNoZXMgdGhlIGxhc3QgZ3JpZCBjb2x1bW4gc3R5bGVzLlxyXG4gICAqIFRoaXMgaW1wcm92ZXMgdGhlIGdyaWQgcmVzcG9uc2l2ZW5lc3MgYnkgY2FjaGluZyBhbmQgcmV1c2luZyB0aGUgbGFzdCBzdHlsZSBvYmplY3QgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsYXN0R3JpZENvbHVtblN0eWxlczogUmVjb3JkPG51bWJlciwgR3JpZENvbHVtbkNhY2hlZFN0eWxlPiA9IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBDYWNoZXMgdGhlIGxhc3QgZ3JpZCBjb2x1bW4gc3R5bGVzLlxyXG4gICAqIFRoaXMgaW1wcm92ZXMgdGhlIGdyaWQgcmVzcG9uc2l2ZW5lc3MgYnkgY2FjaGluZyBhbmQgcmV1c2luZyB0aGUgbGFzdCBzdHlsZSBvYmplY3QgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsYXN0R3JpZFJvd1N0eWxlczogUmVjb3JkPG51bWJlciwgR3JpZFJvd0NhY2hlZFN0eWxlPiA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyaWRzdGVyOiBHcmlkc3RlckNvbXBvbmVudEludGVyZmFjZSkge31cclxuXHJcbiAgZGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZHN0ZXIgPSBudWxsITtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUl0ZW0oZWw6IEVsZW1lbnQsIGl0ZW06IEdyaWRzdGVySXRlbSwgcmVuZGVyZXI6IFJlbmRlcmVyMik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIubW9iaWxlKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJDZWxsUG9zaXRpb24ocmVuZGVyZXIsIGVsKTtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMua2VlcEZpeGVkSGVpZ2h0SW5Nb2JpbGUpIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIGVsLFxyXG4gICAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgICAoaXRlbS5yb3dzIC0gMSkgKiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbiArXHJcbiAgICAgICAgICAgIGl0ZW0ucm93cyAqIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRSb3dIZWlnaHQgK1xyXG4gICAgICAgICAgICAncHgnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICAgIGVsLFxyXG4gICAgICAgICAgJ2hlaWdodCcsXHJcbiAgICAgICAgICAoaXRlbS5yb3dzICogdGhpcy5ncmlkc3Rlci5jdXJXaWR0aCkgLyBpdGVtLmNvbHMgKyAncHgnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5rZWVwRml4ZWRXaWR0aEluTW9iaWxlKSB7XHJcbiAgICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgICBlbCxcclxuICAgICAgICAgICd3aWR0aCcsXHJcbiAgICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkQ29sV2lkdGggKyAncHgnXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ3dpZHRoJywgJycpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShcclxuICAgICAgICBlbCxcclxuICAgICAgICAnbWFyZ2luLWJvdHRvbScsXHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnXHJcbiAgICAgICk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCBEaXJUeXBlcy5MVFIgPyAnbWFyZ2luLXJpZ2h0JyA6ICdtYXJnaW4tbGVmdCcsICcnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHggPSBNYXRoLnJvdW5kKHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggKiBpdGVtLngpO1xyXG4gICAgICBjb25zdCB5ID0gTWF0aC5yb3VuZCh0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAqIGl0ZW0ueSk7XHJcbiAgICAgIGNvbnN0IHdpZHRoID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogaXRlbS5jb2xzIC0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gLSAxOyAgLy8gYWRkZWQgLTEgdG8gYXZvaWQgdGhlIHJpZ2h0IHNpZGUgb2Ygd2lkZ2V0cyBub3Qgc2hvd2luZyBib3JkZXJzXHJcbiAgICAgIGNvbnN0IGhlaWdodCA9XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgKiBpdGVtLnJvd3MgLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgLy8gc2V0IHRoZSBjZWxsIHN0eWxlXHJcbiAgICAgIHRoaXMuc2V0Q2VsbFBvc2l0aW9uKHJlbmRlcmVyLCBlbCwgeCwgeSk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnd2lkdGgnLCB3aWR0aCArICdweCcpO1xyXG4gICAgICByZW5kZXJlci5zZXRTdHlsZShlbCwgJ2hlaWdodCcsIGhlaWdodCArICdweCcpO1xyXG4gICAgICBsZXQgbWFyZ2luQm90dG9tOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgbGV0IG1hcmdpblJpZ2h0OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5yb3dzID09PSBpdGVtLnJvd3MgKyBpdGVtLnkpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG1hcmdpbkJvdHRvbSA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Cb3R0b20gKyAncHgnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5ncmlkc3Rlci5jb2x1bW5zID09PSBpdGVtLmNvbHMgKyBpdGVtLngpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luQm90dG9tICE9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIG1hcmdpblJpZ2h0ID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5vdXRlck1hcmdpblJpZ2h0ICsgJ3B4JztcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1hcmdpblJpZ2h0ID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4gKyAncHgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdtYXJnaW4tYm90dG9tJywgbWFyZ2luQm90dG9tKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoXHJcbiAgICAgICAgZWwsXHJcbiAgICAgICAgRGlyVHlwZXMuTFRSID8gJ21hcmdpbi1yaWdodCcgOiAnbWFyZ2luLWxlZnQnLFxyXG4gICAgICAgIG1hcmdpblJpZ2h0XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVHcmlkc3RlcigpOiB2b2lkIHtcclxuICAgIGxldCBhZGRDbGFzcyA9ICcnO1xyXG4gICAgbGV0IHJlbW92ZUNsYXNzMSA9ICcnO1xyXG4gICAgbGV0IHJlbW92ZUNsYXNzMiA9ICcnO1xyXG4gICAgbGV0IHJlbW92ZUNsYXNzMyA9ICcnO1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkZpdCkge1xyXG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMiA9IEdyaWRUeXBlLlNjcm9sbEhvcml6b250YWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLkZpeGVkO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmdyaWRUeXBlID09PSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbCkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCA9XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci5jdXJDb2xXaWR0aCAqIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLlNjcm9sbEhvcml6b250YWwpIHtcclxuICAgICAgY29uc3Qgd2lkdGhSYXRpbyA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMucm93SGVpZ2h0UmF0aW87XHJcbiAgICAgIGNvbnN0IGNhbFdpZHRoUmF0aW8gPSB3aWR0aFJhdGlvID49IDEgPyB3aWR0aFJhdGlvIDogd2lkdGhSYXRpbyArIDE7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggPSB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCAqIGNhbFdpZHRoUmF0aW87XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkZpeGVkKSB7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggPVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZml4ZWRDb2xXaWR0aCArXHJcbiAgICAgICAgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuaWdub3JlTWFyZ2luSW5Sb3dcclxuICAgICAgICAgID8gMFxyXG4gICAgICAgICAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0ID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkUm93SGVpZ2h0ICtcclxuICAgICAgICAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5pZ25vcmVNYXJnaW5JblJvd1xyXG4gICAgICAgICAgPyAwXHJcbiAgICAgICAgICA6IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luKTtcclxuICAgICAgYWRkQ2xhc3MgPSBHcmlkVHlwZS5GaXhlZDtcclxuICAgICAgcmVtb3ZlQ2xhc3MxID0gR3JpZFR5cGUuRml0O1xyXG4gICAgICByZW1vdmVDbGFzczIgPSBHcmlkVHlwZS5TY3JvbGxWZXJ0aWNhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5ncmlkVHlwZSA9PT0gR3JpZFR5cGUuVmVydGljYWxGaXhlZCkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLmN1clJvd0hlaWdodCA9XHJcbiAgICAgICAgdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5maXhlZFJvd0hlaWdodCArXHJcbiAgICAgICAgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuaWdub3JlTWFyZ2luSW5Sb3dcclxuICAgICAgICAgID8gMFxyXG4gICAgICAgICAgOiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbik7XHJcbiAgICAgIGFkZENsYXNzID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsSG9yaXpvbnRhbDtcclxuICAgICAgcmVtb3ZlQ2xhc3MzID0gR3JpZFR5cGUuRml4ZWQ7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZ3JpZFR5cGUgPT09IEdyaWRUeXBlLkhvcml6b250YWxGaXhlZCkge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoID1cclxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmZpeGVkQ29sV2lkdGggK1xyXG4gICAgICAgICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmlnbm9yZU1hcmdpbkluUm93XHJcbiAgICAgICAgICA/IDBcclxuICAgICAgICAgIDogdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4pO1xyXG4gICAgICBhZGRDbGFzcyA9IEdyaWRUeXBlLlNjcm9sbEhvcml6b250YWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMSA9IEdyaWRUeXBlLkZpdDtcclxuICAgICAgcmVtb3ZlQ2xhc3MyID0gR3JpZFR5cGUuU2Nyb2xsVmVydGljYWw7XHJcbiAgICAgIHJlbW92ZUNsYXNzMyA9IEdyaWRUeXBlLkZpeGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChcclxuICAgICAgdGhpcy5ncmlkc3Rlci5tb2JpbGUgfHxcclxuICAgICAgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuc2V0R3JpZFNpemUgJiZcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLmdyaWRUeXBlICE9PSBHcmlkVHlwZS5GaXQpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5ncmlkc3Rlci5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmdyaWRzdGVyLmVsLCBhZGRDbGFzcyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmdyaWRzdGVyLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZ3JpZHN0ZXIuZWwsIGFkZENsYXNzKTtcclxuICAgIH1cclxuICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgcmVtb3ZlQ2xhc3MxKTtcclxuICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgcmVtb3ZlQ2xhc3MyKTtcclxuICAgIHRoaXMuZ3JpZHN0ZXIucmVuZGVyZXIucmVtb3ZlQ2xhc3ModGhpcy5ncmlkc3Rlci5lbCwgcmVtb3ZlQ2xhc3MzKTtcclxuICB9XHJcblxyXG4gIGdldEdyaWRDb2x1bW5TdHlsZShpOiBudW1iZXIpOiBDb21tb25HcmlkU3R5bGUge1xyXG4gICAgLy8gZ2VuZXJhdGVzIHRoZSBuZXcgc3R5bGVcclxuICAgIGNvbnN0IG5ld1BvczogR3JpZENvbHVtbkNhY2hlZFN0eWxlID0ge1xyXG4gICAgICBsZWZ0OiB0aGlzLmdyaWRzdGVyLmN1ckNvbFdpZHRoICogaSxcclxuICAgICAgd2lkdGg6IHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggLSB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbixcclxuICAgICAgaGVpZ2h0OlxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuZ3JpZFJvd3MubGVuZ3RoICogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgLVxyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxyXG4gICAgICBzdHlsZToge31cclxuICAgIH07XHJcbiAgICBuZXdQb3Muc3R5bGUgPSB7XHJcbiAgICAgIC4uLnRoaXMuZ2V0TGVmdFBvc2l0aW9uKG5ld1Bvcy5sZWZ0KSxcclxuICAgICAgd2lkdGg6IG5ld1Bvcy53aWR0aCArICdweCcsXHJcbiAgICAgIGhlaWdodDogbmV3UG9zLmhlaWdodCArICdweCdcclxuICAgIH07XHJcblxyXG4gICAgLy8gdXNlIHRoZSBsYXN0IGNhY2hlZCBzdHlsZSBpZiBpdCBoYXMgc2FtZSB2YWx1ZXMgYXMgdGhlIGdlbmVyYXRlZCBvbmVcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RHcmlkQ29sdW1uU3R5bGVzW2ldO1xyXG4gICAgaWYgKFxyXG4gICAgICBsYXN0ICYmXHJcbiAgICAgIGxhc3QubGVmdCA9PT0gbmV3UG9zLmxlZnQgJiZcclxuICAgICAgbGFzdC53aWR0aCA9PT0gbmV3UG9zLndpZHRoICYmXHJcbiAgICAgIGxhc3QuaGVpZ2h0ID09PSBuZXdQb3MuaGVpZ2h0XHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGxhc3Quc3R5bGU7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FjaGUgYW5kIHNldCBuZXcgc3R5bGVcclxuICAgIHRoaXMubGFzdEdyaWRDb2x1bW5TdHlsZXNbaV0gPSBuZXdQb3M7XHJcbiAgICByZXR1cm4gbmV3UG9zLnN0eWxlO1xyXG4gIH1cclxuXHJcbiAgZ2V0R3JpZFJvd1N0eWxlKGk6IG51bWJlcik6IENvbW1vbkdyaWRTdHlsZSB7XHJcbiAgICAvLyBnZW5lcmF0ZXMgdGhlIG5ldyBzdHlsZVxyXG4gICAgY29uc3QgbmV3UG9zOiBHcmlkUm93Q2FjaGVkU3R5bGUgPSB7XHJcbiAgICAgIHRvcDogdGhpcy5ncmlkc3Rlci5jdXJSb3dIZWlnaHQgKiBpLFxyXG4gICAgICB3aWR0aDpcclxuICAgICAgICB0aGlzLmdyaWRzdGVyLmdyaWRDb2x1bW5zLmxlbmd0aCAqIHRoaXMuZ3JpZHN0ZXIuY3VyQ29sV2lkdGggK1xyXG4gICAgICAgIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luLFxyXG4gICAgICBoZWlnaHQ6IHRoaXMuZ3JpZHN0ZXIuY3VyUm93SGVpZ2h0IC0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5tYXJnaW4sXHJcbiAgICAgIHN0eWxlOiB7fVxyXG4gICAgfTtcclxuICAgIG5ld1Bvcy5zdHlsZSA9IHtcclxuICAgICAgLi4udGhpcy5nZXRUb3BQb3NpdGlvbihuZXdQb3MudG9wKSxcclxuICAgICAgd2lkdGg6IG5ld1Bvcy53aWR0aCArICdweCcsXHJcbiAgICAgIGhlaWdodDogbmV3UG9zLmhlaWdodCArICdweCdcclxuICAgIH07XHJcblxyXG4gICAgLy8gdXNlIHRoZSBsYXN0IGNhY2hlZCBzdHlsZSBpZiBpdCBoYXMgc2FtZSB2YWx1ZXMgYXMgdGhlIGdlbmVyYXRlZCBvbmVcclxuICAgIGNvbnN0IGxhc3QgPSB0aGlzLmxhc3RHcmlkUm93U3R5bGVzW2ldO1xyXG4gICAgaWYgKFxyXG4gICAgICBsYXN0ICYmXHJcbiAgICAgIGxhc3QudG9wID09PSBuZXdQb3MudG9wICYmXHJcbiAgICAgIGxhc3Qud2lkdGggPT09IG5ld1Bvcy53aWR0aCAmJlxyXG4gICAgICBsYXN0LmhlaWdodCA9PT0gbmV3UG9zLmhlaWdodFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBsYXN0LnN0eWxlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhY2hlIGFuZCBzZXQgbmV3IHN0eWxlXHJcbiAgICB0aGlzLmxhc3RHcmlkUm93U3R5bGVzW2ldID0gbmV3UG9zO1xyXG4gICAgcmV0dXJuIG5ld1Bvcy5zdHlsZTtcclxuICB9XHJcblxyXG4gIGdldExlZnRQb3NpdGlvbihkOiBudW1iZXIpOiB7IGxlZnQ6IHN0cmluZyB9IHwgeyB0cmFuc2Zvcm06IHN0cmluZyB9IHtcclxuICAgIGNvbnN0IGRQb3NpdGlvbiA9IHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMuZGlyVHlwZSA9PT0gRGlyVHlwZXMuUlRMID8gLWQgOiBkO1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMudXNlVHJhbnNmb3JtUG9zaXRpb25pbmcpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKCcgKyBkUG9zaXRpb24gKyAncHgpJ1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBsZWZ0OiB0aGlzLmdldExlZnRNYXJnaW4oKSArIGRQb3NpdGlvbiArICdweCdcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRvcFBvc2l0aW9uKGQ6IG51bWJlcik6IHsgdG9wOiBzdHJpbmcgfSB8IHsgdHJhbnNmb3JtOiBzdHJpbmcgfSB7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy51c2VUcmFuc2Zvcm1Qb3NpdGlvbmluZykge1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoJyArIGQgKyAncHgpJ1xyXG4gICAgICB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICB0b3A6IHRoaXMuZ2V0VG9wTWFyZ2luKCkgKyBkICsgJ3B4J1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJDZWxsUG9zaXRpb24ocmVuZGVyZXI6IFJlbmRlcmVyMiwgZWw6IEVsZW1lbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLnVzZVRyYW5zZm9ybVBvc2l0aW9uaW5nKSB7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAndHJhbnNmb3JtJywgJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0b3AnLCAnJyk7XHJcbiAgICAgIHJlbmRlcmVyLnNldFN0eWxlKGVsLCAnbGVmdCcsICcnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldENlbGxQb3NpdGlvbihcclxuICAgIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICBlbDogRWxlbWVudCxcclxuICAgIHg6IG51bWJlcixcclxuICAgIHk6IG51bWJlclxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc3QgeFBvc2l0aW9uID0gdGhpcy5ncmlkc3Rlci4kb3B0aW9ucy5kaXJUeXBlID09PSBEaXJUeXBlcy5SVEwgPyAteCA6IHg7XHJcbiAgICBpZiAodGhpcy5ncmlkc3Rlci4kb3B0aW9ucy51c2VUcmFuc2Zvcm1Qb3NpdGlvbmluZykge1xyXG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSAndHJhbnNsYXRlM2QoJyArIHhQb3NpdGlvbiArICdweCwgJyArIHkgKyAncHgsIDApJztcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0cmFuc2Zvcm0nLCB0cmFuc2Zvcm0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICdsZWZ0JywgdGhpcy5nZXRMZWZ0TWFyZ2luKCkgKyB4UG9zaXRpb24gKyAncHgnKTtcclxuICAgICAgcmVuZGVyZXIuc2V0U3R5bGUoZWwsICd0b3AnLCB0aGlzLmdldFRvcE1hcmdpbigpICsgeSArICdweCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0TGVmdE1hcmdpbigpOiBudW1iZXIge1xyXG4gICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW4pIHtcclxuICAgICAgaWYgKHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0ICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5MZWZ0O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm1hcmdpbjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRUb3BNYXJnaW4oKTogbnVtYmVyIHtcclxuICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luKSB7XHJcbiAgICAgIGlmICh0aGlzLmdyaWRzdGVyLiRvcHRpb25zLm91dGVyTWFyZ2luVG9wICE9PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMub3V0ZXJNYXJnaW5Ub3A7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZHN0ZXIuJG9wdGlvbnMubWFyZ2luO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|