ng-virtual-list 0.7.2 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -71
- package/esm2020/lib/components/ng-virtual-list-item.component.mjs +80 -0
- package/esm2020/lib/const/index.mjs +34 -0
- package/esm2020/lib/enums/direction.mjs +2 -0
- package/esm2020/lib/enums/directions.mjs +18 -0
- package/esm2020/lib/enums/index.mjs +3 -0
- package/esm2020/lib/models/collection.model.mjs +3 -0
- package/esm2020/lib/models/index.mjs +2 -0
- package/esm2020/lib/models/item.model.mjs +3 -0
- package/esm2020/lib/models/render-collection.model.mjs +3 -0
- package/esm2020/lib/models/render-item-config.model.mjs +2 -0
- package/esm2020/lib/models/render-item.model.mjs +3 -0
- package/esm2020/lib/models/sticky-map.model.mjs +2 -0
- package/esm2020/lib/ng-virtual-list.component.mjs +510 -0
- package/esm2020/lib/ng-virtual-list.module.mjs +20 -0
- package/esm2020/lib/types/id.mjs +2 -0
- package/esm2020/lib/types/index.mjs +2 -0
- package/esm2020/lib/types/rect.mjs +2 -0
- package/esm2020/lib/types/size.mjs +2 -0
- package/esm2020/lib/utils/cacheMap.mjs +52 -0
- package/esm2020/lib/utils/debounce.mjs +31 -0
- package/esm2020/lib/utils/disposableComponent.mjs +29 -0
- package/esm2020/lib/utils/eventEmitter.mjs +106 -0
- package/esm2020/lib/utils/index.mjs +8 -0
- package/esm2020/lib/utils/isDirection.mjs +15 -0
- package/esm2020/lib/utils/toggleClassName.mjs +15 -0
- package/esm2020/lib/utils/trackBox.mjs +352 -0
- package/esm2020/lib/utils/tracker.mjs +108 -0
- package/esm2020/ng-virtual-list.mjs +5 -0
- package/esm2020/public-api.mjs +8 -0
- package/fesm2015/ng-virtual-list.mjs +1360 -0
- package/fesm2015/ng-virtual-list.mjs.map +1 -0
- package/fesm2020/ng-virtual-list.mjs +1359 -0
- package/fesm2020/ng-virtual-list.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/components/ng-virtual-list-item.component.d.ts +28 -35
- package/lib/const/index.d.ts +32 -31
- package/lib/enums/direction.d.ts +8 -2
- package/lib/enums/directions.d.ts +16 -4
- package/lib/enums/index.d.ts +4 -4
- package/lib/models/collection.model.d.ts +9 -3
- package/lib/models/index.d.ts +4 -4
- package/lib/models/item.model.d.ts +14 -5
- package/lib/models/render-collection.model.d.ts +9 -3
- package/lib/models/render-item-config.model.d.ts +33 -7
- package/lib/models/render-item.model.d.ts +28 -10
- package/lib/models/sticky-map.model.d.ts +12 -6
- package/lib/ng-virtual-list.component.d.ts +151 -110
- package/lib/ng-virtual-list.module.d.ts +9 -0
- package/lib/types/id.d.ts +7 -1
- package/lib/types/index.d.ts +4 -4
- package/lib/types/rect.d.ts +17 -5
- package/lib/types/size.d.ts +16 -4
- package/lib/utils/cacheMap.d.ts +34 -31
- package/lib/utils/debounce.d.ts +16 -10
- package/lib/utils/disposableComponent.d.ts +15 -0
- package/lib/utils/eventEmitter.d.ts +40 -37
- package/lib/utils/index.d.ts +7 -6
- package/lib/utils/isDirection.d.ts +8 -2
- package/lib/utils/toggleClassName.d.ts +7 -1
- package/lib/utils/trackBox.d.ts +113 -73
- package/lib/utils/tracker.d.ts +38 -38
- package/package.json +18 -6
- package/public-api.d.ts +4 -3
- package/fesm2022/ng-virtual-list.mjs +0 -942
- package/fesm2022/ng-virtual-list.mjs.map +0 -1
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
import { CacheMap } from "./cacheMap";
|
|
2
|
+
import { Tracker } from "./tracker";
|
|
3
|
+
import { debounce } from "./debounce";
|
|
4
|
+
import { HEIGHT_PROP_NAME, WIDTH_PROP_NAME, X_PROP_NAME, Y_PROP_NAME } from "../const";
|
|
5
|
+
export const TRACK_BOX_CHANGE_EVENT_NAME = 'change';
|
|
6
|
+
/**
|
|
7
|
+
* An object that performs tracking, calculations and caching.
|
|
8
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/utils/trackBox.ts
|
|
9
|
+
* @author Evgenii Grebennikov
|
|
10
|
+
* @email djonnyx@gmail.com
|
|
11
|
+
*/
|
|
12
|
+
export class TrackBox extends CacheMap {
|
|
13
|
+
constructor(trackingPropertyName) {
|
|
14
|
+
super();
|
|
15
|
+
this._fireChanges = (version) => {
|
|
16
|
+
this.dispatch(TRACK_BOX_CHANGE_EVENT_NAME, version);
|
|
17
|
+
};
|
|
18
|
+
this._debounceChanges = debounce(this._fireChanges, 0);
|
|
19
|
+
this._tracker = new Tracker(trackingPropertyName);
|
|
20
|
+
}
|
|
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(id, bounds) {
|
|
34
|
+
if (this._map.has(id) && JSON.stringify(this._map.get(id)) === JSON.stringify(bounds)) {
|
|
35
|
+
return this._map;
|
|
36
|
+
}
|
|
37
|
+
const v = this._map.set(id, bounds);
|
|
38
|
+
this.bumpVersion();
|
|
39
|
+
this.fireChange();
|
|
40
|
+
return v;
|
|
41
|
+
}
|
|
42
|
+
fireChange() {
|
|
43
|
+
this._debounceChanges.execute(this._version);
|
|
44
|
+
}
|
|
45
|
+
getItemPosition(id, stickyMap, options) {
|
|
46
|
+
const opt = { fromItemId: id, stickyMap, scrollDirection: undefined, ...options };
|
|
47
|
+
const { scrollSize } = this.recalculateMetrics(opt);
|
|
48
|
+
return scrollSize;
|
|
49
|
+
}
|
|
50
|
+
updateCollection(items, stickyMap, options) {
|
|
51
|
+
const opt = { stickyMap, scrollDirection: undefined, ...options };
|
|
52
|
+
this.cacheElements();
|
|
53
|
+
const metrics = this.recalculateMetrics({
|
|
54
|
+
...opt,
|
|
55
|
+
collection: items,
|
|
56
|
+
});
|
|
57
|
+
const displayItems = this.generateDisplayCollection(items, stickyMap, metrics);
|
|
58
|
+
return { displayItems, totalSize: metrics.totalSize, delta: metrics.delta };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Calculates list metrics
|
|
62
|
+
*/
|
|
63
|
+
recalculateMetrics(options) {
|
|
64
|
+
const { scrollDirection = 0, fromItemId, bounds, collection, dynamicSize, isVertical, itemSize, itemsOffset, scrollSize, snap, stickyMap } = options;
|
|
65
|
+
const { 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, totalSize = dynamicSize ? this.getBoundsFromCache(collection, typicalItemSize, isVertical) : totalLength * typicalItemSize, snippedPos = Math.floor(scrollSize), leftItemsWeights = [], isFromId = fromItemId !== undefined && (typeof fromItemId === 'number' && fromItemId > -1)
|
|
66
|
+
|| (typeof fromItemId === 'string' && fromItemId > '-1');
|
|
67
|
+
let itemsFromStartToScrollEnd = -1, itemsFromDisplayEndToOffsetEnd = 0, itemsFromStartToDisplayEnd = -1, leftItemLength = 0, rightItemLength = 0, leftItemsWeight = 0, rightItemsWeight = 0, leftHiddenItemsWeight = 0, totalItemsToDisplayEndWeight = 0, itemById = undefined, itemByIdPos = 0, lastDisplayItemId = undefined, actualScrollSize = itemByIdPos, fullHeight = 0, startIndex;
|
|
68
|
+
if (dynamicSize) {
|
|
69
|
+
let y = 0, stickyCollectionItem = undefined, stickyComponentSize = 0;
|
|
70
|
+
for (let i = 0, l = collection.length; i < l; i++) {
|
|
71
|
+
const ii = i + 1, collectionItem = collection[i], map = this._map;
|
|
72
|
+
let componentSize = 0;
|
|
73
|
+
if (map.has(collectionItem.id)) {
|
|
74
|
+
const bounds = map.get(collectionItem.id);
|
|
75
|
+
componentSize = bounds ? bounds[sizeProperty] : typicalItemSize;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
componentSize = typicalItemSize;
|
|
79
|
+
}
|
|
80
|
+
if (isFromId) {
|
|
81
|
+
if (itemById === undefined) {
|
|
82
|
+
leftItemsWeights.push(componentSize);
|
|
83
|
+
leftHiddenItemsWeight += componentSize;
|
|
84
|
+
itemsFromStartToScrollEnd = ii;
|
|
85
|
+
if (stickyMap && stickyMap[collectionItem.id] > 0) {
|
|
86
|
+
stickyComponentSize = componentSize;
|
|
87
|
+
stickyCollectionItem = collectionItem;
|
|
88
|
+
}
|
|
89
|
+
if (collectionItem.id === fromItemId) {
|
|
90
|
+
itemById = collectionItem;
|
|
91
|
+
itemByIdPos = y;
|
|
92
|
+
if (stickyCollectionItem && stickyMap && stickyMap[stickyCollectionItem.id] > 0) {
|
|
93
|
+
itemByIdPos = itemByIdPos - stickyComponentSize;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (y < scrollSize - componentSize) {
|
|
99
|
+
leftItemsWeights.push(componentSize);
|
|
100
|
+
leftHiddenItemsWeight += componentSize;
|
|
101
|
+
itemsFromStartToScrollEnd = ii;
|
|
102
|
+
}
|
|
103
|
+
if (isFromId) {
|
|
104
|
+
if (!lastDisplayItemId) {
|
|
105
|
+
if (itemById === undefined || y < itemByIdPos + size + componentSize) {
|
|
106
|
+
itemsFromStartToDisplayEnd = ii;
|
|
107
|
+
totalItemsToDisplayEndWeight += componentSize;
|
|
108
|
+
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + itemsOffset;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else if (y < scrollSize + size + componentSize) {
|
|
113
|
+
itemsFromStartToDisplayEnd = ii;
|
|
114
|
+
totalItemsToDisplayEndWeight += componentSize;
|
|
115
|
+
itemsFromDisplayEndToOffsetEnd = itemsFromStartToDisplayEnd + itemsOffset;
|
|
116
|
+
}
|
|
117
|
+
else if (i < itemsFromDisplayEndToOffsetEnd) {
|
|
118
|
+
rightItemsWeight += componentSize;
|
|
119
|
+
}
|
|
120
|
+
y += componentSize;
|
|
121
|
+
}
|
|
122
|
+
fullHeight = y;
|
|
123
|
+
if (itemsFromStartToScrollEnd === -1) {
|
|
124
|
+
itemsFromStartToScrollEnd = 0;
|
|
125
|
+
}
|
|
126
|
+
if (itemsFromStartToDisplayEnd === -1) {
|
|
127
|
+
itemsFromStartToDisplayEnd = 0;
|
|
128
|
+
}
|
|
129
|
+
actualScrollSize = isFromId ? itemByIdPos : scrollSize;
|
|
130
|
+
leftItemsWeights.splice(0, leftItemsWeights.length - itemsOffset);
|
|
131
|
+
leftItemsWeights.forEach(v => {
|
|
132
|
+
leftItemsWeight += v;
|
|
133
|
+
});
|
|
134
|
+
leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);
|
|
135
|
+
rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength
|
|
136
|
+
? totalLength - itemsFromStartToDisplayEnd : itemsOffset;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
itemsFromStartToScrollEnd = Math.floor(scrollSize / typicalItemSize);
|
|
140
|
+
itemsFromStartToDisplayEnd = Math.ceil((scrollSize + size) / typicalItemSize);
|
|
141
|
+
leftItemLength = Math.min(itemsFromStartToScrollEnd, itemsOffset);
|
|
142
|
+
rightItemLength = itemsFromStartToDisplayEnd + itemsOffset > totalLength
|
|
143
|
+
? totalLength - itemsFromStartToDisplayEnd : itemsOffset;
|
|
144
|
+
leftItemsWeight = leftItemLength * typicalItemSize;
|
|
145
|
+
rightItemsWeight = rightItemLength * typicalItemSize,
|
|
146
|
+
leftHiddenItemsWeight = itemsFromStartToScrollEnd * typicalItemSize,
|
|
147
|
+
totalItemsToDisplayEndWeight = itemsFromStartToDisplayEnd * typicalItemSize;
|
|
148
|
+
actualScrollSize = scrollSize,
|
|
149
|
+
fullHeight = totalLength * typicalItemSize;
|
|
150
|
+
}
|
|
151
|
+
startIndex = Math.min(itemsFromStartToScrollEnd - leftItemLength, totalLength > 0 ? totalLength - 1 : 0);
|
|
152
|
+
const itemsOnDisplay = totalItemsToDisplayEndWeight - leftHiddenItemsWeight, itemsOnDisplayLength = itemsFromStartToDisplayEnd - itemsFromStartToScrollEnd, startPosition = leftHiddenItemsWeight - leftItemsWeight, renderItems = itemsOnDisplayLength + leftItemLength + rightItemLength, delta = fullHeight - this._previouseFullHeigh;
|
|
153
|
+
if (scrollDirection === -1) {
|
|
154
|
+
this._delta += delta;
|
|
155
|
+
}
|
|
156
|
+
const metrics = {
|
|
157
|
+
delta: this._delta,
|
|
158
|
+
normalizedItemWidth: w,
|
|
159
|
+
normalizedItemHeight: h,
|
|
160
|
+
width,
|
|
161
|
+
height,
|
|
162
|
+
dynamicSize,
|
|
163
|
+
itemSize,
|
|
164
|
+
itemsFromStartToScrollEnd,
|
|
165
|
+
itemsFromStartToDisplayEnd,
|
|
166
|
+
itemsOnDisplay,
|
|
167
|
+
itemsOnDisplayLength,
|
|
168
|
+
isVertical,
|
|
169
|
+
leftHiddenItemsWeight,
|
|
170
|
+
leftItemLength,
|
|
171
|
+
leftItemsWeight,
|
|
172
|
+
renderItems,
|
|
173
|
+
rightItemLength,
|
|
174
|
+
rightItemsWeight,
|
|
175
|
+
scrollSize: actualScrollSize,
|
|
176
|
+
sizeProperty,
|
|
177
|
+
snap,
|
|
178
|
+
snippedPos,
|
|
179
|
+
startIndex,
|
|
180
|
+
startPosition,
|
|
181
|
+
totalItemsToDisplayEndWeight,
|
|
182
|
+
totalLength,
|
|
183
|
+
totalSize,
|
|
184
|
+
typicalItemSize,
|
|
185
|
+
};
|
|
186
|
+
if (scrollDirection !== 0) {
|
|
187
|
+
this._previouseFullHeigh = fullHeight;
|
|
188
|
+
}
|
|
189
|
+
return metrics;
|
|
190
|
+
}
|
|
191
|
+
clearDelta() {
|
|
192
|
+
this._delta = 0;
|
|
193
|
+
}
|
|
194
|
+
generateDisplayCollection(items, stickyMap, metrics) {
|
|
195
|
+
const {
|
|
196
|
+
// delta,
|
|
197
|
+
normalizedItemWidth, normalizedItemHeight,
|
|
198
|
+
// width,
|
|
199
|
+
// height,
|
|
200
|
+
dynamicSize,
|
|
201
|
+
// itemSize,
|
|
202
|
+
itemsFromStartToScrollEnd,
|
|
203
|
+
// itemsFromStartToDisplayEnd,
|
|
204
|
+
// itemsOnDisplay,
|
|
205
|
+
// itemsOnDisplayLength,
|
|
206
|
+
isVertical,
|
|
207
|
+
// leftHiddenItemsWeight,
|
|
208
|
+
// leftItemLength,
|
|
209
|
+
// leftItemsWeight,
|
|
210
|
+
renderItems: renderItemsLength,
|
|
211
|
+
// rightItemLength,
|
|
212
|
+
// rightItemsWeight,
|
|
213
|
+
scrollSize, sizeProperty, snap, snippedPos, startPosition,
|
|
214
|
+
// totalItemsToDisplayEndWeight,
|
|
215
|
+
totalLength,
|
|
216
|
+
// totalSize,
|
|
217
|
+
startIndex, typicalItemSize, } = metrics, displayItems = [];
|
|
218
|
+
if (items.length) {
|
|
219
|
+
const actualSnippedPosition = snippedPos;
|
|
220
|
+
let pos = startPosition, renderItems = renderItemsLength, stickyItem, nextSticky, stickyItemIndex = -1, stickyItemSize = 0;
|
|
221
|
+
if (snap) {
|
|
222
|
+
for (let i = Math.min(itemsFromStartToScrollEnd > 0 ? itemsFromStartToScrollEnd : 0, totalLength - 1); i >= 0; i--) {
|
|
223
|
+
const id = items[i].id, sticky = stickyMap[id], size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;
|
|
224
|
+
stickyItemSize = size;
|
|
225
|
+
if (sticky > 0) {
|
|
226
|
+
const measures = {
|
|
227
|
+
x: isVertical ? 0 : actualSnippedPosition,
|
|
228
|
+
y: isVertical ? actualSnippedPosition : 0,
|
|
229
|
+
width: normalizedItemWidth,
|
|
230
|
+
height: normalizedItemHeight,
|
|
231
|
+
}, config = {
|
|
232
|
+
isVertical,
|
|
233
|
+
sticky,
|
|
234
|
+
snap,
|
|
235
|
+
snapped: true,
|
|
236
|
+
snappedOut: false,
|
|
237
|
+
dynamic: dynamicSize,
|
|
238
|
+
};
|
|
239
|
+
const itemData = items[i];
|
|
240
|
+
stickyItem = { id, measures, data: itemData, config };
|
|
241
|
+
stickyItemIndex = i;
|
|
242
|
+
displayItems.push(stickyItem);
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
let i = startIndex;
|
|
248
|
+
while (renderItems > 0) {
|
|
249
|
+
if (i >= totalLength) {
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
const id = items[i].id, size = dynamicSize ? this.get(id)?.[sizeProperty] || typicalItemSize : typicalItemSize;
|
|
253
|
+
if (id !== stickyItem?.id) {
|
|
254
|
+
const snapped = snap && stickyMap[id] > 0 && pos <= scrollSize, measures = {
|
|
255
|
+
x: isVertical ? 0 : pos,
|
|
256
|
+
y: isVertical ? pos : 0,
|
|
257
|
+
width: normalizedItemWidth,
|
|
258
|
+
height: normalizedItemHeight,
|
|
259
|
+
}, config = {
|
|
260
|
+
isVertical,
|
|
261
|
+
sticky: stickyMap[id],
|
|
262
|
+
snap,
|
|
263
|
+
snapped: false,
|
|
264
|
+
snappedOut: false,
|
|
265
|
+
dynamic: dynamicSize,
|
|
266
|
+
};
|
|
267
|
+
const itemData = items[i];
|
|
268
|
+
const item = { id, measures, data: itemData, config };
|
|
269
|
+
if (!nextSticky && stickyItemIndex < i && snap && stickyMap[id] > 0 && pos <= scrollSize + size) {
|
|
270
|
+
item.measures.x = isVertical ? 0 : snapped ? actualSnippedPosition : pos;
|
|
271
|
+
item.measures.y = isVertical ? snapped ? actualSnippedPosition : pos : 0;
|
|
272
|
+
nextSticky = item;
|
|
273
|
+
nextSticky.config.snapped = snapped;
|
|
274
|
+
}
|
|
275
|
+
displayItems.push(item);
|
|
276
|
+
}
|
|
277
|
+
renderItems -= 1;
|
|
278
|
+
pos += size;
|
|
279
|
+
i++;
|
|
280
|
+
}
|
|
281
|
+
const axis = isVertical ? Y_PROP_NAME : X_PROP_NAME;
|
|
282
|
+
if (nextSticky && stickyItem && nextSticky.measures[axis] <= scrollSize + stickyItemSize) {
|
|
283
|
+
if (nextSticky.measures[axis] > scrollSize) {
|
|
284
|
+
stickyItem.measures[axis] = nextSticky.measures[axis] - stickyItemSize;
|
|
285
|
+
stickyItem.config.snapped = nextSticky.config.snapped = false;
|
|
286
|
+
stickyItem.config.snappedOut = true;
|
|
287
|
+
stickyItem.config.sticky = 1;
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
nextSticky.config.snapped = true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return displayItems;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* tracking by propName
|
|
298
|
+
*/
|
|
299
|
+
track() {
|
|
300
|
+
if (!this._items || !this._displayComponents) {
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
this._tracker.track(this._items, this._displayComponents);
|
|
304
|
+
}
|
|
305
|
+
setDisplayObjectIndexMapById(v) {
|
|
306
|
+
this._tracker.displayObjectIndexMapById = v;
|
|
307
|
+
}
|
|
308
|
+
untrackComponentByIdProperty(component) {
|
|
309
|
+
this._tracker.untrackComponentByIdProperty(component);
|
|
310
|
+
}
|
|
311
|
+
cacheElements() {
|
|
312
|
+
if (!this._displayComponents) {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
for (let i = 0, l = this._displayComponents.length; i < l; i++) {
|
|
316
|
+
const component = this._displayComponents[i], itemId = component.instance.itemId;
|
|
317
|
+
if (itemId === undefined) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
const bounds = component.instance.getBounds();
|
|
321
|
+
this.set(itemId, bounds);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Returns calculated bounds from cache
|
|
326
|
+
*/
|
|
327
|
+
getBoundsFromCache(items, typicalItemSize, isVertical) {
|
|
328
|
+
const sizeProperty = isVertical ? HEIGHT_PROP_NAME : WIDTH_PROP_NAME, map = this._map;
|
|
329
|
+
let size = 0;
|
|
330
|
+
for (let i = 0, l = items.length; i < l; i++) {
|
|
331
|
+
const item = items[i];
|
|
332
|
+
if (map.has(item.id)) {
|
|
333
|
+
const bounds = map.get(item.id);
|
|
334
|
+
size += bounds ? bounds[sizeProperty] : typicalItemSize;
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
size += typicalItemSize;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return size;
|
|
341
|
+
}
|
|
342
|
+
dispose() {
|
|
343
|
+
super.dispose();
|
|
344
|
+
if (this._debounceChanges) {
|
|
345
|
+
this._debounceChanges.dispose();
|
|
346
|
+
}
|
|
347
|
+
if (this._tracker) {
|
|
348
|
+
this._tracker.dispose();
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tCb3guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja0JveC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFHdkYsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsUUFBUSxDQUFDO0FBc0RwRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxRQUFTLFNBQVEsUUFBc0Q7SUF1QmhGLFlBQVksb0JBQTRCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBbUJKLGlCQUFZLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtZQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLDJCQUEyQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQztRQUVNLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBckJ0RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQXRCRCxJQUFJLEtBQUssQ0FBQyxDQUFrRDtRQUN4RCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFJRCxJQUFJLGlCQUFpQixDQUFDLENBQXFFO1FBQ3ZGLElBQUksSUFBSSxDQUFDLGtCQUFr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VUFBVSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3RGLElBQUksSUFBSSxHQUFXLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUNsQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDaEMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7YUFDM0Q7aUJBQU07Z0JBQ0gsSUFBSSxJQUFJLGVBQWUsQ0FBQzthQUMzQjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVRLE9BQU87UUFDWixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFaEIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ25DO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMzQjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbmctdmlydHVhbC1saXN0LWl0ZW0uY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IElWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfSBmcm9tIFwiLi4vbW9kZWxzL2NvbGxlY3Rpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0Q29sbGVjdGlvbiB9IGZyb20gXCIuLi9tb2RlbHMvcmVuZGVyLWNvbGxlY3Rpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgSVJlbmRlclZpcnR1YWxMaXN0SXRlbSB9IGZyb20gXCIuLi9tb2RlbHMvcmVuZGVyLWl0ZW0ubW9kZWxcIjtcclxuaW1wb3J0IHsgSWQgfSBmcm9tIFwiLi4vdHlwZXMvaWRcIjtcclxuaW1wb3J0IHsgSVJlY3QgfSBmcm9tIFwiLi4vdHlwZXMvcmVjdFwiO1xyXG5pbXBvcnQgeyBDYWNoZU1hcCB9IGZyb20gXCIuL2NhY2hlTWFwXCI7XHJcbmltcG9ydCB7IFRyYWNrZXIgfSBmcm9tIFwiLi90cmFja2VyXCI7XHJcbmltcG9ydCB7IElTaXplIH0gZnJvbSBcIi4uL3R5cGVzXCI7XHJcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSBcIi4vZGVib3VuY2VcIjtcclxuaW1wb3J0IHsgSEVJR0hUX1BST1BfTkFNRSwgV0lEVEhfUFJPUF9OQU1FLCBYX1BST1BfTkFNRSwgWV9QUk9QX05BTUUgfSBmcm9tIFwiLi4vY29uc3RcIjtcclxuaW1wb3J0IHsgSVZpcnR1YWxMaXN0U3RpY2t5TWFwIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xyXG5cclxuZXhwb3J0IGNvbnN0IFRSQUNLX0JPWF9DSEFOR0VfRVZFTlRfTkFNRSA9ICdjaGFuZ2UnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJTWV0cmljcyB7XHJcbiAgICBkZWx0YTogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1XaWR0aDogbnVtYmVyO1xyXG4gICAgbm9ybWFsaXplZEl0ZW1IZWlnaHQ6IG51bWJlcjtcclxuICAgIHdpZHRoOiBudW1iZXI7XHJcbiAgICBoZWlnaHQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgaXRlbVNpemU6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQ6IG51bWJlcjtcclxuICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kOiBudW1iZXI7XHJcbiAgICBpdGVtc09uRGlzcGxheTogbnVtYmVyO1xyXG4gICAgaXRlbXNPbkRpc3BsYXlMZW5ndGg6IG51bWJlcjtcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIGxlZnRJdGVtTGVuZ3RoOiBudW1iZXI7XHJcbiAgICBsZWZ0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHJlbmRlckl0ZW1zOiBudW1iZXI7XHJcbiAgICByaWdodEl0ZW1MZW5ndGg6IG51bWJlcjtcclxuICAgIHJpZ2h0SXRlbXNXZWlnaHQ6IG51bWJlcjtcclxuICAgIHNjcm9sbFNpemU6IG51bWJlcjtcclxuICAgIHNpemVQcm9wZXJ0eTogdHlwZW9mIEhFSUdIVF9QUk9QX05BTUUgfCB0eXBlb2YgV0lEVEhfUFJPUF9OQU1FO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIHNuaXBwZWRQb3M6IG51bWJlcjtcclxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcjtcclxuICAgIHN0YXJ0UG9zaXRpb246IG51bWJlcjtcclxuICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQ6IG51bWJlcjtcclxuICAgIHRvdGFsTGVuZ3RoOiBudW1iZXI7XHJcbiAgICB0b3RhbFNpemU6IG51bWJlcjtcclxuICAgIHR5cGljYWxJdGVtU2l6ZTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBTY3JvbGxEaXJlY3Rpb24gPSAtMSB8IDAgfCAxO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PiB7XHJcbiAgICBib3VuZHM6IElTaXplO1xyXG4gICAgY29sbGVjdGlvbjogQztcclxuICAgIGlzVmVydGljYWw6IGJvb2xlYW47XHJcbiAgICBpdGVtU2l6ZTogbnVtYmVyO1xyXG4gICAgaXRlbXNPZmZzZXQ6IG51bWJlcjtcclxuICAgIGR5bmFtaWNTaXplOiBib29sZWFuO1xyXG4gICAgc2Nyb2xsU2l6ZTogbnVtYmVyO1xyXG4gICAgc25hcDogYm9vbGVhbjtcclxuICAgIGZyb21JdGVtSWQ/OiBJZDtcclxuICAgIHNjcm9sbERpcmVjdGlvbj86IFNjcm9sbERpcmVjdGlvbjtcclxufVxyXG5cclxudHlwZSBDYWNoZU1hcEV2ZW50cyA9IHR5cGVvZiBUUkFDS19CT1hfQ0hBTkdFX0VWRU5UX05BTUU7XHJcblxyXG50eXBlIE9uQ2hhbmdlRXZlbnRMaXN0ZW5lciA9ICh2ZXJzaW9uOiBudW1iZXIpID0+IHZvaWQ7XHJcblxyXG50eXBlIENhY2hlTWFwTGlzdGVuZXJzID0gT25DaGFuZ2VFdmVudExpc3RlbmVyO1xyXG5cclxuLyoqXHJcbiAqIEFuIG9iamVjdCB0aGF0IHBlcmZvcm1zIHRyYWNraW5nLCBjYWxjdWxhdGlvbnMgYW5kIGNhY2hpbmcuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iL21haW4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvdXRpbHMvdHJhY2tCb3gudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEdyZWJlbm5pa292XHJcbiAqIEBlbWFpbCBkam9ubnl4QGdtYWlsLmNvbVxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIFRyYWNrQm94IGV4dGVuZHMgQ2FjaGVNYXA8SWQsIElSZWN0LCBDYWNoZU1hcEV2ZW50cywgQ2FjaGVNYXBMaXN0ZW5lcnM+IHtcclxuICAgIHByb3RlY3RlZCBfdHJhY2tlciE6IFRyYWNrZXI8SVJlbmRlclZpcnR1YWxMaXN0SXRlbSwgTmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+O1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBpdGVtcyh2OiBJUmVuZGVyVmlydHVhbExpc3RDb2xsZWN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pdGVtcyA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9pdGVtcyA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9kaXNwbGF5Q29tcG9uZW50czogQXJyYXk8Q29tcG9uZW50UmVmPE5nVmlydHVhbExpc3RJdGVtQ29tcG9uZW50Pj4gfCBudWxsIHwgdW5kZWZpbmVkO1xyXG5cclxuICAgIHNldCBkaXNwbGF5Q29tcG9uZW50cyh2OiBBcnJheTxDb21wb25lbnRSZWY8TmdWaXJ0dWFsTGlzdEl0ZW1Db21wb25lbnQ+PiB8IG51bGwgfCB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPT09IHYpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGlzcGxheUNvbXBvbmVudHMgPSB2O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHRyYWNraW5nUHJvcGVydHlOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG5cclxuICAgICAgICB0aGlzLl90cmFja2VyID0gbmV3IFRyYWNrZXIodHJhY2tpbmdQcm9wZXJ0eU5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHNldChpZDogSWQsIGJvdW5kczogSVJlY3QpOiBNYXA8SWQsIElSZWN0PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX21hcC5oYXMoaWQpICYmIEpTT04uc3RyaW5naWZ5KHRoaXMuX21hcC5nZXQoaWQpKSA9PT0gSlNPTi5zdHJpbmdpZnkoYm91bmRzKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdiA9IHRoaXMuX21hcC5zZXQoaWQsIGJvdW5kcyk7XHJcblxyXG4gICAgICAgIHRoaXMuYnVtcFZlcnNpb24oKTtcclxuXHJcbiAgICAgICAgdGhpcy5maXJlQ2hhbmdlKCk7XHJcblxyXG4gICAgICAgIHJldHVybiB2O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2ZpcmVDaGFuZ2VzID0gKHZlcnNpb246IG51bWJlcikgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlzcGF0Y2goVFJBQ0tfQk9YX0NIQU5HRV9FVkVOVF9OQU1FLCB2ZXJzaW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgcHJpdmF0ZSBfZGVib3VuY2VDaGFuZ2VzID0gZGVib3VuY2UodGhpcy5fZmlyZUNoYW5nZXMsIDApO1xyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYm91bmNlQ2hhbmdlcy5leGVjdXRlKHRoaXMuX3ZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEl0ZW1Qb3NpdGlvbjxJIGV4dGVuZHMgeyBpZDogSWQgfSwgQyBleHRlbmRzIEFycmF5PEk+PihpZDogSWQsIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLCBvcHRpb25zOiBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPik6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3Qgb3B0ID0geyBmcm9tSXRlbUlkOiBpZCwgc3RpY2t5TWFwLCBzY3JvbGxEaXJlY3Rpb246IHVuZGVmaW5lZCwgLi4ub3B0aW9ucyB9O1xyXG4gICAgICAgIGNvbnN0IHsgc2Nyb2xsU2l6ZSB9ID0gdGhpcy5yZWNhbGN1bGF0ZU1ldHJpY3Mob3B0KTtcclxuICAgICAgICByZXR1cm4gc2Nyb2xsU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBvcHRpb25zOiBPbWl0PElSZWNhbGN1bGF0ZU1ldHJpY3NPcHRpb25zPEksIEM+LCAnY29sbGVjdGlvbic+KTogeyBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb247IHRvdGFsU2l6ZTogbnVtYmVyOyBkZWx0YTogbnVtYmVyOyB9IHtcclxuICAgICAgICBjb25zdCBvcHQgPSB7IHN0aWNreU1hcCwgc2Nyb2xsRGlyZWN0aW9uOiB1bmRlZmluZWQsIC4uLm9wdGlvbnMgfTtcclxuICAgICAgICB0aGlzLmNhY2hlRWxlbWVudHMoKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IHRoaXMucmVjYWxjdWxhdGVNZXRyaWNzKHtcclxuICAgICAgICAgICAgLi4ub3B0LFxyXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiBpdGVtcyxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgZGlzcGxheUl0ZW1zID0gdGhpcy5nZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uKGl0ZW1zLCBzdGlja3lNYXAsIG1ldHJpY3MpO1xyXG4gICAgICAgIHJldHVybiB7IGRpc3BsYXlJdGVtcywgdG90YWxTaXplOiBtZXRyaWNzLnRvdGFsU2l6ZSwgZGVsdGE6IG1ldHJpY3MuZGVsdGEgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENhbGN1bGF0ZXMgbGlzdCBtZXRyaWNzXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCByZWNhbGN1bGF0ZU1ldHJpY3M8SSBleHRlbmRzIHsgaWQ6IElkIH0sIEMgZXh0ZW5kcyBBcnJheTxJPj4ob3B0aW9uczogSVJlY2FsY3VsYXRlTWV0cmljc09wdGlvbnM8SSwgQz4pOiBJTWV0cmljcyB7XHJcbiAgICAgICAgY29uc3QgeyBzY3JvbGxEaXJlY3Rpb24gPSAwLCBmcm9tSXRlbUlkLCBib3VuZHMsIGNvbGxlY3Rpb24sIGR5bmFtaWNTaXplLCBpc1ZlcnRpY2FsLCBpdGVtU2l6ZSxcclxuICAgICAgICAgICAgaXRlbXNPZmZzZXQsIHNjcm9sbFNpemUsIHNuYXAsIHN0aWNreU1hcCB9ID0gb3B0aW9ucyBhcyBJUmVjYWxjdWxhdGVNZXRyaWNzT3B0aW9uczxJLCBDPiAmIHtcclxuICAgICAgICAgICAgICAgIHN0aWNreU1hcDogSVZpcnR1YWxMaXN0U3RpY2t5TWFwLFxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGJvdW5kcywgc2l6ZVByb3BlcnR5ID0gaXNWZXJ0aWNhbCA/IEhFSUdIVF9QUk9QX05BTUUgOiBXSURUSF9QUk9QX05BTUUsIHNpemUgPSBpc1ZlcnRpY2FsID8gaGVpZ2h0IDogd2lkdGgsXHJcbiAgICAgICAgICAgIHRvdGFsTGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGgsIHR5cGljYWxJdGVtU2l6ZSA9IGl0ZW1TaXplLFxyXG4gICAgICAgICAgICB3ID0gaXNWZXJ0aWNhbCA/IHdpZHRoIDogdHlwaWNhbEl0ZW1TaXplLCBoID0gaXNWZXJ0aWNhbCA/IHR5cGljYWxJdGVtU2l6ZSA6IGhlaWdodCxcclxuICAgICAgICAgICAgdG90YWxTaXplID0gZHluYW1pY1NpemUgPyB0aGlzLmdldEJvdW5kc0Zyb21DYWNoZShjb2xsZWN0aW9uLCB0eXBpY2FsSXRlbVNpemUsIGlzVmVydGljYWwpIDogdG90YWxMZW5ndGggKiB0eXBpY2FsSXRlbVNpemUsXHJcbiAgICAgICAgICAgIHNuaXBwZWRQb3MgPSBNYXRoLmZsb29yKHNjcm9sbFNpemUpLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzOiBBcnJheTxudW1iZXI+ID0gW10sXHJcbiAgICAgICAgICAgIGlzRnJvbUlkID0gZnJvbUl0ZW1JZCAhPT0gdW5kZWZpbmVkICYmICh0eXBlb2YgZnJvbUl0ZW1JZCA9PT0gJ251bWJlcicgJiYgZnJvbUl0ZW1JZCA+IC0xKVxyXG4gICAgICAgICAgICAgICAgfHwgKHR5cGVvZiBmcm9tSXRlbUlkID09PSAnc3RyaW5nJyAmJiBmcm9tSXRlbUlkID4gJy0xJyk7XHJcblxyXG4gICAgICAgIGxldCBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kOiBudW1iZXIgPSAtMSwgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gMCwgaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPSAtMSxcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSAwLCByaWdodEl0ZW1MZW5ndGggPSAwLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQgPSAwLCByaWdodEl0ZW1zV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gMCxcclxuICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCA9IDAsXHJcbiAgICAgICAgICAgIGl0ZW1CeUlkOiBJIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBpdGVtQnlJZFBvczogbnVtYmVyID0gMCxcclxuICAgICAgICAgICAgbGFzdERpc3BsYXlJdGVtSWQ6IElkIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhY3R1YWxTY3JvbGxTaXplID0gaXRlbUJ5SWRQb3MsXHJcbiAgICAgICAgICAgIGZ1bGxIZWlnaHQgPSAwLFxyXG4gICAgICAgICAgICBzdGFydEluZGV4O1xyXG5cclxuICAgICAgICBpZiAoZHluYW1pY1NpemUpIHtcclxuICAgICAgICAgICAgbGV0IHkgPSAwLCBzdGlja3lDb2xsZWN0aW9uSXRlbTogSSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCwgc3RpY2t5Q29tcG9uZW50U2l6ZSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlpID0gaSArIDEsIGNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbltpXSwgbWFwID0gdGhpcy5fbWFwO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnRTaXplID0gMDtcclxuICAgICAgICAgICAgICAgIGlmIChtYXAuaGFzKGNvbGxlY3Rpb25JdGVtLmlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcC5nZXQoY29sbGVjdGlvbkl0ZW0uaWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFNpemUgPSBib3VuZHMgPyBib3VuZHNbc2l6ZVByb3BlcnR5XSA6IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2l6ZSA9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUJ5SWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHRzLnB1c2goY29tcG9uZW50U2l6ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gaWk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5TWFwICYmIHN0aWNreU1hcFtjb2xsZWN0aW9uSXRlbS5pZF0gPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3lDb21wb25lbnRTaXplID0gY29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUNvbGxlY3Rpb25JdGVtID0gY29sbGVjdGlvbkl0ZW07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uSXRlbS5pZCA9PT0gZnJvbUl0ZW1JZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUJ5SWQgPSBjb2xsZWN0aW9uSXRlbTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1CeUlkUG9zID0geTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGlja3lDb2xsZWN0aW9uSXRlbSAmJiBzdGlja3lNYXAgJiYgc3RpY2t5TWFwW3N0aWNreUNvbGxlY3Rpb25JdGVtLmlkXSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQnlJZFBvcyA9IGl0ZW1CeUlkUG9zIC0gc3RpY2t5Q29tcG9uZW50U2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8IHNjcm9sbFNpemUgLSBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5wdXNoKGNvbXBvbmVudFNpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxlZnRIaWRkZW5JdGVtc1dlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSBpaTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaXNGcm9tSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3REaXNwbGF5SXRlbUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnlJZCA9PT0gdW5kZWZpbmVkIHx8IHkgPCBpdGVtQnlJZFBvcyArIHNpemUgKyBjb21wb25lbnRTaXplKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IGlpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNGcm9tRGlzcGxheUVuZFRvT2Zmc2V0RW5kID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgKyBpdGVtc09mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeSA8IHNjcm9sbFNpemUgKyBzaXplICsgY29tcG9uZW50U2l6ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kID0gaWk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zRnJvbURpc3BsYXlFbmRUb09mZnNldEVuZCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPCBpdGVtc0Zyb21EaXNwbGF5RW5kVG9PZmZzZXRFbmQpIHtcclxuICAgICAgICAgICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ICs9IGNvbXBvbmVudFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgeSArPSBjb21wb25lbnRTaXplO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZ1bGxIZWlnaHQgPSB5O1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgPT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IGlzRnJvbUlkID8gaXRlbUJ5SWRQb3MgOiBzY3JvbGxTaXplO1xyXG5cclxuICAgICAgICAgICAgbGVmdEl0ZW1zV2VpZ2h0cy5zcGxpY2UoMCwgbGVmdEl0ZW1zV2VpZ2h0cy5sZW5ndGggLSBpdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodHMuZm9yRWFjaCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCArPSB2O1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoID0gTWF0aC5taW4oaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCwgaXRlbXNPZmZzZXQpO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGggPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCArIGl0ZW1zT2Zmc2V0ID4gdG90YWxMZW5ndGhcclxuICAgICAgICAgICAgICAgID8gdG90YWxMZW5ndGggLSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA6IGl0ZW1zT2Zmc2V0O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgPSBNYXRoLmZsb29yKHNjcm9sbFNpemUgLyB0eXBpY2FsSXRlbVNpemUpO1xyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCA9IE1hdGguY2VpbCgoc2Nyb2xsU2l6ZSArIHNpemUpIC8gdHlwaWNhbEl0ZW1TaXplKTtcclxuICAgICAgICAgICAgbGVmdEl0ZW1MZW5ndGggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLCBpdGVtc09mZnNldCk7XHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbUxlbmd0aCA9IGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kICsgaXRlbXNPZmZzZXQgPiB0b3RhbExlbmd0aFxyXG4gICAgICAgICAgICAgICAgPyB0b3RhbExlbmd0aCAtIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kIDogaXRlbXNPZmZzZXQ7XHJcbiAgICAgICAgICAgIGxlZnRJdGVtc1dlaWdodCA9IGxlZnRJdGVtTGVuZ3RoICogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICByaWdodEl0ZW1zV2VpZ2h0ID0gcmlnaHRJdGVtTGVuZ3RoICogdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgICAgICAgICAgbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0ID0gaXRlbXNGcm9tU3RhcnRUb1Njcm9sbEVuZCAqIHR5cGljYWxJdGVtU2l6ZSxcclxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgPSBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCAqIHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgYWN0dWFsU2Nyb2xsU2l6ZSA9IHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgICAgICBmdWxsSGVpZ2h0ID0gdG90YWxMZW5ndGggKiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHN0YXJ0SW5kZXggPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kIC0gbGVmdEl0ZW1MZW5ndGgsIHRvdGFsTGVuZ3RoID4gMCA/IHRvdGFsTGVuZ3RoIC0gMSA6IDApO1xyXG5cclxuICAgICAgICBjb25zdCBpdGVtc09uRGlzcGxheSA9IHRvdGFsSXRlbXNUb0Rpc3BsYXlFbmRXZWlnaHQgLSBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoID0gaXRlbXNGcm9tU3RhcnRUb0Rpc3BsYXlFbmQgLSBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gbGVmdEhpZGRlbkl0ZW1zV2VpZ2h0IC0gbGVmdEl0ZW1zV2VpZ2h0LFxyXG4gICAgICAgICAgICByZW5kZXJJdGVtcyA9IGl0ZW1zT25EaXNwbGF5TGVuZ3RoICsgbGVmdEl0ZW1MZW5ndGggKyByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIGRlbHRhID0gZnVsbEhlaWdodCAtIHRoaXMuX3ByZXZpb3VzZUZ1bGxIZWlnaDtcclxuXHJcbiAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5fZGVsdGEgKz0gZGVsdGE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBtZXRyaWNzOiBJTWV0cmljcyA9IHtcclxuICAgICAgICAgICAgZGVsdGE6IHRoaXMuX2RlbHRhLFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbVdpZHRoOiB3LFxyXG4gICAgICAgICAgICBub3JtYWxpemVkSXRlbUhlaWdodDogaCxcclxuICAgICAgICAgICAgd2lkdGgsXHJcbiAgICAgICAgICAgIGhlaWdodCxcclxuICAgICAgICAgICAgZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgIGl0ZW1TaXplLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kLFxyXG4gICAgICAgICAgICBpdGVtc0Zyb21TdGFydFRvRGlzcGxheUVuZCxcclxuICAgICAgICAgICAgaXRlbXNPbkRpc3BsYXksXHJcbiAgICAgICAgICAgIGl0ZW1zT25EaXNwbGF5TGVuZ3RoLFxyXG4gICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICBsZWZ0SGlkZGVuSXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIGxlZnRJdGVtTGVuZ3RoLFxyXG4gICAgICAgICAgICBsZWZ0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHJlbmRlckl0ZW1zLFxyXG4gICAgICAgICAgICByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIHJpZ2h0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemU6IGFjdHVhbFNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIHNpemVQcm9wZXJ0eSxcclxuICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgc25pcHBlZFBvcyxcclxuICAgICAgICAgICAgc3RhcnRJbmRleCxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCxcclxuICAgICAgICAgICAgdG90YWxMZW5ndGgsXHJcbiAgICAgICAgICAgIHRvdGFsU2l6ZSxcclxuICAgICAgICAgICAgdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChzY3JvbGxEaXJlY3Rpb24gIT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNlRnVsbEhlaWdoID0gZnVsbEhlaWdodDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtZXRyaWNzO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyRGVsdGEoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fZGVsdGEgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZW5lcmF0ZURpc3BsYXlDb2xsZWN0aW9uPEkgZXh0ZW5kcyB7IGlkOiBJZCB9LCBDIGV4dGVuZHMgQXJyYXk8ST4+KGl0ZW1zOiBDLCBzdGlja3lNYXA6IElWaXJ0dWFsTGlzdFN0aWNreU1hcCxcclxuICAgICAgICBtZXRyaWNzOiBJTWV0cmljcyk6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24ge1xyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgLy8gZGVsdGEsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtV2lkdGgsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAvLyB3aWR0aCxcclxuICAgICAgICAgICAgLy8gaGVpZ2h0LFxyXG4gICAgICAgICAgICBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgLy8gaXRlbVNpemUsXHJcbiAgICAgICAgICAgIGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQsXHJcbiAgICAgICAgICAgIC8vIGl0ZW1zRnJvbVN0YXJ0VG9EaXNwbGF5RW5kLFxyXG4gICAgICAgICAgICAvLyBpdGVtc09uRGlzcGxheSxcclxuICAgICAgICAgICAgLy8gaXRlbXNPbkRpc3BsYXlMZW5ndGgsXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgIC8vIGxlZnRIaWRkZW5JdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgLy8gbGVmdEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIC8vIGxlZnRJdGVtc1dlaWdodCxcclxuICAgICAgICAgICAgcmVuZGVySXRlbXM6IHJlbmRlckl0ZW1zTGVuZ3RoLFxyXG4gICAgICAgICAgICAvLyByaWdodEl0ZW1MZW5ndGgsXHJcbiAgICAgICAgICAgIC8vIHJpZ2h0SXRlbXNXZWlnaHQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUsXHJcbiAgICAgICAgICAgIHNpemVQcm9wZXJ0eSxcclxuICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgc25pcHBlZFBvcyxcclxuICAgICAgICAgICAgc3RhcnRQb3NpdGlvbixcclxuICAgICAgICAgICAgLy8gdG90YWxJdGVtc1RvRGlzcGxheUVuZFdlaWdodCxcclxuICAgICAgICAgICAgdG90YWxMZW5ndGgsXHJcbiAgICAgICAgICAgIC8vIHRvdGFsU2l6ZSxcclxuICAgICAgICAgICAgc3RhcnRJbmRleCxcclxuICAgICAgICAgICAgdHlwaWNhbEl0ZW1TaXplLFxyXG4gICAgICAgIH0gPSBtZXRyaWNzLFxyXG4gICAgICAgICAgICBkaXNwbGF5SXRlbXM6IElSZW5kZXJWaXJ0dWFsTGlzdENvbGxlY3Rpb24gPSBbXTtcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA9IHNuaXBwZWRQb3M7XHJcbiAgICAgICAgICAgIGxldCBwb3MgPSBzdGFydFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySXRlbXMgPSByZW5kZXJJdGVtc0xlbmd0aCxcclxuICAgICAgICAgICAgICAgIHN0aWNreUl0ZW06IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIG5leHRTdGlja3k6IElSZW5kZXJWaXJ0dWFsTGlzdEl0ZW0gfCB1bmRlZmluZWQsIHN0aWNreUl0ZW1JbmRleCA9IC0xLFxyXG4gICAgICAgICAgICAgICAgc3RpY2t5SXRlbVNpemUgPSAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNuYXApIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBNYXRoLm1pbihpdGVtc0Zyb21TdGFydFRvU2Nyb2xsRW5kID4gMCA/IGl0ZW1zRnJvbVN0YXJ0VG9TY3JvbGxFbmQgOiAwLCB0b3RhbExlbmd0aCAtIDEpOyBpID49IDA7IGktLSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbXNbaV0uaWQsIHN0aWNreSA9IHN0aWNreU1hcFtpZF0sIHNpemUgPSBkeW5hbWljU2l6ZSA/IHRoaXMuZ2V0KGlkKT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1TaXplID0gc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWFzdXJlcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IGlzVmVydGljYWwgPyAwIDogYWN0dWFsU25pcHBlZFBvc2l0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogaXNWZXJ0aWNhbCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogbm9ybWFsaXplZEl0ZW1XaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogbm9ybWFsaXplZEl0ZW1IZWlnaHQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIGNvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVmVydGljYWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZDogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWRPdXQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYzogZHluYW1pY1NpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtRGF0YTogSSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbSA9IHsgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgY29uZmlnIH07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW1JbmRleCA9IGk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5SXRlbXMucHVzaChzdGlja3lJdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgaSA9IHN0YXJ0SW5kZXg7XHJcblxyXG4gICAgICAgICAgICB3aGlsZSAocmVuZGVySXRlbXMgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSB0b3RhbExlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gaXRlbXNbaV0uaWQsIHNpemUgPSBkeW5hbWljU2l6ZSA/IHRoaXMuZ2V0KGlkKT8uW3NpemVQcm9wZXJ0eV0gfHwgdHlwaWNhbEl0ZW1TaXplIDogdHlwaWNhbEl0ZW1TaXplO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpZCAhPT0gc3RpY2t5SXRlbT8uaWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzbmFwcGVkID0gc25hcCAmJiBzdGlja3lNYXBbaWRdID4gMCAmJiBwb3MgPD0gc2Nyb2xsU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBpc1ZlcnRpY2FsID8gMCA6IHBvcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IGlzVmVydGljYWwgPyBwb3MgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG5vcm1hbGl6ZWRJdGVtV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IG5vcm1hbGl6ZWRJdGVtSGVpZ2h0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBjb25maWcgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ZlcnRpY2FsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5OiBzdGlja3lNYXBbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBwZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHBlZE91dDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljOiBkeW5hbWljU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbURhdGE6IEkgPSBpdGVtc1tpXTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbTogSVJlbmRlclZpcnR1YWxMaXN0SXRlbSA9IHsgaWQsIG1lYXN1cmVzLCBkYXRhOiBpdGVtRGF0YSwgY29uZmlnIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0U3RpY2t5ICYmIHN0aWNreUl0ZW1JbmRleCA8IGkgJiYgc25hcCAmJiBzdGlja3lNYXBbaWRdID4gMCAmJiBwb3MgPD0gc2Nyb2xsU2l6ZSArIHNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5tZWFzdXJlcy54ID0gaXNWZXJ0aWNhbCA/IDAgOiBzbmFwcGVkID8gYWN0dWFsU25pcHBlZFBvc2l0aW9uIDogcG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLm1lYXN1cmVzLnkgPSBpc1ZlcnRpY2FsID8gc25hcHBlZCA/IGFjdHVhbFNuaXBwZWRQb3NpdGlvbiA6IHBvcyA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGlja3kgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gc25hcHBlZDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheUl0ZW1zLnB1c2goaXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmVuZGVySXRlbXMgLT0gMTtcclxuICAgICAgICAgICAgICAgIHBvcyArPSBzaXplO1xyXG4gICAgICAgICAgICAgICAgaSsrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBheGlzID0gaXNWZXJ0aWNhbCA/IFlfUFJPUF9OQU1FIDogWF9QUk9QX05BTUU7XHJcblxyXG4gICAgICAgICAgICBpZiAobmV4dFN0aWNreSAmJiBzdGlja3lJdGVtICYmIG5leHRTdGlja3kubWVhc3VyZXNbYXhpc10gPD0gc2Nyb2xsU2l6ZSArIHN0aWNreUl0ZW1TaXplKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSA+IHNjcm9sbFNpemUpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdGlja3lJdGVtLm1lYXN1cmVzW2F4aXNdID0gbmV4dFN0aWNreS5tZWFzdXJlc1theGlzXSAtIHN0aWNreUl0ZW1TaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIHN0aWNreUl0ZW0uY29uZmlnLnNuYXBwZWQgPSBuZXh0U3RpY2t5LmNvbmZpZy5zbmFwcGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc25hcHBlZE91dCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RpY2t5SXRlbS5jb25maWcuc3RpY2t5ID0gMTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dFN0aWNreS5jb25maWcuc25hcHBlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGRpc3BsYXlJdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRyYWNraW5nIGJ5IHByb3BOYW1lXHJcbiAgICAgKi9cclxuICAgIHRyYWNrKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5faXRlbXMgfHwgIXRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudHJhY2sodGhpcy5faXRlbXMsIHRoaXMuX2Rpc3BsYXlDb21wb25lbnRzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXREaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkKHY6IHsgW2lkOiBudW1iZXJdOiBudW1iZXIgfSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIuZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9IHY7XHJcbiAgICB9XHJcblxyXG4gICAgdW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQ/OiBOZ1ZpcnR1YWxMaXN0SXRlbUNvbXBvbmVudCB8IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRoaXMuX3RyYWNrZXIudW50cmFja0NvbXBvbmVudEJ5SWRQcm9wZXJ0eShjb21wb25lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBjYWNoZUVsZW1lbnRzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5fZGlzcGxheUNvbXBvbmVudHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLl9kaXNwbGF5Q29tcG9uZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5fZGlzcGxheUNvbXBvbmVudHNbaV0sIGl0ZW1JZCA9IGNvbXBvbmVudC5pbnN0YW5jZS5pdGVtSWQ7XHJcbiAgICAgICAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgYm91bmRzID0gY29tcG9uZW50Lmluc3RhbmNlLmdldEJvdW5kcygpO1xyXG4gICAgICAgICAgICB0aGlzLnNldChpdGVtSWQsIGJvdW5kcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBjYWxjdWxhdGVkIGJvdW5kcyBmcm9tIGNhY2hlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0Qm91bmRzRnJvbUNhY2hlKGl0ZW1zOiBJVmlydHVhbExpc3RDb2xsZWN0aW9uLCB0eXBpY2FsSXRlbVNpemU6IG51bWJlciwgaXNWZXJ0aWNhbDogYm9vbGVhbikge1xyXG4gICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9IGlzVmVydGljYWwgPyBIRUlHSFRfUFJPUF9OQU1FIDogV0lEVEhfUFJPUF9OQU1FLCBtYXAgPSB0aGlzLl9tYXA7XHJcbiAgICAgICAgbGV0IHNpemU6IG51bWJlciA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBpdGVtcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBpZiAobWFwLmhhcyhpdGVtLmlkKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm91bmRzID0gbWFwLmdldChpdGVtLmlkKTtcclxuICAgICAgICAgICAgICAgIHNpemUgKz0gYm91bmRzID8gYm91bmRzW3NpemVQcm9wZXJ0eV0gOiB0eXBpY2FsSXRlbVNpemU7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzaXplICs9IHR5cGljYWxJdGVtU2l6ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYm91bmNlQ2hhbmdlcykge1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJvdW5jZUNoYW5nZXMuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fdHJhY2tlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks display items by property
|
|
3
|
+
* @link https://github.com/DjonnyX/ng-virtual-list/blob/main/projects/ng-virtual-list/src/lib/utils/tracker.ts
|
|
4
|
+
* @author Evgenii Grebennikov
|
|
5
|
+
* @email djonnyx@gmail.com
|
|
6
|
+
*/
|
|
7
|
+
export class Tracker {
|
|
8
|
+
constructor(trackingPropertyName) {
|
|
9
|
+
/**
|
|
10
|
+
* display objects dictionary of indexes by id
|
|
11
|
+
*/
|
|
12
|
+
this._displayObjectIndexMapById = {};
|
|
13
|
+
/**
|
|
14
|
+
* Dictionary displayItems propertyNameId by items propertyNameId
|
|
15
|
+
*/
|
|
16
|
+
this._trackMap = {};
|
|
17
|
+
this._trackingPropertyName = trackingPropertyName;
|
|
18
|
+
}
|
|
19
|
+
set displayObjectIndexMapById(v) {
|
|
20
|
+
if (this._displayObjectIndexMapById === v) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
this._displayObjectIndexMapById = v;
|
|
24
|
+
}
|
|
25
|
+
get displayObjectIndexMapById() {
|
|
26
|
+
return this._displayObjectIndexMapById;
|
|
27
|
+
}
|
|
28
|
+
get trackMap() {
|
|
29
|
+
return this._trackMap;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* tracking by propName
|
|
33
|
+
*/
|
|
34
|
+
track(items, components, afterComponentSetup) {
|
|
35
|
+
if (!items) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const idPropName = this._trackingPropertyName, untrackedItems = [...components];
|
|
39
|
+
for (let i = 0, l = items.length; i < l; i++) {
|
|
40
|
+
const item = items[i], itemTrackingProperty = item[idPropName];
|
|
41
|
+
if (this._trackMap) {
|
|
42
|
+
const diId = this._trackMap[itemTrackingProperty];
|
|
43
|
+
if (this._trackMap.hasOwnProperty(itemTrackingProperty)) {
|
|
44
|
+
const lastIndex = this._displayObjectIndexMapById[diId], el = components[lastIndex];
|
|
45
|
+
this._checkComponentProperty(el?.instance);
|
|
46
|
+
const elId = el?.instance?.[itemTrackingProperty];
|
|
47
|
+
if (el && elId === diId) {
|
|
48
|
+
const indexByUntrackedItems = untrackedItems.findIndex(v => {
|
|
49
|
+
this._checkComponentProperty(v.instance);
|
|
50
|
+
return v.instance[itemTrackingProperty] === elId;
|
|
51
|
+
});
|
|
52
|
+
if (indexByUntrackedItems > -1) {
|
|
53
|
+
el.instance.item = item;
|
|
54
|
+
if (afterComponentSetup !== undefined) {
|
|
55
|
+
afterComponentSetup(el.instance, item);
|
|
56
|
+
}
|
|
57
|
+
untrackedItems.splice(indexByUntrackedItems, 1);
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
delete this._trackMap[itemTrackingProperty];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (untrackedItems.length > 0) {
|
|
65
|
+
const el = untrackedItems.shift(), item = items[i];
|
|
66
|
+
if (el) {
|
|
67
|
+
el.instance.item = item;
|
|
68
|
+
if (this._trackMap) {
|
|
69
|
+
this._checkComponentProperty(el.instance);
|
|
70
|
+
this._trackMap[itemTrackingProperty] = el.instance[itemTrackingProperty];
|
|
71
|
+
}
|
|
72
|
+
if (afterComponentSetup !== undefined) {
|
|
73
|
+
afterComponentSetup(el.instance, item);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (untrackedItems.length) {
|
|
79
|
+
throw Error('Tracking by id caused an error.');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
untrackComponentByIdProperty(component) {
|
|
83
|
+
if (!component) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const propertyIdName = this._trackingPropertyName;
|
|
87
|
+
this._checkComponentProperty(component);
|
|
88
|
+
if (this._trackMap && component[propertyIdName] !== undefined) {
|
|
89
|
+
delete this._trackMap[propertyIdName];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
_checkComponentProperty(component) {
|
|
93
|
+
if (!component) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const propertyIdName = this._trackingPropertyName;
|
|
97
|
+
try {
|
|
98
|
+
component[propertyIdName];
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
throw Error(`Property ${propertyIdName} does not exist.`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
dispose() {
|
|
105
|
+
this._trackMap = null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2tlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvbGliL3V0aWxzL3RyYWNrZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sT0FBTztJQTZCaEIsWUFBWSxvQkFBNEI7UUE1QnhDOztXQUVHO1FBQ0ssK0JBQTBCLEdBQTZCLEVBQUUsQ0FBQztRQWNsRTs7V0FFRztRQUNLLGNBQVMsR0FBZ0QsRUFBRSxDQUFDO1FBU2hFLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxvQkFBb0IsQ0FBQztJQUN0RCxDQUFDO0lBekJELElBQUkseUJBQXlCLENBQUMsQ0FBMkI7UUFDckQsSUFBSSxJQUFJLENBQUMsMEJBQTBCLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQywwQkFBMEIsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUkseUJBQXlCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQzNDLENBQUM7SUFPRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQVFEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLEtBQWlCLEVBQUUsVUFBb0MsRUFDekQsbUJBQXFEO1FBQ3JELElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDUixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLEVBQUUsY0FBYyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUVoRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENB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QkFBdUIsQ0FBQyxTQUFhO1FBQ3pDLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDWixPQUFPO1NBQ1Y7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFFbEQsSUFBSTtZQUNDLFNBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdEM7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNWLE1BQU0sS0FBSyxDQUFDLFlBQVksY0FBYyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzdEO0lBQ0wsQ0FBQztJQUVELE9BQU87UUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxudHlwZSBUcmFja2luZ1Byb3BlcnR5SWQgPSBzdHJpbmcgfCBudW1iZXI7XHJcblxyXG4vKipcclxuICogVHJhY2tzIGRpc3BsYXkgaXRlbXMgYnkgcHJvcGVydHlcclxuICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL0Rqb25ueVgvbmctdmlydHVhbC1saXN0L2Jsb2IvbWFpbi9wcm9qZWN0cy9uZy12aXJ0dWFsLWxpc3Qvc3JjL2xpYi91dGlscy90cmFja2VyLnRzXHJcbiAqIEBhdXRob3IgRXZnZW5paSBHcmViZW5uaWtvdlxyXG4gKiBAZW1haWwgZGpvbm55eEBnbWFpbC5jb21cclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFja2VyPEkgPSBhbnksIEMgPSB7IFtwcm9wOiBzdHJpbmddOiBhbnk7IH0+IHtcclxuICAgIC8qKlxyXG4gICAgICogZGlzcGxheSBvYmplY3RzIGRpY3Rpb25hcnkgb2YgaW5kZXhlcyBieSBpZFxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkOiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0gPSB7fTtcclxuXHJcbiAgICBzZXQgZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCh2OiB7IFtpZDogbnVtYmVyXTogbnVtYmVyIH0pIHtcclxuICAgICAgICBpZiAodGhpcy5fZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCA9PT0gdikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9kaXNwbGF5T2JqZWN0SW5kZXhNYXBCeUlkID0gdjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGxheU9iamVjdEluZGV4TWFwQnlJZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpY3Rpb25hcnkgZGlzcGxheUl0ZW1zIHByb3BlcnR5TmFtZUlkIGJ5IGl0ZW1zIHByb3BlcnR5TmFtZUlkXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3RyYWNrTWFwOiB7IFtpZDogVHJhY2tpbmdQcm9wZXJ0eUlkXTogbnVtYmVyIH0gfCBudWxsID0ge307XHJcblxyXG4gICAgZ2V0IHRyYWNrTWFwKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl90cmFja01hcDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF90cmFja2luZ1Byb3BlcnR5TmFtZSE6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFja2luZ1Byb3BlcnR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWUgPSB0cmFja2luZ1Byb3BlcnR5TmFtZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHRyYWNraW5nIGJ5IHByb3BOYW1lXHJcbiAgICAgKi9cclxuICAgIHRyYWNrKGl0ZW1zOiBBcnJheTxhbnk+LCBjb21wb25lbnRzOiBBcnJheTxDb21wb25lbnRSZWY8YW55Pj4sXHJcbiAgICAgICAgYWZ0ZXJDb21wb25lbnRTZXR1cD86IChjb21wb25lbnQ6IEMsIGl0ZW06IEkpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGlkUHJvcE5hbWUgPSB0aGlzLl90cmFja2luZ1Byb3BlcnR5TmFtZSwgdW50cmFja2VkSXRlbXMgPSBbLi4uY29tcG9uZW50c107XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gaXRlbXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpXSwgaXRlbVRyYWNraW5nUHJvcGVydHkgPSBpdGVtW2lkUHJvcE5hbWVdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaUlkID0gdGhpcy5fdHJhY2tNYXBbaXRlbVRyYWNraW5nUHJvcGVydHldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwLmhhc093blByb3BlcnR5KGl0ZW1UcmFja2luZ1Byb3BlcnR5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RJbmRleCA9IHRoaXMuX2Rpc3BsYXlPYmplY3RJbmRleE1hcEJ5SWRbZGlJZF0sIGVsID0gY29tcG9uZW50c1tsYXN0SW5kZXhdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGVja0NvbXBvbmVudFByb3BlcnR5KGVsPy5pbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsSWQgPSBlbD8uaW5zdGFuY2U/LltpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICYmIGVsSWQgPT09IGRpSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhCeVVudHJhY2tlZEl0ZW1zID0gdW50cmFja2VkSXRlbXMuZmluZEluZGV4KHYgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb21wb25lbnRQcm9wZXJ0eSh2Lmluc3RhbmNlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5pbnN0YW5jZVtpdGVtVHJhY2tpbmdQcm9wZXJ0eV0gPT09IGVsSWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhCeVVudHJhY2tlZEl0ZW1zID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmluc3RhbmNlLml0ZW0gPSBpdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbXBvbmVudFNldHVwICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlckNvbXBvbmVudFNldHVwKGVsLmluc3RhbmNlLCBpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRyYWNrZWRJdGVtcy5zcGxpY2UoaW5kZXhCeVVudHJhY2tlZEl0ZW1zLCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90cmFja01hcFtpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh1bnRyYWNrZWRJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHVudHJhY2tlZEl0ZW1zLnNoaWZ0KCksIGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsLmluc3RhbmNlLml0ZW0gPSBpdGVtO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdHJhY2tNYXApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDb21wb25lbnRQcm9wZXJ0eShlbC5pbnN0YW5jZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFja01hcFtpdGVtVHJhY2tpbmdQcm9wZXJ0eV0gPSBlbC5pbnN0YW5jZVtpdGVtVHJhY2tpbmdQcm9wZXJ0eV07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21wb25lbnRTZXR1cCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tcG9uZW50U2V0dXAoZWwuaW5zdGFuY2UsIGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHVudHJhY2tlZEl0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcignVHJhY2tpbmcgYnkgaWQgY2F1c2VkIGFuIGVycm9yLicpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVudHJhY2tDb21wb25lbnRCeUlkUHJvcGVydHkoY29tcG9uZW50PzogQyk6IHZvaWQge1xyXG4gICAgICAgIGlmICghY29tcG9uZW50KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByb3BlcnR5SWROYW1lID0gdGhpcy5fdHJhY2tpbmdQcm9wZXJ0eU5hbWU7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoZWNrQ29tcG9uZW50UHJvcGVydHkoY29tcG9uZW50KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3RyYWNrTWFwICYmIChjb21wb25lbnQgYXMgYW55KVtwcm9wZXJ0eUlkTmFtZV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fdHJhY2tNYXBbcHJvcGVydHlJZE5hbWVdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9jaGVja0NvbXBvbmVudFByb3BlcnR5KGNvbXBvbmVudD86IEMpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcm9wZXJ0eUlkTmFtZSA9IHRoaXMuX3RyYWNraW5nUHJvcGVydHlOYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSlbcHJvcGVydHlJZE5hbWVdO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgUHJvcGVydHkgJHtwcm9wZXJ0eUlkTmFtZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRpc3Bvc2UoKSB7XHJcbiAgICAgICAgdGhpcy5fdHJhY2tNYXAgPSBudWxsO1xyXG4gICAgfVxyXG59Il19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctdmlydHVhbC1saXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9uZy12aXJ0dWFsLWxpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Public API Surface of ng-virtual-list
|
|
3
|
+
*/
|
|
4
|
+
export * from './lib/ng-virtual-list.module';
|
|
5
|
+
export * from './lib/ng-virtual-list.component';
|
|
6
|
+
export * from './lib/models';
|
|
7
|
+
export * from './lib/types';
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL25nLXZpcnR1YWwtbGlzdC9zcmMvcHVibGljLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBuZy12aXJ0dWFsLWxpc3RcclxuICovXHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9uZy12aXJ0dWFsLWxpc3QubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmctdmlydHVhbC1saXN0LmNvbXBvbmVudCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3R5cGVzJztcclxuIl19
|