ng-virtual-list 17.0.8 → 17.0.10
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 +24 -24
- package/esm2022/lib/const/index.mjs +1 -2
- package/esm2022/lib/models/scroll-direction.model.mjs +1 -1
- package/esm2022/lib/ng-virtual-list.component.mjs +42 -26
- package/esm2022/lib/utils/cacheMap.mjs +11 -18
- package/esm2022/lib/utils/collection.mjs +14 -9
- package/esm2022/lib/utils/trackBox.mjs +76 -95
- package/fesm2022/ng-virtual-list.mjs +138 -144
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/const/index.d.ts +0 -1
- package/lib/models/scroll-direction.model.d.ts +1 -1
- package/lib/ng-virtual-list.component.d.ts +4 -5
- package/lib/utils/cacheMap.d.ts +2 -3
- package/lib/utils/collection.d.ts +2 -1
- package/lib/utils/trackBox.d.ts +14 -13
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,9 +28,9 @@ Template:
|
|
|
28
28
|
|
|
29
29
|
<ng-template #hotizontalItemRenderer let-data="data">
|
|
30
30
|
@if (data) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
<div class="list__h-container" (click)="onItemClick(data)">
|
|
32
|
+
<span>{{data.name}}</span>
|
|
33
|
+
</div>
|
|
34
34
|
}
|
|
35
35
|
</ng-template>
|
|
36
36
|
```
|
|
@@ -68,14 +68,14 @@ Template:
|
|
|
68
68
|
@if (data) {
|
|
69
69
|
@switch (data.type) {
|
|
70
70
|
@case ("group-header") {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
<div class="list__h-group-container">
|
|
72
|
+
<span>{{data.name}}</span>
|
|
73
|
+
</div>
|
|
74
74
|
}
|
|
75
75
|
@default {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
<div class="list__h-container" (click)="onItemClick(data)">
|
|
77
|
+
<span>{{data.name}}</span>
|
|
78
|
+
</div>
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
}
|
|
@@ -124,9 +124,9 @@ Template:
|
|
|
124
124
|
|
|
125
125
|
<ng-template #itemRenderer let-data="data">
|
|
126
126
|
@if (data) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
127
|
+
<div class="list__container">
|
|
128
|
+
<p>{{data.name}}</p>
|
|
129
|
+
</div>
|
|
130
130
|
}
|
|
131
131
|
</ng-template>
|
|
132
132
|
```
|
|
@@ -167,14 +167,14 @@ Template:
|
|
|
167
167
|
@if (data) {
|
|
168
168
|
@switch (data.type) {
|
|
169
169
|
@case ("group-header") {
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
<div class="list__group-container">
|
|
171
|
+
<p>{{data.name}}</p>
|
|
172
|
+
</div>
|
|
173
173
|
}
|
|
174
174
|
@default {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
175
|
+
<div class="list__container">
|
|
176
|
+
<p>{{data.name}}</p>
|
|
177
|
+
</div>
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
}
|
|
@@ -194,14 +194,14 @@ Template (with snapping):
|
|
|
194
194
|
@if (data) {
|
|
195
195
|
@switch (data.type) {
|
|
196
196
|
@case ("group-header") {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
197
|
+
<div class="list__group-container">
|
|
198
|
+
<p>{{data.name}}</p>
|
|
199
|
+
</div>
|
|
200
200
|
}
|
|
201
201
|
@default {
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
<div class="list__container">
|
|
203
|
+
<p>{{data.name}}</p>
|
|
204
|
+
</div>
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
207
|
}
|
|
@@ -4,7 +4,6 @@ export const DEFAULT_ITEMS_OFFSET = 2;
|
|
|
4
4
|
export const DEFAULT_LIST_SIZE = 400;
|
|
5
5
|
export const DEFAULT_SNAP = false;
|
|
6
6
|
export const DEFAULT_ENABLED_BUFFER_OPTIMIZATION = true;
|
|
7
|
-
export const DEFAULT_OPTIMIZE_FOR_END = false;
|
|
8
7
|
export const DEFAULT_SNAP_TO_ITEM = false;
|
|
9
8
|
export const DEFAULT_DYNAMIC_SIZE = false;
|
|
10
9
|
export const TRACK_BY_PROPERTY_NAME = 'id';
|
|
@@ -34,4 +33,4 @@ export const SCROLL = 'scroll';
|
|
|
34
33
|
export const SCROLL_END = 'scrollend';
|
|
35
34
|
export const CLASS_LIST_VERTICAL = 'vertical';
|
|
36
35
|
export const CLASS_LIST_HORIZONTAL = 'horizontal';
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9jb25zdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxJQUFJLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFFM0MsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSx1Q0FBdUMsR0FBRyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBRTFDLFVBQVU7QUFFVixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRXhDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztBQUU1QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUM7QUFFMUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxDQUFDO0FBRTVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLFlBQVksU0FBUyxDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQztBQUVyQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBRS9CLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7QUFFekMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2QixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBRS9CLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDO0FBRTlDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGlvbnMgfSBmcm9tIFwiLi4vZW51bXMvZGlyZWN0aW9uc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSVRFTV9TSVpFID0gMjQ7XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9JVEVNU19PRkZTRVQgPSAyO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElTVF9TSVpFID0gNDAwO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU05BUCA9IGZhbHNlO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OID0gdHJ1ZTtcclxuXHJcbmV4cG9ydCBjb25zdCBERUZBVUxUX1NOQVBfVE9fSVRFTSA9IGZhbHNlO1xyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRFlOQU1JQ19TSVpFID0gZmFsc2U7XHJcblxyXG5leHBvcnQgY29uc3QgVFJBQ0tfQllfUFJPUEVSVFlfTkFNRSA9ICdpZCc7XHJcblxyXG5leHBvcnQgY29uc3QgREVGQVVMVF9ESVJFQ1RJT04gPSBEaXJlY3Rpb25zLlZFUlRJQ0FMO1xyXG5cclxuZXhwb3J0IGNvbnN0IERJU1BMQVlfT0JKRUNUU19MRU5HVEhfTUVTVVJFTUVOVF9FUlJPUiA9IDE7XHJcblxyXG5leHBvcnQgY29uc3QgTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TID0gNTtcclxuXHJcbi8vIHByZXNldHNcclxuXHJcbmV4cG9ydCBjb25zdCBCRUhBVklPUl9BVVRPID0gJ2F1dG8nO1xyXG5cclxuZXhwb3J0IGNvbnN0IEJFSEFWSU9SX0lOU1RBTlQgPSAnaW5zdGFudCc7XHJcblxyXG5leHBvcnQgY29uc3QgQkVIQVZJT1JfU01PT1RIID0gJ3Ntb290aCc7XHJcblxyXG5leHBvcnQgY29uc3QgVklTSUJJTElUWV9WSVNJQkxFID0gJ3Zpc2libGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFZJU0lCSUxJVFlfSElEREVOID0gJ2hpZGRlbic7XHJcblxyXG5leHBvcnQgY29uc3QgU0laRV8xMDBfUEVSU0VOVCA9ICcxMDAlJztcclxuXHJcbmV4cG9ydCBjb25zdCBTSVpFX0FVVE8gPSAnYXV0byc7XHJcblxyXG5leHBvcnQgY29uc3QgUE9TSVRJT05fQUJTT0xVVEUgPSAnYWJzb2x1dGUnO1xyXG5cclxuZXhwb3J0IGNvbnN0IFBPU0lUSU9OX1NUSUNLWSA9ICdzdGlja3knO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRSQU5TTEFURV8zRCA9ICd0cmFuc2xhdGUzZCc7XHJcblxyXG5leHBvcnQgY29uc3QgWkVST1NfVFJBTlNMQVRFXzNEID0gYCR7VFJBTlNMQVRFXzNEfSgwLDAsMClgO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRPUF9QUk9QX05BTUUgPSAndG9wJztcclxuXHJcbmV4cG9ydCBjb25zdCBMRUZUX1BST1BfTkFNRSA9ICdsZWZ0JztcclxuXHJcbmV4cG9ydCBjb25zdCBYX1BST1BfTkFNRSA9ICd4JztcclxuXHJcbmV4cG9ydCBjb25zdCBZX1BST1BfTkFNRSA9ICd5JztcclxuXHJcbmV4cG9ydCBjb25zdCBXSURUSF9QUk9QX05BTUUgPSAnd2lkdGgnO1xyXG5cclxuZXhwb3J0IGNvbnN0IEhFSUdIVF9QUk9QX05BTUUgPSAnaGVpZ2h0JztcclxuXHJcbmV4cG9ydCBjb25zdCBQWCA9ICdweCc7XHJcblxyXG5leHBvcnQgY29uc3QgU0NST0xMID0gJ3Njcm9sbCc7XHJcblxyXG5leHBvcnQgY29uc3QgU0NST0xMX0VORCA9ICdzY3JvbGxlbmQnO1xyXG5cclxuZXhwb3J0IGNvbnN0IENMQVNTX0xJU1RfVkVSVElDQUwgPSAndmVydGljYWwnO1xyXG5cclxuZXhwb3J0IGNvbnN0IENMQVNTX0xJU1RfSE9SSVpPTlRBTCA9ICdob3Jpem9udGFsJztcclxuIl19
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLWRpcmVjdGlvbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL21vZGVscy9zY3JvbGwtZGlyZWN0aW9uLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBpcyB1cCBvciBsZWZ0IChpZiB0aGUgbGlzdCBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCkuXHJcbiAqIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbiBpcyBkb3duIG9yIHJpZ2h0IChpZiB0aGUgbGlzdCBkaXJlY3Rpb24gaXMgaG9yaXpvbnRhbCkuXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTY3JvbGxEaXJlY3Rpb24gPSAtMSB8IDEgfCAwO1xyXG4iXX0=
|
|
@@ -2,9 +2,9 @@ import { ChangeDetectionStrategy, Component, ElementRef, inject, input, output,
|
|
|
2
2
|
import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
|
|
3
3
|
import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, map, of, switchMap, tap } from 'rxjs';
|
|
4
4
|
import { NgVirtualListItemComponent } from './components/ng-virtual-list-item.component';
|
|
5
|
-
import { BEHAVIOR_AUTO, BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE, DEFAULT_ENABLED_BUFFER_OPTIMIZATION, DEFAULT_ITEM_SIZE, DEFAULT_ITEMS_OFFSET,
|
|
5
|
+
import { BEHAVIOR_AUTO, BEHAVIOR_INSTANT, CLASS_LIST_HORIZONTAL, CLASS_LIST_VERTICAL, DEFAULT_DIRECTION, DEFAULT_DYNAMIC_SIZE, DEFAULT_ENABLED_BUFFER_OPTIMIZATION, DEFAULT_ITEM_SIZE, DEFAULT_ITEMS_OFFSET, DEFAULT_SNAP, DEFAULT_SNAP_TO_ITEM, HEIGHT_PROP_NAME, LEFT_PROP_NAME, MAX_SCROLL_TO_ITERATIONS, PX, SCROLL, SCROLL_END, TOP_PROP_NAME, TRACK_BY_PROPERTY_NAME, WIDTH_PROP_NAME, } from './const';
|
|
6
6
|
import { Directions } from './enums';
|
|
7
|
-
import { ScrollEvent, TrackBox, isDirection, toggleClassName } from './utils';
|
|
7
|
+
import { ScrollEvent, TrackBox, debounce, isDirection, toggleClassName } from './utils';
|
|
8
8
|
import { TRACK_BOX_CHANGE_EVENT_NAME } from './utils/trackBox';
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
/**
|
|
@@ -35,7 +35,7 @@ export class NgVirtualListComponent {
|
|
|
35
35
|
onScrollEnd = output();
|
|
36
36
|
_itemsOptions = {
|
|
37
37
|
transform: (v) => {
|
|
38
|
-
this._trackBox.resetCollection(v);
|
|
38
|
+
this._trackBox.resetCollection(v, this.itemSize());
|
|
39
39
|
return v;
|
|
40
40
|
},
|
|
41
41
|
};
|
|
@@ -59,10 +59,6 @@ export class NgVirtualListComponent {
|
|
|
59
59
|
* Works only if the property dynamic = true
|
|
60
60
|
*/
|
|
61
61
|
enabledBufferOptimization = input(DEFAULT_ENABLED_BUFFER_OPTIMIZATION);
|
|
62
|
-
/**
|
|
63
|
-
* If true, optimization for lists that start from the end is enabled (chat mode enabled).
|
|
64
|
-
*/
|
|
65
|
-
likeAChat = input(DEFAULT_OPTIMIZE_FOR_END);
|
|
66
62
|
/**
|
|
67
63
|
* Rendering element template.
|
|
68
64
|
*/
|
|
@@ -103,11 +99,17 @@ export class NgVirtualListComponent {
|
|
|
103
99
|
_displayComponents = [];
|
|
104
100
|
_bounds = signal(null);
|
|
105
101
|
_scrollSize = signal(0);
|
|
102
|
+
_isScrollingDebounces = debounce((v) => {
|
|
103
|
+
this._isScrolling = v;
|
|
104
|
+
}, 250);
|
|
105
|
+
_isScrolling = false;
|
|
106
|
+
get isScrolling() { return this._isScrolling; }
|
|
106
107
|
_resizeObserver = null;
|
|
107
108
|
_onResizeHandler = () => {
|
|
108
109
|
this._bounds.set(this._container()?.nativeElement?.getBoundingClientRect() ?? null);
|
|
109
110
|
};
|
|
110
111
|
_onScrollHandler = (e) => {
|
|
112
|
+
this._isScrollingDebounces.dispose();
|
|
111
113
|
this.clearScrollToRepeatExecutionTimeout();
|
|
112
114
|
const container = this._container()?.nativeElement;
|
|
113
115
|
if (container) {
|
|
@@ -214,15 +216,7 @@ export class NgVirtualListComponent {
|
|
|
214
216
|
this._initialized = signal(false);
|
|
215
217
|
this.$initialized = toObservable(this._initialized);
|
|
216
218
|
this._trackBox.displayComponents = this._displayComponents;
|
|
217
|
-
const $enabledBufferOptimization = toObservable(this.enabledBufferOptimization);
|
|
218
|
-
$enabledBufferOptimization.pipe(takeUntilDestroyed(), tap(v => {
|
|
219
|
-
this._trackBox.enabledBufferOptimization = v;
|
|
220
|
-
})).subscribe();
|
|
221
|
-
const $likeAChat = toObservable(this.likeAChat);
|
|
222
|
-
$likeAChat.pipe(takeUntilDestroyed(), tap(v => {
|
|
223
|
-
this._trackBox.likeAChat = v;
|
|
224
|
-
})).subscribe();
|
|
225
|
-
const $bounds = toObservable(this._bounds).pipe(filter(b => !!b)), $items = toObservable(this.items).pipe(map(i => !i ? [] : i)), $scrollSize = toObservable(this._scrollSize), $itemSize = toObservable(this.itemSize).pipe(map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v)), $itemsOffset = toObservable(this.itemsOffset).pipe(map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v)), $stickyMap = toObservable(this.stickyMap).pipe(map(v => !v ? {} : v)), $snap = toObservable(this.snap), $isVertical = toObservable(this.direction).pipe(map(v => this.getIsVertical(v || DEFAULT_DIRECTION))), $dynamicSize = toObservable(this.dynamicSize), $cacheVersion = this.$cacheVersion;
|
|
219
|
+
const $bounds = toObservable(this._bounds).pipe(filter(b => !!b)), $items = toObservable(this.items).pipe(map(i => !i ? [] : i)), $scrollSize = toObservable(this._scrollSize), $itemSize = toObservable(this.itemSize).pipe(map(v => v <= 0 ? DEFAULT_ITEM_SIZE : v)), $itemsOffset = toObservable(this.itemsOffset).pipe(map(v => v < 0 ? DEFAULT_ITEMS_OFFSET : v)), $stickyMap = toObservable(this.stickyMap).pipe(map(v => !v ? {} : v)), $snap = toObservable(this.snap), $snapToItem = toObservable(this.snapToItem), $isVertical = toObservable(this.direction).pipe(map(v => this.getIsVertical(v || DEFAULT_DIRECTION))), $dynamicSize = toObservable(this.dynamicSize), $enabledBufferOptimization = toObservable(this.enabledBufferOptimization), $cacheVersion = this.$cacheVersion;
|
|
226
220
|
$isVertical.pipe(takeUntilDestroyed(), tap(v => {
|
|
227
221
|
this._isVertical = v;
|
|
228
222
|
const el = this._elementRef.nativeElement;
|
|
@@ -232,20 +226,35 @@ export class NgVirtualListComponent {
|
|
|
232
226
|
this.listenCacheChangesIfNeed(dynamicSize);
|
|
233
227
|
})).subscribe();
|
|
234
228
|
combineLatest([this.$initialized, $bounds, $items, $stickyMap, $scrollSize, $itemSize,
|
|
235
|
-
$itemsOffset, $snap, $isVertical, $dynamicSize, $cacheVersion,
|
|
236
|
-
]).pipe(takeUntilDestroyed(), distinctUntilChanged(), filter(([initialized]) => !!initialized), switchMap(([, bounds, items, stickyMap, scrollSize, itemSize, itemsOffset, snap, isVertical, dynamicSize, cacheVersion,]) => {
|
|
229
|
+
$itemsOffset, $snap, $snapToItem, $isVertical, $dynamicSize, $enabledBufferOptimization, $cacheVersion,
|
|
230
|
+
]).pipe(takeUntilDestroyed(), distinctUntilChanged(), filter(([initialized]) => !!initialized), switchMap(([, bounds, items, stickyMap, scrollSize, itemSize, itemsOffset, snap, snapToItem, isVertical, dynamicSize, enabledBufferOptimization, cacheVersion,]) => {
|
|
237
231
|
const { width, height } = bounds;
|
|
238
232
|
let actualScrollSize = scrollSize;
|
|
239
233
|
const opts = {
|
|
240
234
|
bounds: { width, height }, collection: items, dynamicSize, isVertical, itemSize,
|
|
241
|
-
itemsOffset, scrollSize: scrollSize, snap,
|
|
235
|
+
itemsOffset, scrollSize: scrollSize, snap, enabledBufferOptimization,
|
|
242
236
|
};
|
|
243
|
-
const { displayItems, totalSize } = this._trackBox.updateCollection(items, stickyMap, {
|
|
237
|
+
const { displayItems, totalSize, delta } = this._trackBox.updateCollection(items, stickyMap, {
|
|
244
238
|
...opts, scrollSize: actualScrollSize,
|
|
245
239
|
});
|
|
246
240
|
this.resetBoundsSize(isVertical, totalSize);
|
|
247
241
|
this.createDisplayComponentsIfNeed(displayItems);
|
|
248
242
|
this.tracking();
|
|
243
|
+
const container = this._container();
|
|
244
|
+
if (!this.isScrolling && dynamicSize && container) {
|
|
245
|
+
actualScrollSize = scrollSize + delta;
|
|
246
|
+
if (snapToItem) {
|
|
247
|
+
// etc
|
|
248
|
+
}
|
|
249
|
+
else if (scrollSize !== actualScrollSize) {
|
|
250
|
+
const params = {
|
|
251
|
+
[this._isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: actualScrollSize,
|
|
252
|
+
behavior: BEHAVIOR_INSTANT
|
|
253
|
+
};
|
|
254
|
+
this.scrollImmediately(container, params);
|
|
255
|
+
this._trackBox.clearDelta();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
249
258
|
return of(displayItems);
|
|
250
259
|
})).subscribe();
|
|
251
260
|
combineLatest([this.$initialized, toObservable(this.itemRenderer)]).pipe(takeUntilDestroyed(), distinctUntilChanged(), filter(([initialized]) => !!initialized), tap(([, itemRenderer]) => {
|
|
@@ -334,6 +343,7 @@ export class NgVirtualListComponent {
|
|
|
334
343
|
clearTimeout(this._scrollToRepeatExecutionTimeout);
|
|
335
344
|
}
|
|
336
345
|
scrollToExecutor(id, behavior, iteration = 0) {
|
|
346
|
+
this._isScrolling = true;
|
|
337
347
|
this.clearScrollToRepeatExecutionTimeout();
|
|
338
348
|
const items = this.items();
|
|
339
349
|
if (!items || !items.length) {
|
|
@@ -349,7 +359,7 @@ export class NgVirtualListComponent {
|
|
|
349
359
|
const { width, height } = this._bounds() || { width: 0, height: 0 }, stickyMap = this.stickyMap(), items = this.items(), isVertical = this._isVertical, opts = {
|
|
350
360
|
bounds: { width, height }, collection: items, dynamicSize, isVertical: this._isVertical, itemSize,
|
|
351
361
|
itemsOffset: this.itemsOffset(), scrollSize: isVertical ? container.nativeElement.scrollTop : container.nativeElement.scrollLeft,
|
|
352
|
-
snap: this.snap(), fromItemId: id,
|
|
362
|
+
snap: this.snap(), fromItemId: id, enabledBufferOptimization: this.enabledBufferOptimization(),
|
|
353
363
|
}, scrollSize = this._trackBox.getItemPosition(id, stickyMap, opts), params = { [isVertical ? TOP_PROP_NAME : LEFT_PROP_NAME]: scrollSize, behavior };
|
|
354
364
|
this._scrollSize.set(scrollSize);
|
|
355
365
|
if (container) {
|
|
@@ -392,10 +402,11 @@ export class NgVirtualListComponent {
|
|
|
392
402
|
this.scrollTo(latItem.id, behavior);
|
|
393
403
|
}
|
|
394
404
|
_onContainerScrollHandler = (e) => {
|
|
405
|
+
this._isScrolling = true;
|
|
395
406
|
const containerEl = this._container();
|
|
396
407
|
if (containerEl) {
|
|
397
|
-
const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft)
|
|
398
|
-
this._trackBox.deltaDirection = this._scrollSize()
|
|
408
|
+
const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);
|
|
409
|
+
this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : this._scrollSize() < scrollSize ? 1 : 0;
|
|
399
410
|
const event = new ScrollEvent({
|
|
400
411
|
direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,
|
|
401
412
|
list: this._list().nativeElement, delta: this._trackBox.delta,
|
|
@@ -405,9 +416,11 @@ export class NgVirtualListComponent {
|
|
|
405
416
|
}
|
|
406
417
|
};
|
|
407
418
|
_onContainerScrollEndHandler = (e) => {
|
|
408
|
-
this.
|
|
419
|
+
this._isScrollingDebounces.execute(false);
|
|
409
420
|
const containerEl = this._container();
|
|
410
421
|
if (containerEl) {
|
|
422
|
+
const scrollSize = (this._isVertical ? containerEl.nativeElement.scrollTop : containerEl.nativeElement.scrollLeft);
|
|
423
|
+
this._trackBox.deltaDirection = this._scrollSize() > scrollSize ? -1 : 0;
|
|
411
424
|
const event = new ScrollEvent({
|
|
412
425
|
direction: this._trackBox.scrollDirection, container: containerEl.nativeElement,
|
|
413
426
|
list: this._list().nativeElement, delta: this._trackBox.delta,
|
|
@@ -434,6 +447,9 @@ export class NgVirtualListComponent {
|
|
|
434
447
|
if (this._trackBox) {
|
|
435
448
|
this._trackBox.dispose();
|
|
436
449
|
}
|
|
450
|
+
if (this._isScrollingDebounces) {
|
|
451
|
+
this._isScrollingDebounces.dispose();
|
|
452
|
+
}
|
|
437
453
|
const containerEl = this._container();
|
|
438
454
|
if (containerEl) {
|
|
439
455
|
containerEl.nativeElement.removeEventListener(SCROLL, this._onScrollHandler);
|
|
@@ -452,7 +468,7 @@ export class NgVirtualListComponent {
|
|
|
452
468
|
}
|
|
453
469
|
}
|
|
454
470
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgVirtualListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
455
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, snapToItem: { classPropertyName: "snapToItem", publicName: "snapToItem", isSignal: true, isRequired: false, transformFunction: null }, enabledBufferOptimization: { classPropertyName: "enabledBufferOptimization", publicName: "enabledBufferOptimization", isSignal: true, isRequired: false, transformFunction: null },
|
|
471
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "17.3.12", type: NgVirtualListComponent, selector: "ng-virtual-list", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: true, transformFunction: null }, snap: { classPropertyName: "snap", publicName: "snap", isSignal: true, isRequired: false, transformFunction: null }, snapToItem: { classPropertyName: "snapToItem", publicName: "snapToItem", isSignal: true, isRequired: false, transformFunction: null }, enabledBufferOptimization: { classPropertyName: "enabledBufferOptimization", publicName: "enabledBufferOptimization", isSignal: true, isRequired: false, transformFunction: null }, itemRenderer: { classPropertyName: "itemRenderer", publicName: "itemRenderer", isSignal: true, isRequired: true, transformFunction: null }, stickyMap: { classPropertyName: "stickyMap", publicName: "stickyMap", isSignal: true, isRequired: false, transformFunction: null }, itemSize: { classPropertyName: "itemSize", publicName: "itemSize", isSignal: true, isRequired: false, transformFunction: null }, dynamicSize: { classPropertyName: "dynamicSize", publicName: "dynamicSize", isSignal: true, isRequired: false, transformFunction: null }, direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null }, itemsOffset: { classPropertyName: "itemsOffset", publicName: "itemsOffset", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onScroll: "onScroll", onScrollEnd: "onScrollEnd" }, viewQueries: [{ propertyName: "_container", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "_list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "_listContainerRef", first: true, predicate: ["renderersContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<div #container part=\"scroller\" class=\"ngvl__container\">\r\n <ul #list part=\"list\" class=\"ngvl__list\">\r\n <ng-container #renderersContainer></ng-container>\r\n </ul>\r\n</div>", styles: [":host{display:block;width:400px;overflow:hidden}:host(.horizontal){height:48px}:host(.vertical){height:320px}.ngvl__container{overflow:auto;width:100%;height:100%}.ngvl__list{position:relative;list-style:none;padding:0;margin:0;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom });
|
|
456
472
|
}
|
|
457
473
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgVirtualListComponent, decorators: [{
|
|
458
474
|
type: Component,
|
|
@@ -461,4 +477,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
461
477
|
type: ViewChild,
|
|
462
478
|
args: ['renderersContainer', { read: ViewContainerRef }]
|
|
463
479
|
}] } });
|
|
464
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQy9FLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsR0FFbEcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUNMLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxtQ0FBbUMsRUFBRSxpQkFBaUIsRUFDNUssb0JBQW9CLEVBQUUsd0JBQXdCLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQ3JMLHNCQUFzQixFQUFFLGVBQWUsR0FDeEMsTUFBTSxTQUFTLENBQUM7QUFJakIsT0FBTyxF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QUFDO1lBRTdGLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDNUQsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO3dHQXhsQlUsc0JBQXNCOzRGQUF0QixzQkFBc0IsbzREQVNRLGdCQUFnQiw2QkM3QzNELCtMQUlNOzs0RkRnQ08sc0JBQXNCO2tCQVJsQyxTQUFTOytCQUNFLGlCQUFpQixjQUNmLEtBQUssbUJBR0EsdUJBQXVCLENBQUMsTUFBTSxpQkFDaEMsaUJBQWlCLENBQUMsU0FBUzt3REFZaEMsaUJBQWlCO3NCQUQxQixTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBDb21wb25lbnRSZWYsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsXHJcbiAgT25EZXN0cm95LCBvdXRwdXQsIHNpZ25hbCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCwgdmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmLCBWaWV3RW5jYXBzdWxhdGlvbixcclxuICBXcml0YWJsZVNpZ25hbCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbmctdmlydHVhbC1saXN0LWl0ZW0uY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBCRUhBVklPUl9BVVRPLCBCRUhBVklPUl9JTlNUQU5ULCBDTEFTU19MSVNUX0hPUklaT05UQUwsIENMQVNTX0xJU1RfVkVSVElDQUwsIERFRkFVTFRfRElSRUNUSU9OLCBERUZBVUxUX0RZTkFNSUNfU0laRSwgREVGQVVMVF9FTkFCTEVEX0JVRkZFUl9PUFRJTUlaQVRJT04sIERFRkFVTFRfSVRFTV9TSVpFLFxyXG4gIERFRkFVTFRfSVRFTVNfT0ZGU0VULCBERUZBVUxUX09QVElNSVpFX0ZPUl9FTkQsIERFRkFVTFRfU05BUCwgREVGQVVMVF9TTkFQX1RPX0lURU0sIEhFSUdIVF9QUk9QX05BTUUsIExFRlRfUFJPUF9OQU1FLCBNQVhfU0NST0xMX1RPX0lURVJBVElPTlMsIFBYLCBTQ1JPTEwsIFNDUk9MTF9FTkQsIFRPUF9QUk9QX05BTUUsXHJcbiAgVFJBQ0tfQllfUFJPUEVSVFlfTkFNRSwgV0lEVEhfUFJPUF9OQU1FLFxyXG59IGZyb20gJy4vY29uc3QnO1xyXG5pbXBvcnQgeyBJU2Nyb2xsRXZlbnQsIElWaXJ0dWFsTGlzdENvbGxlY3Rpb24sIElWaXJ0dWFsTGlzdEl0ZW0sIElWaXJ0dWFsTGlzdFN0aWNreU1hcCB9IGZyb20gJy4vbW9kZWxzJztcclxuaW1wb3J0IHsgSWQsIElSZWN0IH0gZnJvbSAnLi90eXBlcyc7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfSBmcm9tICcuL21vZGVscy9yZW5kZXItY29sbGVjdGlvbi5tb2RlbCc7XHJcbmltcG9ydCB7IERpcmVjdGlvbiwgRGlyZWN0aW9ucyB9IGZyb20gJy4vZW51bXMnO1xyXG5pbXBvcnQgeyBTY3JvbGxFdmVudCwgVHJhY2tCb3gsIGlzRGlyZWN0aW9uLCB0b2dnbGVDbGFzc05hbWUgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnMsIFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSB9IGZyb20gJy4vdXRpbHMvdHJhY2tCb3gnO1xyXG5cclxuLyoqXHJcbiAqIFZpcnR1YWwgbGlzdCBjb21wb25lbnQuXHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE3LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvbmctdmlydHVhbC1saXN0LmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nLXZpcnR1YWwtbGlzdCcsXHJcbiAgc3RhbmRhbG9uZTogZmFsc2UsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdWaXJ0dWFsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX19uZXh0SWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG4gIC8qKlxyXG4gICAqIFJlYWRvbmx5LiBSZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3JlbmRlcmVyc0NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIHByb3RlY3RlZCBfbGlzdENvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIF9jb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXInKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9saXN0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTFVMaXN0RWxlbWVudD4+KCdsaXN0Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gdGhlIGxpc3QgaGFzIGJlZW4gc2Nyb2xsZWQuXHJcbiAgICovXHJcbiAgb25TY3JvbGwgPSBvdXRwdXQ8SVNjcm9sbEV2ZW50PigpO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIHRoZSBsaXN0IGhhcyBjb21wbGV0ZWQgc2Nyb2xsaW5nLlxyXG4gICAqL1xyXG4gIG9uU2Nyb2xsRW5kID0gb3V0cHV0PElTY3JvbGxFdmVudD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbXNPcHRpb25zID0ge1xyXG4gICAgdHJhbnNmb3JtOiAodjogSVZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5yZXNldENvbGxlY3Rpb24odik7XHJcbiAgICAgIHJldHVybiB2O1xyXG4gICAgfSxcclxuICB9IGFzIGFueTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdGlvbiBvZiBsaXN0IGl0ZW1zLlxyXG4gICAqL1xyXG4gIGl0ZW1zID0gaW5wdXQucmVxdWlyZWQ8SVZpcnR1YWxMaXN0Q29sbGVjdGlvbj4oe1xyXG4gICAgLi4udGhpcy5faXRlbXNPcHRpb25zLFxyXG4gIH0pO1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgZWxlbWVudHMgd2lsbCBzbmFwLiBEZWZhdWx0IHZhbHVlIGlzIFwidHJ1ZVwiLlxyXG4gICAqL1xyXG4gIHNuYXAgPSBpbnB1dDxib29sZWFuPihERUZBVUxUX1NOQVApO1xyXG5cclxuICAvKipcclxuICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgc2Nyb2xsIHBvc2l0aW9ucyB3aWxsIGJlIHNuYXBwZWQgdG8gdGhlIGVsZW1lbnQuIERlZmF1bHQgdmFsdWUgaXMgXCJmYWxzZVwiLlxyXG4gICAqL1xyXG4gIHNuYXBUb0l0ZW0gPSBpbnB1dDxib29sZWFuPihERUZBVUxUX1NOQVBfVE9fSVRFTSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZXMgYnVmZmVyIG9wdGltaXphdGlvbi5cclxuICAgKiBDYW4gb25seSBiZSB1c2VkIGlmIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGFyZSBub3QgYWRkZWQgb3IgdXBkYXRlZC4gT3RoZXJ3aXNlLCBhcnRpZmFjdHMgaW4gdGhlIGZvcm0gb2YgdHdpdGNoaW5nIG9mIHRoZSBzY3JvbGwgYXJlYSBhcmUgcG9zc2libGUuXHJcbiAgICogV29ya3Mgb25seSBpZiB0aGUgcHJvcGVydHkgZHluYW1pYyA9IHRydWVcclxuICAgKi9cclxuICBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gaW5wdXQ8Ym9vbGVhbj4oREVGQVVMVF9FTkFCTEVEX0JVRkZFUl9PUFRJTUlaQVRJT04pO1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0cnVlLCBvcHRpbWl6YXRpb24gZm9yIGxpc3RzIHRoYXQgc3RhcnQgZnJvbSB0aGUgZW5kIGlzIGVuYWJsZWQgKGNoYXQgbW9kZSBlbmFibGVkKS5cclxuICAgKi9cclxuICBsaWtlQUNoYXQgPSBpbnB1dDxib29sZWFuPihERUZBVUxUX09QVElNSVpFX0ZPUl9FTkQpO1xyXG5cclxuICAvKipcclxuICAgKiBSZW5kZXJpbmcgZWxlbWVudCB0ZW1wbGF0ZS5cclxuICAgKi9cclxuICBpdGVtUmVuZGVyZXIgPSBpbnB1dC5yZXF1aXJlZDxUZW1wbGF0ZVJlZjxhbnk+PigpO1xyXG5cclxuICAvKipcclxuICAgKiBEaWN0aW9uYXJ5IHpJbmRleCBieSBpZCBvZiB0aGUgbGlzdCBlbGVtZW50LiBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCBvciBlcXVhbCB0byAwLFxyXG4gICAqIHRoZW4gYSBzaW1wbGUgZWxlbWVudCBpcyBkaXNwbGF5ZWQsIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCwgdGhlbiB0aGUgc3RpY2t5IHBvc2l0aW9uIG1vZGUgaXMgZW5hYmxlZCBmb3IgdGhlIGVsZW1lbnQuXHJcbiAgICovXHJcbiAgc3RpY2t5TWFwID0gaW5wdXQ8SVZpcnR1YWxMaXN0U3RpY2t5TWFwPih7fSk7XHJcblxyXG4gIHByaXZhdGUgX2l0ZW1TaXplT3B0aW9ucyA9IHtcclxuICAgIHRyYW5zZm9ybTogKHY6IG51bWJlciB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICBpZiAodiA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuIERFRkFVTFRfSVRFTV9TSVpFO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHZhbCA9IE51bWJlcih2KTtcclxuICAgICAgcmV0dXJuIE51bWJlci5pc05hTih2YWwpIHx8IHZhbCA8PSAwID8gREVGQVVMVF9JVEVNX1NJWkUgOiB2YWw7XHJcbiAgICB9LFxyXG4gIH0gYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBJZiBkaXJlY3Rpb24gPSAndmVydGljYWwnLCB0aGVuIHRoZSBoZWlnaHQgb2YgYSB0eXBpY2FsIGVsZW1lbnQuIElmIGRpcmVjdGlvbiA9ICdob3Jpem9udGFsJywgdGhlbiB0aGUgd2lkdGggb2YgYSB0eXBpY2FsIGVsZW1lbnQuXHJcbiAgICogSWdub3JlZCBpZiB0aGUgZHluYW1pY1NpemUgcHJvcGVydHkgaXMgdHJ1ZS5cclxuICAgKi9cclxuICBpdGVtU2l6ZSA9IGlucHV0PG51bWJlcj4oREVGQVVMVF9JVEVNX1NJWkUsIHsgLi4udGhpcy5faXRlbVNpemVPcHRpb25zIH0pO1xyXG5cclxuICAvKipcclxuICAgKiBJZiB0cnVlIHRoZW4gdGhlIGl0ZW1zIGluIHRoZSBsaXN0IGNhbiBoYXZlIGRpZmZlcmVudCBzaXplcyBhbmQgdGhlIGl0ZW1TaXplIHByb3BlcnR5IGlzIGlnbm9yZWQuXHJcbiAgICogSWYgZmFsc2UgdGhlbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgaGF2ZSBhIGZpeGVkIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSBpdGVtU2l6ZSBwcm9wZXJ0eS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgZmFsc2UuXHJcbiAgICovXHJcbiAgZHluYW1pY1NpemUgPSBpbnB1dChERUZBVUxUX0RZTkFNSUNfU0laRSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgdGhlIGRpcmVjdGlvbiBpbiB3aGljaCBlbGVtZW50cyBhcmUgcGxhY2VkLiBEZWZhdWx0IHZhbHVlIGlzIFwidmVydGljYWxcIi5cclxuICAgKi9cclxuICBkaXJlY3Rpb24gPSBpbnB1dDxEaXJlY3Rpb24+KERFRkFVTFRfRElSRUNUSU9OKTtcclxuXHJcbiAgLyoqXHJcbiAgICogTnVtYmVyIG9mIGVsZW1lbnRzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHZpc2liaWxpdHkuIERlZmF1bHQgdmFsdWUgaXMgMi5cclxuICAgKi9cclxuICBpdGVtc09mZnNldCA9IGlucHV0PG51bWJlcj4oREVGQVVMVF9JVEVNU19PRkZTRVQpO1xyXG5cclxuICBwcml2YXRlIF9pc1ZlcnRpY2FsID0gdGhpcy5nZXRJc1ZlcnRpY2FsKCk7XHJcblxyXG4gIHByb3RlY3RlZCBfZGlzcGxheUNvbXBvbmVudHM6IEFycmF5PENvbXBvbmVudFJlZjxOZ1ZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudD4+ID0gW107XHJcblxyXG4gIHByb3RlY3RlZCBfYm91bmRzID0gc2lnbmFsPERPTVJlY3QgfCBudWxsPihudWxsKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9zY3JvbGxTaXplID0gc2lnbmFsPG51bWJlcj4oMCk7XHJcblxyXG4gIHByaXZhdGUgX3Jlc2l6ZU9ic2VydmVyOiBSZXNpemVPYnNlcnZlciB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIF9vblJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICB0aGlzLl9ib3VuZHMuc2V0KHRoaXMuX2NvbnRhaW5lcigpPy5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA/PyBudWxsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uU2Nyb2xsSGFuZGxlciA9IChlPzogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29uc3QgZHluYW1pY1NpemUgPSB0aGlzLmR5bmFtaWNTaXplKCksIGRlbHRhID0gdGhpcy5fdHJhY2tCb3guZGVsdGEsIHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lci5zY3JvbGxUb3AgOiBjb250YWluZXIuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSwgaXNJbW1lZGlhdGVTY3JvbGwgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSAmJiBkZWx0YSAhPT0gMCkge1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGlzSW1tZWRpYXRlU2Nyb2xsID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNjcm9sbEltbWVkaWF0ZWx5KGNvbnRhaW5lciwgcGFyYW1zKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zY3JvbGxTaXplLnNldChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsSW1tZWRpYXRlbHkoY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiwgcGFyYW1zOiBTY3JvbGxPcHRpb25zLCBjYj86ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxJbW1lZGlhdGVseSgpO1xyXG5cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuXHJcbiAgICAgICAgaWYgKGNiICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNiKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcblxyXG4gICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5fc2Nyb2xsSW1tZWRpYXRlbHlIYW5kbGVyID0gaGFuZGxlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlcjogKCguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNjcm9sbEltbWVkaWF0ZWx5KCkge1xyXG4gICAgaWYgKHRoaXMuX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9zY3JvbGxJbW1lZGlhdGVseUhhbmRsZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25TY3JvbGxFbmRIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guY2xlYXJEZWx0YSgpO1xyXG4gICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhRGlyZWN0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemUoKSwgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbSgpLCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUoKSwgZGVsdGEgPSB0aGlzLl90cmFja0JveC5kZWx0YSxcclxuICAgICAgICBzY3JvbGxTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcclxuICAgICAgbGV0IGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplO1xyXG4gICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSArIGRlbHRhO1xyXG4gICAgICAgIGlmIChzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMoKSxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICAgIHRhcmdldEl0ZW0gPSB0aGlzLl90cmFja0JveC5nZXROZWFyZXN0SXRlbShhY3R1YWxTY3JvbGxTaXplLCBpdGVtcywgaXRlbVNpemUsIGlzVmVydGljYWwpO1xyXG4gICAgICAgICAgaWYgKHRhcmdldEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyh0YXJnZXRJdGVtLmlkLCBCRUhBVklPUl9JTlNUQU5UKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFNpemUgIT09IGFjdHVhbFNjcm9sbFNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuX3Njcm9sbFNpemUuc2V0KGFjdHVhbFNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbChwYXJhbXMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxJdGVtcyA9IE1hdGgucm91bmQoc2Nyb2xsU2l6ZSAvIGl0ZW1TaXplKTtcclxuICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc25hcFRvSXRlbSA/IHNjcm9sbEl0ZW1zICogaXRlbVNpemUgOiBzY3JvbGxTaXplO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsU2l6ZSAhPT0gYWN0dWFsU2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SX0lOU1RBTlRcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zY3JvbGxTaXplLnNldChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pO1xyXG5cclxuICBwcml2YXRlIF9pbml0aWFsaXplZCE6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xyXG5cclxuICByZWFkb25seSAkaW5pdGlhbGl6ZWQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAvKipcclxuICAgKiBEaWN0aW9uYXJ5IG9mIGVsZW1lbnQgc2l6ZXMgYnkgdGhlaXIgaWRcclxuICAgKi9cclxuICBwcml2YXRlIF90cmFja0JveCA9IG5ldyBUcmFja0JveChUUkFDS19CWV9QUk9QRVJUWV9OQU1FKTtcclxuXHJcbiAgcHJpdmF0ZSBfb25UcmFja0JveENoYW5nZUhhbmRsZXIgPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLl8kY2FjaGVWZXJzaW9uLm5leHQodik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF8kY2FjaGVWZXJzaW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcclxuICBnZXQgJGNhY2hlVmVyc2lvbigpIHsgcmV0dXJuIHRoaXMuXyRjYWNoZVZlcnNpb24uYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkID0gTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZCArIDEgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICAgID8gMCA6IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQgKyAxO1xyXG4gICAgdGhpcy5faWQgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHRoaXMuJGluaXRpYWxpemVkID0gdG9PYnNlcnZhYmxlKHRoaXMuX2luaXRpYWxpemVkKTtcclxuXHJcbiAgICB0aGlzLl90cmFja0JveC5kaXNwbGF5Q29tcG9uZW50cyA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzO1xyXG5cclxuICAgIGNvbnN0ICRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gdG9PYnNlcnZhYmxlKHRoaXMuZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbik7XHJcblxyXG4gICAgJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24ucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl90cmFja0JveC5lbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gdjtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbnN0ICRsaWtlQUNoYXQgPSB0b09ic2VydmFibGUodGhpcy5saWtlQUNoYXQpO1xyXG5cclxuICAgICRsaWtlQUNoYXQucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl90cmFja0JveC5saWtlQUNoYXQgPSB2O1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29uc3QgJGJvdW5kcyA9IHRvT2JzZXJ2YWJsZSh0aGlzLl9ib3VuZHMpLnBpcGUoXHJcbiAgICAgIGZpbHRlcihiID0+ICEhYiksXHJcbiAgICApLCAkaXRlbXMgPSB0b09ic2VydmFibGUodGhpcy5pdGVtcykucGlwZShcclxuICAgICAgbWFwKGkgPT4gIWkgPyBbXSA6IGkpLFxyXG4gICAgKSwgJHNjcm9sbFNpemUgPSB0b09ic2VydmFibGUodGhpcy5fc2Nyb2xsU2l6ZSksXHJcbiAgICAgICRpdGVtU2l6ZSA9IHRvT2JzZXJ2YWJsZSh0aGlzLml0ZW1TaXplKS5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHYgPD0gMCA/IERFRkFVTFRfSVRFTV9TSVpFIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRpdGVtc09mZnNldCA9IHRvT2JzZXJ2YWJsZSh0aGlzLml0ZW1zT2Zmc2V0KS5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHYgPCAwID8gREVGQVVMVF9JVEVNU19PRkZTRVQgOiB2KSxcclxuICAgICAgKSxcclxuICAgICAgJHN0aWNreU1hcCA9IHRvT2JzZXJ2YWJsZSh0aGlzLnN0aWNreU1hcCkucGlwZShcclxuICAgICAgICBtYXAodiA9PiAhdiA/IHt9IDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRzbmFwID0gdG9PYnNlcnZhYmxlKHRoaXMuc25hcCksXHJcbiAgICAgICRpc1ZlcnRpY2FsID0gdG9PYnNlcnZhYmxlKHRoaXMuZGlyZWN0aW9uKS5waXBlKFxyXG4gICAgICAgIG1hcCh2ID0+IHRoaXMuZ2V0SXNWZXJ0aWNhbCh2IHx8IERFRkFVTFRfRElSRUNUSU9OKSksXHJcbiAgICAgICksXHJcbiAgICAgICRkeW5hbWljU2l6ZSA9IHRvT2JzZXJ2YWJsZSh0aGlzLmR5bmFtaWNTaXplKSxcclxuICAgICAgJGNhY2hlVmVyc2lvbiA9IHRoaXMuJGNhY2hlVmVyc2lvbjtcclxuXHJcbiAgICAkaXNWZXJ0aWNhbC5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgdGFwKHYgPT4ge1xyXG4gICAgICAgIHRoaXMuX2lzVmVydGljYWwgPSB2O1xyXG4gICAgICAgIGNvbnN0IGVsOiBIVE1MRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgICAgICB0b2dnbGVDbGFzc05hbWUoZWwsIHYgPyBDTEFTU19MSVNUX1ZFUlRJQ0FMIDogQ0xBU1NfTElTVF9IT1JJWk9OVEFMLCB0cnVlKTtcclxuICAgICAgfSksXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICRkeW5hbWljU2l6ZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgdGFwKGR5bmFtaWNTaXplID0+IHtcclxuICAgICAgICB0aGlzLmxpc3RlbkNhY2hlQ2hhbmdlc0lmTmVlZChkeW5hbWljU2l6ZSk7XHJcbiAgICAgIH0pXHJcbiAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuJGluaXRpYWxpemVkLCAkYm91bmRzLCAkaXRlbXMsICRzdGlja3lNYXAsICRzY3JvbGxTaXplLCAkaXRlbVNpemUsXHJcbiAgICAgICRpdGVtc09mZnNldCwgJHNuYXAsICRpc1ZlcnRpY2FsLCAkZHluYW1pY1NpemUsICRjYWNoZVZlcnNpb24sXHJcbiAgICBdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZmlsdGVyKChbaW5pdGlhbGl6ZWRdKSA9PiAhIWluaXRpYWxpemVkKSxcclxuICAgICAgc3dpdGNoTWFwKChbLFxyXG4gICAgICAgIGJvdW5kcywgaXRlbXMsIHN0aWNreU1hcCwgc2Nyb2xsU2l6ZSwgaXRlbVNpemUsXHJcbiAgICAgICAgaXRlbXNPZmZzZXQsIHNuYXAsIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBjYWNoZVZlcnNpb24sXHJcbiAgICAgIF0pID0+IHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcyBhcyBET01SZWN0O1xyXG4gICAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICBjb25zdCBvcHRzOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uPiA9IHtcclxuICAgICAgICAgIGJvdW5kczogeyB3aWR0aCwgaGVpZ2h0IH0sIGNvbGxlY3Rpb246IGl0ZW1zLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICBpdGVtc09mZnNldCwgc2Nyb2xsU2l6ZTogc2Nyb2xsU2l6ZSwgc25hcCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zLCB0b3RhbFNpemUgfSA9IHRoaXMuX3RyYWNrQm94LnVwZGF0ZUNvbGxlY3Rpb24oaXRlbXMsIHN0aWNreU1hcCwge1xyXG4gICAgICAgICAgLi4ub3B0cywgc2Nyb2xsU2l6ZTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbCwgdG90YWxTaXplKTtcclxuXHJcbiAgICAgICAgdGhpcy5jcmVhdGVEaXNwbGF5Q29tcG9uZW50c0lmTmVlZChkaXNwbGF5SXRlbXMpO1xyXG5cclxuICAgICAgICB0aGlzLnRyYWNraW5nKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBvZihkaXNwbGF5SXRlbXMpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy4kaW5pdGlhbGl6ZWQsIHRvT2JzZXJ2YWJsZSh0aGlzLml0ZW1SZW5kZXJlcildKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZmlsdGVyKChbaW5pdGlhbGl6ZWRdKSA9PiAhIWluaXRpYWxpemVkKSxcclxuICAgICAgdGFwKChbLCBpdGVtUmVuZGVyZXJdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXNldFJlbmRlcmVycyhpdGVtUmVuZGVyZXIpO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlbkNhY2hlQ2hhbmdlc0lmTmVlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmICghdGhpcy5fdHJhY2tCb3guaGFzRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKSkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LmFkZEV2ZW50TGlzdGVuZXIoVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl9vblRyYWNrQm94Q2hhbmdlSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl90cmFja0JveC5oYXNFdmVudExpc3RlbmVyKFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSwgdGhpcy5fb25UcmFja0JveENoYW5nZUhhbmRsZXIpKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc1ZlcnRpY2FsKGQ/OiBEaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IGRpciA9IGQgfHwgdGhpcy5kaXJlY3Rpb24oKTtcclxuICAgIHJldHVybiBpc0RpcmVjdGlvbihkaXIsIERpcmVjdGlvbnMuVkVSVElDQUwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaXNwbGF5Q29tcG9uZW50c0lmTmVlZChkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsKSB7XHJcbiAgICBpZiAoIWRpc3BsYXlJdGVtcyB8fCAhdGhpcy5fbGlzdENvbnRhaW5lclJlZikge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5zZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKHt9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyYWNrQm94Lml0ZW1zID0gZGlzcGxheUl0ZW1zO1xyXG5cclxuICAgIGNvbnN0IF9saXN0Q29udGFpbmVyUmVmID0gdGhpcy5fbGlzdENvbnRhaW5lclJlZjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoIDwgZGlzcGxheUl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBpZiAoX2xpc3RDb250YWluZXJSZWYpIHtcclxuICAgICAgICBjb25zdCBjb21wID0gX2xpc3RDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5wdXNoKGNvbXApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gZGlzcGxheUl0ZW1zLmxlbmd0aDtcclxuICAgIHdoaWxlICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGggPiBtYXhMZW5ndGgpIHtcclxuICAgICAgY29uc3QgY29tcCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLnBvcCgpO1xyXG4gICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIGNvbnN0IGlkID0gY29tcD8uaW5zdGFuY2UuaXRlbT8uaWQ7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gudW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wPy5pbnN0YW5jZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0UmVuZGVyZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UmVuZGVyZXJzKGl0ZW1SZW5kZXJlcj86IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIGNvbnN0IGRvTWFwOiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXTtcclxuICAgICAgaXRlbS5pbnN0YW5jZS5yZW5kZXJlciA9IGl0ZW1SZW5kZXJlciB8fCB0aGlzLml0ZW1SZW5kZXJlcigpO1xyXG4gICAgICBkb01hcFtpdGVtLmluc3RhbmNlLmlkXSA9IGk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdHJhY2tCb3guc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZChkb01hcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja2luZyBieSBpZFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB0cmFja2luZygpIHtcclxuICAgIHRoaXMuX3RyYWNrQm94LnRyYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsOiBib29sZWFuLCB0b3RhbFNpemU6IG51bWJlcikge1xyXG4gICAgY29uc3QgbCA9IHRoaXMuX2xpc3QoKTtcclxuICAgIGlmIChsKSB7XHJcbiAgICAgIGwubmF0aXZlRWxlbWVudC5zdHlsZVtpc1ZlcnRpY2FsID8gSEVJR0hUX1BST1BfTkFNRSA6IFdJRFRIX1BST1BfTkFNRV0gPSBgJHt0b3RhbFNpemV9JHtQWH1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgYm91bmRzIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIGlkXHJcbiAgICovXHJcbiAgZ2V0SXRlbUJvdW5kcyhpZDogSWQpOiBJUmVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhY2tCb3guZ2V0SXRlbUJvdW5kcyhpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWV0aG9kIHNjcm9sbHMgdGhlIGxpc3QgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzY3JvbGxlZCBhcmVhLlxyXG4gICAqIEJlaGF2aW9yIGFjY2VwdHMgdGhlIHZhbHVlcyDigIvigItcImF1dG9cIiwgXCJpbnN0YW50XCIgYW5kIFwic21vb3RoXCIuXHJcbiAgICovXHJcbiAgc2Nyb2xsVG8oaWQ6IElkLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBCRUhBVklPUl9BVVRPKSB7XHJcbiAgICB0aGlzLnNjcm9sbFRvRXhlY3V0b3IoaWQsIGJlaGF2aW9yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dDogYW55O1xyXG5cclxuICBwcml2YXRlIGNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9FeGVjdXRvcihpZDogSWQsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciwgaXRlcmF0aW9uOiBudW1iZXIgPSAwKSB7XHJcbiAgICB0aGlzLmNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCk7XHJcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMoKTtcclxuICAgIGlmICghaXRlbXMgfHwgIWl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZHluYW1pY1NpemUgPSB0aGlzLmR5bmFtaWNTaXplKCksIGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcigpLCBpdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemUoKTtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgaWYgKGR5bmFtaWNTaXplKSB7XHJcbiAgICAgICAgaWYgKGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuX2JvdW5kcygpIHx8IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxyXG4gICAgICAgICAgc3RpY2t5TWFwID0gdGhpcy5zdGlja3lNYXAoKSwgaXRlbXMgPSB0aGlzLml0ZW1zKCksIGlzVmVydGljYWwgPSB0aGlzLl9pc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgb3B0czogSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SVZpcnR1YWxMaXN0SXRlbSwgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbj4gPSB7XHJcbiAgICAgICAgICAgIGJvdW5kczogeyB3aWR0aCwgaGVpZ2h0IH0sIGNvbGxlY3Rpb246IGl0ZW1zLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbDogdGhpcy5faXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zT2Zmc2V0OiB0aGlzLml0ZW1zT2Zmc2V0KCksIHNjcm9sbFNpemU6IGlzVmVydGljYWwgPyBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0LFxyXG4gICAgICAgICAgICBzbmFwOiB0aGlzLnNuYXAoKSwgZnJvbUl0ZW1JZDogaWQsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2Nyb2xsU2l6ZSA9IHRoaXMuX3RyYWNrQm94LmdldEl0ZW1Qb3NpdGlvbihpZCwgc3RpY2t5TWFwLCBvcHRzKSxcclxuICAgICAgICAgIHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0geyBbaXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IHNjcm9sbFNpemUsIGJlaGF2aW9yIH07XHJcblxyXG4gICAgICAgIHRoaXMuX3Njcm9sbFNpemUuc2V0KHNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCBoYW5kbGVyKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgeyBkaXNwbGF5SXRlbXMsIHRvdGFsU2l6ZSB9ID0gdGhpcy5fdHJhY2tCb3gudXBkYXRlQ29sbGVjdGlvbihpdGVtcywgc3RpY2t5TWFwLCB7XHJcbiAgICAgICAgICAgICAgICAuLi5vcHRzLCBzY3JvbGxTaXplLCBmcm9tSXRlbUlkOiBpZCxcclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5yZXNldEJvdW5kc1NpemUoaXNWZXJ0aWNhbCwgdG90YWxTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgdGhpcy5jcmVhdGVEaXNwbGF5Q29tcG9uZW50c0lmTmVlZChkaXNwbGF5SXRlbXMpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnRyYWNraW5nKCk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnN0IF9zY3JvbGxTaXplID0gdGhpcy5fdHJhY2tCb3guZ2V0SXRlbVBvc2l0aW9uKGlkLCBzdGlja3lNYXAsIHsgLi4ub3B0cywgc2Nyb2xsU2l6ZSwgZnJvbUl0ZW1JZDogaWQgfSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChzY3JvbGxTaXplIDwgX3Njcm9sbFNpemUgJiYgaXRlcmF0aW9uIDwgTUFYX1NDUk9MTF9UT19JVEVSQVRJT05TKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0V4ZWN1dG9yKGlkLCBCRUhBVklPUl9JTlNUQU5ULCBpdGVyYXRpb24gKyAxKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTaXplLnNldChzY3JvbGxTaXplKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBpbmRleCA9IGl0ZW1zLmZpbmRJbmRleChpdGVtID0+IGl0ZW0uaWQgPT09IGlkKSwgc2Nyb2xsU2l6ZSA9IGluZGV4ICogdGhpcy5pdGVtU2l6ZSgpO1xyXG4gICAgICAgIGNvbnN0IHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0geyBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IHNjcm9sbFNpemUsIGJlaGF2aW9yIH07XHJcbiAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNjcm9sbFRvRW5kKGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciA9IEJFSEFWSU9SX0lOU1RBTlQpIHtcclxuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5pdGVtcygpLCBsYXRJdGVtID0gaXRlbXNbaXRlbXMubGVuZ3RoID4gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiAwXTtcclxuICAgIHRoaXMuc2Nyb2xsVG8obGF0SXRlbS5pZCwgYmVoYXZpb3IpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25Db250YWluZXJTY3JvbGxIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KSxcclxuICAgICAgICBvZmZzZXRTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA6IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgpLFxyXG4gICAgICAgIGxpc3RTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyB0aGlzLl9saXN0KCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID8/IDAgOiB0aGlzLl9saXN0KCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0TGVmdCA/PyAwKTtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guZGVsdGFEaXJlY3Rpb24gPSB0aGlzLl9zY3JvbGxTaXplKCkgPj0gc2Nyb2xsU2l6ZSA/IC0xIDogdGhpcy5saWtlQUNoYXQoKSAmJiAoc2Nyb2xsU2l6ZSArIG9mZnNldFNpemUpID49IGxpc3RTaXplID8gLTEgOiAxO1xyXG5cclxuICAgICAgY29uc3QgZXZlbnQgPSBuZXcgU2Nyb2xsRXZlbnQoe1xyXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGlyZWN0aW9uLCBjb250YWluZXI6IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgICAgbGlzdDogdGhpcy5fbGlzdCgpIS5uYXRpdmVFbGVtZW50LCBkZWx0YTogdGhpcy5fdHJhY2tCb3guZGVsdGEsXHJcbiAgICAgICAgc2Nyb2xsRGVsdGE6IHRoaXMuX3RyYWNrQm94LnNjcm9sbERlbHRhLCBpc1ZlcnRpY2FsOiB0aGlzLl9pc1ZlcnRpY2FsLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMub25TY3JvbGwuZW1pdChldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbnRhaW5lclNjcm9sbEVuZEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuX3RyYWNrQm94LmRlbHRhRGlyZWN0aW9uID0gdGhpcy5saWtlQUNoYXQoKSA/IC0xIDogMTtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFNjcm9sbEV2ZW50KHtcclxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX3RyYWNrQm94LnNjcm9sbERpcmVjdGlvbiwgY29udGFpbmVyOiBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIGxpc3Q6IHRoaXMuX2xpc3QoKSEubmF0aXZlRWxlbWVudCwgZGVsdGE6IHRoaXMuX3RyYWNrQm94LmRlbHRhLFxyXG4gICAgICAgIHNjcm9sbERlbHRhOiB0aGlzLl90cmFja0JveC5zY3JvbGxEZWx0YSwgaXNWZXJ0aWNhbDogdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm9uU2Nyb2xsRW5kLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXJFbCkge1xyXG4gICAgICAvLyBmb3IgZGlyZWN0aW9uIGNhbGN1bGF0aW9uXHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uQ29udGFpbmVyU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEVuZEhhbmRsZXIpO1xyXG5cclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcblxyXG4gICAgICB0aGlzLl9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih0aGlzLl9vblJlc2l6ZUhhbmRsZXIpO1xyXG4gICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgdGhpcy5fb25SZXNpemVIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuICAgIGlmICh0aGlzLl90cmFja0JveCkge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXJFbCkge1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vblNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25Db250YWluZXJTY3JvbGxIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uQ29udGFpbmVyU2Nyb2xsRW5kSGFuZGxlcik7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVzaXplT2JzZXJ2ZXIpIHtcclxuICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci51bm9ic2VydmUoY29udGFpbmVyRWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgd2hpbGUgKHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMucG9wKCk7XHJcbiAgICAgICAgY29tcD8uZGVzdHJveSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgI2NvbnRhaW5lciBwYXJ0PVwic2Nyb2xsZXJcIiBjbGFzcz1cIm5ndmxfX2NvbnRhaW5lclwiPlxyXG4gIDx1bCAjbGlzdCBwYXJ0PVwibGlzdFwiIGNsYXNzPVwibmd2bF9fbGlzdFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAjcmVuZGVyZXJzQ29udGFpbmVyPjwvbmctY29udGFpbmVyPlxyXG4gIDwvdWw+XHJcbjwvZGl2PiJdfQ==
|
|
480
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi9uZy12aXJ0dWFsLWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUFFLFNBQVMsRUFBZ0IsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQy9FLE1BQU0sRUFBRSxNQUFNLEVBQWUsU0FBUyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsR0FFbEcsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekgsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDekYsT0FBTyxFQUNMLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxvQkFBb0IsRUFBRSxtQ0FBbUMsRUFBRSxpQkFBaUIsRUFDNUssb0JBQW9CLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQzNKLHNCQUFzQixFQUFFLGVBQWUsR0FDeEMsTUFBTSxTQUFTLENBQUM7QUFJakIsT0FBTyxFQUFhLFVBQVUsRUFB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NEZEZ0NPLHNCQUFzQjtrQkFSbEMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixLQUFLLG1CQUdBLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLFNBQVM7d0RBWWhDLGlCQUFpQjtzQkFEMUIsU0FBUzt1QkFBQyxvQkFBb0IsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LFxyXG4gIE9uRGVzdHJveSwgb3V0cHV0LCBzaWduYWwsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIHZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgVmlld0VuY2Fwc3VsYXRpb24sXHJcbiAgV3JpdGFibGVTaWduYWwsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL25nLXZpcnR1YWwtbGlzdC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgQkVIQVZJT1JfQVVUTywgQkVIQVZJT1JfSU5TVEFOVCwgQ0xBU1NfTElTVF9IT1JJWk9OVEFMLCBDTEFTU19MSVNUX1ZFUlRJQ0FMLCBERUZBVUxUX0RJUkVDVElPTiwgREVGQVVMVF9EWU5BTUlDX1NJWkUsIERFRkFVTFRfRU5BQkxFRF9CVUZGRVJfT1BUSU1JWkFUSU9OLCBERUZBVUxUX0lURU1fU0laRSxcclxuICBERUZBVUxUX0lURU1TX09GRlNFVCwgREVGQVVMVF9TTkFQLCBERUZBVUxUX1NOQVBfVE9fSVRFTSwgSEVJR0hUX1BST1BfTkFNRSwgTEVGVF9QUk9QX05BTUUsIE1BWF9TQ1JPTExfVE9fSVRFUkFUSU9OUywgUFgsIFNDUk9MTCwgU0NST0xMX0VORCwgVE9QX1BST1BfTkFNRSxcclxuICBUUkFDS19CWV9QUk9QRVJUWV9OQU1FLCBXSURUSF9QUk9QX05BTUUsXHJcbn0gZnJvbSAnLi9jb25zdCc7XHJcbmltcG9ydCB7IElTY3JvbGxFdmVudCwgSVZpcnR1YWxMaXN0Q29sbGVjdGlvbiwgSVZpcnR1YWxMaXN0SXRlbSwgSVZpcnR1YWxMaXN0U3RpY2t5TWFwIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBJZCwgSVJlY3QgfSBmcm9tICcuL3R5cGVzJztcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB9IGZyb20gJy4vbW9kZWxzL3JlbmRlci1jb2xsZWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uLCBEaXJlY3Rpb25zIH0gZnJvbSAnLi9lbnVtcyc7XHJcbmltcG9ydCB7IFNjcm9sbEV2ZW50LCBUcmFja0JveCwgZGVib3VuY2UsIGlzRGlyZWN0aW9uLCB0b2dnbGVDbGFzc05hbWUgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnMsIFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSB9IGZyb20gJy4vdXRpbHMvdHJhY2tCb3gnO1xyXG5cclxuLyoqXHJcbiAqIFZpcnR1YWwgbGlzdCBjb21wb25lbnQuXHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE3LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvbmctdmlydHVhbC1saXN0LmNvbXBvbmVudC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25nLXZpcnR1YWwtbGlzdCcsXHJcbiAgc3RhbmRhbG9uZTogZmFsc2UsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL25nLXZpcnR1YWwtbGlzdC5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdWaXJ0dWFsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgX19uZXh0SWQ6IG51bWJlciA9IDA7XHJcblxyXG4gIHByaXZhdGUgX2lkOiBudW1iZXIgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG4gIC8qKlxyXG4gICAqIFJlYWRvbmx5LiBSZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tcG9uZW50LlxyXG4gICAqL1xyXG4gIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3JlbmRlcmVyc0NvbnRhaW5lcicsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG4gIHByb3RlY3RlZCBfbGlzdENvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIF9jb250YWluZXIgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXInKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9saXN0ID0gdmlld0NoaWxkPEVsZW1lbnRSZWY8SFRNTFVMaXN0RWxlbWVudD4+KCdsaXN0Jyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEZpcmVzIHdoZW4gdGhlIGxpc3QgaGFzIGJlZW4gc2Nyb2xsZWQuXHJcbiAgICovXHJcbiAgb25TY3JvbGwgPSBvdXRwdXQ8SVNjcm9sbEV2ZW50PigpO1xyXG5cclxuICAvKipcclxuICAgKiBGaXJlcyB3aGVuIHRoZSBsaXN0IGhhcyBjb21wbGV0ZWQgc2Nyb2xsaW5nLlxyXG4gICAqL1xyXG4gIG9uU2Nyb2xsRW5kID0gb3V0cHV0PElTY3JvbGxFdmVudD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbXNPcHRpb25zID0ge1xyXG4gICAgdHJhbnNmb3JtOiAodjogSVZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5yZXNldENvbGxlY3Rpb24odiwgdGhpcy5pdGVtU2l6ZSgpKTtcclxuICAgICAgcmV0dXJuIHY7XHJcbiAgICB9LFxyXG4gIH0gYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0aW9uIG9mIGxpc3QgaXRlbXMuXHJcbiAgICovXHJcbiAgaXRlbXMgPSBpbnB1dC5yZXF1aXJlZDxJVmlydHVhbExpc3RDb2xsZWN0aW9uPih7XHJcbiAgICAuLi50aGlzLl9pdGVtc09wdGlvbnMsXHJcbiAgfSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBlbGVtZW50cyB3aWxsIHNuYXAuIERlZmF1bHQgdmFsdWUgaXMgXCJ0cnVlXCIuXHJcbiAgICovXHJcbiAgc25hcCA9IGlucHV0PGJvb2xlYW4+KERFRkFVTFRfU05BUCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERldGVybWluZXMgd2hldGhlciBzY3JvbGwgcG9zaXRpb25zIHdpbGwgYmUgc25hcHBlZCB0byB0aGUgZWxlbWVudC4gRGVmYXVsdCB2YWx1ZSBpcyBcImZhbHNlXCIuXHJcbiAgICovXHJcbiAgc25hcFRvSXRlbSA9IGlucHV0PGJvb2xlYW4+KERFRkFVTFRfU05BUF9UT19JVEVNKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW5hYmxlcyBidWZmZXIgb3B0aW1pemF0aW9uLlxyXG4gICAqIENhbiBvbmx5IGJlIHVzZWQgaWYgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gYXJlIG5vdCBhZGRlZCBvciB1cGRhdGVkLiBPdGhlcndpc2UsIGFydGlmYWN0cyBpbiB0aGUgZm9ybSBvZiB0d2l0Y2hpbmcgb2YgdGhlIHNjcm9sbCBhcmVhIGFyZSBwb3NzaWJsZS5cclxuICAgKiBXb3JrcyBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBkeW5hbWljID0gdHJ1ZVxyXG4gICAqL1xyXG4gIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24gPSBpbnB1dDxib29sZWFuPihERUZBVUxUX0VOQUJMRURfQlVGRkVSX09QVElNSVpBVElPTik7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbmRlcmluZyBlbGVtZW50IHRlbXBsYXRlLlxyXG4gICAqL1xyXG4gIGl0ZW1SZW5kZXJlciA9IGlucHV0LnJlcXVpcmVkPFRlbXBsYXRlUmVmPGFueT4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERpY3Rpb25hcnkgekluZGV4IGJ5IGlkIG9mIHRoZSBsaXN0IGVsZW1lbnQuIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IG9yIGVxdWFsIHRvIDAsXHJcbiAgICogdGhlbiBhIHNpbXBsZSBlbGVtZW50IGlzIGRpc3BsYXllZCwgaWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHRoZSBzdGlja3kgcG9zaXRpb24gbW9kZSBpcyBlbmFibGVkIGZvciB0aGUgZWxlbWVudC5cclxuICAgKi9cclxuICBzdGlja3lNYXAgPSBpbnB1dDxJVmlydHVhbExpc3RTdGlja3lNYXA+KHt9KTtcclxuXHJcbiAgcHJpdmF0ZSBfaXRlbVNpemVPcHRpb25zID0ge1xyXG4gICAgdHJhbnNmb3JtOiAodjogbnVtYmVyIHwgdW5kZWZpbmVkKSA9PiB7XHJcbiAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gREVGQVVMVF9JVEVNX1NJWkU7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdmFsID0gTnVtYmVyKHYpO1xyXG4gICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbCkgfHwgdmFsIDw9IDAgPyBERUZBVUxUX0lURU1fU0laRSA6IHZhbDtcclxuICAgIH0sXHJcbiAgfSBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIGRpcmVjdGlvbiA9ICd2ZXJ0aWNhbCcsIHRoZW4gdGhlIGhlaWdodCBvZiBhIHR5cGljYWwgZWxlbWVudC4gSWYgZGlyZWN0aW9uID0gJ2hvcml6b250YWwnLCB0aGVuIHRoZSB3aWR0aCBvZiBhIHR5cGljYWwgZWxlbWVudC5cclxuICAgKiBJZ25vcmVkIGlmIHRoZSBkeW5hbWljU2l6ZSBwcm9wZXJ0eSBpcyB0cnVlLlxyXG4gICAqL1xyXG4gIGl0ZW1TaXplID0gaW5wdXQ8bnVtYmVyPihERUZBVUxUX0lURU1fU0laRSwgeyAuLi50aGlzLl9pdGVtU2l6ZU9wdGlvbnMgfSk7XHJcblxyXG4gIC8qKlxyXG4gICAqIElmIHRydWUgdGhlbiB0aGUgaXRlbXMgaW4gdGhlIGxpc3QgY2FuIGhhdmUgZGlmZmVyZW50IHNpemVzIGFuZCB0aGUgaXRlbVNpemUgcHJvcGVydHkgaXMgaWdub3JlZC5cclxuICAgKiBJZiBmYWxzZSB0aGVuIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCBoYXZlIGEgZml4ZWQgc2l6ZSBzcGVjaWZpZWQgYnkgdGhlIGl0ZW1TaXplIHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS5cclxuICAgKi9cclxuICBkeW5hbWljU2l6ZSA9IGlucHV0KERFRkFVTFRfRFlOQU1JQ19TSVpFKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGV0ZXJtaW5lcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIGVsZW1lbnRzIGFyZSBwbGFjZWQuIERlZmF1bHQgdmFsdWUgaXMgXCJ2ZXJ0aWNhbFwiLlxyXG4gICAqL1xyXG4gIGRpcmVjdGlvbiA9IGlucHV0PERpcmVjdGlvbj4oREVGQVVMVF9ESVJFQ1RJT04pO1xyXG5cclxuICAvKipcclxuICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdmlzaWJpbGl0eS4gRGVmYXVsdCB2YWx1ZSBpcyAyLlxyXG4gICAqL1xyXG4gIGl0ZW1zT2Zmc2V0ID0gaW5wdXQ8bnVtYmVyPihERUZBVUxUX0lURU1TX09GRlNFVCk7XHJcblxyXG4gIHByaXZhdGUgX2lzVmVydGljYWwgPSB0aGlzLmdldElzVmVydGljYWwoKTtcclxuXHJcbiAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50Pj4gPSBbXTtcclxuXHJcbiAgcHJvdGVjdGVkIF9ib3VuZHMgPSBzaWduYWw8RE9NUmVjdCB8IG51bGw+KG51bGwpO1xyXG5cclxuICBwcm90ZWN0ZWQgX3Njcm9sbFNpemUgPSBzaWduYWw8bnVtYmVyPigwKTtcclxuXHJcbiAgcHJpdmF0ZSBfaXNTY3JvbGxpbmdEZWJvdW5jZXMgPSBkZWJvdW5jZSgodjogYm9vbGVhbikgPT4ge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmcgPSB2O1xyXG4gIH0sIDI1MCk7XHJcblxyXG4gIHByaXZhdGUgX2lzU2Nyb2xsaW5nID0gZmFsc2U7XHJcbiAgZ2V0IGlzU2Nyb2xsaW5nKCkgeyByZXR1cm4gdGhpcy5faXNTY3JvbGxpbmc7IH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHByaXZhdGUgX29uUmVzaXplSGFuZGxlciA9ICgpID0+IHtcclxuICAgIHRoaXMuX2JvdW5kcy5zZXQodGhpcy5fY29udGFpbmVyKCk/Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpID8/IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25TY3JvbGxIYW5kbGVyID0gKGU/OiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmdEZWJvdW5jZXMuZGlzcG9zZSgpO1xyXG5cclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKT8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29uc3QgZHluYW1pY1NpemUgPSB0aGlzLmR5bmFtaWNTaXplKCksIGRlbHRhID0gdGhpcy5fdHJhY2tCb3guZGVsdGEsIHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lci5zY3JvbGxUb3AgOiBjb250YWluZXIuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSwgaXNJbW1lZGlhdGVTY3JvbGwgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSAmJiBkZWx0YSAhPT0gMCkge1xyXG4gICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplICsgZGVsdGE7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGlzSW1tZWRpYXRlU2Nyb2xsID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNjcm9sbEltbWVkaWF0ZWx5KGNvbnRhaW5lciwgcGFyYW1zKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zY3JvbGxTaXplLnNldChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsSW1tZWRpYXRlbHkoY29udGFpbmVyOiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PiwgcGFyYW1zOiBTY3JvbGxPcHRpb25zLCBjYj86ICgpID0+IHZvaWQpIHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxJbW1lZGlhdGVseSgpO1xyXG5cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25TY3JvbGxFbmRIYW5kbGVyKTtcclxuICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuXHJcbiAgICAgICAgaWYgKGNiICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGNiKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgaGFuZGxlcik7XHJcblxyXG4gICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcblxyXG4gICAgdGhpcy5fc2Nyb2xsSW1tZWRpYXRlbHlIYW5kbGVyID0gaGFuZGxlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlcjogKCguLi5hcmdzOiBBcnJheTxhbnk+KSA9PiB2b2lkKSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJpdmF0ZSBjbGVhclNjcm9sbEltbWVkaWF0ZWx5KCkge1xyXG4gICAgaWYgKHRoaXMuX3Njcm9sbEltbWVkaWF0ZWx5SGFuZGxlciA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9zY3JvbGxJbW1lZGlhdGVseUhhbmRsZXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb25TY3JvbGxFbmRIYW5kbGVyID0gKGU6IEV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guY2xlYXJEZWx0YSgpO1xyXG4gICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhRGlyZWN0aW9uKCk7XHJcblxyXG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHRoaXMuaXRlbVNpemUoKSwgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbSgpLCBkeW5hbWljU2l6ZSA9IHRoaXMuZHluYW1pY1NpemUoKSwgZGVsdGEgPSB0aGlzLl90cmFja0JveC5kZWx0YSxcclxuICAgICAgICBzY3JvbGxTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcclxuICAgICAgbGV0IGFjdHVhbFNjcm9sbFNpemUgPSBzY3JvbGxTaXplO1xyXG4gICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSArIGRlbHRhO1xyXG4gICAgICAgIGlmIChzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMoKSxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgICAgICAgIHRhcmdldEl0ZW0gPSB0aGlzLl90cmFja0JveC5nZXROZWFyZXN0SXRlbShhY3R1YWxTY3JvbGxTaXplLCBpdGVtcywgaXRlbVNpemUsIGlzVmVydGljYWwpO1xyXG4gICAgICAgICAgaWYgKHRhcmdldEl0ZW0pIHtcclxuICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyh0YXJnZXRJdGVtLmlkLCBCRUhBVklPUl9JTlNUQU5UKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHNjcm9sbFNpemUgIT09IGFjdHVhbFNjcm9sbFNpemUpIHtcclxuICAgICAgICAgIGNvbnN0IHBhcmFtczogU2Nyb2xsVG9PcHRpb25zID0ge1xyXG4gICAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIGJlaGF2aW9yOiBCRUhBVklPUl9JTlNUQU5UXHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIHRoaXMuX3Njcm9sbFNpemUuc2V0KGFjdHVhbFNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbChwYXJhbXMpO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxJdGVtcyA9IE1hdGgucm91bmQoc2Nyb2xsU2l6ZSAvIGl0ZW1TaXplKTtcclxuICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc25hcFRvSXRlbSA/IHNjcm9sbEl0ZW1zICogaXRlbVNpemUgOiBzY3JvbGxTaXplO1xyXG5cclxuICAgICAgICBpZiAoc2Nyb2xsU2l6ZSAhPT0gYWN0dWFsU2Nyb2xsU2l6ZSkge1xyXG4gICAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgIFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogYWN0dWFsU2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgYmVoYXZpb3I6IEJFSEFWSU9SX0lOU1RBTlRcclxuICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsKHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9zY3JvbGxTaXplLnNldChhY3R1YWxTY3JvbGxTaXplKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2VsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pO1xyXG5cclxuICBwcml2YXRlIF9pbml0aWFsaXplZCE6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+O1xyXG5cclxuICByZWFkb25seSAkaW5pdGlhbGl6ZWQhOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAvKipcclxuICAgKiBEaWN0aW9uYXJ5IG9mIGVsZW1lbnQgc2l6ZXMgYnkgdGhlaXIgaWRcclxuICAgKi9cclxuICBwcml2YXRlIF90cmFja0JveCA9IG5ldyBUcmFja0JveChUUkFDS19CWV9QUk9QRVJUWV9OQU1FKTtcclxuXHJcbiAgcHJpdmF0ZSBfb25UcmFja0JveENoYW5nZUhhbmRsZXIgPSAodjogbnVtYmVyKSA9PiB7XHJcbiAgICB0aGlzLl8kY2FjaGVWZXJzaW9uLm5leHQodik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF8kY2FjaGVWZXJzaW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcclxuICBnZXQgJGNhY2hlVmVyc2lvbigpIHsgcmV0dXJuIHRoaXMuXyRjYWNoZVZlcnNpb24uYXNPYnNlcnZhYmxlKCk7IH1cclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkID0gTmdWaXJ0dWFsTGlzdENvbXBvbmVudC5fX25leHRJZCArIDEgPT09IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXHJcbiAgICAgID8gMCA6IE5nVmlydHVhbExpc3RDb21wb25lbnQuX19uZXh0SWQgKyAxO1xyXG4gICAgdGhpcy5faWQgPSBOZ1ZpcnR1YWxMaXN0Q29tcG9uZW50Ll9fbmV4dElkO1xyXG5cclxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcclxuICAgIHRoaXMuJGluaXRpYWxpemVkID0gdG9PYnNlcnZhYmxlKHRoaXMuX2luaXRpYWxpemVkKTtcclxuXHJcbiAgICB0aGlzLl90cmFja0JveC5kaXNwbGF5Q29tcG9uZW50cyA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzO1xyXG5cclxuICAgIGNvbnN0ICRib3VuZHMgPSB0b09ic2VydmFibGUodGhpcy5fYm91bmRzKS5waXBlKFxyXG4gICAgICBmaWx0ZXIoYiA9PiAhIWIpLFxyXG4gICAgKSwgJGl0ZW1zID0gdG9PYnNlcnZhYmxlKHRoaXMuaXRlbXMpLnBpcGUoXHJcbiAgICAgIG1hcChpID0+ICFpID8gW10gOiBpKSxcclxuICAgICksICRzY3JvbGxTaXplID0gdG9PYnNlcnZhYmxlKHRoaXMuX3Njcm9sbFNpemUpLFxyXG4gICAgICAkaXRlbVNpemUgPSB0b09ic2VydmFibGUodGhpcy5pdGVtU2l6ZSkucGlwZShcclxuICAgICAgICBtYXAodiA9PiB2IDw9IDAgPyBERUZBVUxUX0lURU1fU0laRSA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkaXRlbXNPZmZzZXQgPSB0b09ic2VydmFibGUodGhpcy5pdGVtc09mZnNldCkucGlwZShcclxuICAgICAgICBtYXAodiA9PiB2IDwgMCA/IERFRkFVTFRfSVRFTVNfT0ZGU0VUIDogdiksXHJcbiAgICAgICksXHJcbiAgICAgICRzdGlja3lNYXAgPSB0b09ic2VydmFibGUodGhpcy5zdGlja3lNYXApLnBpcGUoXHJcbiAgICAgICAgbWFwKHYgPT4gIXYgPyB7fSA6IHYpLFxyXG4gICAgICApLFxyXG4gICAgICAkc25hcCA9IHRvT2JzZXJ2YWJsZSh0aGlzLnNuYXApLFxyXG4gICAgICAkc25hcFRvSXRlbSA9IHRvT2JzZXJ2YWJsZSh0aGlzLnNuYXBUb0l0ZW0pLFxyXG4gICAgICAkaXNWZXJ0aWNhbCA9IHRvT2JzZXJ2YWJsZSh0aGlzLmRpcmVjdGlvbikucGlwZShcclxuICAgICAgICBtYXAodiA9PiB0aGlzLmdldElzVmVydGljYWwodiB8fCBERUZBVUxUX0RJUkVDVElPTikpLFxyXG4gICAgICApLFxyXG4gICAgICAkZHluYW1pY1NpemUgPSB0b09ic2VydmFibGUodGhpcy5keW5hbWljU2l6ZSksXHJcbiAgICAgICRlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uID0gdG9PYnNlcnZhYmxlKHRoaXMuZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbiksXHJcbiAgICAgICRjYWNoZVZlcnNpb24gPSB0aGlzLiRjYWNoZVZlcnNpb247XHJcblxyXG4gICAgJGlzVmVydGljYWwucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICB0aGlzLl9pc1ZlcnRpY2FsID0gdjtcclxuICAgICAgICBjb25zdCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgdG9nZ2xlQ2xhc3NOYW1lKGVsLCB2ID8gQ0xBU1NfTElTVF9WRVJUSUNBTCA6IENMQVNTX0xJU1RfSE9SSVpPTlRBTCwgdHJ1ZSk7XHJcbiAgICAgIH0pLFxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAkZHluYW1pY1NpemUucGlwZShcclxuICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXHJcbiAgICAgIHRhcChkeW5hbWljU2l6ZSA9PiB7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5DYWNoZUNoYW5nZXNJZk5lZWQoZHluYW1pY1NpemUpO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICBjb21iaW5lTGF0ZXN0KFt0aGlzLiRpbml0aWFsaXplZCwgJGJvdW5kcywgJGl0ZW1zLCAkc3RpY2t5TWFwLCAkc2Nyb2xsU2l6ZSwgJGl0ZW1TaXplLFxyXG4gICAgICAkaXRlbXNPZmZzZXQsICRzbmFwLCAkc25hcFRvSXRlbSwgJGlzVmVydGljYWwsICRkeW5hbWljU2l6ZSwgJGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24sICRjYWNoZVZlcnNpb24sXHJcbiAgICBdKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZmlsdGVyKChbaW5pdGlhbGl6ZWRdKSA9PiAhIWluaXRpYWxpemVkKSxcclxuICAgICAgc3dpdGNoTWFwKChbLFxyXG4gICAgICAgIGJvdW5kcywgaXRlbXMsIHN0aWNreU1hcCwgc2Nyb2xsU2l6ZSwgaXRlbVNpemUsXHJcbiAgICAgICAgaXRlbXNPZmZzZXQsIHNuYXAsIHNuYXBUb0l0ZW0sIGlzVmVydGljYWwsIGR5bmFtaWNTaXplLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uLCBjYWNoZVZlcnNpb24sXHJcbiAgICAgIF0pID0+IHtcclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcyBhcyBET01SZWN0O1xyXG4gICAgICAgIGxldCBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICBjb25zdCBvcHRzOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJVmlydHVhbExpc3RJdGVtLCBJVmlydHVhbExpc3RDb2xsZWN0aW9uPiA9IHtcclxuICAgICAgICAgIGJvdW5kczogeyB3aWR0aCwgaGVpZ2h0IH0sIGNvbGxlY3Rpb246IGl0ZW1zLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICBpdGVtc09mZnNldCwgc2Nyb2xsU2l6ZTogc2Nyb2xsU2l6ZSwgc25hcCwgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHsgZGlzcGxheUl0ZW1zLCB0b3RhbFNpemUsIGRlbHRhIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBzdGlja3lNYXAsIHtcclxuICAgICAgICAgIC4uLm9wdHMsIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzZXRCb3VuZHNTaXplKGlzVmVydGljYWwsIHRvdGFsU2l6ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY3JlYXRlRGlzcGxheUNvbXBvbmVudHNJZk5lZWQoZGlzcGxheUl0ZW1zKTtcclxuXHJcbiAgICAgICAgdGhpcy50cmFja2luZygpO1xyXG5cclxuICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLmlzU2Nyb2xsaW5nICYmIGR5bmFtaWNTaXplICYmIGNvbnRhaW5lcikge1xyXG4gICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemUgKyBkZWx0YTtcclxuICAgICAgICAgIGlmIChzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICAgIC8vIGV0Y1xyXG4gICAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIGlmIChzY3JvbGxTaXplICE9PSBhY3R1YWxTY3JvbGxTaXplKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7XHJcbiAgICAgICAgICAgICAgICBbdGhpcy5faXNWZXJ0aWNhbCA/IFRPUF9QUk9QX05BTUUgOiBMRUZUX1BST1BfTkFNRV06IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjogQkVIQVZJT1JfSU5TVEFOVFxyXG4gICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuc2Nyb2xsSW1tZWRpYXRlbHkoY29udGFpbmVyLCBwYXJhbXMpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLl90cmFja0JveC5jbGVhckRlbHRhKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvZihkaXNwbGF5SXRlbXMpO1xyXG4gICAgICB9KSxcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy4kaW5pdGlhbGl6ZWQsIHRvT2JzZXJ2YWJsZSh0aGlzLml0ZW1SZW5kZXJlcildKS5waXBlKFxyXG4gICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgZmlsdGVyKChbaW5pdGlhbGl6ZWRdKSA9PiAhIWluaXRpYWxpemVkKSxcclxuICAgICAgdGFwKChbLCBpdGVtUmVuZGVyZXJdKSA9PiB7XHJcbiAgICAgICAgdGhpcy5yZXNldFJlbmRlcmVycyhpdGVtUmVuZGVyZXIpO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9pbml0aWFsaXplZC5zZXQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RlbkNhY2hlQ2hhbmdlc0lmTmVlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIGlmICghdGhpcy5fdHJhY2tCb3guaGFzRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKSkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrQm94LmFkZEV2ZW50TGlzdGVuZXIoVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB0aGlzLl9vblRyYWNrQm94Q2hhbmdlSGFuZGxlcik7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLl90cmFja0JveC5oYXNFdmVudExpc3RlbmVyKFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSwgdGhpcy5fb25UcmFja0JveENoYW5nZUhhbmRsZXIpKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gucmVtb3ZlRXZlbnRMaXN0ZW5lcihUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX29uVHJhY2tCb3hDaGFuZ2VIYW5kbGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRJc1ZlcnRpY2FsKGQ/OiBEaXJlY3Rpb24pIHtcclxuICAgIGNvbnN0IGRpciA9IGQgfHwgdGhpcy5kaXJlY3Rpb24oKTtcclxuICAgIHJldHVybiBpc0RpcmVjdGlvbihkaXIsIERpcmVjdGlvbnMuVkVSVElDQUwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVEaXNwbGF5Q29tcG9uZW50c0lmTmVlZChkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsKSB7XHJcbiAgICBpZiAoIWRpc3BsYXlJdGVtcyB8fCAhdGhpcy5fbGlzdENvbnRhaW5lclJlZikge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5zZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKHt9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3RyYWNrQm94Lml0ZW1zID0gZGlzcGxheUl0ZW1zO1xyXG5cclxuICAgIGNvbnN0IF9saXN0Q29udGFpbmVyUmVmID0gdGhpcy5fbGlzdENvbnRhaW5lclJlZjtcclxuXHJcbiAgICB3aGlsZSAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoIDwgZGlzcGxheUl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICBpZiAoX2xpc3RDb250YWluZXJSZWYpIHtcclxuICAgICAgICBjb25zdCBjb21wID0gX2xpc3RDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50KTtcclxuICAgICAgICB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5wdXNoKGNvbXApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgbWF4TGVuZ3RoID0gZGlzcGxheUl0ZW1zLmxlbmd0aDtcclxuICAgIHdoaWxlICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGggPiBtYXhMZW5ndGgpIHtcclxuICAgICAgY29uc3QgY29tcCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLnBvcCgpO1xyXG4gICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIGNvbnN0IGlkID0gY29tcD8uaW5zdGFuY2UuaXRlbT8uaWQ7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tCb3gudW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wPy5pbnN0YW5jZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlc2V0UmVuZGVyZXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0UmVuZGVyZXJzKGl0ZW1SZW5kZXJlcj86IFRlbXBsYXRlUmVmPGFueT4pIHtcclxuICAgIGNvbnN0IGRvTWFwOiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0gPSB7fTtcclxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXTtcclxuICAgICAgaXRlbS5pbnN0YW5jZS5yZW5kZXJlciA9IGl0ZW1SZW5kZXJlciB8fCB0aGlzLml0ZW1SZW5kZXJlcigpO1xyXG4gICAgICBkb01hcFtpdGVtLmluc3RhbmNlLmlkXSA9IGk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdHJhY2tCb3guc2V0RGlzcGxheU9iamVjdEluZGV4TWFwQnlJZChkb01hcCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFja2luZyBieSBpZFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCB0cmFja2luZygpIHtcclxuICAgIHRoaXMuX3RyYWNrQm94LnRyYWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsOiBib29sZWFuLCB0b3RhbFNpemU6IG51bWJlcikge1xyXG4gICAgY29uc3QgbCA9IHRoaXMuX2xpc3QoKTtcclxuICAgIGlmIChsKSB7XHJcbiAgICAgIGwubmF0aXZlRWxlbWVudC5zdHlsZVtpc1ZlcnRpY2FsID8gSEVJR0hUX1BST1BfTkFNRSA6IFdJRFRIX1BST1BfTkFNRV0gPSBgJHt0b3RhbFNpemV9JHtQWH1gO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgYm91bmRzIG9mIGFuIGVsZW1lbnQgd2l0aCBhIGdpdmVuIGlkXHJcbiAgICovXHJcbiAgZ2V0SXRlbUJvdW5kcyhpZDogSWQpOiBJUmVjdCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdHJhY2tCb3guZ2V0SXRlbUJvdW5kcyhpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgbWV0aG9kIHNjcm9sbHMgdGhlIGxpc3QgdG8gdGhlIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBzY3JvbGxlZCBhcmVhLlxyXG4gICAqIEJlaGF2aW9yIGFjY2VwdHMgdGhlIHZhbHVlcyDigIvigItcImF1dG9cIiwgXCJpbnN0YW50XCIgYW5kIFwic21vb3RoXCIuXHJcbiAgICovXHJcbiAgc2Nyb2xsVG8oaWQ6IElkLCBiZWhhdmlvcjogU2Nyb2xsQmVoYXZpb3IgPSBCRUhBVklPUl9BVVRPKSB7XHJcbiAgICB0aGlzLnNjcm9sbFRvRXhlY3V0b3IoaWQsIGJlaGF2aW9yKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dDogYW55O1xyXG5cclxuICBwcml2YXRlIGNsZWFyU2Nyb2xsVG9SZXBlYXRFeGVjdXRpb25UaW1lb3V0KCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9FeGVjdXRvcihpZDogSWQsIGJlaGF2aW9yOiBTY3JvbGxCZWhhdmlvciwgaXRlcmF0aW9uOiBudW1iZXIgPSAwKSB7XHJcbiAgICB0aGlzLl9pc1Njcm9sbGluZyA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jbGVhclNjcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCgpO1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCk7XHJcbiAgICBpZiAoIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGR5bmFtaWNTaXplID0gdGhpcy5keW5hbWljU2l6ZSgpLCBjb250YWluZXIgPSB0aGlzLl9jb250YWluZXIoKSwgaXRlbVNpemUgPSB0aGlzLml0ZW1TaXplKCk7XHJcbiAgICBpZiAoY29udGFpbmVyKSB7XHJcbiAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vblNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSB0aGlzLl9ib3VuZHMoKSB8fCB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSxcclxuICAgICAgICAgIHN0aWNreU1hcCA9IHRoaXMuc3RpY2t5TWFwKCksIGl0ZW1zID0gdGhpcy5pdGVtcygpLCBpc1ZlcnRpY2FsID0gdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgICAgIG9wdHM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPElWaXJ0dWFsTGlzdEl0ZW0sIElWaXJ0dWFsTGlzdENvbGxlY3Rpb24+ID0ge1xyXG4gICAgICAgICAgICBib3VuZHM6IHsgd2lkdGgsIGhlaWdodCB9LCBjb2xsZWN0aW9uOiBpdGVtcywgZHluYW1pY1NpemUsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBpdGVtc09mZnNldDogdGhpcy5pdGVtc09mZnNldCgpLCBzY3JvbGxTaXplOiBpc1ZlcnRpY2FsID8gY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCxcclxuICAgICAgICAgICAgc25hcDogdGhpcy5zbmFwKCksIGZyb21JdGVtSWQ6IGlkLCBlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uOiB0aGlzLmVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb24oKSxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzY3JvbGxTaXplID0gdGhpcy5fdHJhY2tCb3guZ2V0SXRlbVBvc2l0aW9uKGlkLCBzdGlja3lNYXAsIG9wdHMpLFxyXG4gICAgICAgICAgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7IFtpc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogc2Nyb2xsU2l6ZSwgYmVoYXZpb3IgfTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2Nyb2xsU2l6ZS5zZXQoc2Nyb2xsU2l6ZSk7XHJcblxyXG4gICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcclxuICAgICAgICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIGhhbmRsZXIpO1xyXG5cclxuICAgICAgICAgICAgICBjb25zdCB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplIH0gPSB0aGlzLl90cmFja0JveC51cGRhdGVDb2xsZWN0aW9uKGl0ZW1zLCBzdGlja3lNYXAsIHtcclxuICAgICAgICAgICAgICAgIC4uLm9wdHMsIHNjcm9sbFNpemUsIGZyb21JdGVtSWQ6IGlkLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLnJlc2V0Qm91bmRzU2l6ZShpc1ZlcnRpY2FsLCB0b3RhbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICB0aGlzLmNyZWF0ZURpc3BsYXlDb21wb25lbnRzSWZOZWVkKGRpc3BsYXlJdGVtcyk7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMudHJhY2tpbmcoKTtcclxuXHJcbiAgICAgICAgICAgICAgY29uc3QgX3Njcm9sbFNpemUgPSB0aGlzLl90cmFja0JveC5nZXRJdGVtUG9zaXRpb24oaWQsIHN0aWNreU1hcCwgeyAuLi5vcHRzLCBzY3JvbGxTaXplLCBmcm9tSXRlbUlkOiBpZCB9KTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKHNjcm9sbFNpemUgPCBfc2Nyb2xsU2l6ZSAmJiBpdGVyYXRpb24gPCBNQVhfU0NST0xMX1RPX0lURVJBVElPTlMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvUmVwZWF0RXhlY3V0aW9uVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRXhlY3V0b3IoaWQsIEJFSEFWSU9SX0lOU1RBTlQsIGl0ZXJhdGlvbiArIDEpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFNpemUuc2V0KHNjcm9sbFNpemUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vblNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCBoYW5kbGVyKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNjcm9sbChwYXJhbXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pZCA9PT0gaWQpLCBzY3JvbGxTaXplID0gaW5kZXggKiB0aGlzLml0ZW1TaXplKCk7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zOiBTY3JvbGxUb09wdGlvbnMgPSB7IFt0aGlzLl9pc1ZlcnRpY2FsID8gVE9QX1BST1BfTkFNRSA6IExFRlRfUFJPUF9OQU1FXTogc2Nyb2xsU2l6ZSwgYmVoYXZpb3IgfTtcclxuICAgICAgICBjb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGwocGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2Nyb2xsVG9FbmQoYmVoYXZpb3I6IFNjcm9sbEJlaGF2aW9yID0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCksIGxhdEl0ZW0gPSBpdGVtc1tpdGVtcy5sZW5ndGggPiAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IDBdO1xyXG4gICAgdGhpcy5zY3JvbGxUbyhsYXRJdGVtLmlkLCBiZWhhdmlvcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9vbkNvbnRhaW5lclNjcm9sbEhhbmRsZXIgPSAoZTogRXZlbnQpID0+IHtcclxuICAgIHRoaXMuX2lzU2Nyb2xsaW5nID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsVG9wIDogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0KTtcclxuICAgICAgdGhpcy5fdHJhY2tCb3guZGVsdGFEaXJlY3Rpb24gPSB0aGlzLl9zY3JvbGxTaXplKCkgPiBzY3JvbGxTaXplID8gLTEgOiB0aGlzLl9zY3JvbGxTaXplKCkgPCBzY3JvbGxTaXplID8gMSA6IDA7XHJcblxyXG4gICAgICBjb25zdCBldmVudCA9IG5ldyBTY3JvbGxFdmVudCh7XHJcbiAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl90cmFja0JveC5zY3JvbGxEaXJlY3Rpb24sIGNvbnRhaW5lcjogY29udGFpbmVyRWwubmF0aXZlRWxlbWVudCxcclxuICAgICAgICBsaXN0OiB0aGlzLl9saXN0KCkhLm5hdGl2ZUVsZW1lbnQsIGRlbHRhOiB0aGlzLl90cmFja0JveC5kZWx0YSxcclxuICAgICAgICBzY3JvbGxEZWx0YTogdGhpcy5fdHJhY2tCb3guc2Nyb2xsRGVsdGEsIGlzVmVydGljYWw6IHRoaXMuX2lzVmVydGljYWwsXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5vblNjcm9sbC5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uQ29udGFpbmVyU2Nyb2xsRW5kSGFuZGxlciA9IChlOiBFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5faXNTY3JvbGxpbmdEZWJvdW5jZXMuZXhlY3V0ZShmYWxzZSk7XHJcblxyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXJFbCkge1xyXG4gICAgICBjb25zdCBzY3JvbGxTaXplID0gKHRoaXMuX2lzVmVydGljYWwgPyBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA6IGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCk7XHJcbiAgICAgIHRoaXMuX3RyYWNrQm94LmRlbHRhRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsU2l6ZSgpID4gc2Nyb2xsU2l6ZSA/IC0xIDogMDtcclxuXHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IFNjcm9sbEV2ZW50KHtcclxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuX3RyYWNrQm94LnNjcm9sbERpcmVjdGlvbiwgY29udGFpbmVyOiBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LFxyXG4gICAgICAgIGxpc3Q6IHRoaXMuX2xpc3QoKSEubmF0aXZlRWxlbWVudCwgZGVsdGE6IHRoaXMuX3RyYWNrQm94LmRlbHRhLFxyXG4gICAgICAgIHNjcm9sbERlbHRhOiB0aGlzLl90cmFja0JveC5zY3JvbGxEZWx0YSwgaXNWZXJ0aWNhbDogdGhpcy5faXNWZXJ0aWNhbCxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLm9uU2Nyb2xsRW5kLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLl9jb250YWluZXIoKTtcclxuICAgIGlmIChjb250YWluZXJFbCkge1xyXG4gICAgICAvLyBmb3IgZGlyZWN0aW9uIGNhbGN1bGF0aW9uXHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uQ29udGFpbmVyU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEVuZEhhbmRsZXIpO1xyXG5cclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTCwgdGhpcy5fb25TY3JvbGxIYW5kbGVyKTtcclxuICAgICAgY29udGFpbmVyRWwubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFNDUk9MTF9FTkQsIHRoaXMuX29uU2Nyb2xsRW5kSGFuZGxlcik7XHJcblxyXG4gICAgICB0aGlzLl9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcih0aGlzLl9vblJlc2l6ZUhhbmRsZXIpO1xyXG4gICAgICB0aGlzLl9yZXNpemVPYnNlcnZlci5vYnNlcnZlKGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuICAgICAgdGhpcy5fb25SZXNpemVIYW5kbGVyKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJTY3JvbGxUb1JlcGVhdEV4ZWN1dGlvblRpbWVvdXQoKTtcclxuICAgIGlmICh0aGlzLl90cmFja0JveCkge1xyXG4gICAgICB0aGlzLl90cmFja0JveC5kaXNwb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuX2lzU2Nyb2xsaW5nRGVib3VuY2VzKSB7XHJcbiAgICAgIHRoaXMuX2lzU2Nyb2xsaW5nRGVib3VuY2VzLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBjb250YWluZXJFbCA9IHRoaXMuX2NvbnRhaW5lcigpO1xyXG4gICAgaWYgKGNvbnRhaW5lckVsKSB7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTEwsIHRoaXMuX29uU2Nyb2xsSGFuZGxlcik7XHJcbiAgICAgIGNvbnRhaW5lckVsLm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihTQ1JPTExfRU5ELCB0aGlzLl9vblNjcm9sbEVuZEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMLCB0aGlzLl9vbkNvbnRhaW5lclNjcm9sbEhhbmRsZXIpO1xyXG4gICAgICBjb250YWluZXJFbC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoU0NST0xMX0VORCwgdGhpcy5fb25Db250YWluZXJTY3JvbGxFbmRIYW5kbGVyKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLl9yZXNpemVPYnNlcnZlcikge1xyXG4gICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShjb250YWluZXJFbC5uYXRpdmVFbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICB3aGlsZSAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNvbXAgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5wb3AoKTtcclxuICAgICAgICBjb21wPy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiAjY29udGFpbmVyIHBhcnQ9XCJzY3JvbGxlclwiIGNsYXNzPVwibmd2bF9fY29udGFpbmVyXCI+XHJcbiAgPHVsICNsaXN0IHBhcnQ9XCJsaXN0XCIgY2xhc3M9XCJuZ3ZsX19saXN0XCI+XHJcbiAgICA8bmctY29udGFpbmVyICNyZW5kZXJlcnNDb250YWluZXI+PC9uZy1jb250YWluZXI+XHJcbiAgPC91bD5cclxuPC9kaXY+Il19
|