ng-virtual-list 20.4.1 → 20.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ng-virtual-list.mjs +202 -193
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/index.d.ts +201 -451
- package/package.json +1 -1
- package/esm2020/lib/components/ng-virtual-list-item.component.mjs +0 -131
- package/esm2020/lib/const/index.mjs +0 -44
- package/esm2020/lib/enums/direction.mjs +0 -2
- package/esm2020/lib/enums/directions.mjs +0 -18
- package/esm2020/lib/enums/index.mjs +0 -4
- package/esm2020/lib/enums/snapping-method.mjs +0 -2
- package/esm2020/lib/enums/snapping-methods.mjs +0 -18
- package/esm2020/lib/models/base-virtual-list-item-component.mjs +0 -9
- package/esm2020/lib/models/collection.model.mjs +0 -3
- package/esm2020/lib/models/component.model.mjs +0 -2
- package/esm2020/lib/models/index.mjs +0 -3
- package/esm2020/lib/models/item.model.mjs +0 -2
- package/esm2020/lib/models/render-collection.model.mjs +0 -3
- package/esm2020/lib/models/render-item-config.model.mjs +0 -2
- package/esm2020/lib/models/render-item.model.mjs +0 -3
- package/esm2020/lib/models/scroll-direction.model.mjs +0 -2
- package/esm2020/lib/models/scroll-event.model.mjs +0 -2
- package/esm2020/lib/models/sticky-map.model.mjs +0 -2
- package/esm2020/lib/ng-virtual-list.component.mjs +0 -677
- package/esm2020/lib/ng-virtual-list.module.mjs +0 -20
- package/esm2020/lib/types/id.mjs +0 -2
- package/esm2020/lib/types/index.mjs +0 -2
- package/esm2020/lib/types/rect.mjs +0 -2
- package/esm2020/lib/types/size.mjs +0 -2
- package/esm2020/lib/utils/browser.mjs +0 -3
- package/esm2020/lib/utils/buffer-interpolation.mjs +0 -27
- package/esm2020/lib/utils/cacheMap.mjs +0 -167
- package/esm2020/lib/utils/debounce.mjs +0 -31
- package/esm2020/lib/utils/disposableComponent.mjs +0 -29
- package/esm2020/lib/utils/eventEmitter.mjs +0 -106
- package/esm2020/lib/utils/index.mjs +0 -9
- package/esm2020/lib/utils/isDirection.mjs +0 -15
- package/esm2020/lib/utils/scrollEvent.mjs +0 -42
- package/esm2020/lib/utils/snapping-method.mjs +0 -9
- package/esm2020/lib/utils/toggleClassName.mjs +0 -15
- package/esm2020/lib/utils/trackBox.mjs +0 -745
- package/esm2020/lib/utils/tracker.mjs +0 -134
- package/esm2020/ng-virtual-list.mjs +0 -5
- package/esm2020/public-api.mjs +0 -10
- package/esm2022/lib/components/ng-virtual-list-item.component.mjs +0 -136
- package/esm2022/lib/const/index.mjs +0 -44
- package/esm2022/lib/enums/direction.mjs +0 -2
- package/esm2022/lib/enums/directions.mjs +0 -18
- package/esm2022/lib/enums/index.mjs +0 -4
- package/esm2022/lib/enums/snapping-method.mjs +0 -2
- package/esm2022/lib/enums/snapping-methods.mjs +0 -18
- package/esm2022/lib/models/base-virtual-list-item-component.mjs +0 -9
- package/esm2022/lib/models/collection.model.mjs +0 -3
- package/esm2022/lib/models/component.model.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -3
- package/esm2022/lib/models/item.model.mjs +0 -2
- package/esm2022/lib/models/render-collection.model.mjs +0 -3
- package/esm2022/lib/models/render-item-config.model.mjs +0 -2
- package/esm2022/lib/models/render-item.model.mjs +0 -3
- package/esm2022/lib/models/scroll-direction.model.mjs +0 -2
- package/esm2022/lib/models/scroll-event.model.mjs +0 -2
- package/esm2022/lib/models/sticky-map.model.mjs +0 -2
- package/esm2022/lib/ng-virtual-list.component.mjs +0 -685
- package/esm2022/lib/ng-virtual-list.module.mjs +0 -20
- package/esm2022/lib/types/id.mjs +0 -2
- package/esm2022/lib/types/index.mjs +0 -2
- package/esm2022/lib/types/rect.mjs +0 -2
- package/esm2022/lib/types/size.mjs +0 -2
- package/esm2022/lib/utils/browser.mjs +0 -3
- package/esm2022/lib/utils/buffer-interpolation.mjs +0 -27
- package/esm2022/lib/utils/cacheMap.mjs +0 -168
- package/esm2022/lib/utils/debounce.mjs +0 -31
- package/esm2022/lib/utils/eventEmitter.mjs +0 -105
- package/esm2022/lib/utils/index.mjs +0 -9
- package/esm2022/lib/utils/isDirection.mjs +0 -15
- package/esm2022/lib/utils/scrollEvent.mjs +0 -42
- package/esm2022/lib/utils/snapping-method.mjs +0 -9
- package/esm2022/lib/utils/toggleClassName.mjs +0 -15
- package/esm2022/lib/utils/trackBox.mjs +0 -751
- package/esm2022/lib/utils/tracker.mjs +0 -135
- package/esm2022/ng-virtual-list.mjs +0 -5
- package/esm2022/public-api.mjs +0 -10
- package/fesm2015/ng-virtual-list.mjs +0 -2216
- package/fesm2015/ng-virtual-list.mjs.map +0 -1
- package/fesm2020/ng-virtual-list.mjs +0 -2221
- package/fesm2020/ng-virtual-list.mjs.map +0 -1
- package/lib/components/ng-virtual-list-item.component.d.ts +0 -35
- package/lib/const/index.d.ts +0 -42
- package/lib/enums/direction.d.ts +0 -8
- package/lib/enums/directions.d.ts +0 -16
- package/lib/enums/index.d.ts +0 -7
- package/lib/enums/snapping-method.d.ts +0 -10
- package/lib/enums/snapping-methods.d.ts +0 -16
- package/lib/models/base-virtual-list-item-component.d.ts +0 -25
- package/lib/models/collection.model.d.ts +0 -9
- package/lib/models/component.model.d.ts +0 -3
- package/lib/models/index.d.ts +0 -9
- package/lib/models/item.model.d.ts +0 -14
- package/lib/models/render-collection.model.d.ts +0 -9
- package/lib/models/render-item-config.model.d.ts +0 -41
- package/lib/models/render-item.model.d.ts +0 -33
- package/lib/models/scroll-direction.model.d.ts +0 -5
- package/lib/models/scroll-event.model.d.ts +0 -50
- package/lib/models/sticky-map.model.d.ts +0 -14
- package/lib/ng-virtual-list.component.d.ts +0 -208
- package/lib/ng-virtual-list.module.d.ts +0 -9
- package/lib/types/id.d.ts +0 -7
- package/lib/types/index.d.ts +0 -4
- package/lib/types/rect.d.ts +0 -17
- package/lib/types/size.d.ts +0 -16
- package/lib/utils/browser.d.ts +0 -2
- package/lib/utils/buffer-interpolation.d.ts +0 -5
- package/lib/utils/cacheMap.d.ts +0 -60
- package/lib/utils/debounce.d.ts +0 -16
- package/lib/utils/disposableComponent.d.ts +0 -15
- package/lib/utils/eventEmitter.d.ts +0 -40
- package/lib/utils/index.d.ts +0 -9
- package/lib/utils/isDirection.d.ts +0 -8
- package/lib/utils/scrollEvent.d.ts +0 -39
- package/lib/utils/snapping-method.d.ts +0 -3
- package/lib/utils/toggleClassName.d.ts +0 -7
- package/lib/utils/trackBox.d.ts +0 -204
- package/lib/utils/tracker.d.ts +0 -46
- package/public-api.d.ts +0 -6
|
@@ -1,745 +0,0 @@
|
|
|
1
|
-
import { CacheMap } from "./cacheMap";
|
|
2
|
-
import { Tracker } from "./tracker";
|
|
3
|
-
import { HEIGHT_PROP_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME } from "../const";
|
|
4
|
-
import { bufferInterpolation } from "./buffer-interpolation";
|
|
5
|
-
export const TRACK_BOX_CHANGE_EVENT_NAME = 'change';
|
|
6
|
-
export var ItemDisplayMethods;
|
|
7
|
-
(function (ItemDisplayMethods) {
|
|
8
|
-
ItemDisplayMethods[ItemDisplayMethods["CREATE"] = 0] = "CREATE";
|
|
9
|
-
ItemDisplayMethods[ItemDisplayMethods["UPDATE"] = 1] = "UPDATE";
|
|
10
|
-
ItemDisplayMethods[ItemDisplayMethods["DELETE"] = 2] = "DELETE";
|
|
11
|
-
ItemDisplayMethods[ItemDisplayMethods["NOT_CHANGED"] = 3] = "NOT_CHANGED";
|
|
12
|
-
})(ItemDisplayMethods || (ItemDisplayMethods = {}));
|
|
13
|
-
const DEFAULT_BUFFER_EXTREMUM_THRESHOLD = 15, DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH = 30, DEFAULT_RESET_BUFFER_SIZE_TIMEOUT = 10000;
|
|
14
|
-
/**
|
|
15
|
-
* An object that performs tracking, calculations and caching.
|
|
16
|
-
* @link https://github.com/DjonnyX/ng-virtual-list/blob/15.x/projects/ng-virtual-list/src/lib/utils/trackBox.ts
|
|
17
|
-
* @author Evgenii Grebennikov
|
|
18
|
-
* @email djonnyx@gmail.com
|
|
19
|
-
*/
|
|
20
|
-
export class TrackBox extends CacheMap {
|
|
21
|
-
set items(v) {
|
|
22
|
-
if (this._items === v) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
this._items = v;
|
|
26
|
-
}
|
|
27
|
-
set displayComponents(v) {
|
|
28
|
-
if (this._displayComponents === v) {
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
this._displayComponents = v;
|
|
32
|
-
}
|
|
33
|
-
set snapedDisplayComponent(v) {
|
|
34
|
-
if (this._snapedDisplayComponent === v) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
this._snapedDisplayComponent = v;
|
|
38
|
-
}
|
|
39
|
-
set isSnappingMethodAdvanced(v) {
|
|
40
|
-
if (this._isSnappingMethodAdvanced === v) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
this._isSnappingMethodAdvanced = v;
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Set the trackBy property
|
|
47
|
-
*/
|
|
48
|
-
set trackingPropertyName(v) {
|
|
49
|
-
this._tracker.trackingPropertyName = v;
|
|
50
|
-
}
|
|
51
|
-
constructor(trackingPropertyName) {
|
|
52
|
-
super();
|
|
53
|
-
this._isSnappingMethodAdvanced = false;
|
|
54
|
-
this._deletedItemsMap = {};
|
|
55
|
-
this._crudDetected = false;
|
|
56
|
-
this._previousTotalSize = 0;
|
|
57
|
-
this._scrollDelta = 0;
|
|
58
|
-
this.isAdaptiveBuffer = true;
|
|
59
|
-
this._bufferSequenceExtraThreshold = DEFAULT_BUFFER_EXTREMUM_THRESHOLD;
|
|
60
|
-
this._maxBufferSequenceLength = DEFAULT_MAX_BUFFER_SEQUENCE_LENGTH;
|
|
61
|
-
this._bufferSizeSequence = [];
|
|
62
|
-
this._bufferSize = 0;
|
|
63
|
-
this._defaultBufferSize = 0;
|
|
64
|
-
this._maxBufferSize = this._defaultBufferSize;
|
|
65
|
-
this._resetBufferSizeTimeout = DEFAULT_RESET_BUFFER_SIZE_TIMEOUT;
|
|
66
|
-
this._previousScrollSize = 0;
|
|
67
|
-
this._tracker = new Tracker(trackingPropertyName);
|
|
68
|
-
}
|
|
69
|
-
set(id, bounds) {
|
|
70
|
-
if (this._map.has(id)) {
|
|
71
|
-
const b = this._map.get(id);
|
|
72
|
-
if (b?.width === bounds.width && b.height === bounds.height) {
|
|
73
|
-
return this._map;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
const v = this._map.set(id, bounds);
|
|
77
|
-
this.bumpVersion();
|
|
78
|
-
return v;
|
|
79
|
-
}
|
|
80
|
-
get crudDetected() { return this._crudDetected; }
|
|
81
|
-
fireChangeIfNeed() {
|
|
82
|
-
if (this.changesDetected()) {
|
|
83
|
-
this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, this._version);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
get scrollDelta() { return this._scrollDelta; }
|
|
87
|
-
get bufferSize() { return this._bufferSize; }
|
|
88
|
-
lifeCircle() {
|
|
89
|
-
this.fireChangeIfNeed();
|
|
90
|
-
this.lifeCircleDo();
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Scans the collection for deleted items and flushes the deleted item cache.
|
|
94
|
-
*/
|
|
95
|
-
resetCollection(currentCollection, itemSize) {
|
|
96
|
-
if (currentCollection !== undefined && currentCollection !== null && currentCollection === this._previousCollection) {
|
|
97
|
-
console.warn('Attention! The collection must be immutable.');
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
this.updateCache(this._previousCollection, currentCollection, itemSize);
|
|
101
|
-
this._previousCollection = currentCollection;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Update the cache of items from the list
|
|
105
|
-
*/
|
|
106
|
-
updateCache(previousCollection, currentCollection, itemSize) {
|
|
107
|
-
let crudDetected = false;
|
|
108
|
-
if (!currentCollection || currentCollection.length === 0) {
|
|
109
|
-
if (previousCollection) {
|
|
110
|
-
// deleted
|
|
111
|
-
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
112
|
-
const item = previousCollection[i], id = item.id;
|
|
113
|
-
crudDetected = true;
|
|
114
|
-
if (this._map.has(id)) {
|
|
115
|
-
this._map.delete(id);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
if (!previousCollection || previousCollection.length === 0) {
|
|
122
|
-
if (currentCollection) {
|
|
123
|
-
// added
|
|
124
|
-
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
125
|
-
crudDetected = true;
|
|
126
|
-
const item = currentCollection[i], id = item.id;
|
|
127
|
-
this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
return;
|
|
131
|
-
}
|
|
132
|
-
const collectionDict = {};
|
|
133
|
-
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
134
|
-
const item = currentCollection[i];
|
|
135
|
-
if (item) {
|
|
136
|
-
collectionDict[item.id] = item;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
const notChangedMap = {}, deletedMap = {}, deletedItemsMap = {}, updatedMap = {};
|
|
140
|
-
for (let i = 0, l = previousCollection.length; i < l; i++) {
|
|
141
|
-
const item = previousCollection[i], id = item.id;
|
|
142
|
-
if (item) {
|
|
143
|
-
if (collectionDict.hasOwnProperty(id)) {
|
|
144
|
-
if (item === collectionDict[id]) {
|
|
145
|
-
// not changed
|
|
146
|
-
notChangedMap[item.id] = item;
|
|
147
|
-
this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.NOT_CHANGED });
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
|
-
else {
|
|
151
|
-
// updated
|
|
152
|
-
crudDetected = true;
|
|
153
|
-
updatedMap[item.id] = item;
|
|
154
|
-
this._map.set(id, { ...(this._map.get(id) || { width: itemSize, height: itemSize }), method: ItemDisplayMethods.UPDATE });
|
|
155
|
-
continue;
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
// deleted
|
|
159
|
-
crudDetected = true;
|
|
160
|
-
deletedMap[item.id] = item;
|
|
161
|
-
deletedItemsMap[i] = this._map.get(item.id);
|
|
162
|
-
this._map.delete(id);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
for (let i = 0, l = currentCollection.length; i < l; i++) {
|
|
166
|
-
const item = currentCollection[i], id = item.id;
|
|
167
|
-
if (item && !deletedMap.hasOwnProperty(id) && !updatedMap.hasOwnProperty(id) && !notChangedMap.hasOwnProperty(id)) {
|
|
168
|
-
// added
|
|
169
|
-
crudDetected = true;
|
|
170
|
-
this._map.set(id, { width: itemSize, height: itemSize, method: ItemDisplayMethods.CREATE });
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
this._crudDetected = crudDetected;
|
|
174
|
-
this._deletedItemsMap = deletedItemsMap;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Finds the position of a collection element by the given Id
|
|
178
|
-
*/
|
|
179
|
-
getItemPosition(id, stickyMap, options) {
|
|
180
|
-
const opt = { fromItemId: id, stickyMap, ...options };
|
|
181
|
-
this._defaultBufferSize = opt.bufferSize;
|
|
182
|
-
this._maxBufferSize = opt.maxBufferSize;
|
|
183
|
-
const { scrollSize, isFromItemIdFound } = this.recalculateMetrics({
|
|
184
|
-
...opt,
|
|
185
|
-
dynamicSize: this._crudDetected || opt.dynamicSize,
|
|
186
|
-
previousTotalSize: this._previousTotalSize,
|
|
187
|
-
crudDetected: this._crudDetected,
|
|
188
|
-
deletedItemsMap: this._deletedItemsMap,
|
|
189
|
-
});
|
|
190
|
-
return isFromItemIdFound ? scrollSize : -1;
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Updates the collection of display objects
|
|
194
|
-
*/
|
|
195
|
-
updateCollection(items, stickyMap, options) {
|
|
196
|
-
const opt = { stickyMap, ...options }, crudDetected = this._crudDetected, deletedItemsMap = this._deletedItemsMap;
|
|
197
|
-
if (opt.dynamicSize) {
|
|
198
|
-
this.cacheElements();
|
|
199
|
-
}
|
|
200
|
-
this._defaultBufferSize = opt.bufferSize;
|
|
201
|
-
this._maxBufferSize = opt.maxBufferSize;
|
|
202
|
-
const metrics = this.recalculateMetrics({
|
|
203
|
-
...opt,
|
|
204
|
-
collection: items,
|
|
205
|
-
previousTotalSize: this._previousTotalSize,
|
|
206
|
-
crudDetected: this._crudDetected,
|
|
207
|
-
deletedItemsMap,
|
|
208
|
-
});
|
|
209
|
-
this._delta += metrics.delta;
|
|
210
|
-
this.updateAdaptiveBufferParams(metrics, items.length);
|
|
211
|
-
this._previousTotalSize = metrics.totalSize;
|
|
212
|
-
this._deletedItemsMap = {};
|
|
213
|
-
this._crudDetected = false;
|
|
214
|
-
if (opt.dynamicSize) {
|
|
215
|
-
this.snapshot();
|
|
216
|
-
}
|
|
217
|
-
const displayItems = this.generateDisplayCollection(items, stickyMap, { ...metrics, });
|
|
218
|
-
return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta, crudDetected };
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Finds the closest element in the collection by scrollSize
|
|
222
|
-
*/
|
|
223
|
-
getNearestItem(scrollSize, items, itemSize, isVertical) {
|
|
224
|
-
return this.getElementFromStart(scrollSize, items, this._map, itemSize, isVertical);
|
|
225
|
-
}
|
|
226
|
-
updateAdaptiveBufferParams(metrics, totalItemsLength) {
|
|
227
|
-
this.disposeClearBufferSizeTimer();
|
|
228
|
-
const scrollSize = metrics.scrollSize + this._delta, delta = Math.abs(this._previousScrollSize - scrollSize);
|
|
229
|
-
this._previousScrollSize = scrollSize;
|
|
230
|
-
const bufferRawSize = Math.min(Math.floor(delta / metrics.typicalItemSize) * 5, totalItemsLength), minBufferSize = bufferRawSize < this._defaultBufferSize ? this._defaultBufferSize : bufferRawSize, bufferValue = minBufferSize > this._maxBufferSize ? this._maxBufferSize : minBufferSize;
|
|
231
|
-
this._bufferSize = bufferInterpolation(this._bufferSize, this._bufferSizeSequence, bufferValue, {
|
|
232
|
-
extremumThreshold: this._bufferSequenceExtraThreshold,
|
|
233
|
-
bufferSize: this._maxBufferSequenceLength,
|
|
234
|
-
});
|
|
235
|
-
this.startResetBufferSizeTimer();
|
|
236
|
-
}
|
|
237
|
-
startResetBufferSizeTimer() {
|
|
238
|
-
this._resetBufferSizeTimer = setTimeout(() => {
|
|
239
|
-
this._bufferSize = this._defaultBufferSize;
|
|
240
|
-
this._bufferSizeSequence = [];
|
|
241
|
-
}, this._resetBufferSizeTimeout);
|
|
242
|
-
}
|
|
243
|
-
disposeClearBufferSizeTimer() {
|
|
244
|
-
clearTimeout(this._resetBufferSizeTimer);
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Calculates the position of an element based on the given scrollSize
|
|
248
|
-
*/
|
|
249
|
-
getElementFromStart(scrollSize, collection, map, typicalItemSize, isVertical) {
|
|
250
|
-
const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;
|
|
251
|
-
let offset = 0;
|
|
252
|
-
for (let i = 0, l = collection.length; i < l; i++) {
|
|
253
|
-
const item = collection[i];
|
|
254
|
-
let itemSize = 0;
|
|
255
|
-
if (map.has(item.id)) {
|
|
256
|
-
const bounds = map.get(item.id);
|
|
257
|
-
itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;
|
|
258
|
-
}
|
|
259
|
-
else {
|
|
260
|
-
itemSize = typicalItemSize;
|
|
261
|
-
}
|
|
262
|
-
if (offset > scrollSize) {
|
|
263
|
-
return item;
|
|
264
|
-
}
|
|
265
|
-
offset += itemSize;
|
|
266
|
-
}
|
|
267
|
-
return undefined;
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* Calculates the entry into the overscroll area and returns the number of overscroll elements
|
|
271
|
-
*/
|
|
272
|
-
getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical, indexOffset = 0) {
|
|
273
|
-
const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME;
|
|
274
|
-
let offset = 0, num = 0;
|
|
275
|
-
for (let j = collection.length - indexOffset - 1; j >= i; j--) {
|
|
276
|
-
const item = collection[j];
|
|
277
|
-
let itemSize = 0;
|
|
278
|
-
if (map.has(item.id)) {
|
|
279
|
-
const bounds = map.get(item.id);
|
|
280
|
-
itemSize = bounds ? bounds[sizeProperty] : typicalItemSize;
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
itemSize = typicalItemSize;
|
|
284
|
-
}
|
|
285
|
-
offset += itemSize;
|
|
286
|
-
num++;
|
|
287
|
-
if (offset > size) {
|
|
288
|
-
return { num: 0, offset };
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
return { num, offset };
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Calculates list metrics
|
|
295
|
-
*/
|
|
296
|
-
recalculateMetrics(options) {
|
|
297
|
-
const { fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, bufferSize: minBufferSize, scrollSize, snap, stickyMap, enabledBufferOptimization, previousTotalSize, crudDetected, deletedItemsMap } = options;
|
|
298
|
-
const bufferSize = Math.max(minBufferSize, this._bufferSize), { width, height } = bounds, sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, size = isVertical ? height : width, totalLength = collection.length, typicalItemSize = itemSize, w = isVertical ? width : typicalItemSize, h = isVertical ? typicalItemSize : height, map = this._map, snapshot = this._snapshot, checkOverscrollItemsLimit = Math.ceil(size / typicalItemSize), snippedPos = Math.floor(scrollSize), leftItemsWeights = [], isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)
|
|
299
|
-
|| (typeof fromItemId === 'string' && fromItemId > '-1');
|
|
300
|
-
let leftItemsOffset = 0, rightItemsOffset = 0;
|
|
301
|
-
if (enabledBufferOptimization) {
|
|
302
|
-
switch (this.scrollDirection) {
|
|
303
|
-
case 1: {
|
|
304
|
-
leftItemsOffset = 0;
|
|
305
|
-
rightItemsOffset = bufferSize;
|
|
306
|
-
break;
|
|
307
|
-
}
|
|
308
|
-
case -1: {
|
|
309
|
-
leftItemsOffset = bufferSize;
|
|
310
|
-
rightItemsOffset = 0;
|
|
311
|
-
break;
|
|
312
|
-
}
|
|
313
|
-
case 0:
|
|
314
|
-
default: {
|
|
315
|
-
leftItemsOffset = rightItemsOffset = bufferSize;
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
leftItemsOffset = rightItemsOffset = bufferSize;
|
|
321
|
-
}
|
|
322
|
-
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, leftSizeOfAddedItems = 0, leftSizeOfUpdatedItems = 0, leftSizeOfDeletedItems = 0, itemById = undefined, itemByIdPos = 0, targetDisplayItemIndex = -1, isTargetInOverscroll = false, actualScrollSize = itemByIdPos, totalSize = 0, startIndex, isFromItemIdFound = false;
|
|
323
|
-
// If the list is dynamic or there are new elements in the collection, then it switches to the long algorithm.
|
|
324
|
-
if (dynamicSize) {
|
|
325
|
-
let y = 0, stickyCollectionItem = undefined, stickyComponentSize = 0;
|
|
326
|
-
for (let i = 0, l = collection.length; i < l; i++) {
|
|
327
|
-
const ii = i + 1, collectionItem = collection[i], id = collectionItem.id;
|
|
328
|
-
let componentSize = 0, componentSizeDelta = 0, itemDisplayMethod = ItemDisplayMethods.NOT_CHANGED;
|
|
329
|
-
if (map.has(id)) {
|
|
330
|
-
const bounds = map.get(id) || { width: typicalItemSize, height: typicalItemSize };
|
|
331
|
-
componentSize = bounds[sizeProperty];
|
|
332
|
-
itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;
|
|
333
|
-
switch (itemDisplayMethod) {
|
|
334
|
-
case ItemDisplayMethods.UPDATE: {
|
|
335
|
-
const snapshotBounds = snapshot.get(id);
|
|
336
|
-
const componentSnapshotSize = componentSize - (snapshotBounds ? snapshotBounds[sizeProperty] : typicalItemSize);
|
|
337
|
-
componentSizeDelta = componentSnapshotSize;
|
|
338
|
-
map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
case ItemDisplayMethods.CREATE: {
|
|
342
|
-
componentSizeDelta = typicalItemSize;
|
|
343
|
-
map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });
|
|
344
|
-
break;
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
if (deletedItemsMap.hasOwnProperty(i)) {
|
|
349
|
-
const bounds = deletedItemsMap[i], size = bounds?.[sizeProperty] ?? typicalItemSize;
|
|
350
|
-
if (y < scrollSize - size) {
|
|
351
|
-
leftSizeOfDeletedItems += size;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
totalSize += componentSize;
|
|
355
|
-
if (isFromId) {
|
|
356
|
-
if (itemById === undefined) {
|
|
357
|
-
if (id !== fromItemId && stickyMap && stickyMap[id] === 1) {
|
|
358
|
-
stickyComponentSize = componentSize;
|
|
359
|
-
stickyCollectionItem = collectionItem;
|
|
360
|
-
}
|
|
361
|
-
if (id === fromItemId) {
|
|
362
|
-
isFromItemIdFound = true;
|
|
363
|
-
targetDisplayItemIndex = i;
|
|
364
|
-
if (stickyCollectionItem && stickyMap) {
|
|
365
|
-
const { num } = this.getElementNumToEnd(i, collection, map, typicalItemSize, size, isVertical);
|
|
366
|
-
if (num > 0) {
|
|
367
|
-
isTargetInOverscroll = true;
|
|
368
|
-
y -= size - componentSize;
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
if (stickyMap && !stickyMap[collectionItem.id] && y >= scrollSize && y < scrollSize + stickyComponentSize) {
|
|
372
|
-
const snappedY = scrollSize - stickyComponentSize;
|
|
373
|
-
leftHiddenItemsWeight -= (snappedY - y);
|
|
374
|
-
y = snappedY;
|
|
375
|
-
}
|
|
376
|
-
else {
|
|
377
|
-
y -= stickyComponentSize;
|
|
378
|
-
leftHiddenItemsWeight -= stickyComponentSize;
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
itemById = collectionItem;
|
|
383
|
-
itemByIdPos = y;
|
|
384
|
-
}
|
|
385
|
-
else {
|
|
386
|
-
leftItemsWeights.push(componentSize);
|
|
387
|
-
leftHiddenItemsWeight += componentSize;
|
|
388
|
-
itemsFromStartToScrollEnd = ii;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
else if (y <= scrollSize - componentSize) {
|
|
393
|
-
leftItemsWeights.push(componentSize);
|
|
394
|
-
leftHiddenItemsWeight += componentSize;
|
|
395
|
-
itemsFromStartToScrollEnd = ii;
|
|
396
|
-
}
|
|
397
|
-
if (isFromId) {
|
|
398
|
-
if (itemById === undefined || y < itemByIdPos + size + componentSize) {
|
|
399
|
-
itemsFromStartToDisplayEnd = ii;
|
|
400
|
-
totalItemsToDisplayEndWeight += componentSize;
|
|
401
|
-
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
else if (y <= scrollSize + size + componentSize) {
|
|
405
|
-
itemsFromStartToDisplayEnd = ii;
|
|
406
|
-
totalItemsToDisplayEndWeight += componentSize;
|
|
407
|
-
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + rightItemsOffset;
|
|
408
|
-
if (y <= scrollSize - componentSize) {
|
|
409
|
-
switch (itemDisplayMethod) {
|
|
410
|
-
case ItemDisplayMethods.CREATE: {
|
|
411
|
-
leftSizeOfAddedItems += componentSizeDelta;
|
|
412
|
-
break;
|
|
413
|
-
}
|
|
414
|
-
case ItemDisplayMethods.UPDATE: {
|
|
415
|
-
leftSizeOfUpdatedItems += componentSizeDelta;
|
|
416
|
-
break;
|
|
417
|
-
}
|
|
418
|
-
case ItemDisplayMethods.DELETE: {
|
|
419
|
-
leftSizeOfDeletedItems += componentSizeDelta;
|
|
420
|
-
break;
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
if (i < itemsFromDisplayEndToOffsetEnd) {
|
|
427
|
-
rightItemsWeight += componentSize;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
y += componentSize;
|
|
431
|
-
}
|
|
432
|
-
if (isTargetInOverscroll) {
|
|
433
|
-
const { num } = this.getElementNumToEnd(collection.length - (checkOverscrollItemsLimit < 0 ? 0 : collection.length - checkOverscrollItemsLimit), collection, map, typicalItemSize, size, isVertical, collection.length - (collection.length - (targetDisplayItemIndex + 1)));
|
|
434
|
-
if (num > 0) {
|
|
435
|
-
itemsFromStartToScrollEnd -= num;
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
if (itemsFromStartToScrollEnd <= -1) {
|
|
439
|
-
itemsFromStartToScrollEnd = 0;
|
|
440
|
-
}
|
|
441
|
-
if (itemsFromStartToDisplayEnd <= -1) {
|
|
442
|
-
itemsFromStartToDisplayEnd = 0;
|
|
443
|
-
}
|
|
444
|
-
actualScrollSize = isFromId ? itemByIdPos : scrollSize;
|
|
445
|
-
leftItemsWeights.splice(0, leftItemsWeights.length - leftItemsOffset);
|
|
446
|
-
leftItemsWeights.forEach(v => {
|
|
447
|
-
leftItemsWeight += v;
|
|
448
|
-
});
|
|
449
|
-
leftItemLength = Math.min(itemsFromStartToScrollEnd, leftItemsOffset);
|
|
450
|
-
rightItemLength = itemsFromStartToDisplayEnd + rightItemsOffset > totalLength
|
|
451
|
-
? totalLength - itemsFromStartToDisplayEnd : rightItemsOffset;
|
|
452
|
-
}
|
|
453
|
-
else
|
|
454
|
-
// Buffer optimization does not work on fast linear algorithm
|
|
455
|
-
{
|
|
456
|
-
if (crudDetected) {
|
|
457
|
-
let y = 0;
|
|
458
|
-
for (let i = 0, l = collection.length; i < l; i++) {
|
|
459
|
-
const collectionItem = collection[i], id = collectionItem.id;
|
|
460
|
-
let componentSize = typicalItemSize, itemDisplayMethod = ItemDisplayMethods.NOT_CHANGED;
|
|
461
|
-
if (map.has(id)) {
|
|
462
|
-
const bounds = map.get(id);
|
|
463
|
-
itemDisplayMethod = bounds?.method ?? ItemDisplayMethods.UPDATE;
|
|
464
|
-
if (itemDisplayMethod === ItemDisplayMethods.CREATE) {
|
|
465
|
-
map.set(id, { ...bounds, method: ItemDisplayMethods.NOT_CHANGED });
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
if (deletedItemsMap.hasOwnProperty(i)) {
|
|
469
|
-
const bounds = deletedItemsMap[i], size = bounds?.[sizeProperty] ?? typicalItemSize;
|
|
470
|
-
if (y < scrollSize - size) {
|
|
471
|
-
leftSizeOfDeletedItems += size;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
if (y < scrollSize - componentSize) {
|
|
475
|
-
switch (itemDisplayMethod) {
|
|
476
|
-
case ItemDisplayMethods.CREATE: {
|
|
477
|
-
leftSizeOfUpdatedItems += componentSize;
|
|
478
|
-
break;
|
|
479
|
-
}
|
|
480
|
-
case ItemDisplayMethods.UPDATE: {
|
|
481
|
-
leftSizeOfUpdatedItems += componentSize;
|
|
482
|
-
break;
|
|
483
|
-
}
|
|
484
|
-
case ItemDisplayMethods.DELETE: {
|
|
485
|
-
leftSizeOfDeletedItems += componentSize;
|
|
486
|
-
break;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
y += componentSize;
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
itemsFromStartToScrollEnd = Math.floor(scrollSize / typicalItemSize);
|
|
494
|
-
itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);
|
|
495
|
-
leftItemLength = Math.min(itemsFromStartToScrollEnd, bufferSize);
|
|
496
|
-
rightItemLength = itemsFromStartToDisplayEnd + bufferSize > totalLength
|
|
497
|
-
? totalLength - itemsFromStartToDisplayEnd : bufferSize;
|
|
498
|
-
leftItemsWeight = leftItemLength * typicalItemSize;
|
|
499
|
-
rightItemsWeight = rightItemLength * typicalItemSize;
|
|
500
|
-
leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize;
|
|
501
|
-
totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;
|
|
502
|
-
totalSize = totalLength * typicalItemSize;
|
|
503
|
-
const k = totalSize !== 0 ? previousTotalSize / totalSize : 0;
|
|
504
|
-
actualScrollSize = scrollSize * k;
|
|
505
|
-
}
|
|
506
|
-
startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);
|
|
507
|
-
const itemsOnDisplayWeight = totalItemsToDisplayEndWeight - leftItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd, startPosition = leftHiddenItemsWeight - leftItemsWeight, renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength, delta = leftSizeOfUpdatedItems + leftSizeOfAddedItems - leftSizeOfDeletedItems;
|
|
508
|
-
const metrics = {
|
|
509
|
-
delta,
|
|
510
|
-
normalizedItemWidth: w,
|
|
511
|
-
normalizedItemHeight: h,
|
|
512
|
-
width,
|
|
513
|
-
height,
|
|
514
|
-
dynamicSize,
|
|
515
|
-
itemSize,
|
|
516
|
-
itemsFromStartToScrollEnd,
|
|
517
|
-
itemsFromStartToDisplayEnd,
|
|
518
|
-
itemsOnDisplayWeight,
|
|
519
|
-
itemsOnDisplayLength,
|
|
520
|
-
isVertical,
|
|
521
|
-
leftHiddenItemsWeight,
|
|
522
|
-
leftItemLength,
|
|
523
|
-
leftItemsWeight,
|
|
524
|
-
renderItems,
|
|
525
|
-
rightItemLength,
|
|
526
|
-
rightItemsWeight,
|
|
527
|
-
scrollSize: actualScrollSize,
|
|
528
|
-
leftSizeOfAddedItems,
|
|
529
|
-
sizeProperty,
|
|
530
|
-
snap,
|
|
531
|
-
snippedPos,
|
|
532
|
-
startIndex,
|
|
533
|
-
startPosition,
|
|
534
|
-
totalItemsToDisplayEndWeight,
|
|
535
|
-
totalLength,
|
|
536
|
-
totalSize,
|
|
537
|
-
typicalItemSize,
|
|
538
|
-
isFromItemIdFound,
|
|
539
|
-
};
|
|
540
|
-
return metrics;
|
|
541
|
-
}
|
|
542
|
-
clearDeltaDirection() {
|
|
543
|
-
this.clearScrollDirectionCache();
|
|
544
|
-
}
|
|
545
|
-
clearDelta(clearDirectionDetector = false) {
|
|
546
|
-
this._delta = 0;
|
|
547
|
-
if (clearDirectionDetector) {
|
|
548
|
-
this.clearScrollDirectionCache();
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
changes() {
|
|
552
|
-
this.bumpVersion();
|
|
553
|
-
}
|
|
554
|
-
generateDisplayCollection(items, stickyMap, metrics) {
|
|
555
|
-
const { width, height, normalizedItemWidth, normalizedItemHeight, dynamicSize, itemsOnDisplayLength, itemsFromStartToScrollEnd, isVertical, renderItems: renderItemsLength, scrollSize, sizeProperty, snap, snippedPos, startPosition, totalLength, startIndex, typicalItemSize, } = metrics, displayItems = [];
|
|
556
|
-
if (items.length) {
|
|
557
|
-
const actualSnippedPosition = snippedPos, isSnappingMethodAdvanced = this.isSnappingMethodAdvanced, boundsSize = isVertical ? height : width, actualEndSnippedPosition = boundsSize;
|
|
558
|
-
let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0, endStickyItem, nextEndSticky, endStickyItemIndex = -1, endStickyItemSize = 0;
|
|
559
|
-
if (snap) {
|
|
560
|
-
for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? itemsFromStartToScrollEnd : 0, totalLength - 1); i >= 0; i--) {
|
|
561
|
-
if (!items[i]) {
|
|
562
|
-
continue;
|
|
563
|
-
}
|
|
564
|
-
const id = items[i].id, sticky = stickyMap[id], size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;
|
|
565
|
-
if (sticky === 1) {
|
|
566
|
-
const measures = {
|
|
567
|
-
x: isVertical ? 0 : actualSnippedPosition,
|
|
568
|
-
y: isVertical ? actualSnippedPosition : 0,
|
|
569
|
-
width: isVertical ? normalizedItemWidth : size,
|
|
570
|
-
height: isVertical ? size : normalizedItemHeight,
|
|
571
|
-
delta: 0,
|
|
572
|
-
}, config = {
|
|
573
|
-
isVertical,
|
|
574
|
-
sticky,
|
|
575
|
-
snap,
|
|
576
|
-
snapped: true,
|
|
577
|
-
snappedOut: false,
|
|
578
|
-
dynamic: dynamicSize,
|
|
579
|
-
isSnappingMethodAdvanced,
|
|
580
|
-
zIndex: '1',
|
|
581
|
-
};
|
|
582
|
-
const itemData = items[i];
|
|
583
|
-
stickyItem = { id, measures, data: itemData, config };
|
|
584
|
-
stickyItemIndex = i;
|
|
585
|
-
stickyItemSize = size;
|
|
586
|
-
displayItems.push(stickyItem);
|
|
587
|
-
break;
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
}
|
|
591
|
-
if (snap) {
|
|
592
|
-
const startIndex = itemsFromStartToScrollEnd + itemsOnDisplayLength - 1;
|
|
593
|
-
for (let i = Math.min(startIndex, totalLength > 0 ? totalLength - 1 : 0), l = totalLength; i < l; i++) {
|
|
594
|
-
const id = items[i].id, sticky = stickyMap[id], size = dynamicSize
|
|
595
|
-
? this.get(id)?.[sizeProperty] || typicalItemSize
|
|
596
|
-
: typicalItemSize;
|
|
597
|
-
if (sticky === 2) {
|
|
598
|
-
const w = isVertical ? normalizedItemWidth : size, h = isVertical ? size : normalizedItemHeight, measures = {
|
|
599
|
-
x: isVertical ? 0 : actualEndSnippedPosition - w,
|
|
600
|
-
y: isVertical ? actualEndSnippedPosition - h : 0,
|
|
601
|
-
width: w,
|
|
602
|
-
height: h,
|
|
603
|
-
delta: 0,
|
|
604
|
-
}, config = {
|
|
605
|
-
isVertical,
|
|
606
|
-
sticky,
|
|
607
|
-
snap,
|
|
608
|
-
snapped: true,
|
|
609
|
-
snappedOut: false,
|
|
610
|
-
dynamic: dynamicSize,
|
|
611
|
-
isSnappingMethodAdvanced,
|
|
612
|
-
zIndex: '1',
|
|
613
|
-
};
|
|
614
|
-
const itemData = items[i];
|
|
615
|
-
endStickyItem = { id, measures, data: itemData, config };
|
|
616
|
-
endStickyItemIndex = i;
|
|
617
|
-
endStickyItemSize = size;
|
|
618
|
-
displayItems.push(endStickyItem);
|
|
619
|
-
break;
|
|
620
|
-
}
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
let i = startIndex;
|
|
624
|
-
while (renderItems > 0) {
|
|
625
|
-
if (i >= totalLength) {
|
|
626
|
-
break;
|
|
627
|
-
}
|
|
628
|
-
const id = items[i].id, size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;
|
|
629
|
-
if (id !== stickyItem?.id && id !== endStickyItem?.id) {
|
|
630
|
-
const snapped = snap && (stickyMap[id] === 1 && pos <= scrollSize || stickyMap[id] === 2 && pos >= scrollSize + boundsSize - size), measures = {
|
|
631
|
-
x: isVertical ? stickyMap[id] === 1 ? 0 : boundsSize - size : pos,
|
|
632
|
-
y: isVertical ? pos : stickyMap[id] === 2 ? boundsSize - size : 0,
|
|
633
|
-
width: isVertical ? normalizedItemWidth : size,
|
|
634
|
-
height: isVertical ? size : normalizedItemHeight,
|
|
635
|
-
delta: 0,
|
|
636
|
-
}, config = {
|
|
637
|
-
isVertical,
|
|
638
|
-
sticky: stickyMap[id],
|
|
639
|
-
snap,
|
|
640
|
-
snapped: false,
|
|
641
|
-
snappedOut: false,
|
|
642
|
-
dynamic: dynamicSize,
|
|
643
|
-
isSnappingMethodAdvanced,
|
|
644
|
-
zIndex: '0',
|
|
645
|
-
};
|
|
646
|
-
if (snapped) {
|
|
647
|
-
config.zIndex = '2';
|
|
648
|
-
}
|
|
649
|
-
const itemData = items[i];
|
|
650
|
-
const item = { id, measures, data: itemData, config };
|
|
651
|
-
if (!nextSticky && stickyItemIndex < i && stickyMap[id] === 1 && (pos <= scrollSize + size + stickyItemSize)) {
|
|
652
|
-
item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;
|
|
653
|
-
item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;
|
|
654
|
-
nextSticky = item;
|
|
655
|
-
nextSticky.config.snapped = snapped;
|
|
656
|
-
nextSticky.measures.delta = isVertical ? (item.measures.y - scrollSize) : (item.measures.x - scrollSize);
|
|
657
|
-
nextSticky.config.zIndex = '3';
|
|
658
|
-
}
|
|
659
|
-
else if (!nextEndSticky && endStickyItemIndex > i && stickyMap[id] === 2 && (pos >= scrollSize + boundsSize - size - endStickyItemSize)) {
|
|
660
|
-
item.measures.x = isVertical ? 0 : snapped ? actualEndSnippedPosition - size : pos;
|
|
661
|
-
item.measures.y = isVertical ? snapped ? actualEndSnippedPosition - size : pos : 0;
|
|
662
|
-
nextEndSticky = item;
|
|
663
|
-
nextEndSticky.config.zIndex = '3';
|
|
664
|
-
nextEndSticky.config.snapped = snapped;
|
|
665
|
-
nextEndSticky.measures.delta = isVertical ? (item.measures.y - scrollSize) : (item.measures.x - scrollSize);
|
|
666
|
-
}
|
|
667
|
-
displayItems.push(item);
|
|
668
|
-
}
|
|
669
|
-
renderItems -= 1;
|
|
670
|
-
pos += size;
|
|
671
|
-
i++;
|
|
672
|
-
}
|
|
673
|
-
const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;
|
|
674
|
-
if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {
|
|
675
|
-
if (nextSticky.measures[axis] > scrollSize) {
|
|
676
|
-
stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;
|
|
677
|
-
stickyItem.config.snapped = nextSticky.config.snapped = false;
|
|
678
|
-
stickyItem.config.snappedOut = true;
|
|
679
|
-
stickyItem.config.sticky = 1;
|
|
680
|
-
stickyItem.measures.delta = isVertical ? stickyItem.measures.y - scrollSize : stickyItem.measures.x - scrollSize;
|
|
681
|
-
}
|
|
682
|
-
else {
|
|
683
|
-
nextSticky.config.snapped = true;
|
|
684
|
-
nextSticky.measures.delta = isVertical ? nextSticky.measures.y - scrollSize : nextSticky.measures.x - scrollSize;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
if (nextEndSticky && endStickyItem && nextEndSticky.measures[axis] >= scrollSize + boundsSize - endStickyItemSize - nextEndSticky.measures[sizeProperty]) {
|
|
688
|
-
if (nextEndSticky.measures[axis] < scrollSize + boundsSize - endStickyItemSize) {
|
|
689
|
-
endStickyItem.measures[axis] = nextEndSticky.measures[axis] + nextEndSticky.measures[sizeProperty];
|
|
690
|
-
endStickyItem.config.snapped = nextEndSticky.config.snapped = false;
|
|
691
|
-
endStickyItem.config.snappedOut = true;
|
|
692
|
-
endStickyItem.config.sticky = 2;
|
|
693
|
-
endStickyItem.measures.delta = isVertical ? endStickyItem.measures.y - scrollSize : endStickyItem.measures.x - scrollSize;
|
|
694
|
-
}
|
|
695
|
-
else {
|
|
696
|
-
nextEndSticky.config.snapped = true;
|
|
697
|
-
nextEndSticky.measures.delta = isVertical ? nextEndSticky.measures.y - scrollSize : nextEndSticky.measures.x - scrollSize;
|
|
698
|
-
}
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
return displayItems;
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* tracking by propName
|
|
705
|
-
*/
|
|
706
|
-
track() {
|
|
707
|
-
if (!this._items || !this._displayComponents) {
|
|
708
|
-
return;
|
|
709
|
-
}
|
|
710
|
-
this._tracker.track(this._items, this._displayComponents, this._snapedDisplayComponent, this.scrollDirection);
|
|
711
|
-
}
|
|
712
|
-
setDisplayObjectIndexMapById(v) {
|
|
713
|
-
this._tracker.displayObjectIndexMapById = v;
|
|
714
|
-
}
|
|
715
|
-
untrackComponentByIdProperty(component) {
|
|
716
|
-
this._tracker.untrackComponentByIdProperty(component);
|
|
717
|
-
}
|
|
718
|
-
getItemBounds(id) {
|
|
719
|
-
if (this.has(id)) {
|
|
720
|
-
return this.get(id);
|
|
721
|
-
}
|
|
722
|
-
return undefined;
|
|
723
|
-
}
|
|
724
|
-
cacheElements() {
|
|
725
|
-
if (!this._displayComponents) {
|
|
726
|
-
return;
|
|
727
|
-
}
|
|
728
|
-
for (let i = 0, l = this._displayComponents.length; i < l; i++) {
|
|
729
|
-
const component = this._displayComponents[i], itemId = component.instance.itemId;
|
|
730
|
-
if (itemId === undefined) {
|
|
731
|
-
continue;
|
|
732
|
-
}
|
|
733
|
-
const bounds = component.instance.getBounds();
|
|
734
|
-
this.set(itemId, bounds);
|
|
735
|
-
}
|
|
736
|
-
}
|
|
737
|
-
dispose() {
|
|
738
|
-
super.dispose();
|
|
739
|
-
this.disposeClearBufferSizeTimer();
|
|
740
|
-
if (this._tracker) {
|
|
741
|
-
this._tracker.dispose();
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
}
|
|
745
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tCb3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsUUFBUSxFQUFRLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLFFBQVEsQ0FBQztBQWdFcEQsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUMxQiwrREFBTSxDQUFBO0lBQ04sK0RBQU0sQ0FBQTtJQUNOLCtEQUFNLENBQUE7SUFDTix5RUFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUFTRCxNQUFNLGlDQUFpQyxHQUFHLEVBQUUsRUFDeEMsa0NBQWtDLEdBQUcsRUFBRSxFQUN2QyxpQ0FBaUMsR0FBRyxLQUFLLENBQUM7QUFFOUM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sUUFDVCxTQUFRLFFBQXdGO0lBTWhHLElBQUksS0FBSyxDQUFDLENBQWtEO1FBQ3hELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbkIsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUlELElBQUksaUJBQWlCLENBQUMsQ0FBNEM7UUFDOUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEtBQUssQ0FBQyxFQUFFO1lBQy9CLE9BQU87U0FDVjtRQUVELElBQUksQ0FB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UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUMxQixPQUFPO1NBQ1Y7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDakYsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN0QixTQUFTO2FBQ1o7WUFDRCxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQzVCO0lBQ0wsQ0FBQztJQUVRLE9BQU87UUFDWixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFaEIsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFFbkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24sIH0gZnJvbSBcIi4uL21vZGVscy9yZW5kZXItY29sbGVjdGlvbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJUmVuZGVyVmlydHVhbExpc3RJdGVtIH0gZnJvbSBcIi4uL21vZGVscy9yZW5kZXItaXRlbS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBJZCB9IGZyb20gXCIuLi90eXBlcy9pZFwiO1xyXG5pbXBvcnQgeyBDYWNoZU1hcCwgQ01hcCB9IGZyb20gXCIuL2NhY2hlTWFwXCI7XHJcbmltcG9ydCB7IFRyYWNrZXIgfSBmcm9tIFwiLi90cmFja2VyXCI7XHJcbmltcG9ydCB7IElTaXplIH0gZnJvbSBcIi4uL3R5cGVzXCI7XHJcbmltcG9ydCB7IEhFSUdIVF9QUk9QX05BTUUsIFdJRFRIX1BST1BfTkFNRSwgWF9QUk9QX05BTUUsIFlfUFJPUF9OQU1FIH0gZnJvbSBcIi4uL2NvbnN0XCI7XHJcbmltcG9ydCB7IEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQsIElWaXJ0dWFsTGlzdFN0aWNreU1hcCB9IGZyb20gXCIuLi9tb2RlbHNcIjtcclxuaW1wb3J0IHsgYnVmZmVySW50ZXJwb2xhdGlvbiB9IGZyb20gXCIuL2J1ZmZlci1pbnRlcnBvbGF0aW9uXCI7XHJcblxyXG5leHBvcnQgY29uc3QgVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FID0gJ2NoYW5nZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElNZXRyaWNzIHtcclxuICAgIGRlbHRhOiBudW1iZXI7XHJcbiAgICBub3JtYWxpemVkSXRlbVdpZHRoOiBudW1iZXI7XHJcbiAgICBub3JtYWxpemVkSXRlbUhlaWdodDogbnVtYmVyO1xyXG4gICAgd2lkdGg6IG51bWJlcjtcclxuICAgIGhlaWdodDogbnVtYmVyO1xyXG4gICAgZHluYW1pY1NpemU6IGJvb2xlYW47XHJcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZDogbnVtYmVyO1xyXG4gICAgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQ6IG51bWJlcjtcclxuICAgIGl0ZW1zT25EaXNwbGF5V2VpZ2h0OiBudW1iZXI7XHJcbiAgICBpdGVtc09uRGlzcGxheUxlbmd0aDogbnVtYmVyO1xyXG4gICAgaXNWZXJ0aWNhbDogYm9vbGVhbjtcclxuICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgbGVmdEl0ZW1MZW5ndGg6IG51bWJlcjtcclxuICAgIGxlZnRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgcmVuZGVySXRlbXM6IG51bWJlcjtcclxuICAgIHJpZ2h0SXRlbUxlbmd0aDogbnVtYmVyO1xyXG4gICAgcmlnaHRJdGVtc1dlaWdodDogbnVtYmVyO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgbGVmdFNpemVPZkFkZGVkSXRlbXM6IG51bWJlcjtcclxuICAgIHNpemVQcm9wZXJ0eTogdHlwZW9mIEhFSUdIVF9QUk9QX05BTUUgfCB0eXBlb2YgV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIHNuaXBwZWRQb3M6IG51bWJlcjtcclxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcjtcclxuICAgIHN0YXJ0UG9zaXRpb246IG51bWJlcjtcclxuICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IG51bWJlcjtcclxuICAgIHRvdGFsTGVuZ3RoOiBudW1iZXI7XHJcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgIHR5cGljYWxJdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXNGcm9tSXRlbUlkRm91bmQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ge1xyXG4gICAgYm91bmRzOiBJU2l6ZTtcclxuICAgIGNvbGxlY3Rpb246IEM7XHJcbiAgICBpc1ZlcnRpY2FsOiBib29sZWFuO1xyXG4gICAgaXRlbVNpemU6IG51bWJlcjtcclxuICAgIGJ1ZmZlclNpemU6IG51bWJlcjtcclxuICAgIG1heEJ1ZmZlclNpemU6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIGVuYWJsZWRCdWZmZXJPcHRpbWl6YXRpb246IGJvb2xlYW47XHJcbiAgICBmcm9tSXRlbUlkPzogSWQ7XHJcbiAgICBwcmV2aW91c1RvdGFsU2l6ZTogbnVtYmVyO1xyXG4gICAgY3J1ZERldGVjdGVkOiBib29sZWFuO1xyXG4gICAgZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemU7IH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUdldEl0ZW1Qb3NpdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj5cclxuICAgIGV4dGVuZHMgT21pdDxJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiwgJ2NvbGxlY3Rpb24nIHwgJ3ByZXZpb3VzVG90YWxTaXplJyB8ICdjcnVkRGV0ZWN0ZWQnIHwgJ2RlbGV0ZWRJdGVtc01hcCc+IHsgfVxyXG5cclxuZXhwb3J0IHR5cGUgQ2FjaGVNYXBFdmVudHMgPSB0eXBlb2YgVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FO1xyXG5cclxuZXhwb3J0IHR5cGUgT25DaGFuZ2VFdmVudExpc3RlbmVyID0gKHZlcnNpb246IG51bWJlcikgPT4gdm9pZDtcclxuXHJcbmV4cG9ydCB0eXBlIENhY2hlTWFwTGlzdGVuZXJzID0gT25DaGFuZ2VFdmVudExpc3RlbmVyO1xyXG5cclxuZXhwb3J0IGVudW0gSXRlbURpc3BsYXlNZXRob2RzIHtcclxuICAgIENSRUFURSxcclxuICAgIFVQREFURSxcclxuICAgIERFTEVURSxcclxuICAgIE5PVF9DSEFOR0VELFxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVcGRhdGVDb2xsZWN0aW9uUmV0dXJucyB7XHJcbiAgICBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb247XHJcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgIGRlbHRhOiBudW1iZXI7XHJcbiAgICBjcnVkRGV0ZWN0ZWQ6IGJvb2xlYW47XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQlVGRkVSX0VYVFJFTVVNX1RIUkVTSE9MRCA9IDE1LFxyXG4gICAgREVGQVVMVF9NQVhfQlVGRkVSX1NFUVVFTkNFX0xFTkdUSCA9IDMwLFxyXG4gICAgREVGQVVMVF9SRVNFVF9CVUZGRVJfU0laRV9USU1FT1VUID0gMTAwMDA7XHJcblxyXG4vKipcclxuICogQW4gb2JqZWN0IHRoYXQgcGVyZm9ybXMgdHJhY2tpbmcsIGNhbGN1bGF0aW9ucyBhbmQgY2FjaGluZy5cclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvMTUueC9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50c1xyXG4gKiBAYXV0aG9yIEV2Z2VuaWkgR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgVHJhY2tCb3g8QyBleHRlbmRzIEJhc2VWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQgPSBhbnk+XHJcbiAgICBleHRlbmRzIENhY2hlTWFwPElkLCBJU2l6ZSAmIHsgbWV0aG9kPzogSXRlbURpc3BsYXlNZXRob2RzIH0sIENhY2hlTWFwRXZlbnRzLCBDYWNoZU1hcExpc3RlbmVycz4ge1xyXG5cclxuICAgIHByb3RlY3RlZCBfdHJhY2tlciE6IFRyYWNrZXI8Qz47XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB8IG51bGwgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgc2V0IGl0ZW1zKHY6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2l0ZW1zID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2l0ZW1zID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2Rpc3BsYXlDb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8Qz4+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBzZXQgZGlzcGxheUNvbXBvbmVudHModjogQXJyYXk8Q29tcG9uZW50UmVmPEM+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfc25hcGVkRGlzcGxheUNvbXBvbmVudDogQ29tcG9uZW50UmVmPEM+IHwgbnVsbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICBzZXQgc25hcGVkRGlzcGxheUNvbXBvbmVudCh2OiBDb21wb25lbnRSZWY8Qz4gfCBudWxsIHwgdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NuYXBlZERpc3BsYXlDb21wb25lbnQgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc25hcGVkRGlzcGxheUNvbXBvbmVudCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBzZXQgaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5faXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID09PSB2KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2lzU25hcHBpbmdNZXRob2RBZHZhbmNlZCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXQgdGhlIHRyYWNrQnkgcHJvcGVydHlcclxuICAgICAqL1xyXG4gICAgc2V0IHRyYWNraW5nUHJvcGVydHlOYW1lKHY6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHRyYWNraW5nUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90cmFja2VyID0gbmV3IFRyYWNrZXIodHJhY2tpbmdQcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHNldChpZDogSWQsIGJvdW5kczogSVNpemUpOiBDTWFwPElkLCBJU2l6ZT4ge1xyXG4gICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICBjb25zdCBiID0gdGhpcy5fbWFwLmdldChpZCk7XHJcbiAgICAgICAgICAgIGlmIChiPy53aWR0aCA9PT0gYm91bmRzLndpZHRoICYmIGIuaGVpZ2h0ID09PSBib3VuZHMuaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB2ID0gdGhpcy5fbWFwLnNldChpZCwgYm91bmRzKTtcclxuXHJcbiAgICAgICAgdGhpcy5idW1wVmVyc2lvbigpO1xyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJldmlvdXNDb2xsZWN0aW9uOiBBcnJheTx7IGlkOiBJZDsgfT4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHByb3RlY3RlZCBfZGVsZXRlZEl0ZW1zTWFwOiB7IFtpbmRleDogbnVtYmVyXTogSVNpemUgfSA9IHt9O1xyXG5cclxuICAgIHByb3RlY3RlZCBfY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcbiAgICBnZXQgY3J1ZERldGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fY3J1ZERldGVjdGVkOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDaGFuZ2VJZk5lZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2hhbmdlc0RldGVjdGVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUUsIHRoaXMuX3ZlcnNpb24pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZpb3VzVG90YWxTaXplID0gMDtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX3Njcm9sbERlbHRhOiBudW1iZXIgPSAwO1xyXG4gICAgZ2V0IHNjcm9sbERlbHRhKCkgeyByZXR1cm4gdGhpcy5fc2Nyb2xsRGVsdGE7IH1cclxuXHJcbiAgICBpc0FkYXB0aXZlQnVmZmVyID0gdHJ1ZTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2J1ZmZlclNlcXVlbmNlRXh0cmFUaHJlc2hvbGQgPSBERUZBVUxUX0JVRkZFUl9FWFRSRU1VTV9USFJFU0hPTEQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9tYXhCdWZmZXJTZXF1ZW5jZUxlbmd0aCA9IERFRkFVTFRfTUFYX0JVRkZFUl9TRVFVRU5DRV9MRU5HVEg7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9idWZmZXJTaXplU2VxdWVuY2U6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2J1ZmZlclNpemU6IG51bWJlciA9IDA7XHJcbiAgICBnZXQgYnVmZmVyU2l6ZSgpIHsgcmV0dXJuIHRoaXMuX2J1ZmZlclNpemU7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2RlZmF1bHRCdWZmZXJTaXplOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfbWF4QnVmZmVyU2l6ZTogbnVtYmVyID0gdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemU7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZXNldEJ1ZmZlclNpemVUaW1lb3V0OiBudW1iZXIgPSBERUZBVUxUX1JFU0VUX0JVRkZFUl9TSVpFX1RJTUVPVVQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9yZXNldEJ1ZmZlclNpemVUaW1lcjogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBsaWZlQ2lyY2xlKCkge1xyXG4gICAgICAgIHRoaXMuZmlyZUNoYW5nZUlmTmVlZCgpO1xyXG5cclxuICAgICAgICB0aGlzLmxpZmVDaXJjbGVEbygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2NhbnMgdGhlIGNvbGxlY3Rpb24gZm9yIGRlbGV0ZWQgaXRlbXMgYW5kIGZsdXNoZXMgdGhlIGRlbGV0ZWQgaXRlbSBjYWNoZS5cclxuICAgICAqL1xyXG4gICAgcmVzZXRDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZDsgfSwgQyBleHRlbmRzIEFycmF5PEk+PihjdXJyZW50Q29sbGVjdGlvbjogQyB8IG51bGwgfCB1bmRlZmluZWQsIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAoY3VycmVudENvbGxlY3Rpb24gIT09IHVuZGVmaW5lZCAmJiBjdXJyZW50Q29sbGVjdGlvbiAhPT0gbnVsbCAmJiBjdXJyZW50Q29sbGVjdGlvbiA9PT0gdGhpcy5fcHJldmlvdXNDb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignQXR0ZW50aW9uISBUaGUgY29sbGVjdGlvbiBtdXN0IGJlIGltbXV0YWJsZS4nKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVDYWNoZSh0aGlzLl9wcmV2aW91c0NvbGxlY3Rpb24sIGN1cnJlbnRDb2xsZWN0aW9uLCBpdGVtU2l6ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3ByZXZpb3VzQ29sbGVjdGlvbiA9IGN1cnJlbnRDb2xsZWN0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlIHRoZSBjYWNoZSBvZiBpdGVtcyBmcm9tIHRoZSBsaXN0XHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCB1cGRhdGVDYWNoZTxJIGV4dGVuZHMgeyBpZDogSWQ7IH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ocHJldmlvdXNDb2xsZWN0aW9uOiBDIHwgbnVsbCB8IHVuZGVmaW5lZCwgY3VycmVudENvbGxlY3Rpb246IEMgfCBudWxsIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgIGl0ZW1TaXplOiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBsZXQgY3J1ZERldGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghY3VycmVudENvbGxlY3Rpb24gfHwgY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChwcmV2aW91c0NvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gcHJldmlvdXNDb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGlkKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXByZXZpb3VzQ29sbGVjdGlvbiB8fCBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50Q29sbGVjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gY3VycmVudENvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbkRpY3Q6IHsgW2lkOiBJZF06IEkgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXTtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb25EaWN0W2l0ZW0uaWRdID0gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBub3RDaGFuZ2VkTWFwOiB7IFtpZDogSWRdOiBJIH0gPSB7fSwgZGVsZXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge30sIGRlbGV0ZWRJdGVtc01hcDogeyBbaW5kZXg6IG51bWJlcl06IElTaXplIH0gPSB7fSwgdXBkYXRlZE1hcDogeyBbaWQ6IElkXTogSSB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBwcmV2aW91c0NvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBwcmV2aW91c0NvbGxlY3Rpb25baV0sIGlkID0gaXRlbS5pZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uRGljdC5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gY29sbGVjdGlvbkRpY3RbaWRdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdENoYW5nZWRNYXBbaXRlbS5pZF0gPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IC4uLih0aGlzLl9tYXAuZ2V0KGlkKSB8fCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSB9KSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3J1ZERldGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoaWQsIHsgLi4uKHRoaXMuX21hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IGl0ZW1TaXplLCBoZWlnaHQ6IGl0ZW1TaXplIH0pLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5VUERBVEUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBkZWxldGVkXHJcbiAgICAgICAgICAgICAgICBjcnVkRGV0ZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlZE1hcFtpdGVtLmlkXSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICBkZWxldGVkSXRlbXNNYXBbaV0gPSB0aGlzLl9tYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY3VycmVudENvbGxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBjdXJyZW50Q29sbGVjdGlvbltpXSwgaWQgPSBpdGVtLmlkO1xyXG4gICAgICAgICAgICBpZiAoaXRlbSAmJiAhZGVsZXRlZE1hcC5oYXNPd25Qcm9wZXJ0eShpZCkgJiYgIXVwZGF0ZWRNYXAuaGFzT3duUHJvcGVydHkoaWQpICYmICFub3RDaGFuZ2VkTWFwLmhhc093blByb3BlcnR5KGlkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gYWRkZWRcclxuICAgICAgICAgICAgICAgIGNydWREZXRlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGlkLCB7IHdpZHRoOiBpdGVtU2l6ZSwgaGVpZ2h0OiBpdGVtU2l6ZSwgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuQ1JFQVRFIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGNydWREZXRlY3RlZDtcclxuICAgICAgICB0aGlzLl9kZWxldGVkSXRlbXNNYXAgPSBkZWxldGVkSXRlbXNNYXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGaW5kcyB0aGUgcG9zaXRpb24gb2YgYSBjb2xsZWN0aW9uIGVsZW1lbnQgYnkgdGhlIGdpdmVuIElkXHJcbiAgICAgKi9cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihpZDogSWQsIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgIG9wdGlvbnM6IElHZXRJdGVtUG9zaXRpb25PcHRpb25zPEksIEM+KTogbnVtYmVyIHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IGZyb21JdGVtSWQ6IGlkLCBzdGlja3lNYXAsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICB0aGlzLl9kZWZhdWx0QnVmZmVyU2l6ZSA9IG9wdC5idWZmZXJTaXplO1xyXG4gICAgICAgIHRoaXMuX21heEJ1ZmZlclNpemUgPSBvcHQubWF4QnVmZmVyU2l6ZTtcclxuXHJcbiAgICAgICAgY29uc3QgeyBzY3JvbGxTaXplLCBpc0Zyb21JdGVtSWRGb3VuZCB9ID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplOiB0aGlzLl9jcnVkRGV0ZWN0ZWQgfHwgb3B0LmR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXA6IHRoaXMuX2RlbGV0ZWRJdGVtc01hcCxcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gaXNGcm9tSXRlbUlkRm91bmQgPyBzY3JvbGxTaXplIDogLTE7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xsZWN0aW9uIG9mIGRpc3BsYXkgb2JqZWN0c1xyXG4gICAgICovXHJcbiAgICB1cGRhdGVDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBvcHRpb25zOiBJVXBkYXRlQ29sbGVjdGlvbk9wdGlvbnM8SSwgQz4pOiBJVXBkYXRlQ29sbGVjdGlvblJldHVybnMge1xyXG4gICAgICAgIGNvbnN0IG9wdCA9IHsgc3RpY2t5TWFwLCAuLi5vcHRpb25zIH0sIGNydWREZXRlY3RlZCA9IHRoaXMuX2NydWREZXRlY3RlZCwgZGVsZXRlZEl0ZW1zTWFwID0gdGhpcy5fZGVsZXRlZEl0ZW1zTWFwO1xyXG4gICAgICAgIGlmIChvcHQuZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5jYWNoZUVsZW1lbnRzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplID0gb3B0LmJ1ZmZlclNpemU7XHJcbiAgICAgICAgdGhpcy5fbWF4QnVmZmVyU2l6ZSA9IG9wdC5tYXhCdWZmZXJTaXplO1xyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Moe1xyXG4gICAgICAgICAgICAuLi5vcHQsXHJcbiAgICAgICAgICAgIGNvbGxlY3Rpb246IGl0ZW1zLFxyXG4gICAgICAgICAgICBwcmV2aW91c1RvdGFsU2l6ZTogdGhpcy5fcHJldmlvdXNUb3RhbFNpemUsXHJcbiAgICAgICAgICAgIGNydWREZXRlY3RlZDogdGhpcy5fY3J1ZERldGVjdGVkLFxyXG4gICAgICAgICAgICBkZWxldGVkSXRlbXNNYXAsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX2RlbHRhICs9IG1ldHJpY3MuZGVsdGE7XHJcblxyXG4gICAgICAgIHRoaXMudXBkYXRlQWRhcHRpdmVCdWZmZXJQYXJhbXMobWV0cmljcywgaXRlbXMubGVuZ3RoKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJldmlvdXNUb3RhbFNpemUgPSBtZXRyaWNzLnRvdGFsU2l6ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZEl0ZW1zTWFwID0ge307XHJcblxyXG4gICAgICAgIHRoaXMuX2NydWREZXRlY3RlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAob3B0LmR5bmFtaWNTaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc25hcHNob3QoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRpc3BsYXlJdGVtcyA9IHRoaXMuZ2VuZXJhdGVEaXNwbGF5Q29sbGVjdGlvbihpdGVtcywgc3RpY2t5TWFwLCB7IC4uLm1ldHJpY3MsIH0pO1xyXG4gICAgICAgIHJldHVybiB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplOiBtZXRyaWNzLnRvdGFsU2l6ZSwgZGVsdGE6IG1ldHJpY3MuZGVsdGEsIGNydWREZXRlY3RlZCB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRmluZHMgdGhlIGNsb3Nlc3QgZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiBieSBzY3JvbGxTaXplXHJcbiAgICAgKi9cclxuICAgIGdldE5lYXJlc3RJdGVtPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KHNjcm9sbFNpemU6IG51bWJlciwgaXRlbXM6IEMsIGl0ZW1TaXplOiBudW1iZXIsIGlzVmVydGljYWw6IGJvb2xlYW4pOiBJIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFbGVtZW50RnJvbVN0YXJ0KHNjcm9sbFNpemUsIGl0ZW1zLCB0aGlzLl9tYXAsIGl0ZW1TaXplLCBpc1ZlcnRpY2FsKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX3ByZXZpb3VzU2Nyb2xsU2l6ZSA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUFkYXB0aXZlQnVmZmVyUGFyYW1zKG1ldHJpY3M6IElNZXRyaWNzLCB0b3RhbEl0ZW1zTGVuZ3RoOiBudW1iZXIpIHtcclxuICAgICAgICB0aGlzLmRpc3Bvc2VDbGVhckJ1ZmZlclNpemVUaW1lcigpO1xyXG5cclxuICAgICAgICBjb25zdCBzY3JvbGxTaXplID0gbWV0cmljcy5zY3JvbGxTaXplICsgdGhpcy5fZGVsdGEsIGRlbHRhID0gTWF0aC5hYnModGhpcy5fcHJldmlvdXNTY3JvbGxTaXplIC0gc2Nyb2xsU2l6ZSk7XHJcbiAgICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICBjb25zdCBidWZmZXJSYXdTaXplID0gTWF0aC5taW4oTWF0aC5mbG9vcihkZWx0YSAvIG1ldHJpY3MudHlwaWNhbEl0ZW1TaXplKSAqIDUsIHRvdGFsSXRlbXNMZW5ndGgpLFxyXG4gICAgICAgICAgICBtaW5CdWZmZXJTaXplID0gYnVmZmVyUmF3U2l6ZSA8IHRoaXMuX2RlZmF1bHRCdWZmZXJTaXplID8gdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemUgOiBidWZmZXJSYXdTaXplLFxyXG4gICAgICAgICAgICBidWZmZXJWYWx1ZSA9IG1pbkJ1ZmZlclNpemUgPiB0aGlzLl9tYXhCdWZmZXJTaXplID8gdGhpcy5fbWF4QnVmZmVyU2l6ZSA6IG1pbkJ1ZmZlclNpemU7XHJcblxyXG4gICAgICAgIHRoaXMuX2J1ZmZlclNpemUgPSBidWZmZXJJbnRlcnBvbGF0aW9uKHRoaXMuX2J1ZmZlclNpemUsIHRoaXMuX2J1ZmZlclNpemVTZXF1ZW5jZSwgYnVmZmVyVmFsdWUsIHtcclxuICAgICAgICAgICAgZXh0cmVtdW1UaHJlc2hvbGQ6IHRoaXMuX2J1ZmZlclNlcXVlbmNlRXh0cmFUaHJlc2hvbGQsXHJcbiAgICAgICAgICAgIGJ1ZmZlclNpemU6IHRoaXMuX21heEJ1ZmZlclNlcXVlbmNlTGVuZ3RoLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXJ0UmVzZXRCdWZmZXJTaXplVGltZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgc3RhcnRSZXNldEJ1ZmZlclNpemVUaW1lcigpIHtcclxuICAgICAgICB0aGlzLl9yZXNldEJ1ZmZlclNpemVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gdGhpcy5fZGVmYXVsdEJ1ZmZlclNpemU7XHJcbiAgICAgICAgICAgIHRoaXMuX2J1ZmZlclNpemVTZXF1ZW5jZSA9IFtdO1xyXG4gICAgICAgIH0sIHRoaXMuX3Jlc2V0QnVmZmVyU2l6ZVRpbWVvdXQpIGFzIHVua25vd24gYXMgbnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBkaXNwb3NlQ2xlYXJCdWZmZXJTaXplVGltZXIoKSB7XHJcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2V0QnVmZmVyU2l6ZVRpbWVyKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgYmFzZWQgb24gdGhlIGdpdmVuIHNjcm9sbFNpemVcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldEVsZW1lbnRGcm9tU3RhcnQ8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oc2Nyb2xsU2l6ZTogbnVtYmVyLCBjb2xsZWN0aW9uOiBDLCBtYXA6IENNYXA8SWQsIElTaXplPiwgdHlwaWNhbEl0ZW1TaXplOiBudW1iZXIsXHJcbiAgICAgICAgaXNWZXJ0aWNhbDogYm9vbGVhbik6IEkgfCB1bmRlZmluZWQge1xyXG4gICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25baV07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBib3VuZHMgPyBib3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzY3JvbGxTaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvZmZzZXQgKz0gaXRlbVNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbnRyeSBpbnRvIHRoZSBvdmVyc2Nyb2xsIGFyZWEgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBvdmVyc2Nyb2xsIGVsZW1lbnRzXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXRFbGVtZW50TnVtVG9FbmQ8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4oaTogbnVtYmVyLCBjb2xsZWN0aW9uOiBDLCBtYXA6IENNYXA8SWQsIElTaXplPiwgdHlwaWNhbEl0ZW1TaXplOiBudW1iZXIsXHJcbiAgICAgICAgc2l6ZTogbnVtYmVyLCBpc1ZlcnRpY2FsOiBib29sZWFuLCBpbmRleE9mZnNldDogbnVtYmVyID0gMCk6IHsgbnVtOiBudW1iZXIsIG9mZnNldDogbnVtYmVyIH0ge1xyXG4gICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgICAgIGxldCBvZmZzZXQgPSAwLCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGogPSBjb2xsZWN0aW9uLmxlbmd0aCAtIGluZGV4T2Zmc2V0IC0gMTsgaiA+PSBpOyBqLS0pIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGNvbGxlY3Rpb25bal07XHJcbiAgICAgICAgICAgIGxldCBpdGVtU2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGlmIChtYXAuaGFzKGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXAuZ2V0KGl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgaXRlbVNpemUgPSBib3VuZHMgPyBib3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1TaXplID0gdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9mZnNldCArPSBpdGVtU2l6ZTtcclxuICAgICAgICAgICAgbnVtKys7XHJcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPiBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBudW06IDAsIG9mZnNldCB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IG51bSwgb2Zmc2V0IH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjdWxhdGVzIGxpc3QgbWV0cmljc1xyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgcmVjYWxjdWxhdGVNZXRyaWNzPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KG9wdGlvbnM6IElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+KTogSU1ldHJpY3Mge1xyXG4gICAgICAgIGNvbnN0IHsgZnJvbUl0ZW1JZCwgYm91bmRzLCBjb2xsZWN0aW9uLCBkeW5hbWljU2l6ZSwgaXNWZXJ0aWNhbCwgaXRlbVNpemUsXHJcbiAgICAgICAgICAgIGJ1ZmZlclNpemU6IG1pbkJ1ZmZlclNpemUsIHNjcm9sbFNpemUsIHNuYXAsIHN0aWNreU1hcCwgZW5hYmxlZEJ1ZmZlck9wdGltaXphdGlvbixcclxuICAgICAgICAgICAgcHJldmlvdXNUb3RhbFNpemUsIGNydWREZXRlY3RlZCwgZGVsZXRlZEl0ZW1zTWFwIH0gPSBvcHRpb25zIGFzIElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+ICYge1xyXG4gICAgICAgICAgICAgICAgc3RpY2t5TWFwOiBJVmlydHVhbExpc3RTdGlja3lNYXAsXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGJ1ZmZlclNpemUgPSBNYXRoLm1heChtaW5CdWZmZXJTaXplLCB0aGlzLl9idWZmZXJTaXplKSxcclxuICAgICAgICAgICAgeyB3aWR0aCwgaGVpZ2h0IH0gPSBib3VuZHMsIHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FLFxyXG4gICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLCB0b3RhbExlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLCB0eXBpY2FsSXRlbVNpemUgPSBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgdyA9IGlzVmVydGljYWwgPyB3aWR0aCA6IHR5cGljYWxJdGVtU2l6ZSwgaCA9IGlzVmVydGljYWwgPyB0eXBpY2FsSXRlbVNpemUgOiBoZWlnaHQsXHJcbiAgICAgICAgICAgIG1hcCA9IHRoaXMuX21hcCwgc25hcHNob3QgPSB0aGlzLl9zbmFwc2hvdCwgY2hlY2tPdmVyc2Nyb2xsSXRlbXNMaW1pdCA9IE1hdGguY2VpbChzaXplIC8gdHlwaWNhbEl0ZW1TaXplKSxcclxuICAgICAgICAgICAgc25pcHBlZFBvcyA9IE1hdGguZmxvb3Ioc2Nyb2xsU2l6ZSksIGxlZnRJdGVtc1dlaWdodHM6IEFycmF5PG51bWJlcj4gPSBbXSxcclxuICAgICAgICAgICAgaXNGcm9tSWQgPSBmcm9tSXRlbUlkICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBmcm9tSXRlbUlkID09PSAnbnVtYmVyJyAmJiBmcm9tSXRlbUlkID4gLTEpXHJcbiAgICAgICAgICAgICAgICB8fCAodHlwZW9mIGZyb21JdGVtSWQgPT09ICdzdHJpbmcnICYmIGZyb21JdGVtSWQgPiAnLTEnKTtcclxuXHJcbiAgICAgICAgbGV0IGxlZnRJdGVtc09mZnNldCA9IDAsIHJpZ2h0SXRlbXNPZmZzZXQgPSAwO1xyXG4gICAgICAgIGlmIChlbmFibGVkQnVmZmVyT3B0aW1pemF0aW9uKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxEaXJlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgMToge1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRJdGVtc09mZnNldCA9IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgcmlnaHRJdGVtc09mZnNldCA9IGJ1ZmZlclNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXNlIC0xOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zT2Zmc2V0ID0gMDtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNhc2UgMDpcclxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNPZmZzZXQgPSByaWdodEl0ZW1zT2Zmc2V0ID0gYnVmZmVyU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc09mZnNldCA9IHJpZ2h0SXRlbXNPZmZzZXQgPSBidWZmZXJTaXplO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlciA9IC0xLCBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSAwLCBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IC0xLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IDAsIHJpZ2h0SXRlbUxlbmd0aCA9IDAsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IDAsIHJpZ2h0SXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICB0b3RhbEl0ZW1zVG9EaXNwbGF5RW5kV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkFkZGVkSXRlbXMgPSAwLFxyXG4gICAgICAgICAgICBsZWZ0U2l6ZU9mVXBkYXRlZEl0ZW1zID0gMCxcclxuICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1CeUlkOiBJIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBpdGVtQnlJZFBvczogbnVtYmVyID0gMCxcclxuICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleDogbnVtYmVyID0gLTEsXHJcbiAgICAgICAgICAgIGlzVGFyZ2V0SW5PdmVyc2Nyb2xsOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICAgICAgICAgIGFjdHVhbFNjcm9sbFNpemUgPSBpdGVtQnlJZFBvcyxcclxuICAgICAgICAgICAgdG90YWxTaXplID0gMCxcclxuICAgICAgICAgICAgc3RhcnRJbmRleDogbnVtYmVyLFxyXG4gICAgICAgICAgICBpc0Zyb21JdGVtSWRGb3VuZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBkeW5hbWljIG9yIHRoZXJlIGFyZSBuZXcgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24sIHRoZW4gaXQgc3dpdGNoZXMgdG8gdGhlIGxvbmcgYWxnb3JpdGhtLlxyXG4gICAgICAgIGlmIChkeW5hbWljU2l6ZSkge1xyXG4gICAgICAgICAgICBsZXQgeSA9IDAsIHN0aWNreUNvbGxlY3Rpb25JdGVtOiBJIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLCBzdGlja3lDb21wb25lbnRTaXplID0gMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaWkgPSBpICsgMSwgY29sbGVjdGlvbkl0ZW0gPSBjb2xsZWN0aW9uW2ldLCBpZCA9IGNvbGxlY3Rpb25JdGVtLmlkO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRTaXplID0gMCwgY29tcG9uZW50U2l6ZURlbHRhID0gMCwgaXRlbURpc3BsYXlNZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcyA9IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRDtcclxuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKGlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoaWQpIHx8IHsgd2lkdGg6IHR5cGljYWxJdGVtU2l6ZSwgaGVpZ2h0OiB0eXBpY2FsSXRlbVNpemUgfTtcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplID0gYm91bmRzW3NpemVQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbURpc3BsYXlNZXRob2QgPSBib3VuZHM/Lm1ldGhvZCA/PyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFO1xyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwc2hvdEJvdW5kcyA9IHNuYXBzaG90LmdldChpZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRTbmFwc2hvdFNpemUgPSBjb21wb25lbnRTaXplIC0gKHNuYXBzaG90Qm91bmRzID8gc25hcHNob3RCb3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTaXplRGVsdGEgPSBjb21wb25lbnRTbmFwc2hvdFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGlkLCB7IC4uLmJvdW5kcywgbWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNpemVEZWx0YSA9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIHsgLi4uYm91bmRzLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChkZWxldGVkSXRlbXNNYXAuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBkZWxldGVkSXRlbXNNYXBbaV0sIHNpemUgPSBib3VuZHM/LltzaXplUHJvcGVydHldID8/IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IHNjcm9sbFNpemUgLSBzaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKz0gc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdG90YWxTaXplICs9IGNvbXBvbmVudFNpemU7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGlzRnJvbUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CeUlkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkICE9PSBmcm9tSXRlbUlkICYmIHN0aWNreU1hcCAmJiBzdGlja3lNYXBbaWRdID09PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lDb21wb25lbnRTaXplID0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbkl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA9PT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGlzcGxheUl0ZW1JbmRleCA9IGk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5Q29sbGVjdGlvbkl0ZW0gJiYgc3RpY2t5TWFwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBudW0gfSA9IHRoaXMuZ2V0RWxlbWVudE51bVRvRW5kKGksIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RhcmdldEluT3ZlcnNjcm9sbCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgLT0gc2l6ZSAtIGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0aWNreU1hcCAmJiAhc3RpY2t5TWFwW2NvbGxlY3Rpb25JdGVtLmlkXSAmJiB5ID49IHNjcm9sbFNpemUgJiYgeSA8IHNjcm9sbFNpemUgKyBzdGlja3lDb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwcGVkWSA9IHNjcm9sbFNpemUgLSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IChzbmFwcGVkWSAtIHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IHNuYXBwZWRZO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAtPSBzdGlja3lDb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC09IHN0aWNreUNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZCA9IGNvbGxlY3Rpb25JdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWRQb3MgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHkgPD0gc2Nyb2xsU2l6ZSAtIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnB1c2goY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpc0Zyb21JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnlJZCA9PT0gdW5kZWZpbmVkIHx8IHkgPCBpdGVtQnlJZFBvcyArIHNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8PSBzY3JvbGxTaXplICsgc2l6ZSArIGNvbXBvbmVudFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh5IDw9IHNjcm9sbFNpemUgLSBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zICs9IGNvbXBvbmVudFNpemVEZWx0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZURlbHRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBJdGVtRGlzcGxheU1ldGhvZHMuREVMRVRFOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBjb21wb25lbnRTaXplRGVsdGE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgeSArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRJbk92ZXJzY3JvbGwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHsgbnVtIH0gPSB0aGlzLmdldEVsZW1lbnROdW1Ub0VuZChcclxuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmxlbmd0aCAtIChjaGVja092ZXJzY3JvbGxJdGVtc0xpbWl0IDwgMCA/IDAgOiBjb2xsZWN0aW9uLmxlbmd0aCAtIGNoZWNrT3ZlcnNjcm9sbEl0ZW1zTGltaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24sIG1hcCwgdHlwaWNhbEl0ZW1TaXplLCBzaXplLCBpc1ZlcnRpY2FsLCBjb2xsZWN0aW9uLmxlbmd0aCAtIChjb2xsZWN0aW9uLmxlbmd0aCAtICh0YXJnZXREaXNwbGF5SXRlbUluZGV4ICsgMSkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChudW0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAtPSBudW07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIDw9IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPD0gLTEpIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXNGcm9tSWQgPyBpdGVtQnlJZFBvcyA6IHNjcm9sbFNpemU7XHJcblxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnNwbGljZSgwLCBsZWZ0SXRlbXNXZWlnaHRzLmxlbmd0aCAtIGxlZnRJdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodHMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCArPSB2O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgbGVmdEl0ZW1zT2Zmc2V0KTtcclxuICAgICAgICAgICAgcmlnaHRJdGVtTGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyByaWdodEl0ZW1zT2Zmc2V0ID4gdG90YWxMZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IHJpZ2h0SXRlbXNPZmZzZXQ7XHJcblxyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgIC8vIEJ1ZmZlciBvcHRpbWl6YXRpb24gZG9lcyBub3Qgd29yayBvbiBmYXN0IGxpbmVhciBhbGdvcml0aG1cclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGlmIChjcnVkRGV0ZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIGxldCB5ID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0aW9uSXRlbSA9IGNvbGxlY3Rpb25baV0sIGlkID0gY29sbGVjdGlvbkl0ZW0uaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudFNpemUgPSB0eXBpY2FsSXRlbVNpemUsIGl0ZW1EaXNwbGF5TWV0aG9kOiBJdGVtRGlzcGxheU1ldGhvZHMgPSBJdGVtRGlzcGxheU1ldGhvZHMuTk9UX0NIQU5HRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoaWQpITtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbURpc3BsYXlNZXRob2QgPSBib3VuZHM/Lm1ldGhvZCA/PyBJdGVtRGlzcGxheU1ldGhvZHMuVVBEQVRFO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbURpc3BsYXlNZXRob2QgPT09IEl0ZW1EaXNwbGF5TWV0aG9kcy5DUkVBVEUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXQoaWQsIHsgLi4uYm91bmRzLCBtZXRob2Q6IEl0ZW1EaXNwbGF5TWV0aG9kcy5OT1RfQ0hBTkdFRCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZWRJdGVtc01hcC5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib3VuZHMgPSBkZWxldGVkSXRlbXNNYXBbaV0sIHNpemUgPSBib3VuZHM/LltzaXplUHJvcGVydHldID8/IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzY3JvbGxTaXplIC0gc2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdFNpemVPZkRlbGV0ZWRJdGVtcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoeSA8IHNjcm9sbFNpemUgLSBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbURpc3BsYXlNZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkNSRUFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLlVQREFURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZVcGRhdGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSXRlbURpc3BsYXlNZXRob2RzLkRFTEVURToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRTaXplT2ZEZWxldGVkSXRlbXMgKz0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB5ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA9IE1hdGguZmxvb3Ioc2Nyb2xsU2l6ZSAvIHR5cGljYWxJdGVtU2l6ZSk7XHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gTWF0aC5jZWlsKChzY3JvbGxTaXplICsgc2l6ZSkgLyB0eXBpY2FsSXRlbVNpemUpO1xyXG4gICAgICAgICAgICBsZWZ0SXRlbUxlbmd0aCA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsIGJ1ZmZlclNpemUpO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIGJ1ZmZlclNpemUgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogYnVmZmVyU2l6ZTtcclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0ID0gbGVmdEl0ZW1MZW5ndGggKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQgPSByaWdodEl0ZW1MZW5ndGggKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCA9IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgdG90YWxTaXplID0gdG90YWxMZW5ndGggKiB0eXBpY2FsSXRlbVNpemU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBrID0gdG90YWxTaXplICE9PSAwID8gcHJldmlvdXNUb3RhbFNpemUgLyB0b3RhbFNpemUgOiAwO1xyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gc2Nyb2xsU2l6ZSAqIGs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApO1xyXG5cclxuICAgICAgICBjb25zdCBpdGVtc09uRGlzcGxheVdlaWdodCA9IHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgLSBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgLSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC0gbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyA9IGl0ZW1zT25EaXNwbGF5TGVuZ3RoICsgbGVmdEl0ZW1MZW5ndGggKyByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIGRlbHRhID0gbGVmdFNpemVPZlVwZGF0ZWRJdGVtcyArIGxlZnRTaXplT2ZBZGRlZEl0ZW1zIC0gbGVmdFNpemVPZkRlbGV0ZWRJdGVtcztcclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljczogSU1ldHJpY3MgPSB7XHJcbiAgICAgICAgICAgIGRlbHRhLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoOiB3LFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodDogaCxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXlXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIGxlZnRTaXplT2ZBZGRlZEl0ZW1zLFxyXG4gICAgICAgICAgICBzaXplUHJvcGVydHksXHJcbiAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgIHNuaXBwZWRQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXgsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICB0b3RhbFNpemUsXHJcbiAgICAgICAgICAgIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXNGcm9tSXRlbUlkRm91bmQsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG1ldHJpY3M7XHJcbiAgICB9XHJcblxyXG4gICAgY2xlYXJEZWx0YURpcmVjdGlvbigpIHtcclxuICAgICAgICB0aGlzLmNsZWFyU2Nyb2xsRGlyZWN0aW9uQ2FjaGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckRlbHRhKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IgPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX2RlbHRhID0gMDtcclxuXHJcbiAgICAgICAgaWYgKGNsZWFyRGlyZWN0aW9uRGV0ZWN0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5jbGVhclNjcm9sbERpcmVjdGlvbkNhY2hlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5idW1wVmVyc2lvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBtZXRyaWNzOiBJTWV0cmljcyk6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgIGR5bmFtaWNTaXplLFxyXG4gICAgICAgICAgICBpdGVtc09uRGlzcGxheUxlbmd0aCxcclxuICAgICAgICAgICAgaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCxcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXM6IHJlbmRlckl0ZW1zTGVuZ3RoLFxyXG4gICAgICAgICAgICBzY3JvbGxTaXplLFxyXG4gICAgICAgICAgICBzaXplUHJvcGVydHksXHJcbiAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgIHNuaXBwZWRQb3MsXHJcbiAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoLFxyXG4gICAgICAgICAgICBzdGFydEluZGV4LFxyXG4gICAgICAgICAgICB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgfSA9IG1ldHJpY3MsXHJcbiAgICAgICAgICAgIGRpc3BsYXlJdGVtczogSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiA9IFtdO1xyXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0dWFsU25pcHBlZFBvc2l0aW9uID0gc25pcHBlZFBvcywgaXNTbmFwcGluZ01ldGhvZEFkdmFuY2VkID0gdGhpcy5pc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICBib3VuZHNTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoLCBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gPSBib3VuZHNTaXplO1xyXG4gICAgICAgICAgICBsZXQgcG9zID0gc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zID0gcmVuZGVySXRlbXNMZW5ndGgsXHJcbiAgICAgICAgICAgICAgICBzdGlja3lJdGVtOiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBuZXh0U3RpY2t5OiBJUmVuZGVyVmlydHVhbExpc3RJdGVtIHwgdW5kZWZpbmVkLCBzdGlja3lJdGVtSW5kZXggPSAtMSxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gMCwgZW5kU3RpY2t5SXRlbTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCwgbmV4dEVuZFN0aWNreTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW1JbmRleCA9IC0xLCBlbmRTdGlja3lJdGVtU2l6ZSA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPiAwID8gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCA6IDAsIHRvdGFsTGVuZ3RoIC0gMSk7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtc1tpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtc1tpXS5pZCwgc3RpY2t5ID0gc3RpY2t5TWFwW2lkXSwgc2l6ZSA9IGR5bmFtaWNTaXplID8gdGhpcy5nZXQoaWQpPy5bc2l6ZVByb3BlcnR5XSB8fCB0eXBpY2FsSXRlbVNpemUgOiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0aWNreSA9PT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGlzVmVydGljYWwgPyAwIDogYWN0dWFsU25pcHBlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaXNWZXJ0aWNhbCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogaXNWZXJ0aWNhbCA/IG5vcm1hbGl6ZWRJdGVtV2lkdGggOiBzaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcxJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtID0geyBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBjb25maWcgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goc3RpY2t5SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kICsgaXRlbXNPbkRpc3BsYXlMZW5ndGggLSAxO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IE1hdGgubWluKHN0YXJ0SW5kZXgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApLCBsID0gdG90YWxMZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1zW2ldLmlkLCBzdGlja3kgPSBzdGlja3lNYXBbaWRdLCBzaXplID0gZHluYW1pY1NpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmdldChpZCk/LltzaXplUHJvcGVydHldIHx8IHR5cGljYWxJdGVtU2l6ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID09PSAyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHcgPSBpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IHNpemUsIGggPSBpc1ZlcnRpY2FsID8gc2l6ZSA6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LCBtZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGlzVmVydGljYWwgPyAwIDogYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gdyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGlzVmVydGljYWwgPyBhY3R1YWxFbmRTbmlwcGVkUG9zaXRpb24gLSBoIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcxJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtID0geyBpZCwgbWVhc3VyZXMsIGRhdGE6IGl0ZW1EYXRhLCBjb25maWcgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbUluZGV4ID0gaTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbVNpemUgPSBzaXplO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goZW5kU3RpY2t5SXRlbSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGkgPSBzdGFydEluZGV4O1xyXG5cclxuICAgICAgICAgICAgd2hpbGUgKHJlbmRlckl0ZW1zID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gdG90YWxMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1zW2ldLmlkLCBzaXplID0gZHluYW1pY1NpemUgPyB0aGlzLmdldChpZCk/LltzaXplUHJvcGVydHldIHx8IHR5cGljYWxJdGVtU2l6ZSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT09IHN0aWNreUl0ZW0/LmlkICYmIGlkICE9PSBlbmRTdGlja3lJdGVtPy5pZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNuYXBwZWQgPSBzbmFwICYmIChzdGlja3lNYXBbaWRdID09PSAxICYmIHBvcyA8PSBzY3JvbGxTaXplIHx8IHN0aWNreU1hcFtpZF0gPT09IDIgJiYgcG9zID49IHNjcm9sbFNpemUgKyBib3VuZHNTaXplIC0gc2l6ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVzID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogaXNWZXJ0aWNhbCA/IHN0aWNreU1hcFtpZF0gPT09IDEgPyAwIDogYm91bmRzU2l6ZSAtIHNpemUgOiBwb3MsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBpc1ZlcnRpY2FsID8gcG9zIDogc3RpY2t5TWFwW2lkXSA9PT0gMiA/IGJvdW5kc1NpemUgLSBzaXplIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBpc1ZlcnRpY2FsID8gbm9ybWFsaXplZEl0ZW1XaWR0aCA6IHNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGlzVmVydGljYWwgPyBzaXplIDogbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YTogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgY29uZmlnID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNWZXJ0aWNhbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreTogc3RpY2t5TWFwW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwcGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NuYXBwaW5nTWV0aG9kQWR2YW5jZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6ICcwJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNuYXBwZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnpJbmRleCA9ICcyJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1EYXRhOiBJID0gaXRlbXNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gPSB7IGlkLCBtZWFzdXJlcywgZGF0YTogaXRlbURhdGEsIGNvbmZpZyB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbmV4dFN0aWNreSAmJiBzdGlja3lJdGVtSW5kZXggPCBpICYmIHN0aWNreU1hcFtpZF0gPT09IDEgJiYgKHBvcyA8PSBzY3JvbGxTaXplICsgc2l6ZSArIHN0aWNreUl0ZW1TaXplKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnggPSBpc1ZlcnRpY2FsID8gMCA6IHNuYXBwZWQgPyBhY3R1YWxTbmlwcGVkUG9zaXRpb24gOiBwb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zIDogMDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreSA9IGl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gaXNWZXJ0aWNhbCA/IChpdGVtLm1lYXN1cmVzLnkgLSBzY3JvbGxTaXplKSA6IChpdGVtLm1lYXN1cmVzLnggLSBzY3JvbGxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuekluZGV4ID0gJzMnO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5leHRFbmRTdGlja3kgJiYgZW5kU3RpY2t5SXRlbUluZGV4ID4gaSAmJiBzdGlja3lNYXBbaWRdID09PSAyICYmIChwb3MgPj0gc2Nyb2xsU2l6ZSArIGJvdW5kc1NpemUgLSBzaXplIC0gZW5kU3RpY2t5SXRlbVNpemUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueCA9IGlzVmVydGljYWwgPyAwIDogc25hcHBlZCA/IGFjdHVhbEVuZFNuaXBwZWRQb3NpdGlvbiAtIHNpemUgOiBwb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ubWVhc3VyZXMueSA9IGlzVmVydGljYWwgPyBzbmFwcGVkID8gYWN0dWFsRW5kU25pcHBlZFBvc2l0aW9uIC0gc2l6ZSA6IHBvcyA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5LmNvbmZpZy56SW5kZXggPSAnMyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRFbmRTdGlja3kuY29uZmlnLnNuYXBwZWQgPSBzbmFwcGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gaXNWZXJ0aWNhbCA/IChpdGVtLm1lYXN1cmVzLnkgLSBzY3JvbGxTaXplKSA6IChpdGVtLm1lYXN1cmVzLnggLSBzY3JvbGxTaXplKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlJdGVtcy5wdXNoKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlbmRlckl0ZW1zIC09IDE7XHJcbiAgICAgICAgICAgICAgICBwb3MgKz0gc2l6ZTtcclxuICAgICAgICAgICAgICAgIGkrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgYXhpcyA9IGlzVmVydGljYWwgPyBZX1BST1BfTkFNRSA6IFhfUFJPUF9OQU1FO1xyXG5cclxuICAgICAgICAgICAgaWYgKG5leHRTdGlja3kgJiYgc3RpY2t5SXRlbSAmJiBuZXh0U3RpY2t5Lm1lYXN1cmVzW2F4aXNdIDw9IHNjcm9sbFNpemUgKyBzdGlja3lJdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gPiBzY3JvbGxTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5tZWFzdXJlc1theGlzXSA9IG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gLSBzdGlja3lJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLmNvbmZpZy5zbmFwcGVkID0gbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWRPdXQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnN0aWNreSA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5tZWFzdXJlcy5kZWx0YSA9IGlzVmVydGljYWwgPyBzdGlja3lJdGVtLm1lYXN1cmVzLnkgLSBzY3JvbGxTaXplIDogc3RpY2t5SXRlbS5tZWFzdXJlcy54IC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5tZWFzdXJlcy5kZWx0YSA9IGlzVmVydGljYWwgPyBuZXh0U3RpY2t5Lm1lYXN1cmVzLnkgLSBzY3JvbGxTaXplIDogbmV4dFN0aWNreS5tZWFzdXJlcy54IC0gc2Nyb2xsU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG5leHRFbmRTdGlja3kgJiYgZW5kU3RpY2t5SXRlbSAmJiBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdID49IHNjcm9sbFNpemUgKyBib3VuZHNTaXplIC0gZW5kU3RpY2t5SXRlbVNpemUgLSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW3NpemVQcm9wZXJ0eV0pIHtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdIDwgc2Nyb2xsU2l6ZSArIGJvdW5kc1NpemUgLSBlbmRTdGlja3lJdGVtU2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0ubWVhc3VyZXNbYXhpc10gPSBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzW2F4aXNdICsgbmV4dEVuZFN0aWNreS5tZWFzdXJlc1tzaXplUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgICAgIGVuZFN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWQgPSBuZXh0RW5kU3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5jb25maWcuc25hcHBlZE91dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgZW5kU3RpY2t5SXRlbS5jb25maWcuc3RpY2t5ID0gMjtcclxuICAgICAgICAgICAgICAgICAgICBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLmRlbHRhID0gaXNWZXJ0aWNhbCA/IGVuZFN0aWNreUl0ZW0ubWVhc3VyZXMueSAtIHNjcm9sbFNpemUgOiBlbmRTdGlja3lJdGVtLm1lYXN1cmVzLnggLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLmRlbHRhID0gaXNWZXJ0aWNhbCA/IG5leHRFbmRTdGlja3kubWVhc3VyZXMueSAtIHNjcm9sbFNpemUgOiBuZXh0RW5kU3RpY2t5Lm1lYXN1cmVzLnggLSBzY3JvbGxTaXplO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkaXNwbGF5SXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiB0cmFja2luZyBieSBwcm9wTmFtZVxyXG4gICAgICovXHJcbiAgICB0cmFjaygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zIHx8ICF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl90cmFja2VyLnRyYWNrKHRoaXMuX2l0ZW1zLCB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cywgdGhpcy5fc25hcGVkRGlzcGxheUNvbXBvbmVudCwgdGhpcy5zY3JvbGxEaXJlY3Rpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHNldERpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWQodjogeyBbaWQ6IG51bWJlcl06IG51bWJlciB9KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tlci5kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkID0gdjtcclxuICAgIH1cclxuXHJcbiAgICB1bnRyYWNrQ29tcG9uZW50QnlJZFByb3BlcnR5KGNvbXBvbmVudD86IEMgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aGlzLl90cmFja2VyLnVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJdGVtQm91bmRzKGlkOiBJZCk6IElTaXplIHwgdW5kZWZpbmVkIHtcclxuICAgICAgICBpZiAodGhpcy5oYXMoaWQpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNhY2hlRWxlbWVudHMoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kaXNwbGF5Q29tcG9uZW50cykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50c1tpXSwgaXRlbUlkID0gY29tcG9uZW50Lmluc3RhbmNlLml0ZW1JZDtcclxuICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBjb21wb25lbnQuaW5zdGFuY2UuZ2V0Qm91bmRzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0KGl0ZW1JZCwgYm91bmRzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzcG9zZUNsZWFyQnVmZmVyU2l6ZVRpbWVyKCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl90cmFja2VyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|