@libs-ui/components-drag-drop 0.2.10-6.2
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 +3 -0
- package/defines/css.define.d.ts +4 -0
- package/drag-drop.directive.d.ts +37 -0
- package/drag-drop.service.d.ts +45 -0
- package/drag-item-in-container-virtual-scroll.directive.d.ts +25 -0
- package/drag-item.directive.d.ts +31 -0
- package/drag-scroll.directive.d.ts +24 -0
- package/esm2022/defines/css.define.mjs +102 -0
- package/esm2022/drag-drop.directive.mjs +470 -0
- package/esm2022/drag-drop.service.mjs +92 -0
- package/esm2022/drag-item-in-container-virtual-scroll.directive.mjs +124 -0
- package/esm2022/drag-item.directive.mjs +263 -0
- package/esm2022/drag-scroll.directive.mjs +138 -0
- package/esm2022/index.mjs +6 -0
- package/esm2022/interfaces/event.interface.mjs +2 -0
- package/esm2022/libs-ui-components-drag-drop.mjs +5 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs +1176 -0
- package/fesm2022/libs-ui-components-drag-drop.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/interfaces/event.interface.d.ts +60 -0
- package/package.json +25 -0
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { Directive, effect, input, model, output, signal, untracked } from "@angular/core";
|
|
2
|
+
import { checkMouseOverInContainer, cloneDeep, get, set, uuid } from "@libs-ui/utils";
|
|
3
|
+
import { debounceTime, filter, takeUntil } from "rxjs";
|
|
4
|
+
import { styleContainer } from "./defines/css.define";
|
|
5
|
+
import { LibsUiComponentsDragScrollDirective } from "./drag-scroll.directive";
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
export class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective {
|
|
8
|
+
/* PROPERTY */
|
|
9
|
+
groupID = signal(uuid());
|
|
10
|
+
isDragOver = signal(false);
|
|
11
|
+
/* INPUT */
|
|
12
|
+
disableDragContainer = input();
|
|
13
|
+
mode = input('move', { transform: value => value ?? 'move' });
|
|
14
|
+
directionDrag = input();
|
|
15
|
+
viewEncapsulation = input('emulated', { transform: value => value ?? 'emulated' });
|
|
16
|
+
acceptDragSameGroup = input(false, { transform: value => value ?? false });
|
|
17
|
+
placeholder = input(true, { transform: value => value ?? true });
|
|
18
|
+
groupName = input('groupDragAndDropDefault', { transform: value => value ?? 'groupDragAndDropDefault' }); // nếu các group có tên trùng nhau sẽ được drop
|
|
19
|
+
dropToGroupName = input(null); // nếu item trong các group A được drop vào group B nhưng group B không được drop vào group A
|
|
20
|
+
items = model.required();
|
|
21
|
+
stylesOverride = input();
|
|
22
|
+
/* OUTPUT */
|
|
23
|
+
outDragStartContainer = output();
|
|
24
|
+
outDragOverContainer = output();
|
|
25
|
+
outDragLeaveContainer = output();
|
|
26
|
+
outDragEndContainer = output();
|
|
27
|
+
outDroppedContainer = output();
|
|
28
|
+
outDroppedContainerEmpty = output();
|
|
29
|
+
outFunctionControl = output();
|
|
30
|
+
constructor() {
|
|
31
|
+
super();
|
|
32
|
+
const element = this.elementRef.nativeElement;
|
|
33
|
+
const container = { element };
|
|
34
|
+
this.dragDropService.Container.update(data => {
|
|
35
|
+
data.set(this.groupID(), container);
|
|
36
|
+
return data;
|
|
37
|
+
});
|
|
38
|
+
effect(() => {
|
|
39
|
+
if (!this.rootElementScroll()) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
untracked(() => {
|
|
43
|
+
set(container, 'elementScroll', this.rootElementScroll());
|
|
44
|
+
this.dragDropService.Container.update(containerMap => new Map(containerMap));
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
effect(() => {
|
|
48
|
+
if (this.directionDrag() && this.elementRef.nativeElement) {
|
|
49
|
+
this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
effect(() => {
|
|
53
|
+
if (this.disableDragContainer() && this.elementRef.nativeElement) {
|
|
54
|
+
this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
ngAfterViewInit() {
|
|
59
|
+
this.outFunctionControl.emit({ setAttributeElementAndItemDrag: () => this.setAttributeElementAndItemDrag(this.elementRef.nativeElement) });
|
|
60
|
+
this.outDroppedContainer.subscribe(eventDropped => {
|
|
61
|
+
this.dragDropService.OnDropContainer.next(eventDropped);
|
|
62
|
+
});
|
|
63
|
+
this.onDestroy.subscribe(() => {
|
|
64
|
+
if (indexSpliceListTo > -1) {
|
|
65
|
+
this.items.update(items => {
|
|
66
|
+
items.splice(indexSpliceListTo, 1);
|
|
67
|
+
return [...items];
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
this.dragDropService.Container().delete(this.groupID());
|
|
71
|
+
});
|
|
72
|
+
const elementContainer = this.elementRef.nativeElement;
|
|
73
|
+
this.initStyleAndAttribute(elementContainer, true);
|
|
74
|
+
this.dragDropService.OnItemInit.pipe(debounceTime(250), filter(groupName => groupName === this.groupName()), takeUntil(this.onDestroy)).subscribe(() => this.initStyleAndAttribute(elementContainer));
|
|
75
|
+
const styleTag = document.createElement("style");
|
|
76
|
+
styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());
|
|
77
|
+
elementContainer.appendChild(styleTag);
|
|
78
|
+
elementContainer.classList.add(this.dragDropService.ClassContainerDefine);
|
|
79
|
+
const handlerDragStart = (eventDragStart) => {
|
|
80
|
+
this.setAttributeElementAndItemDrag(elementContainer, true);
|
|
81
|
+
if (this.groupID() === eventDragStart.elementDrag.getAttribute('groupID')) {
|
|
82
|
+
this.outDragStartContainer.emit({ ...eventDragStart, itemDragInfo: this.dragDropService.ItemDragInfo });
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const storeIndex = { indexDrag: -1, indexDragOver: -1 };
|
|
86
|
+
let indexSpliceListTo = -1;
|
|
87
|
+
const handlerDragOver = (eventDragOver) => {
|
|
88
|
+
const { elementDrag, elementDragOver } = eventDragOver;
|
|
89
|
+
if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const indexDrag = Number(elementDrag.getAttribute('index')).valueOf();
|
|
93
|
+
const indexDragOver = Number(elementDragOver.getAttribute('index')).valueOf();
|
|
94
|
+
const idGroupElementDrag = elementDrag.getAttribute('groupID');
|
|
95
|
+
const idGroupElementDragOver = elementDragOver.getAttribute('groupID');
|
|
96
|
+
if ((this.groupID() !== idGroupElementDrag) || (idGroupElementDrag !== idGroupElementDragOver)) { // xử lý cho item drag over qua 1 item khác container
|
|
97
|
+
if (idGroupElementDragOver === this.groupID() && this.placeholder()) {
|
|
98
|
+
const item = this.mode() === 'deepCopy' ? cloneDeep(this.dragDropService.ItemDragInfo?.item) : this.dragDropService.ItemDragInfo?.item;
|
|
99
|
+
if (indexSpliceListTo >= 0) {
|
|
100
|
+
this.items.update(items => {
|
|
101
|
+
items.splice(indexSpliceListTo, 1);
|
|
102
|
+
return [...items];
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
this.items.update(items => {
|
|
106
|
+
items.splice(indexDragOver, 0, item);
|
|
107
|
+
return [...items];
|
|
108
|
+
});
|
|
109
|
+
indexSpliceListTo = indexDragOver;
|
|
110
|
+
this.setAttributeElementAndItemDrag(elementContainer, false, indexSpliceListTo);
|
|
111
|
+
}
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
if (!this.acceptDragSameGroup() || indexDrag < 0 || indexDragOver < 0 || !this.items().length || indexDrag > this.items().length || indexDragOver > this.items().length || (storeIndex.indexDrag === indexDrag && storeIndex.indexDragOver === indexDragOver)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// xử lý cho item drag over qua 1 item cùng container
|
|
118
|
+
const itemDrag = this.items()[indexDrag];
|
|
119
|
+
this.setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver);
|
|
120
|
+
storeIndex.indexDrag = indexDrag;
|
|
121
|
+
storeIndex.indexDragOver = indexDragOver;
|
|
122
|
+
this.items.update(items => {
|
|
123
|
+
items.splice(indexDrag, 1);
|
|
124
|
+
return [...items];
|
|
125
|
+
});
|
|
126
|
+
this.items.update(items => {
|
|
127
|
+
items.splice(indexDragOver, 0, itemDrag);
|
|
128
|
+
return [...items];
|
|
129
|
+
});
|
|
130
|
+
elementDrag.setAttribute('index', indexDragOver.toString());
|
|
131
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
132
|
+
};
|
|
133
|
+
const removePlaceholderDrag = (eventDrag, isDragging) => {
|
|
134
|
+
clearInterval(this.intervalScrollToElement());
|
|
135
|
+
storeIndex.indexDrag = -1;
|
|
136
|
+
storeIndex.indexDragOver = -1;
|
|
137
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
138
|
+
if (!checkMouseOverInContainer(eventDrag.mousePosition, (this.rootElementScroll() || elementContainer))) {
|
|
139
|
+
const childElementIndex = Array.from(childrenElement).findIndex((child) => child.classList.contains('libs-ui-drag-drop-item-drop-placeholder'));
|
|
140
|
+
if (childElementIndex >= 0 && this.groupID() !== eventDrag.elementDrag.getAttribute('groupID')) {
|
|
141
|
+
this.items.update(items => {
|
|
142
|
+
items.splice(childElementIndex, 1);
|
|
143
|
+
return [...items];
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
indexSpliceListTo = -1;
|
|
147
|
+
this.removeAttributes(elementContainer, isDragging);
|
|
148
|
+
this.setIndexElement(elementContainer);
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (indexSpliceListTo >= 0) {
|
|
152
|
+
this.items.update(items => {
|
|
153
|
+
items.splice(indexSpliceListTo, 1);
|
|
154
|
+
return [...items];
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
indexSpliceListTo = -1;
|
|
158
|
+
};
|
|
159
|
+
const handlerDragging = (eventDragging) => {
|
|
160
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
161
|
+
const { elementDrag } = eventDragging;
|
|
162
|
+
const fieldIdItem = elementDrag.getAttribute('field_id');
|
|
163
|
+
const idItemDrag = elementDrag.getAttribute('item_id');
|
|
164
|
+
if (fieldIdItem && idItemDrag && this.items().find(item => get(item, fieldIdItem) === idItemDrag)) {
|
|
165
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
166
|
+
const childElement = Array.from(childrenElement).find((child) => child.getAttribute('item_id') === idItemDrag);
|
|
167
|
+
if (this.items() === eventDragging.itemDragInfo?.itemsDrag() && childElement && !childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder') && !childElement.getAttribute(this.dragDropService.TargetItemDragFlag)) {
|
|
168
|
+
childElement.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');
|
|
169
|
+
this.groupID.set(elementDrag.getAttribute('groupID') || '');
|
|
170
|
+
styleTag.remove();
|
|
171
|
+
styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());
|
|
172
|
+
elementContainer.appendChild(styleTag);
|
|
173
|
+
this.setAttributeElementAndItemDrag(elementContainer, true);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (this.disableDragContainer()) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (this.groupID() === elementDrag.getAttribute('groupID') && !this.acceptDragSameGroup()) {
|
|
180
|
+
this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll() || !this.acceptDragSameGroup());
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
if (!checkMouseOverInContainer(eventDragging.mousePosition, (this.rootElementScroll() || elementContainer))) {
|
|
184
|
+
if (this.isDragOver()) {
|
|
185
|
+
this.isDragOver.set(false);
|
|
186
|
+
this.outDragLeaveContainer.emit({ ...eventDragging, elementDragLeave: elementContainer });
|
|
187
|
+
}
|
|
188
|
+
return removePlaceholderDrag(eventDragging, true);
|
|
189
|
+
}
|
|
190
|
+
this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll());
|
|
191
|
+
// Đoạn code xử lý cho việc kéo một element vào 1 container nhưng container không có item hoặc item drag không over qua item trong container
|
|
192
|
+
if (!this.isDragOver()) {
|
|
193
|
+
elementContainer.classList.add('libs-ui-drag-drop-container-dragover');
|
|
194
|
+
this.isDragOver.set(true);
|
|
195
|
+
this.outDragOverContainer.emit({ ...eventDragging, elementDragOver: elementContainer });
|
|
196
|
+
}
|
|
197
|
+
const eventDragOver = { ...eventDragging, elementDragOver: elementContainer };
|
|
198
|
+
if (!this.items().length) {
|
|
199
|
+
eventDragOver.elementDragOver = {
|
|
200
|
+
getAttribute: (name) => {
|
|
201
|
+
if (name === 'groupID') {
|
|
202
|
+
return this.groupID();
|
|
203
|
+
}
|
|
204
|
+
if (name !== 'index') {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
return 0;
|
|
208
|
+
}
|
|
209
|
+
};
|
|
210
|
+
this.dragDropService.OnDragOver.next(eventDragOver);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
214
|
+
let childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(eventDragging.mousePosition, child));
|
|
215
|
+
if (childElement) { // nếu tìm thấy thì sẽ nhận qua sự kiện của drag-item.directive emit
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
childElement = Array.from(childrenElement).pop();
|
|
219
|
+
if (childElement) {
|
|
220
|
+
eventDragOver.elementDragOver = childElement;
|
|
221
|
+
this.dragDropService.OnDragOver.next(eventDragOver);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
const handlerDragEnd = (eventDragEnd) => {
|
|
225
|
+
if (this.disableDragContainer()) {
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
let rect = undefined;
|
|
229
|
+
if (this.rootElementScroll() || elementContainer) {
|
|
230
|
+
rect = (this.rootElementScroll() || elementContainer)?.getBoundingClientRect();
|
|
231
|
+
}
|
|
232
|
+
removePlaceholderDrag(eventDragEnd);
|
|
233
|
+
const { elementDrag, mousePosition, itemDragInfo } = eventDragEnd;
|
|
234
|
+
if (this.groupID() === elementDrag.getAttribute('groupID')) {
|
|
235
|
+
this.outDragEndContainer.emit({ ...eventDragEnd });
|
|
236
|
+
}
|
|
237
|
+
if (!checkMouseOverInContainer(mousePosition, this.rootElementScroll() || elementContainer, rect)) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
const eventDrop = { elementDrag: elementDrag, elementDrop: elementContainer, itemDragInfo: itemDragInfo };
|
|
241
|
+
if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
245
|
+
const childElement = Array.from(childrenElement).find((child) => checkMouseOverInContainer(mousePosition, child));
|
|
246
|
+
if (childElement) {
|
|
247
|
+
eventDrop.elementDrop = childElement;
|
|
248
|
+
this.dragDropService.OnDrop.next(eventDrop);
|
|
249
|
+
return;
|
|
250
|
+
}
|
|
251
|
+
eventDrop.elementDrop = {
|
|
252
|
+
getAttribute: (name) => {
|
|
253
|
+
if (name === 'dropContainer') {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (name === 'groupID') {
|
|
257
|
+
return this.groupID();
|
|
258
|
+
}
|
|
259
|
+
if (name !== 'index') {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
return childrenElement.length;
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
this.dragDropService.OnDrop.next(eventDrop);
|
|
266
|
+
};
|
|
267
|
+
const handlerDrop = (eventDrop) => {
|
|
268
|
+
if (this.disableDragContainer()) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
const { elementDrag, elementDrop, itemDragInfo } = eventDrop;
|
|
272
|
+
if (this.groupID() === elementDrag.getAttribute('groupID') && this.groupID() === elementDrop.getAttribute('groupID')) {
|
|
273
|
+
if (itemDragInfo) {
|
|
274
|
+
itemDragInfo.indexDrop = Number(elementDrop.getAttribute('index')).valueOf();
|
|
275
|
+
itemDragInfo.itemsDrop = this.items;
|
|
276
|
+
itemDragInfo.containerDrop = elementContainer;
|
|
277
|
+
}
|
|
278
|
+
if (this.acceptDragSameGroup()) {
|
|
279
|
+
this.outDroppedContainer.emit(eventDrop);
|
|
280
|
+
}
|
|
281
|
+
this.removeAttributes(elementContainer);
|
|
282
|
+
this.setIndexElement(elementContainer);
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (this.groupID() !== elementDrop.getAttribute('groupID') || elementDrag.getAttribute('groupID') === elementDrop.getAttribute('groupID')) {
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
const indexDragOver = Number(elementDrop.getAttribute('index')).valueOf() - (elementDrop.getAttribute('dropContainer') ? 0 : 1);
|
|
289
|
+
const item = this.mode() === 'deepCopy' ? cloneDeep(itemDragInfo?.item) : itemDragInfo?.item;
|
|
290
|
+
if (itemDragInfo) {
|
|
291
|
+
itemDragInfo.indexDrop = indexDragOver;
|
|
292
|
+
itemDragInfo.itemsDrop = this.items;
|
|
293
|
+
itemDragInfo.containerDrop = elementContainer;
|
|
294
|
+
}
|
|
295
|
+
if (!this.items().length) {
|
|
296
|
+
this.outDroppedContainerEmpty.emit(eventDrop);
|
|
297
|
+
}
|
|
298
|
+
this.items.update(items => {
|
|
299
|
+
items.splice(indexDragOver, 0, item);
|
|
300
|
+
return [...items];
|
|
301
|
+
});
|
|
302
|
+
if (itemDragInfo && itemDragInfo.itemsMove && itemDragInfo.itemsMove()) {
|
|
303
|
+
itemDragInfo.itemsDrag.set([...itemDragInfo.itemsMove()]);
|
|
304
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
305
|
+
}
|
|
306
|
+
this.outDroppedContainer.emit(eventDrop);
|
|
307
|
+
this.removeAttributes(elementContainer);
|
|
308
|
+
this.setIndexElement(elementContainer);
|
|
309
|
+
};
|
|
310
|
+
[{
|
|
311
|
+
name: 'OnDragStart',
|
|
312
|
+
event: this.dragDropService.OnDragStart,
|
|
313
|
+
functionCall: handlerDragStart
|
|
314
|
+
}, {
|
|
315
|
+
name: 'OnDragOver',
|
|
316
|
+
event: this.dragDropService.OnDragOver,
|
|
317
|
+
functionCall: handlerDragOver
|
|
318
|
+
}, {
|
|
319
|
+
name: 'OnDragging',
|
|
320
|
+
event: this.dragDropService.OnDragging,
|
|
321
|
+
functionCall: handlerDragging
|
|
322
|
+
}, {
|
|
323
|
+
name: 'OnDragEnd',
|
|
324
|
+
event: this.dragDropService.OnDragEnd,
|
|
325
|
+
functionCall: handlerDragEnd
|
|
326
|
+
}, {
|
|
327
|
+
name: 'OnDrop',
|
|
328
|
+
event: this.dragDropService.OnDrop,
|
|
329
|
+
functionCall: handlerDrop
|
|
330
|
+
}].forEach((item) => (item.event.pipe(takeUntil(this.onDestroy)).subscribe(item.functionCall)));
|
|
331
|
+
}
|
|
332
|
+
/* */
|
|
333
|
+
async setAttributeElementAndItemDrag(elementContainer, setItemDrag, indexInsert) {
|
|
334
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
335
|
+
let index = -1;
|
|
336
|
+
elementContainer.setAttribute('groupID', this.groupID());
|
|
337
|
+
elementContainer.removeAttribute('disableDragContainer');
|
|
338
|
+
if (this.disableDragContainer()) {
|
|
339
|
+
elementContainer.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
|
|
340
|
+
}
|
|
341
|
+
if (this.groupName()) {
|
|
342
|
+
elementContainer.setAttribute('groupName', this.groupName() || '');
|
|
343
|
+
}
|
|
344
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
345
|
+
if (!childElement.hasAttribute('groupName') || childElement.getAttribute('groupName') === this.groupName()) {
|
|
346
|
+
childElement.setAttribute('groupID', this.groupID());
|
|
347
|
+
}
|
|
348
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
index += 1;
|
|
352
|
+
childElement.setAttribute('index', `${index}`);
|
|
353
|
+
childElement.removeAttribute('disableDragContainer');
|
|
354
|
+
if (this.disableDragContainer()) {
|
|
355
|
+
childElement.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);
|
|
356
|
+
}
|
|
357
|
+
if (this.groupName() && !childElement.hasAttribute('groupName')) {
|
|
358
|
+
childElement.setAttribute('groupName', this.groupName() || '');
|
|
359
|
+
}
|
|
360
|
+
if (this.placeholder()) {
|
|
361
|
+
childElement.setAttribute('placeholder', `${this.placeholder()}`);
|
|
362
|
+
}
|
|
363
|
+
if (this.dropToGroupName()) {
|
|
364
|
+
childElement.setAttribute('dropToGroupName', `${this.dropToGroupName()?.join(';')}`);
|
|
365
|
+
}
|
|
366
|
+
if (indexInsert === index && this.placeholder()) {
|
|
367
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
|
|
368
|
+
childElement.classList.add('libs-ui-drag-drop-item-placeholder');
|
|
369
|
+
}
|
|
370
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder')) {
|
|
371
|
+
childElement.classList.add('libs-ui-drag-drop-item-drop-placeholder');
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (setItemDrag && childElement.getAttribute(this.dragDropService.TargetItemDragFlag) && this.items().length >= index) {
|
|
375
|
+
if (this.placeholder()) {
|
|
376
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {
|
|
377
|
+
childElement.classList.add('libs-ui-drag-drop-item-placeholder');
|
|
378
|
+
}
|
|
379
|
+
if (!childElement.classList.contains('libs-ui-drag-drop-item-origin-placeholder')) {
|
|
380
|
+
childElement.classList.add('libs-ui-drag-drop-item-origin-placeholder');
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
this.dragDropService.ItemDragInfo = { item: this.items()[index], indexDrag: index, itemsDrag: this.items, containerDrag: elementContainer, itemsMove: signal([...this.items()]) };
|
|
384
|
+
if (this.mode() === 'move') {
|
|
385
|
+
this.dragDropService.ItemDragInfo.itemsMove?.update(items => {
|
|
386
|
+
items.splice(index, 1);
|
|
387
|
+
return [...items];
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
initStyleAndAttribute(elementContainer, hasRemoveAttribute = false) {
|
|
394
|
+
this.setAttributeElementAndItemDrag(elementContainer);
|
|
395
|
+
if (hasRemoveAttribute) {
|
|
396
|
+
this.removeAttributes(elementContainer);
|
|
397
|
+
}
|
|
398
|
+
this.setIndexElement(elementContainer);
|
|
399
|
+
}
|
|
400
|
+
;
|
|
401
|
+
setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver) {
|
|
402
|
+
if (!this.directionDrag() || !elementDragOver) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (this.directionDrag() === 'vertical') {
|
|
406
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-bottom');
|
|
407
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-top');
|
|
408
|
+
if (indexDrag > indexDragOver) {
|
|
409
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-bottom');
|
|
410
|
+
}
|
|
411
|
+
if (indexDrag < indexDragOver) {
|
|
412
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-top');
|
|
413
|
+
}
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-left');
|
|
417
|
+
elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-right');
|
|
418
|
+
if (indexDrag > indexDragOver) {
|
|
419
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-right');
|
|
420
|
+
}
|
|
421
|
+
if (indexDrag < indexDragOver) {
|
|
422
|
+
elementDragOver.classList.add('libs-ui-drag-drop-item-translate-left');
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
setIndexElement(elementContainer) {
|
|
426
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
427
|
+
let index = -1;
|
|
428
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
429
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
index += 1;
|
|
433
|
+
childElement.setAttribute('index', `${index}`);
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
removeAttributes(elementContainer, ignoreRemoveClassItemOriginPlaceholder) {
|
|
437
|
+
const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine);
|
|
438
|
+
elementContainer.classList.remove('libs-ui-drag-drop-container-dragover');
|
|
439
|
+
Array.from(childrenElement).forEach((childElement) => {
|
|
440
|
+
if (childElement.getAttribute('groupID') !== this.groupID()) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
childElement.removeAttribute('index');
|
|
444
|
+
if (!this.dropToGroupName() || !this.dropToGroupName()?.length) {
|
|
445
|
+
childElement.removeAttribute('dropToGroupName');
|
|
446
|
+
}
|
|
447
|
+
if (!this.placeholder()) {
|
|
448
|
+
childElement.removeAttribute('placeholder');
|
|
449
|
+
}
|
|
450
|
+
if (this.placeholder()) {
|
|
451
|
+
childElement.classList.remove('libs-ui-drag-drop-item-placeholder');
|
|
452
|
+
if (!ignoreRemoveClassItemOriginPlaceholder) {
|
|
453
|
+
childElement.classList.remove('libs-ui-drag-drop-item-origin-placeholder');
|
|
454
|
+
}
|
|
455
|
+
childElement.classList.remove('libs-ui-drag-drop-item-drop-placeholder');
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDragContainerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
460
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.13", type: LibsUiComponentsDragContainerDirective, isStandalone: true, selector: "[LibsUiComponentsDragContainerDirective]", inputs: { disableDragContainer: { classPropertyName: "disableDragContainer", publicName: "disableDragContainer", isSignal: true, isRequired: false, transformFunction: null }, mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, directionDrag: { classPropertyName: "directionDrag", publicName: "directionDrag", isSignal: true, isRequired: false, transformFunction: null }, viewEncapsulation: { classPropertyName: "viewEncapsulation", publicName: "viewEncapsulation", isSignal: true, isRequired: false, transformFunction: null }, acceptDragSameGroup: { classPropertyName: "acceptDragSameGroup", publicName: "acceptDragSameGroup", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, groupName: { classPropertyName: "groupName", publicName: "groupName", isSignal: true, isRequired: false, transformFunction: null }, dropToGroupName: { classPropertyName: "dropToGroupName", publicName: "dropToGroupName", isSignal: true, isRequired: false, transformFunction: null }, items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, stylesOverride: { classPropertyName: "stylesOverride", publicName: "stylesOverride", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { items: "itemsChange", outDragStartContainer: "outDragStartContainer", outDragOverContainer: "outDragOverContainer", outDragLeaveContainer: "outDragLeaveContainer", outDragEndContainer: "outDragEndContainer", outDroppedContainer: "outDroppedContainer", outDroppedContainerEmpty: "outDroppedContainerEmpty", outFunctionControl: "outFunctionControl" }, usesInheritance: true, ngImport: i0 });
|
|
461
|
+
}
|
|
462
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: LibsUiComponentsDragContainerDirective, decorators: [{
|
|
463
|
+
type: Directive,
|
|
464
|
+
args: [{
|
|
465
|
+
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
466
|
+
selector: "[LibsUiComponentsDragContainerDirective]",
|
|
467
|
+
standalone: true,
|
|
468
|
+
}]
|
|
469
|
+
}], ctorParameters: () => [] });
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWEsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTzlFLE1BQU0sT0FBTyxzQ0FBdUMsU0FBUSxtQ0FBbUM7SUFDN0YsY0FBYztJQUNOLE9BQU8sR0FBRyxNQUFNLENBQVMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqQyxVQUFVLEdBQUcsTUFBTSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBRTVDLFdBQVc7SUFDRixvQkFBb0IsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUN4QyxJQUFJLEdBQUcsS0FBSyxDQUF1QyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwRyxhQUFhLEdBQUcsS0FBSyxFQUE2QixDQUFDO0lBQ25ELGlCQUFpQixHQUFHLEtBQUssQ0FBdUQsVUFBVSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLFVB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QUM7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN2QixZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQztvQkFFNUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztnQkFDRCxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7d0dBL2dCVSxzQ0FBc0M7NEZBQXRDLHNDQUFzQzs7NEZBQXRDLHNDQUFzQztrQkFMbEQsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgT25EZXN0cm95LCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBjbG9uZURlZXAsIGdldCwgc2V0LCB1dWlkIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHN0eWxlQ29udGFpbmVyIH0gZnJvbSBcIi4vZGVmaW5lcy9jc3MuZGVmaW5lXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSB9IGZyb20gXCIuL2RyYWctc2Nyb2xsLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgSURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQsIElEcmFnRW5kLCBJRHJhZ0xlYXZlLCBJRHJhZ092ZXIsIElEcmFnU3RhcnQsIElEcmFnZ2luZywgSURyb3AgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2V2ZW50LmludGVyZmFjZVwiO1xuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiBcIltMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZV1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgZXh0ZW5kcyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qIFBST1BFUlRZICovXG4gIHByaXZhdGUgZ3JvdXBJRCA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByaXZhdGUgaXNEcmFnT3ZlciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLyogSU5QVVQgKi9cbiAgcmVhZG9ubHkgZGlzYWJsZURyYWdDb250YWluZXIgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBtb2RlID0gaW5wdXQ8c3RyaW5nLCAnbW92ZScgfCAnY29weScgfCAnZGVlcENvcHknPignbW92ZScsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyAnbW92ZScgfSk7XG4gIHJlYWRvbmx5IGRpcmVjdGlvbkRyYWcgPSBpbnB1dDwnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnPigpO1xuICByZWFkb25seSB2aWV3RW5jYXBzdWxhdGlvbiA9IGlucHV0PCdlbXVsYXRlZCcgfCAnbm9uZScsICdlbXVsYXRlZCcgfCAnbm9uZScgfCB1bmRlZmluZWQ+KCdlbXVsYXRlZCcsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyAnZW11bGF0ZWQnIH0pO1xuICByZWFkb25seSBhY2NlcHREcmFnU2FtZUdyb3VwID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyBmYWxzZSB9KTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPih0cnVlLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgZ3JvdXBOYW1lID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCdncm91cERyYWdBbmREcm9wRGVmYXVsdCcsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyAnZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnIH0pOyAvLyBu4bq/dSBjw6FjIGdyb3VwIGPDsyB0w6puIHRyw7luZyBuaGF1IHPhur0gxJHGsOG7o2MgZHJvcFxuICByZWFkb25seSBkcm9wVG9Hcm91cE5hbWUgPSBpbnB1dDxBcnJheTxzdHJpbmc+IHwgbnVsbD4obnVsbCk7IC8vIG7hur91IGl0ZW0gdHJvbmcgY8OhYyBncm91cCBBIMSRxrDhu6NjIGRyb3AgdsOgbyBncm91cCBCIG5oxrBuZyBncm91cCBCIGtow7RuZyDEkcaw4bujYyBkcm9wIHbDoG8gZ3JvdXAgQVxuICByZWFkb25seSBpdGVtcyA9IG1vZGVsLnJlcXVpcmVkPEFycmF5PHVua25vd24+PigpO1xuICByZWFkb25seSBzdHlsZXNPdmVycmlkZSA9IGlucHV0PEFycmF5PHsgY2xhc3NOYW1lOiBzdHJpbmcsIHN0eWxlczogc3RyaW5nIH0+PigpO1xuXG4gIC8qIE9VVFBVVCAqL1xuICByZWFkb25seSBvdXREcmFnU3RhcnRDb250YWluZXIgPSBvdXRwdXQ8SURyYWdTdGFydD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ092ZXJDb250YWluZXIgPSBvdXRwdXQ8SURyYWdPdmVyPigpO1xuICByZWFkb25seSBvdXREcmFnTGVhdmVDb250YWluZXIgPSBvdXRwdXQ8SURyYWdMZWF2ZT4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ0VuZENvbnRhaW5lciA9IG91dHB1dDxJRHJhZ0VuZD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJvcHBlZENvbnRhaW5lciA9IG91dHB1dDxJRHJvcD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJvcHBlZENvbnRhaW5lckVtcHR5ID0gb3V0cHV0PElEcm9wPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb25zdCBjb250YWluZXIgPSB7IGVsZW1lbnQgfTtcblxuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lci51cGRhdGUoZGF0YSA9PiB7XG4gICAgICBkYXRhLnNldCh0aGlzLmdyb3VwSUQoKSwgY29udGFpbmVyKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5yb290RWxlbWVudFNjcm9sbCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIHNldChjb250YWluZXIsICdlbGVtZW50U2Nyb2xsJywgdGhpcy5yb290RWxlbWVudFNjcm9sbCgpKTtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuQ29udGFpbmVyLnVwZGF0ZShjb250YWluZXJNYXAgPT4gbmV3IE1hcChjb250YWluZXJNYXApKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpcmVjdGlvbkRyYWcoKSAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQoeyBzZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWc6ICgpID0+IHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB9KTtcblxuICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lci5zdWJzY3JpYmUoZXZlbnREcm9wcGVkID0+IHtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcENvbnRhaW5lci5uZXh0KGV2ZW50RHJvcHBlZCk7XG4gICAgfSk7XG4gICAgIHRoaXMub25EZXN0cm95LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoaW5kZXhTcGxpY2VMaXN0VG8gPiAtMSkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lcigpLmRlbGV0ZSh0aGlzLmdyb3VwSUQoKSk7XG4gICAgfSk7XG4gICAgY29uc3QgZWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgdGhpcy5pbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25JdGVtSW5pdC5waXBlKGRlYm91bmNlVGltZSgyNTApLCBmaWx0ZXIoZ3JvdXBOYW1lID0+IGdyb3VwTmFtZSA9PT0gdGhpcy5ncm91cE5hbWUoKSksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyKSk7XG4gICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cbiAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlQ29udGFpbmVyKCh0aGlzLnN0eWxlc092ZXJyaWRlKCkgfHwgW10pLCB0aGlzLnZpZXdFbmNhcHN1bGF0aW9uKCksIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NDb250YWluZXJEZWZpbmUpO1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdTdGFydCA9IChldmVudERyYWdTdGFydDogSURyYWdTdGFydCkgPT4ge1xuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZXZlbnREcmFnU3RhcnQuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgdGhpcy5vdXREcmFnU3RhcnRDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ1N0YXJ0LCBpdGVtRHJhZ0luZm86IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3RvcmVJbmRleCA9IHsgaW5kZXhEcmFnOiAtMSwgaW5kZXhEcmFnT3ZlcjogLTEgfTtcbiAgICBsZXQgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICBjb25zdCBoYW5kbGVyRHJhZ092ZXIgPSAoZXZlbnREcmFnT3ZlcjogSURyYWdPdmVyKSA9PiB7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnLCBlbGVtZW50RHJhZ092ZXIgfSA9IGV2ZW50RHJhZ092ZXI7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkgfHwgIXRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNoZWNrRWxlbWVudE92ZXJBY2NlcHRFbGVtZW50RHJhZyh0aGlzLmdyb3VwTmFtZSgpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2Ryb3BUb0dyb3VwTmFtZScpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleERyYWcgPSBOdW1iZXIoZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBpbmRleERyYWdPdmVyID0gTnVtYmVyKGVsZW1lbnREcmFnT3Zlci5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKTtcbiAgICAgIGNvbnN0IGlkR3JvdXBFbGVtZW50RHJhZyA9IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpO1xuICAgICAgY29uc3QgaWRHcm91cEVsZW1lbnREcmFnT3ZlciA9IGVsZW1lbnREcmFnT3Zlci5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKTtcblxuICAgICAgaWYgKCh0aGlzLmdyb3VwSUQoKSAhPT0gaWRHcm91cEVsZW1lbnREcmFnKSB8fCAoaWRHcm91cEVsZW1lbnREcmFnICE9PSBpZEdyb3VwRWxlbWVudERyYWdPdmVyKSkgeyAvLyB44butIGzDvSBjaG8gaXRlbSBkcmFnIG92ZXIgcXVhIDEgaXRlbSBraMOhYyBjb250YWluZXJcbiAgICAgICAgaWYgKGlkR3JvdXBFbGVtZW50RHJhZ092ZXIgPT09IHRoaXMuZ3JvdXBJRCgpICYmIHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGUoKSA9PT0gJ2RlZXBDb3B5JyA/IGNsb25lRGVlcCh0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8/Lml0ZW0pIDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvPy5pdGVtO1xuXG4gICAgICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnT3ZlciwgMCwgaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpbmRleFNwbGljZUxpc3RUbyA9IGluZGV4RHJhZ092ZXI7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgZmFsc2UsIGluZGV4U3BsaWNlTGlzdFRvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSB8fCBpbmRleERyYWcgPCAwIHx8IGluZGV4RHJhZ092ZXIgPCAwIHx8ICF0aGlzLml0ZW1zKCkubGVuZ3RoIHx8IGluZGV4RHJhZyA+IHRoaXMuaXRlbXMoKS5sZW5ndGggfHwgaW5kZXhEcmFnT3ZlciA+IHRoaXMuaXRlbXMoKS5sZW5ndGggfHwgKHN0b3JlSW5kZXguaW5kZXhEcmFnID09PSBpbmRleERyYWcgJiYgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID09PSBpbmRleERyYWdPdmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB44butIGzDvSBjaG8gaXRlbSBkcmFnIG92ZXIgcXVhIDEgaXRlbSBjw7luZyBjb250YWluZXJcbiAgICAgIGNvbnN0IGl0ZW1EcmFnID0gdGhpcy5pdGVtcygpW2luZGV4RHJhZ107XG5cbiAgICAgIHRoaXMuc2V0QW5pbWF0aW9uRWxlbWVudERyYWdPdmVyKGluZGV4RHJhZywgaW5kZXhEcmFnT3ZlciwgZWxlbWVudERyYWdPdmVyKTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnID0gaW5kZXhEcmFnO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZywgMSk7XG4gICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtRHJhZyk7XG4gICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgfSk7XG5cbiAgICAgIGVsZW1lbnREcmFnLnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBpbmRleERyYWdPdmVyLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbW92ZVBsYWNlaG9sZGVyRHJhZyA9IChldmVudERyYWc6IElEcmFnRW5kLCBpc0RyYWdnaW5nPzogYm9vbGVhbikgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsU2Nyb2xsVG9FbGVtZW50KCkpO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWcgPSAtMTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnT3ZlciA9IC0xO1xuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWcubW91c2VQb3NpdGlvbiwgKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50SW5kZXggPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmRJbmRleCgoY2hpbGQpID0+IGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykpO1xuXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnRJbmRleCA+PSAwICYmIHRoaXMuZ3JvdXBJRCgpICE9PSBldmVudERyYWcuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoY2hpbGRFbGVtZW50SW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcblxuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lciwgaXNEcmFnZ2luZyk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleFNwbGljZUxpc3RUbyA+PSAwKSB7XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhTcGxpY2VMaXN0VG8sIDEpO1xuICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGluZGV4U3BsaWNlTGlzdFRvID0gLTE7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcmFnZ2luZyA9IChldmVudERyYWdnaW5nOiBJRHJhZ2dpbmcpID0+IHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgY29uc3QgeyBlbGVtZW50RHJhZyB9ID0gZXZlbnREcmFnZ2luZztcbiAgICAgIGNvbnN0IGZpZWxkSWRJdGVtID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdmaWVsZF9pZCcpO1xuICAgICAgY29uc3QgaWRJdGVtRHJhZyA9IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnaXRlbV9pZCcpO1xuXG4gICAgICBpZiAoZmllbGRJZEl0ZW0gJiYgaWRJdGVtRHJhZyAmJiB0aGlzLml0ZW1zKCkuZmluZChpdGVtID0+IGdldChpdGVtLCBmaWVsZElkSXRlbSkgPT09IGlkSXRlbURyYWcpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuRWxlbWVudCA9IGVsZW1lbnRDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmUpIGFzIHVua25vd24gYXMgQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICAgICAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5nZXRBdHRyaWJ1dGUoJ2l0ZW1faWQnKSA9PT0gaWRJdGVtRHJhZyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXRlbXMoKSA9PT0gZXZlbnREcmFnZ2luZy5pdGVtRHJhZ0luZm8/Lml0ZW1zRHJhZygpICYmIGNoaWxkRWxlbWVudCAmJiAhY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykgJiYgIWNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUodGhpcy5kcmFnRHJvcFNlcnZpY2UuVGFyZ2V0SXRlbURyYWdGbGFnKSkge1xuICAgICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUodGhpcy5kcmFnRHJvcFNlcnZpY2UuVGFyZ2V0SXRlbURyYWdGbGFnLCAndHJ1ZScpO1xuICAgICAgICAgIHRoaXMuZ3JvdXBJRC5zZXQoZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgfHwgJycpO1xuICAgICAgICAgIHN0eWxlVGFnLnJlbW92ZSgpO1xuICAgICAgICAgIHN0eWxlVGFnLnRleHRDb250ZW50ID0gc3R5bGVDb250YWluZXIoKHRoaXMuc3R5bGVzT3ZlcnJpZGUoKSB8fCBbXSksIHRoaXMudmlld0VuY2Fwc3VsYXRpb24oKSwgdGhpcy5ncm91cElEKCkpO1xuICAgICAgICAgIGVsZW1lbnRDb250YWluZXIuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgPT09IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICYmICF0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSkge1xuICAgICAgICB0aGlzLmNoZWNrQW5kU2Nyb2xsRWxlbWVudFRvUG9zaXRpb24oZXZlbnREcmFnZ2luZywgdGhpcy5pZ25vcmVBdXRvU2Nyb2xsKCkgfHwgIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIoZXZlbnREcmFnZ2luZy5tb3VzZVBvc2l0aW9uLCAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpKSkge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdPdmVyKCkpIHtcbiAgICAgICAgICB0aGlzLmlzRHJhZ092ZXIuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLm91dERyYWdMZWF2ZUNvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnZ2luZywgZWxlbWVudERyYWdMZWF2ZTogZWxlbWVudENvbnRhaW5lciB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW1vdmVQbGFjZWhvbGRlckRyYWcoZXZlbnREcmFnZ2luZywgdHJ1ZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrQW5kU2Nyb2xsRWxlbWVudFRvUG9zaXRpb24oZXZlbnREcmFnZ2luZywgdGhpcy5pZ25vcmVBdXRvU2Nyb2xsKCkpO1xuXG4gICAgICAvLyDEkG/huqFuIGNvZGUgeOG7rSBsw70gY2hvIHZp4buHYyBrw6lvIG3hu5l0IGVsZW1lbnQgdsOgbyAxIGNvbnRhaW5lciBuaMawbmcgY29udGFpbmVyIGtow7RuZyBjw7MgaXRlbSBob+G6t2MgaXRlbSBkcmFnIGtow7RuZyBvdmVyIHF1YSBpdGVtIHRyb25nIGNvbnRhaW5lclxuICAgICAgaWYgKCF0aGlzLmlzRHJhZ092ZXIoKSkge1xuICAgICAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lci1kcmFnb3ZlcicpO1xuICAgICAgICB0aGlzLmlzRHJhZ092ZXIuc2V0KHRydWUpO1xuICAgICAgICB0aGlzLm91dERyYWdPdmVyQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ092ZXI6IGVsZW1lbnRDb250YWluZXIgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudERyYWdPdmVyID0geyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ092ZXI6IGVsZW1lbnRDb250YWluZXIgfTtcblxuICAgICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIGV2ZW50RHJhZ092ZXIuZWxlbWVudERyYWdPdmVyID0ge1xuICAgICAgICAgIGdldEF0dHJpYnV0ZTogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdncm91cElEJykge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cElEKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIubmV4dChldmVudERyYWdPdmVyKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuRWxlbWVudCA9IGVsZW1lbnRDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmUpIGFzIHVua25vd24gYXMgQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICAgICAgbGV0IGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZCgoY2hpbGQpID0+IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIoZXZlbnREcmFnZ2luZy5tb3VzZVBvc2l0aW9uLCBjaGlsZCkpO1xuXG4gICAgICBpZiAoY2hpbGRFbGVtZW50KSB7IC8vIG7hur91IHTDrG0gdGjhuqV5IHRow6wgc+G6vSBuaOG6rW4gcXVhIHPhu7Ega2nhu4duIGPhu6dhIGRyYWctaXRlbS5kaXJlY3RpdmUgZW1pdFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLnBvcCgpO1xuXG4gICAgICBpZiAoY2hpbGRFbGVtZW50KSB7XG4gICAgICAgIGV2ZW50RHJhZ092ZXIuZWxlbWVudERyYWdPdmVyID0gY2hpbGRFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdPdmVyLm5leHQoZXZlbnREcmFnT3Zlcik7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcmFnRW5kID0gKGV2ZW50RHJhZ0VuZDogSURyYWdFbmQpID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IHJlY3QgPSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcikge1xuICAgICAgICByZWN0ID0gKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB9XG4gICAgICByZW1vdmVQbGFjZWhvbGRlckRyYWcoZXZlbnREcmFnRW5kKTtcbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIG1vdXNlUG9zaXRpb24sIGl0ZW1EcmFnSW5mbyB9ID0gZXZlbnREcmFnRW5kO1xuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgPT09IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgIHRoaXMub3V0RHJhZ0VuZENvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnRW5kIH0pO1xuICAgICAgfVxuICAgICAgaWYgKCFjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKG1vdXNlUG9zaXRpb24sIHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyLCByZWN0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBldmVudERyb3AgPSB7IGVsZW1lbnREcmFnOiBlbGVtZW50RHJhZywgZWxlbWVudERyb3A6IGVsZW1lbnRDb250YWluZXIsIGl0ZW1EcmFnSW5mbzogaXRlbURyYWdJbmZvIH07XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkgfHwgIXRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNoZWNrRWxlbWVudE92ZXJBY2NlcHRFbGVtZW50RHJhZyh0aGlzLmdyb3VwTmFtZSgpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2Ryb3BUb0dyb3VwTmFtZScpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkcmVuRWxlbWVudCA9IGVsZW1lbnRDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmUpIGFzIHVua25vd24gYXMgQXJyYXk8SFRNTEVsZW1lbnQ+O1xuICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kKChjaGlsZCkgPT4gY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihtb3VzZVBvc2l0aW9uLCBjaGlsZCkpO1xuXG4gICAgICBpZiAoY2hpbGRFbGVtZW50KSB7XG4gICAgICAgIGV2ZW50RHJvcC5lbGVtZW50RHJvcCA9IGNoaWxkRWxlbWVudDtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wLm5leHQoZXZlbnREcm9wKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBldmVudERyb3AuZWxlbWVudERyb3AgPSB7XG4gICAgICAgIGdldEF0dHJpYnV0ZTogKG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChuYW1lID09PSAnZHJvcENvbnRhaW5lcicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwSUQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cElEKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuYW1lICE9PSAnaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gY2hpbGRyZW5FbGVtZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wLm5leHQoZXZlbnREcm9wKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyb3AgPSAoZXZlbnREcm9wOiBJRHJvcCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnLCBlbGVtZW50RHJvcCwgaXRlbURyYWdJbmZvIH0gPSBldmVudERyb3A7XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgJiYgdGhpcy5ncm91cElEKCkgPT09IGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgIGlmIChpdGVtRHJhZ0luZm8pIHtcbiAgICAgICAgICBpdGVtRHJhZ0luZm8uaW5kZXhEcm9wID0gTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpO1xuICAgICAgICAgIGl0ZW1EcmFnSW5mby5pdGVtc0Ryb3AgPSB0aGlzLml0ZW1zO1xuICAgICAgICAgIGl0ZW1EcmFnSW5mby5jb250YWluZXJEcm9wID0gZWxlbWVudENvbnRhaW5lcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkpIHtcbiAgICAgICAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXIuZW1pdChldmVudERyb3ApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpICE9PSBlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSB8fCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSA9PT0gZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhEcmFnT3ZlciA9IE51bWJlcihlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKSAtIChlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2Ryb3BDb250YWluZXInKSA/IDAgOiAxKTtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGUoKSA9PT0gJ2RlZXBDb3B5JyA/IGNsb25lRGVlcChpdGVtRHJhZ0luZm8/Lml0ZW0pIDogaXRlbURyYWdJbmZvPy5pdGVtO1xuXG4gICAgICBpZiAoaXRlbURyYWdJbmZvKSB7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5pbmRleERyb3AgPSBpbmRleERyYWdPdmVyO1xuICAgICAgICBpdGVtRHJhZ0luZm8uaXRlbXNEcm9wID0gdGhpcy5pdGVtcztcbiAgICAgICAgaXRlbURyYWdJbmZvLmNvbnRhaW5lckRyb3AgPSBlbGVtZW50Q29udGFpbmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5vdXREcm9wcGVkQ29udGFpbmVyRW1wdHkuZW1pdChldmVudERyb3ApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1EcmFnSW5mbyAmJiBpdGVtRHJhZ0luZm8uaXRlbXNNb3ZlICYmIGl0ZW1EcmFnSW5mby5pdGVtc01vdmUoKSkge1xuICAgICAgICBpdGVtRHJhZ0luZm8uaXRlbXNEcmFnLnNldChbLi4uaXRlbURyYWdJbmZvLml0ZW1zTW92ZSgpXSk7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXIuZW1pdChldmVudERyb3ApO1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIFt7XG4gICAgICBuYW1lOiAnT25EcmFnU3RhcnQnLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ1N0YXJ0LFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ1N0YXJ0XG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJhZ092ZXInLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnT3ZlclxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdPbkRyYWdnaW5nJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdnaW5nLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ2dpbmdcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnT25EcmFnRW5kJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdFbmQsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnRW5kXG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJvcCcsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJvcFxuICAgIH1dLmZvckVhY2goKGl0ZW06IHsgbmFtZTogc3RyaW5nOyBldmVudDogT2JzZXJ2YWJsZTx1bmtub3duPjsgZnVuY3Rpb25DYWxsOiBvYmplY3QgfSkgPT4gKGl0ZW0uZXZlbnQucGlwZSh0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoaXRlbS5mdW5jdGlvbkNhbGwpKSk7XG5cbiAgfVxuXG4gIC8qICovXG4gIHByaXZhdGUgYXN5bmMgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBzZXRJdGVtRHJhZz86IGJvb2xlYW4sIGluZGV4SW5zZXJ0PzogbnVtYmVyKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicsIGAke3RoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdncm91cE5hbWUnLCB0aGlzLmdyb3VwTmFtZSgpIHx8ICcnKTtcbiAgICB9XG4gICAgQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgfHwgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgPT09IHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgIT09IHRoaXMuZ3JvdXBJRCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdpbmRleCcsIGAke2luZGV4fWApO1xuICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInLCBgJHt0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCl9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ncm91cE5hbWUoKSAmJiAhY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJywgdGhpcy5ncm91cE5hbWUoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgYCR7dGhpcy5wbGFjZWhvbGRlcigpfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJvcFRvR3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJywgYCR7dGhpcy5kcm9wVG9Hcm91cE5hbWUoKT8uam9pbignOycpfWApO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4SW5zZXJ0ID09PSBpbmRleCAmJiB0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNldEl0ZW1EcmFnICYmIGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUodGhpcy5kcmFnRHJvcFNlcnZpY2UuVGFyZ2V0SXRlbURyYWdGbGFnKSAmJiB0aGlzLml0ZW1zKCkubGVuZ3RoID49IGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgICAgY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gPSB7IGl0ZW06IHRoaXMuaXRlbXMoKVtpbmRleF0gYXMgb2JqZWN0LCBpbmRleERyYWc6IGluZGV4LCBpdGVtc0RyYWc6IHRoaXMuaXRlbXMsIGNvbnRhaW5lckRyYWc6IGVsZW1lbnRDb250YWluZXIsIGl0ZW1zTW92ZTogc2lnbmFsKFsuLi50aGlzLml0ZW1zKCldKSB9O1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb3ZlJykge1xuICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mby5pdGVtc01vdmU/LnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc11cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGhhc1JlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlLCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIpO1xuICAgIGlmIChoYXNSZW1vdmVBdHRyaWJ1dGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRBbmltYXRpb25FbGVtZW50RHJhZ092ZXIoaW5kZXhEcmFnOiBudW1iZXIsIGluZGV4RHJhZ092ZXI6IG51bWJlciwgZWxlbWVudERyYWdPdmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5kaXJlY3Rpb25EcmFnKCkgfHwgIWVsZW1lbnREcmFnT3Zlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJlY3Rpb25EcmFnKCkgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1ib3R0b20nKTtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS10b3AnKTtcbiAgICAgIGlmIChpbmRleERyYWcgPiBpbmRleERyYWdPdmVyKSB7XG4gICAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1ib3R0b20nKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleERyYWcgPCBpbmRleERyYWdPdmVyKSB7XG4gICAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS10b3AnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1sZWZ0Jyk7XG4gICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXJpZ2h0Jyk7XG4gICAgaWYgKGluZGV4RHJhZyA+IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1yaWdodCcpO1xuICAgIH1cbiAgICBpZiAoaW5kZXhEcmFnIDwgaW5kZXhEcmFnT3Zlcikge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWxlZnQnKTtcbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZvckVhY2goKGNoaWxkRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAhPT0gdGhpcy5ncm91cElEKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2luZGV4JywgYCR7aW5kZXh9YCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCwgaWdub3JlUmVtb3ZlQ2xhc3NJdGVtT3JpZ2luUGxhY2Vob2xkZXI/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lci1kcmFnb3ZlcicpO1xuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpbmRleCcpO1xuICAgICAgaWYgKCF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpIHx8ICF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpPy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICBpZiAoIWlnbm9yZVJlbW92ZUNsYXNzSXRlbU9yaWdpblBsYWNlaG9sZGVyKSB7XG5cbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxufVxuIl19
|