@smarterplan/ngx-smarterplan-core 1.4.10 → 1.4.12
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/esm2022/lib/services/matterport-import.service.mjs +13 -62
- package/esm2022/lib/services/matterport-navigation.service.mjs +131 -1
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +865 -0
- package/esm2022/lib/services/matterport-tag.service.mjs +13 -1
- package/esm2022/lib/services/matterport.service.mjs +55 -4
- package/esm2022/lib/services/models/equipment.service.mjs +16 -1
- package/esm2022/lib/services/models/navigation.service.mjs +4 -1
- package/esm2022/lib/services/models/poi.service.mjs +86 -8
- package/esm2022/lib/services/models/ticket.service.mjs +3 -2
- package/esm2022/lib/services/s3.service.mjs +12 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +39 -0
- package/esm2022/lib/services/viewer.service.mjs +12 -6
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +8 -0
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +1227 -78
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/services/matterport-import.service.d.ts +2 -1
- package/lib/services/matterport-navigation.service.d.ts +25 -0
- package/lib/services/matterport-tag-copy.service.d.ts +129 -0
- package/lib/services/matterport.service.d.ts +27 -1
- package/lib/services/models/equipment.service.d.ts +8 -0
- package/lib/services/models/poi.service.d.ts +14 -0
- package/lib/services/s3.service.d.ts +8 -0
- package/lib/services/utils/matterport-transform.util.d.ts +21 -0
- package/lib/services/viewer.service.d.ts +2 -1
- package/lib/tokens/matterport-sdk-key.token.d.ts +7 -0
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
1
|
+
import { Inject, Injectable } from '@angular/core';
|
|
2
|
+
import { MATTERPORT_SDK_KEY } from '../tokens/matterport-sdk-key.token';
|
|
2
3
|
import { Subject } from 'rxjs';
|
|
3
4
|
import { removeNullKeysFromObject, wait, waitUntil } from '../helpers.service';
|
|
4
5
|
import { LevelStatus, } from '../types.service';
|
|
@@ -11,6 +12,7 @@ import * as i4 from "./models/layer.service";
|
|
|
11
12
|
import * as i5 from "./user.service";
|
|
12
13
|
import * as i6 from "./models/plan.service";
|
|
13
14
|
export class MatterportImportService {
|
|
15
|
+
sdkKey;
|
|
14
16
|
navigationService;
|
|
15
17
|
zoneService;
|
|
16
18
|
viewerService;
|
|
@@ -40,7 +42,8 @@ export class MatterportImportService {
|
|
|
40
42
|
importingImages = new Subject();
|
|
41
43
|
sweepProcessedCount = new Subject();
|
|
42
44
|
totalSweepsCount = new Subject();
|
|
43
|
-
constructor(navigationService, zoneService, viewerService, layerService, userService, planService) {
|
|
45
|
+
constructor(sdkKey, navigationService, zoneService, viewerService, layerService, userService, planService) {
|
|
46
|
+
this.sdkKey = sdkKey;
|
|
44
47
|
this.navigationService = navigationService;
|
|
45
48
|
this.zoneService = zoneService;
|
|
46
49
|
this.viewerService = viewerService;
|
|
@@ -71,34 +74,27 @@ export class MatterportImportService {
|
|
|
71
74
|
return new Promise((res, rej) => {
|
|
72
75
|
iframe.addEventListener('load', async () => {
|
|
73
76
|
try {
|
|
74
|
-
this.sdk = await showcaseWindow.MP_SDK.connect(iframe,
|
|
75
|
-
// Subscribe to Floor data
|
|
77
|
+
this.sdk = await showcaseWindow.MP_SDK.connect(iframe, this.sdkKey, '');
|
|
76
78
|
this.sdk.Floor.data.subscribe({
|
|
77
79
|
onCollectionUpdated: function upd(collection) {
|
|
78
|
-
// console.log("Floors", collection);
|
|
79
80
|
this.floors = collection;
|
|
80
81
|
}.bind(this),
|
|
81
82
|
});
|
|
82
|
-
// Subscribe to current Floor
|
|
83
83
|
this.sdk.Floor.current.subscribe(function upd(currentFloor) {
|
|
84
84
|
this.currentFloor = currentFloor;
|
|
85
85
|
}.bind(this));
|
|
86
|
-
// Subscribe to Sweep data
|
|
87
86
|
this.sdk.Sweep.data.subscribe({
|
|
88
87
|
onCollectionUpdated: function upd(collection) {
|
|
89
88
|
console.log('the entire up-to-date collection', collection);
|
|
90
89
|
this.sweeps = collection;
|
|
91
90
|
}.bind(this),
|
|
92
91
|
});
|
|
93
|
-
// remove labels
|
|
94
92
|
await this.sdk.Settings.update('labels', false);
|
|
95
93
|
let timeoutExpired = false;
|
|
96
|
-
// start timeout
|
|
97
94
|
setTimeout(() => (timeoutExpired = true), 7000);
|
|
98
95
|
await waitUntil(() => (this.sweeps !== undefined && this.floors !== undefined) ||
|
|
99
96
|
timeoutExpired === true);
|
|
100
97
|
if (timeoutExpired) {
|
|
101
|
-
// we are likely in matterport error case (that we cannot catch!)
|
|
102
98
|
console.log('timeout intitialising Matterport');
|
|
103
99
|
return rej(new Error('error init Matterport'));
|
|
104
100
|
}
|
|
@@ -118,7 +114,6 @@ export class MatterportImportService {
|
|
|
118
114
|
}
|
|
119
115
|
let appIsLoaded = false;
|
|
120
116
|
this.sdk.App.state.subscribe(function (appState) {
|
|
121
|
-
// app state has changed
|
|
122
117
|
console.log('The current phase: ', appState.phase);
|
|
123
118
|
if (appState.phase === 'appphase.playing') {
|
|
124
119
|
console.log('The app is playing');
|
|
@@ -127,7 +122,6 @@ export class MatterportImportService {
|
|
|
127
122
|
});
|
|
128
123
|
await waitUntil(() => appIsLoaded === true);
|
|
129
124
|
if (reloading) {
|
|
130
|
-
// perform only 360 import since we are reloading
|
|
131
125
|
await this.import360images(overrideExisting);
|
|
132
126
|
return Promise.resolve(true);
|
|
133
127
|
}
|
|
@@ -139,10 +133,8 @@ export class MatterportImportService {
|
|
|
139
133
|
return Promise.reject(new Error('missing data (no main Building Zone)'));
|
|
140
134
|
}
|
|
141
135
|
console.log('importing data from matterport');
|
|
142
|
-
// save sweeps data as json
|
|
143
136
|
const json = JSON.stringify(Object.values(this.sweeps));
|
|
144
137
|
await uploadJsonToS3(`visits/${this.modelID}/inventory/`, json, 'data.json');
|
|
145
|
-
// check layer of building type
|
|
146
138
|
const layerBuilding = await this.getLayerByName('BUILDING');
|
|
147
139
|
const createdDefaultZone = await this.createZone(node.metadata, layerBuilding.id, surface, mainZone.id, Object.keys(this.sweeps), node);
|
|
148
140
|
if (!createdDefaultZone) {
|
|
@@ -151,7 +143,6 @@ export class MatterportImportService {
|
|
|
151
143
|
if (this.floors) {
|
|
152
144
|
floorZones = await this.importFloorData(createdDefaultZone.id, node);
|
|
153
145
|
}
|
|
154
|
-
// console.log(floorZones);
|
|
155
146
|
await Promise.all(Object.keys(this.sweeps).map(async (key) => {
|
|
156
147
|
const sweepInfo = this.sweeps[key];
|
|
157
148
|
const navigationInput = {
|
|
@@ -191,7 +182,6 @@ export class MatterportImportService {
|
|
|
191
182
|
const newLocal = await this.zoneService.create(zoneInput);
|
|
192
183
|
return newLocal;
|
|
193
184
|
}
|
|
194
|
-
// --- Main import function (complete) ---
|
|
195
185
|
async import360images(overrideExisting = true) {
|
|
196
186
|
console.log('Importing 360 images');
|
|
197
187
|
this.importingImages.next(true);
|
|
@@ -209,10 +199,8 @@ export class MatterportImportService {
|
|
|
209
199
|
}
|
|
210
200
|
const sweep = scans[index];
|
|
211
201
|
console.log('Moving to sweep:', sweep);
|
|
212
|
-
// Prefer legacy .id first, then uuid, then sid as last resort
|
|
213
202
|
const moveId = sweep.id || sweep.uuid || sweep.sid;
|
|
214
203
|
try {
|
|
215
|
-
// Move to sweep (use the best available id)
|
|
216
204
|
await this.sdk.Sweep.moveTo(moveId, {
|
|
217
205
|
rotation: { x: 0, y: 0 },
|
|
218
206
|
transition: this.sdk.Camera && this.sdk.Camera.TransitionType
|
|
@@ -220,7 +208,6 @@ export class MatterportImportService {
|
|
|
220
208
|
: undefined,
|
|
221
209
|
transitionTime: 0,
|
|
222
210
|
});
|
|
223
|
-
// Capture with automatic retry (ensures renderer readiness each attempt)
|
|
224
211
|
const img = await this.captureEquirectangularWithRetry({ width: 2048, height: 1024 }, { mattertags: false, sweeps: true }, {
|
|
225
212
|
maxAttempts: 3,
|
|
226
213
|
initialBackoffMs: 500,
|
|
@@ -228,10 +215,7 @@ export class MatterportImportService {
|
|
|
228
215
|
sweepIdForReadyCheck: moveId,
|
|
229
216
|
waitForSweepTimeoutMs: 12000
|
|
230
217
|
});
|
|
231
|
-
|
|
232
|
-
uploadBase64ImageWithRetry(img,
|
|
233
|
-
// prefer using uuid for storage name if available, else fallback to moveId
|
|
234
|
-
sweep.uuid || moveId, `visits/${this.modelID}/sweeps/`, 'sweep', 5).then(() => {
|
|
218
|
+
uploadBase64ImageWithRetry(img, sweep.uuid || moveId, `visits/${this.modelID}/sweeps/`, 'sweep', 5).then(() => {
|
|
235
219
|
this.sweepProcessedCount.next(index);
|
|
236
220
|
if (index === nmbScans - 1) {
|
|
237
221
|
console.log('Import 360 done');
|
|
@@ -244,38 +228,29 @@ export class MatterportImportService {
|
|
|
244
228
|
});
|
|
245
229
|
}
|
|
246
230
|
catch (err) {
|
|
247
|
-
// capture failed after retries — log and continue to next sweep
|
|
248
231
|
console.error(`Failed to capture sweep ${moveId} after retries:`, err);
|
|
249
232
|
this.sweepProcessedCount.next(index);
|
|
250
|
-
// continue to next sweep (change to `throw err` if you want to abort on first failure)
|
|
251
233
|
continue;
|
|
252
234
|
}
|
|
253
235
|
}
|
|
254
|
-
// If loop finishes without hitting the final resolve in upload promise:
|
|
255
236
|
resolve(true);
|
|
256
237
|
this.removeFrame();
|
|
257
238
|
});
|
|
258
239
|
}
|
|
259
|
-
// --- capture with retry and backoff ---
|
|
260
|
-
// options: renderer size; renderOptions: renderer flags; cfg: retry config
|
|
261
240
|
async captureEquirectangularWithRetry(options, renderOptions, { maxAttempts = 3, initialBackoffMs = 500, perAttemptTimeoutMs = 8000, sweepIdForReadyCheck = null, waitForSweepTimeoutMs = 12000 } = {}) {
|
|
262
241
|
let attempt = 0;
|
|
263
242
|
let lastError = null;
|
|
264
243
|
while (attempt < maxAttempts) {
|
|
265
244
|
attempt += 1;
|
|
266
245
|
try {
|
|
267
|
-
// Ensure sweep is ready before each attempt if requested
|
|
268
246
|
if (sweepIdForReadyCheck) {
|
|
269
247
|
await this.waitForSweepReady(sweepIdForReadyCheck, waitForSweepTimeoutMs);
|
|
270
|
-
// small safety delay to let renderer finalize
|
|
271
248
|
await this.sleep(120);
|
|
272
249
|
}
|
|
273
|
-
// Race the takeEquirectangular call against a per-attempt timeout
|
|
274
250
|
const img = await Promise.race([
|
|
275
251
|
this.sdk.Renderer.takeEquirectangular(options, renderOptions),
|
|
276
252
|
this.timeoutPromise(perAttemptTimeoutMs, `takeEquirectangular timed out after ${perAttemptTimeoutMs}ms`)
|
|
277
253
|
]);
|
|
278
|
-
// success
|
|
279
254
|
return img;
|
|
280
255
|
}
|
|
281
256
|
catch (err) {
|
|
@@ -284,37 +259,27 @@ export class MatterportImportService {
|
|
|
284
259
|
if (attempt >= maxAttempts) {
|
|
285
260
|
throw lastError;
|
|
286
261
|
}
|
|
287
|
-
// exponential backoff before next attempt
|
|
288
262
|
const backoff = initialBackoffMs * Math.pow(2, attempt - 1);
|
|
289
|
-
// add small jitter to reduce thundering herd
|
|
290
263
|
const jitter = Math.floor(Math.random() * 100);
|
|
291
264
|
await this.sleep(backoff + jitter);
|
|
292
|
-
// loop to next attempt
|
|
293
265
|
}
|
|
294
266
|
}
|
|
295
267
|
throw lastError || new Error('captureEquirectangularWithRetry failed without error');
|
|
296
268
|
}
|
|
297
|
-
// --- Wait until the SDK reports the target sweep as current ---
|
|
298
|
-
// Tries: sdk.Sweep.current.waitUntil -> sdk.Sweep.current.subscribe -> polling getCurrent/value
|
|
299
|
-
// This function matches targetId against multiple fields and prioritizes .id matching.
|
|
300
269
|
waitForSweepReady(targetId, timeoutMs = 10000) {
|
|
301
270
|
const sdk = this.sdk;
|
|
302
|
-
// helper to match multiple id fields, prioritizing id first
|
|
303
271
|
const matchesTarget = (data) => {
|
|
304
272
|
if (!data)
|
|
305
273
|
return false;
|
|
306
|
-
// check .id first (legacy), then uuid, sid, uid
|
|
307
274
|
const fields = [data.id, data.uuid, data.sid, data.uid];
|
|
308
275
|
return fields.some(f => !!f && String(f) === String(targetId));
|
|
309
276
|
};
|
|
310
|
-
// 1) prefer waitUntil if available on the observable
|
|
311
277
|
if (sdk.Sweep && sdk.Sweep.current && typeof sdk.Sweep.current.waitUntil === 'function') {
|
|
312
278
|
return Promise.race([
|
|
313
279
|
sdk.Sweep.current.waitUntil((data) => matchesTarget(data)),
|
|
314
280
|
this.timeoutPromise(timeoutMs, `Timeout waiting for sweep ${targetId}`)
|
|
315
281
|
]);
|
|
316
282
|
}
|
|
317
|
-
// 2) subscribe if available
|
|
318
283
|
if (sdk.Sweep && sdk.Sweep.current && typeof sdk.Sweep.current.subscribe === 'function') {
|
|
319
284
|
return new Promise((resolve, reject) => {
|
|
320
285
|
const timer = setTimeout(() => {
|
|
@@ -324,7 +289,6 @@ export class MatterportImportService {
|
|
|
324
289
|
}, timeoutMs);
|
|
325
290
|
let off = null;
|
|
326
291
|
try {
|
|
327
|
-
// subscribe may return an unsubscribe function or an object with unsubscribe()
|
|
328
292
|
const subResult = sdk.Sweep.current.subscribe((data) => {
|
|
329
293
|
if (matchesTarget(data)) {
|
|
330
294
|
clearTimeout(timer);
|
|
@@ -338,7 +302,6 @@ export class MatterportImportService {
|
|
|
338
302
|
resolve();
|
|
339
303
|
}
|
|
340
304
|
});
|
|
341
|
-
// if subscribe returned an unsubscribe function, keep it as off
|
|
342
305
|
if (typeof subResult === 'function')
|
|
343
306
|
off = subResult;
|
|
344
307
|
else if (subResult && typeof subResult.unsubscribe === 'function')
|
|
@@ -350,7 +313,6 @@ export class MatterportImportService {
|
|
|
350
313
|
}
|
|
351
314
|
});
|
|
352
315
|
}
|
|
353
|
-
// 3) polling fallback: try getCurrent(), sdk.Sweep.current() function, or .value, else poll renderer readiness
|
|
354
316
|
return new Promise(async (resolve, reject) => {
|
|
355
317
|
const pollInterval = 200;
|
|
356
318
|
const timer = setTimeout(() => {
|
|
@@ -364,11 +326,9 @@ export class MatterportImportService {
|
|
|
364
326
|
current = await sdk.Sweep.getCurrent();
|
|
365
327
|
}
|
|
366
328
|
else if (sdk.Sweep && typeof sdk.Sweep.current === 'function') {
|
|
367
|
-
// some builds expose a function
|
|
368
329
|
current = await sdk.Sweep.current();
|
|
369
330
|
}
|
|
370
331
|
else if (sdk.Sweep && sdk.Sweep.current && sdk.Sweep.current.value) {
|
|
371
|
-
// some observables expose a .value
|
|
372
332
|
current = sdk.Sweep.current.value;
|
|
373
333
|
}
|
|
374
334
|
if (matchesTarget(current)) {
|
|
@@ -381,12 +341,10 @@ export class MatterportImportService {
|
|
|
381
341
|
// ignore and retry until timeout
|
|
382
342
|
}
|
|
383
343
|
};
|
|
384
|
-
// initial immediate check
|
|
385
344
|
await checkNow();
|
|
386
345
|
const interval = setInterval(checkNow, pollInterval);
|
|
387
346
|
});
|
|
388
347
|
}
|
|
389
|
-
// --- small helpers ---
|
|
390
348
|
sleep(ms) {
|
|
391
349
|
return new Promise(res => setTimeout(res, ms));
|
|
392
350
|
}
|
|
@@ -407,7 +365,6 @@ export class MatterportImportService {
|
|
|
407
365
|
console.log('Floor are not loaded yet');
|
|
408
366
|
return;
|
|
409
367
|
}
|
|
410
|
-
// look up for sequence number (the safest method)
|
|
411
368
|
let floorMatterport = Object.values(this.floors).find((floor) => floor.sequence === matterportFloorSequence);
|
|
412
369
|
if (!floorMatterport) {
|
|
413
370
|
floorMatterport = Object.values(this.floors).find((floor) => floorName.includes(floor.name) && floor.name != '');
|
|
@@ -415,13 +372,11 @@ export class MatterportImportService {
|
|
|
415
372
|
if (!floorMatterport) {
|
|
416
373
|
floorMatterport = Object.values(this.floors).find((floor) => floorName.includes(floor.id));
|
|
417
374
|
}
|
|
418
|
-
// console.log(floorMatterport)
|
|
419
375
|
if (floorMatterport) {
|
|
420
376
|
let retry = true;
|
|
421
377
|
while (retry) {
|
|
422
378
|
try {
|
|
423
379
|
const floorIndex = await this.sdk.Floor.moveTo(floorMatterport.sequence);
|
|
424
|
-
// console.log("moved to floorIndex", floorIndex);
|
|
425
380
|
retry = false;
|
|
426
381
|
}
|
|
427
382
|
catch (error) {
|
|
@@ -440,13 +395,10 @@ export class MatterportImportService {
|
|
|
440
395
|
const nmbFloors = Object.keys(this.floors).length;
|
|
441
396
|
console.log('Total number of floors', nmbFloors);
|
|
442
397
|
for (let index = 0; index < nmbFloors; index += 1) {
|
|
443
|
-
// eslint-disable-next-line no-await-in-loop
|
|
444
398
|
console.log('Importing floor', index);
|
|
445
399
|
await this.sdk.Floor.moveTo(index).then(async () => {
|
|
446
400
|
await wait(700);
|
|
447
|
-
// console.log("about to save the floor", index);
|
|
448
401
|
const zone = await this.saveFloor(defautZoneID, node);
|
|
449
|
-
// console.log("received floor zone", zone);
|
|
450
402
|
zones.push(zone);
|
|
451
403
|
});
|
|
452
404
|
}
|
|
@@ -464,14 +416,12 @@ export class MatterportImportService {
|
|
|
464
416
|
console.log('sweeps for floor', sweepsForFloor.length);
|
|
465
417
|
const sweepIDs = sweepsForFloor.map((sweep) => sweep.uuid);
|
|
466
418
|
const zone = await this.createZone(`Étage ${name} - ${node.metadata}`, layerFloor.id, null, defautZoneID, sweepIDs, node, JSON.stringify({ matterportFloorSequence: this.currentFloor.sequence }));
|
|
467
|
-
// TODO link to scans
|
|
468
419
|
const base64 = await this.sdk.Renderer.takeScreenShot({
|
|
469
420
|
width: 4096,
|
|
470
421
|
height: 2048,
|
|
471
422
|
});
|
|
472
423
|
const spaceIDshort = this.spaceID.slice(0, 8);
|
|
473
424
|
await uploadBase64Image(base64, null, `visits/${this.modelID}/plans/`, `plan_floor_${this.currentFloor.id}_${spaceIDshort}`);
|
|
474
|
-
// create Plan object
|
|
475
425
|
const plan = {
|
|
476
426
|
name: `plan_floor_${this.currentFloor.id}`,
|
|
477
427
|
annexe: `visits/${this.modelID}/plans/plan_floor_${this.currentFloor.id}_${spaceIDshort}.jpeg`,
|
|
@@ -482,7 +432,6 @@ export class MatterportImportService {
|
|
|
482
432
|
isImportedMatterport: true,
|
|
483
433
|
};
|
|
484
434
|
await this.planService.createPlan(plan);
|
|
485
|
-
// console.log("floor saved");
|
|
486
435
|
return Promise.resolve(zone);
|
|
487
436
|
}
|
|
488
437
|
abandon() {
|
|
@@ -504,10 +453,9 @@ export class MatterportImportService {
|
|
|
504
453
|
if (layers.length > 0) {
|
|
505
454
|
return layers[0];
|
|
506
455
|
}
|
|
507
|
-
// create then
|
|
508
456
|
return this.layerService.createLayerForOrganisation(name, currentOrgId);
|
|
509
457
|
}
|
|
510
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportImportService, deps: [{ token: i1.NavigationService }, { token: i2.ZoneService }, { token: i3.ViewerService }, { token: i4.LayerService }, { token: i5.BaseUserService }, { token: i6.PlanService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
458
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportImportService, deps: [{ token: MATTERPORT_SDK_KEY }, { token: i1.NavigationService }, { token: i2.ZoneService }, { token: i3.ViewerService }, { token: i4.LayerService }, { token: i5.BaseUserService }, { token: i6.PlanService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
511
459
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportImportService, providedIn: 'root' });
|
|
512
460
|
}
|
|
513
461
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportImportService, decorators: [{
|
|
@@ -515,5 +463,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
515
463
|
args: [{
|
|
516
464
|
providedIn: 'root',
|
|
517
465
|
}]
|
|
518
|
-
}], ctorParameters: () => [{ type:
|
|
519
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQ0wsV0FBVyxHQU1aLE1BQU0sa0JBQWtCLENBQUM7QUFLMUIsT0FBTyxFQUNMLGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsMEJBQTBCLEVBQzFCLGlCQUFpQixHQUNsQixNQUFNLGNBQWMsQ0FBQzs7Ozs7Ozs7QUFhdEIsTUFBTSxPQUFPLHVCQUF1QjtJQXlDeEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN0NGLFlBQVksQ0FBQztJQUVkLEdBQUcsQ0FBTTtJQUVSLE1BQU0sQ0FBUztJQUVoQixNQUFNLENBQVM7SUFFZCxZQUFZLENBQUM7SUFFYixRQUFRLENBQVM7SUFFakIsUUFBUSxDQUFTO0lBRXpCLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElB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ImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QsIHdhaXQsIHdhaXRVbnRpbCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTGV2ZWxTdGF0dXMsXHJcbiAgTGF5ZXIsXHJcbiAgTm9kZSxcclxuICBab25lLFxyXG4gIE5hdmlnYXRpb24sXHJcbiAgUGxhbixcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbGF5ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGxhblNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9wbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3pvbmUuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgdXBsb2FkSnNvblRvUzMsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2UsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnksXHJcbiAgbGlzdEZpbGVzSW5Gb2xkZXIsXHJcbn0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi92aWV3ZXIuc2VydmljZSc7XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0SW1wb3J0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RnJhbWU7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzd2VlcHM6IE9iamVjdDtcclxuXHJcbiAgcHVibGljIGZsb29yczogT2JqZWN0O1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRGbG9vcjtcclxuXHJcbiAgcHJpdmF0ZSBfbW9kZWxJRDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF9zcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBnZXQgc3BhY2VJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NwYWNlSUQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNwYWNlSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3BhY2VJRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtb2RlbElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxJRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbW9kZWxJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9tb2RlbElEID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaW1wb3J0aW5nSW1hZ2VzOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHVibGljIHN3ZWVwUHJvY2Vzc2VkQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcbiAgcHVibGljIHRvdGFsU3dlZXBzQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogTmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcclxuICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcclxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBsYW5TZXJ2aWNlOiBQbGFuU2VydmljZVxyXG4gICkge1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaW5pdFNka0Zvck1vZGVsKG1vZGVsSUQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5zdG9wID0gZmFsc2U7XHJcblxyXG4gICAgLy8gTG9hZCBTREtcclxuICAgIGNvbnNvbGUubG9nKCdMb2FkaW5nIE1hdHRlcnBvcnQgU0RLJyk7XHJcbiAgICB0aGlzLm1vZGVsSUQgPSBtb2RlbElEO1xyXG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XHJcbiAgICBpZiAoIWlmcmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBjcmVhdGUgaWZyYW1lJyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnZpZXdlclNlcnZpY2Uuc2V0VG91clVybCh7IG1vZGVsM2Q6IG1vZGVsSUQgfSk7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnZpZXdlclNlcnZpY2UuZ2V0VG91clVybCgpO1xyXG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcclxuICAgIGlmcmFtZS5hbGxvdyA9ICd4ci1zcGF0aWFsLXRyYWNraW5nJztcclxuICAgIGlmcmFtZS5oZWlnaHQgPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUud2lkdGggPSAnMTAwJSc7XHJcbiAgICBpZnJhbWUuaWQgPSAndmlld2VyLW1vZHVsZSc7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1mcmFtZScpO1xyXG4gICAgZWxlbWVudC5hcHBlbmQoaWZyYW1lKTtcclxuICAgIHRoaXMuY3VycmVudEZyYW1lID0gaWZyYW1lO1xyXG4gICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzLCByZWopID0+IHtcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoXHJcbiAgICAgICAgJ2xvYWQnLFxyXG4gICAgICAgIGFzeW5jICgpID0+IHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgc2hvd2Nhc2VXaW5kb3cuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgICAgaWZyYW1lLFxyXG4gICAgICAgICAgICAgICdxbjl3c2FzdXk1aDJmenJicm4xbnpyMGlkJyxcclxuICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gRmxvb3IgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5GbG9vci5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGbG9vcnNcIiwgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZsb29ycyA9IGNvbGxlY3Rpb247XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgRmxvb3JcclxuICAgICAgICAgICAgdGhpcy5zZGsuRmxvb3IuY3VycmVudC5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgZnVuY3Rpb24gdXBkKGN1cnJlbnRGbG9vcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Rmxvb3IgPSBjdXJyZW50Rmxvb3I7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gU3dlZXAgZGF0YVxyXG4gICAgICAgICAgICB0aGlzLnNkay5Td2VlcC5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGUgZW50aXJlIHVwLXRvLWRhdGUgY29sbGVjdGlvbicsIGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcHMgPSBjb2xsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vIHJlbW92ZSBsYWJlbHNcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU2V0dGluZ3MudXBkYXRlKCdsYWJlbHMnLCBmYWxzZSk7XHJcbiAgICAgICAgICAgIGxldCB0aW1lb3V0RXhwaXJlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAvLyBzdGFydCB0aW1lb3V0XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRpbWVvdXRFeHBpcmVkID0gdHJ1ZSksIDcwMDApO1xyXG4gICAgICAgICAgICBhd2FpdCB3YWl0VW50aWwoXHJcbiAgICAgICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgICAgICh0aGlzLnN3ZWVwcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmxvb3JzICE9PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0RXhwaXJlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAodGltZW91dEV4cGlyZWQpIHtcclxuICAgICAgICAgICAgICAvLyB3ZSBhcmUgbGlrZWx5IGluIG1hdHRlcnBvcnQgZXJyb3IgY2FzZSAodGhhdCB3ZSBjYW5ub3QgY2F0Y2ghKVxyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aW1lb3V0IGludGl0aWFsaXNpbmcgTWF0dGVycG9ydCcpO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2luaXQgZG9uZScpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVzKHRydWUpO1xyXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG4gICAgICAgICAgICByZWoobmV3IEVycm9yKCdlcnJvciBpbml0IE1hdHRlcnBvcnQnKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGltcG9ydERhdGEoXHJcbiAgICBzcGFjZUlEOiBzdHJpbmcsXHJcbiAgICBzdXJmYWNlOiBudW1iZXIsXHJcbiAgICByZWxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZSxcclxuICAgIG5vZGU6IE5vZGUgPSBudWxsLFxyXG4gICAgb3ZlcnJpZGVFeGlzdGluZyA9IHRydWVcclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICghdGhpcy5zd2VlcHMpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignbm8gc3dlZXBzIGluaXRpYWxpemVkJykpO1xyXG4gICAgfVxyXG4gICAgbGV0IGFwcElzTG9hZGVkID0gZmFsc2U7XHJcblxyXG5cclxuICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgIC8vIGFwcCBzdGF0ZSBoYXMgY2hhbmdlZFxyXG4gICAgICBjb25zb2xlLmxvZygnVGhlIGN1cnJlbnQgcGhhc2U6ICcsIGFwcFN0YXRlLnBoYXNlKTtcclxuICAgICAgaWYgKGFwcFN0YXRlLnBoYXNlID09PSAnYXBwcGhhc2UucGxheWluZycpIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnVGhlIGFwcCBpcyBwbGF5aW5nJyk7XHJcbiAgICAgICAgYXBwSXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCB3YWl0VW50aWwoKCkgPT4gYXBwSXNMb2FkZWQgPT09IHRydWUpO1xyXG5cclxuICAgIGlmIChyZWxvYWRpbmcpIHtcclxuICAgICAgLy8gcGVyZm9ybSBvbmx5IDM2MCBpbXBvcnQgc2luY2Ugd2UgYXJlIHJlbG9hZGluZ1xyXG4gICAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNwYWNlSUQgPSBzcGFjZUlEO1xyXG4gICAgbGV0IGZsb29yWm9uZXM6IFpvbmVbXSA9IFtdO1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgIGNvbnN0IG1haW5ab25lID0gem9uZXMuZmluZCgoeikgPT4gIXoucGFyZW50SUQpO1xyXG4gICAgaWYgKCFtYWluWm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdtaXNzaW5nIGRhdGEgKG5vIG1haW4gQnVpbGRpbmcgWm9uZSknKSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnaW1wb3J0aW5nIGRhdGEgZnJvbSBtYXR0ZXJwb3J0Jyk7XHJcbiAgICAvLyBzYXZlIHN3ZWVwcyBkYXRhIGFzIGpzb25cclxuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKSk7XHJcbiAgICBhd2FpdCB1cGxvYWRKc29uVG9TMyhcclxuICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vaW52ZW50b3J5L2AsXHJcbiAgICAgIGpzb24sXHJcbiAgICAgICdkYXRhLmpzb24nXHJcbiAgICApO1xyXG4gICAgLy8gY2hlY2sgbGF5ZXIgb2YgYnVpbGRpbmcgdHlwZVxyXG4gICAgY29uc3QgbGF5ZXJCdWlsZGluZyA9IGF3YWl0IHRoaXMuZ2V0TGF5ZXJCeU5hbWUoJ0JVSUxESU5HJyk7XHJcbiAgICBjb25zdCBjcmVhdGVkRGVmYXVsdFpvbmUgPSBhd2FpdCB0aGlzLmNyZWF0ZVpvbmUoXHJcbiAgICAgIG5vZGUubWV0YWRhdGEsXHJcbiAgICAgIGxheWVyQnVpbGRpbmcuaWQsXHJcbiAgICAgIHN1cmZhY2UsXHJcbiAgICAgIG1haW5ab25lLmlkLFxyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnN3ZWVwcyksXHJcbiAgICAgIG5vZGVcclxuICAgICk7XHJcbiAgICBpZiAoIWNyZWF0ZWREZWZhdWx0Wm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmZsb29ycykge1xyXG4gICAgICBmbG9vclpvbmVzID0gYXdhaXQgdGhpcy5pbXBvcnRGbG9vckRhdGEoY3JlYXRlZERlZmF1bHRab25lLmlkLCBub2RlKTtcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKGZsb29yWm9uZXMpO1xyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3dlZXBzKS5tYXAoYXN5bmMgKGtleSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwSW5mbyA9IHRoaXMuc3dlZXBzW2tleV07XHJcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbklucHV0ID0ge1xyXG4gICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHN3ZWVwSW5mby51dWlkLFxyXG4gICAgICAgICAgcG9zaXRpb246IEpTT04uc3RyaW5naWZ5KHN3ZWVwSW5mby5wb3NpdGlvbiksXHJcbiAgICAgICAgICByb3RhdGlvbjogSlNPTi5zdHJpbmdpZnkoc3dlZXBJbmZvLnJvdGF0aW9uKSxcclxuICAgICAgICAgIGxldmVsOiBMZXZlbFN0YXR1cy5MT1csXHJcbiAgICAgICAgICBub2RlSUQ6IG5vZGUuaWQsXHJcbiAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgIH0gYXMgTmF2aWdhdGlvbjtcclxuICAgICAgICBjb25zdCBuYXYgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmNyZWF0ZU5hdmlnYXRpb24oXHJcbiAgICAgICAgICBuYXZpZ2F0aW9uSW5wdXRcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmICghbmF2KSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnY291bGQgY3JlYXRlIG5hdmlnYXRpb24nLCBuYXZpZ2F0aW9uSW5wdXQuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjcmVhdGVab25lKFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgbGF5ZXJJRDogc3RyaW5nLFxyXG4gICAgc3VyZmFjZTogbnVtYmVyID0gbnVsbCxcclxuICAgIHBhcmVudElEOiBzdHJpbmcgPSBudWxsLFxyXG4gICAgc3dlZXBzOiBzdHJpbmdbXSA9IFtdLFxyXG4gICAgbm9kZTogTm9kZSA9IG51bGwsXHJcbiAgICBtZXRhZGF0YTogc3RyaW5nID0gbnVsbFxyXG4gICk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgY29uc3Qgem9uZUlucHV0ID0ge1xyXG4gICAgICBuYW1lLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGxheWVySUQsXHJcbiAgICAgIHN3ZWVwSURzOiBzd2VlcHMsXHJcbiAgICAgIG5vZGVJRHM6IG5vZGUgPyBbbm9kZS5pZF0gOiBudWxsLFxyXG4gICAgfSBhcyBab25lO1xyXG4gICAgcmVtb3ZlTnVsbEtleXNGcm9tT2JqZWN0KHpvbmVJbnB1dCk7XHJcbiAgICBpZiAoc3VyZmFjZSkge1xyXG4gICAgICB6b25lSW5wdXQuc3VyZmFjZSA9IHN1cmZhY2U7XHJcbiAgICB9XHJcbiAgICBpZiAocGFyZW50SUQpIHtcclxuICAgICAgem9uZUlucHV0LnBhcmVudElEID0gcGFyZW50SUQ7XHJcbiAgICB9XHJcbiAgICBpZiAobWV0YWRhdGEpIHtcclxuICAgICAgem9uZUlucHV0Lm1ldGFkYXRhID0gbWV0YWRhdGE7XHJcbiAgICB9XHJcbiAgICBjb25zdCBuZXdMb2NhbCA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuY3JlYXRlKHpvbmVJbnB1dCk7XHJcbiAgICByZXR1cm4gbmV3TG9jYWw7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0gTWFpbiBpbXBvcnQgZnVuY3Rpb24gKGNvbXBsZXRlKSAtLS1cclxuICBhc3luYyBpbXBvcnQzNjBpbWFnZXMob3ZlcnJpZGVFeGlzdGluZyA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGNvbnNvbGUubG9nKCdJbXBvcnRpbmcgMzYwIGltYWdlcycpO1xyXG4gICAgdGhpcy5pbXBvcnRpbmdJbWFnZXMubmV4dCh0cnVlKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUpID0+IHtcclxuICAgICAgY29uc3Qgc2NhbnMgPSBPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKTtcclxuICAgICAgY29uc3Qgbm1iU2NhbnMgPSBzY2Fucy5sZW5ndGg7XHJcblxyXG4gICAgICB0aGlzLnRvdGFsU3dlZXBzQ291bnQubmV4dChubWJTY2Fucyk7XHJcblxyXG4gICAgICBjb25zdCBzdGFydCA9IG92ZXJyaWRlRXhpc3RpbmcgPyAwIDogYXdhaXQgdGhpcy5nZXRVcGxvYWRlZEltYWdlQ291bnQodGhpcy5tb2RlbElEKTtcclxuXHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnQ7IGluZGV4IDwgbm1iU2NhbnM7IGluZGV4ICs9IDEpIHtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcCkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0FiYW5kb25pbmcgaW1wb3J0IGJlY2F1c2UgaXQgd2FzIGNhbmNlbGxlZCcpO1xyXG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHN3ZWVwID0gc2NhbnNbaW5kZXhdO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdNb3ZpbmcgdG8gc3dlZXA6Jywgc3dlZXApO1xyXG5cclxuICAgICAgICAvLyBQcmVmZXIgbGVnYWN5IC5pZCBmaXJzdCwgdGhlbiB1dWlkLCB0aGVuIHNpZCBhcyBsYXN0IHJlc29ydFxyXG4gICAgICAgIGNvbnN0IG1vdmVJZCA9IHN3ZWVwLmlkIHx8IHN3ZWVwLnV1aWQgfHwgc3dlZXAuc2lkO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgLy8gTW92ZSB0byBzd2VlcCAodXNlIHRoZSBiZXN0IGF2YWlsYWJsZSBpZClcclxuICAgICAgICAgIGF3YWl0IHRoaXMuc2RrLlN3ZWVwLm1vdmVUbyhtb3ZlSWQsIHtcclxuICAgICAgICAgICAgcm90YXRpb246IHsgeDogMCwgeTogMCB9LFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEgJiYgdGhpcy5zZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlXHJcbiAgICAgICAgICAgICAgPyB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuSU5TVEFOVFxyXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0cmFuc2l0aW9uVGltZTogMCxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIENhcHR1cmUgd2l0aCBhdXRvbWF0aWMgcmV0cnkgKGVuc3VyZXMgcmVuZGVyZXIgcmVhZGluZXNzIGVhY2ggYXR0ZW1wdClcclxuICAgICAgICAgIGNvbnN0IGltZyA9IGF3YWl0IHRoaXMuY2FwdHVyZUVxdWlyZWN0YW5ndWxhcldpdGhSZXRyeShcclxuICAgICAgICAgICAgeyB3aWR0aDogMjA0OCwgaGVpZ2h0OiAxMDI0IH0sXHJcbiAgICAgICAgICAgIHsgbWF0dGVydGFnczogZmFsc2UsIHN3ZWVwczogdHJ1ZSB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgbWF4QXR0ZW1wdHM6IDMsXHJcbiAgICAgICAgICAgICAgaW5pdGlhbEJhY2tvZmZNczogNTAwLFxyXG4gICAgICAgICAgICAgIHBlckF0dGVtcHRUaW1lb3V0TXM6IDgwMDAsXHJcbiAgICAgICAgICAgICAgc3dlZXBJZEZvclJlYWR5Q2hlY2s6IG1vdmVJZCxcclxuICAgICAgICAgICAgICB3YWl0Rm9yU3dlZXBUaW1lb3V0TXM6IDEyMDAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgLy8gVXBsb2FkIGFzeW5jaHJvbm91c2x5IChkbyBub3QgYXdhaXQgdG8ga2VlcCB0aHJvdWdocHV0KVxyXG4gICAgICAgICAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnkoXHJcbiAgICAgICAgICAgIGltZyxcclxuICAgICAgICAgICAgLy8gcHJlZmVyIHVzaW5nIHV1aWQgZm9yIHN0b3JhZ2UgbmFtZSBpZiBhdmFpbGFibGUsIGVsc2UgZmFsbGJhY2sgdG8gbW92ZUlkXHJcbiAgICAgICAgICAgIHN3ZWVwLnV1aWQgfHwgbW92ZUlkLFxyXG4gICAgICAgICAgICBgdmlzaXRzLyR7dGhpcy5tb2RlbElEfS9zd2VlcHMvYCxcclxuICAgICAgICAgICAgJ3N3ZWVwJyxcclxuICAgICAgICAgICAgNVxyXG4gICAgICAgICAgKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zd2VlcFByb2Nlc3NlZENvdW50Lm5leHQoaW5kZXgpO1xyXG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IG5tYlNjYW5zIC0gMSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbXBvcnQgMzYwIGRvbmUnKTtcclxuICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICAgICAgICB0aGlzLnN0b3AgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KS5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkVycm9yIHVwbG9hZGluZyBzY2FuIDogXCIsIGUpO1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgLy8gY2FwdHVyZSBmYWlsZWQgYWZ0ZXIgcmV0cmllcyDigJQgbG9nIGFuZCBjb250aW51ZSB0byBuZXh0IHN3ZWVwXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gY2FwdHVyZSBzd2VlcCAke21vdmVJZH0gYWZ0ZXIgcmV0cmllczpgLCBlcnIpO1xyXG4gICAgICAgICAgdGhpcy5zd2VlcFByb2Nlc3NlZENvdW50Lm5leHQoaW5kZXgpO1xyXG4gICAgICAgICAgLy8gY29udGludWUgdG8gbmV4dCBzd2VlcCAoY2hhbmdlIHRvIGB0aHJvdyBlcnJgIGlmIHlvdSB3YW50IHRvIGFib3J0IG9uIGZpcnN0IGZhaWx1cmUpXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIElmIGxvb3AgZmluaXNoZXMgd2l0aG91dCBoaXR0aW5nIHRoZSBmaW5hbCByZXNvbHZlIGluIHVwbG9hZCBwcm9taXNlOlxyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBjYXB0dXJlIHdpdGggcmV0cnkgYW5kIGJhY2tvZmYgLS0tXHJcbiAgLy8gb3B0aW9uczogcmVuZGVyZXIgc2l6ZTsgcmVuZGVyT3B0aW9uczogcmVuZGVyZXIgZmxhZ3M7IGNmZzogcmV0cnkgY29uZmlnXHJcbiAgYXN5bmMgY2FwdHVyZUVxdWlyZWN0YW5ndWxhcldpdGhSZXRyeShvcHRpb25zLCByZW5kZXJPcHRpb25zLCB7XHJcbiAgICBtYXhBdHRlbXB0cyA9IDMsXHJcbiAgICBpbml0aWFsQmFja29mZk1zID0gNTAwLFxyXG4gICAgcGVyQXR0ZW1wdFRpbWVvdXRNcyA9IDgwMDAsXHJcbiAgICBzd2VlcElkRm9yUmVhZHlDaGVjayA9IG51bGwsXHJcbiAgICB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMgPSAxMjAwMFxyXG4gIH0gPSB7fSkge1xyXG4gICAgbGV0IGF0dGVtcHQgPSAwO1xyXG4gICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgd2hpbGUgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xyXG4gICAgICBhdHRlbXB0ICs9IDE7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgLy8gRW5zdXJlIHN3ZWVwIGlzIHJlYWR5IGJlZm9yZSBlYWNoIGF0dGVtcHQgaWYgcmVxdWVzdGVkXHJcbiAgICAgICAgaWYgKHN3ZWVwSWRGb3JSZWFkeUNoZWNrKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTd2VlcFJlYWR5KHN3ZWVwSWRGb3JSZWFkeUNoZWNrLCB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMpO1xyXG4gICAgICAgICAgLy8gc21hbGwgc2FmZXR5IGRlbGF5IHRvIGxldCByZW5kZXJlciBmaW5hbGl6ZVxyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCgxMjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmFjZSB0aGUgdGFrZUVxdWlyZWN0YW5ndWxhciBjYWxsIGFnYWluc3QgYSBwZXItYXR0ZW1wdCB0aW1lb3V0XHJcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgIHRoaXMuc2RrLlJlbmRlcmVyLnRha2VFcXVpcmVjdGFuZ3VsYXIob3B0aW9ucywgcmVuZGVyT3B0aW9ucyksXHJcbiAgICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHBlckF0dGVtcHRUaW1lb3V0TXMsIGB0YWtlRXF1aXJlY3Rhbmd1bGFyIHRpbWVkIG91dCBhZnRlciAke3BlckF0dGVtcHRUaW1lb3V0TXN9bXNgKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICAvLyBzdWNjZXNzXHJcbiAgICAgICAgcmV0dXJuIGltZztcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgbGFzdEVycm9yID0gZXJyO1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgdGFrZUVxdWlyZWN0YW5ndWxhciBhdHRlbXB0ICR7YXR0ZW1wdH0gZmFpbGVkOmAsIGVycik7XHJcblxyXG4gICAgICAgIGlmIChhdHRlbXB0ID49IG1heEF0dGVtcHRzKSB7XHJcbiAgICAgICAgICB0aHJvdyBsYXN0RXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBleHBvbmVudGlhbCBiYWNrb2ZmIGJlZm9yZSBuZXh0IGF0dGVtcHRcclxuICAgICAgICBjb25zdCBiYWNrb2ZmID0gaW5pdGlhbEJhY2tvZmZNcyAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKTtcclxuICAgICAgICAvLyBhZGQgc21hbGwgaml0dGVyIHRvIHJlZHVjZSB0aHVuZGVyaW5nIGhlcmRcclxuICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2xlZXAoYmFja29mZiArIGppdHRlcik7XHJcbiAgICAgICAgLy8gbG9vcCB0byBuZXh0IGF0dGVtcHRcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ2NhcHR1cmVFcXVpcmVjdGFuZ3VsYXJXaXRoUmV0cnkgZmFpbGVkIHdpdGhvdXQgZXJyb3InKTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBXYWl0IHVudGlsIHRoZSBTREsgcmVwb3J0cyB0aGUgdGFyZ2V0IHN3ZWVwIGFzIGN1cnJlbnQgLS0tXHJcbiAgLy8gVHJpZXM6IHNkay5Td2VlcC5jdXJyZW50LndhaXRVbnRpbCAtPiBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUgLT4gcG9sbGluZyBnZXRDdXJyZW50L3ZhbHVlXHJcbiAgLy8gVGhpcyBmdW5jdGlvbiBtYXRjaGVzIHRhcmdldElkIGFnYWluc3QgbXVsdGlwbGUgZmllbGRzIGFuZCBwcmlvcml0aXplcyAuaWQgbWF0Y2hpbmcuXHJcbiAgd2FpdEZvclN3ZWVwUmVhZHkodGFyZ2V0SWQ6IHN0cmluZywgdGltZW91dE1zID0gMTAwMDApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHNkayA9IHRoaXMuc2RrO1xyXG5cclxuICAgIC8vIGhlbHBlciB0byBtYXRjaCBtdWx0aXBsZSBpZCBmaWVsZHMsIHByaW9yaXRpemluZyBpZCBmaXJzdFxyXG4gICAgY29uc3QgbWF0Y2hlc1RhcmdldCA9IChkYXRhKSA9PiB7XHJcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAvLyBjaGVjayAuaWQgZmlyc3QgKGxlZ2FjeSksIHRoZW4gdXVpZCwgc2lkLCB1aWRcclxuICAgICAgY29uc3QgZmllbGRzID0gW2RhdGEuaWQsIGRhdGEudXVpZCwgZGF0YS5zaWQsIGRhdGEudWlkXTtcclxuICAgICAgcmV0dXJuIGZpZWxkcy5zb21lKGYgPT4gISFmICYmIFN0cmluZyhmKSA9PT0gU3RyaW5nKHRhcmdldElkKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIC8vIDEpIHByZWZlciB3YWl0VW50aWwgaWYgYXZhaWxhYmxlIG9uIHRoZSBvYnNlcnZhYmxlXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC53YWl0VW50aWwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2RrLlN3ZWVwLmN1cnJlbnQud2FpdFVudGlsKChkYXRhKSA9PiBtYXRjaGVzVGFyZ2V0KGRhdGEpKSxcclxuICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHRpbWVvdXRNcywgYFRpbWVvdXQgd2FpdGluZyBmb3Igc3dlZXAgJHt0YXJnZXRJZH1gKVxyXG4gICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyAyKSBzdWJzY3JpYmUgaWYgYXZhaWxhYmxlXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9mZikgb2ZmKCk7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaW1lb3V0IHdhaXRpbmcgZm9yIHN3ZWVwICR7dGFyZ2V0SWR9YCkpO1xyXG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XHJcblxyXG4gICAgICAgIGxldCBvZmYgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAvLyBzdWJzY3JpYmUgbWF5IHJldHVybiBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiBvciBhbiBvYmplY3Qgd2l0aCB1bnN1YnNjcmliZSgpXHJcbiAgICAgICAgICBjb25zdCBzdWJSZXN1bHQgPSBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZXNUYXJnZXQoZGF0YSkpIHtcclxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICAgIHRyeSB7IGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBzdWJSZXN1bHQoKTsgZWxzZSBpZiAoc3ViUmVzdWx0ICYmIHR5cGVvZiBzdWJSZXN1bHQudW5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHN1YlJlc3VsdC51bnN1YnNjcmliZSgpOyB9IGNhdGNoIChlKSB7LyppZ25vcmUqLyB9XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIGlmIHN1YnNjcmliZSByZXR1cm5lZCBhbiB1bnN1YnNjcmliZSBmdW5jdGlvbiwga2VlcCBpdCBhcyBvZmZcclxuICAgICAgICAgIGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBvZmYgPSBzdWJSZXN1bHQ7XHJcbiAgICAgICAgICBlbHNlIGlmIChzdWJSZXN1bHQgJiYgdHlwZW9mIHN1YlJlc3VsdC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgb2ZmID0gKCkgPT4gc3ViUmVzdWx0LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Nkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZSBub3QgdXNhYmxlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMykgcG9sbGluZyBmYWxsYmFjazogdHJ5IGdldEN1cnJlbnQoKSwgc2RrLlN3ZWVwLmN1cnJlbnQoKSBmdW5jdGlvbiwgb3IgLnZhbHVlLCBlbHNlIHBvbGwgcmVuZGVyZXIgcmVhZGluZXNzXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBwb2xsSW50ZXJ2YWwgPSAyMDA7XHJcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGltZW91dCB3YWl0aW5nIGZvciBzd2VlcCAke3RhcmdldElkfWApKTtcclxuICAgICAgfSwgdGltZW91dE1zKTtcclxuXHJcbiAgICAgIGNvbnN0IGNoZWNrTm93ID0gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBsZXQgY3VycmVudCA9IG51bGw7XHJcbiAgICAgICAgICBpZiAoc2RrLlN3ZWVwICYmIHR5cGVvZiBzZGsuU3dlZXAuZ2V0Q3VycmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gYXdhaXQgc2RrLlN3ZWVwLmdldEN1cnJlbnQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2RrLlN3ZWVwICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBzb21lIGJ1aWxkcyBleHBvc2UgYSBmdW5jdGlvblxyXG4gICAgICAgICAgICBjdXJyZW50ID0gYXdhaXQgc2RrLlN3ZWVwLmN1cnJlbnQoKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHNkay5Td2VlcC5jdXJyZW50LnZhbHVlKSB7XHJcbiAgICAgICAgICAgIC8vIHNvbWUgb2JzZXJ2YWJsZXMgZXhwb3NlIGEgLnZhbHVlXHJcbiAgICAgICAgICAgIGN1cnJlbnQgPSBzZGsuU3dlZXAuY3VycmVudC52YWx1ZTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2hlc1RhcmdldChjdXJyZW50KSkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcclxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIC8vIGlnbm9yZSBhbmQgcmV0cnkgdW50aWwgdGltZW91dFxyXG4gICAgICAgIH1cclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGluaXRpYWwgaW1tZWRpYXRlIGNoZWNrXHJcbiAgICAgIGF3YWl0IGNoZWNrTm93KCk7XHJcbiAgICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoY2hlY2tOb3csIHBvbGxJbnRlcnZhbCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIC0tLSBzbWFsbCBoZWxwZXJzIC0tLVxyXG4gIHNsZWVwKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIG1zKSk7XHJcbiAgfVxyXG5cclxuICB0aW1lb3V0UHJvbWlzZShtczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPG5ldmVyPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKG1lc3NhZ2UpKSwgbXMpKTtcclxuICB9XHJcblxyXG5cclxuICBhc3luYyBnZXRVcGxvYWRlZEltYWdlQ291bnQobW9kZWxJRCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgbGlzdEZpbGVzSW5Gb2xkZXIoYHZpc2l0cy8ke21vZGVsSUR9L3N3ZWVwcy9gKTtcclxuICAgICAgcmV0dXJuIGltYWdlcy5sZW5ndGg7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbW92ZVRvRmxvb3IoZmxvb3JOYW1lOiBzdHJpbmcsIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JzKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdGbG9vciBhcmUgbm90IGxvYWRlZCB5ZXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gbG9vayB1cCBmb3Igc2VxdWVuY2UgbnVtYmVyICh0aGUgc2FmZXN0IG1ldGhvZClcclxuICAgIGxldCBmbG9vck1hdHRlcnBvcnQgPSBPYmplY3QudmFsdWVzKHRoaXMuZmxvb3JzKS5maW5kKFxyXG4gICAgICAoZmxvb3IpID0+IGZsb29yLnNlcXVlbmNlID09PSBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZVxyXG4gICAgKTtcclxuICAgIGlmICghZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGZsb29yTWF0dGVycG9ydCA9IE9iamVjdC52YWx1ZXModGhpcy5mbG9vcnMpLmZpbmQoXHJcbiAgICAgICAgKGZsb29yKSA9PiBmbG9vck5hbWUuaW5jbHVkZXMoZmxvb3IubmFtZSkgJiYgZmxvb3IubmFtZSAhPSAnJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKCFmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgZmxvb3JNYXR0ZXJwb3J0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb29ycykuZmluZCgoZmxvb3IpID0+XHJcbiAgICAgICAgZmxvb3JOYW1lLmluY2x1ZGVzKGZsb29yLmlkKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2coZmxvb3JNYXR0ZXJwb3J0KVxyXG4gICAgaWYgKGZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBsZXQgcmV0cnkgPSB0cnVlO1xyXG4gICAgICB3aGlsZSAocmV0cnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgZmxvb3JJbmRleCA9IGF3YWl0IHRoaXMuc2RrLkZsb29yLm1vdmVUbyhcclxuICAgICAgICAgICAgZmxvb3JNYXR0ZXJwb3J0LnNlcXVlbmNlXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtb3ZlZCB0byBmbG9vckluZGV4XCIsIGZsb29ySW5kZXgpO1xyXG4gICAgICAgICAgcmV0cnkgPSBmYWxzZTtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBtb3ZlIHRvIEZsb29yJywgZXJyb3IpO1xyXG4gICAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKCdObyBtYXR0ZXJwb3J0IGZsb29yIGZvdW5kIHRvIG1vdmUgdG8nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbXBvcnRGbG9vckRhdGEoXHJcbiAgICBkZWZhdXRab25lSUQ6IHN0cmluZyxcclxuICAgIG5vZGU6IE5vZGVcclxuICApOiBQcm9taXNlPFpvbmVbXT4ge1xyXG4gICAgY29uc3Qgem9uZXMgPSBbXTtcclxuICAgIGF3YWl0IHRoaXMuc2RrLk1vZGUubW92ZVRvKHRoaXMuc2RrLk1vZGUuTW9kZS5GTE9PUlBMQU4pO1xyXG4gICAgY29uc3Qgbm1iRmxvb3JzID0gT2JqZWN0LmtleXModGhpcy5mbG9vcnMpLmxlbmd0aDtcclxuICAgIGNvbnNvbGUubG9nKCdUb3RhbCBudW1iZXIgb2YgZmxvb3JzJywgbm1iRmxvb3JzKTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBubWJGbG9vcnM7IGluZGV4ICs9IDEpIHtcclxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcclxuICAgICAgY29uc29sZS5sb2coJ0ltcG9ydGluZyBmbG9vcicsIGluZGV4KTtcclxuICAgICAgYXdhaXQgdGhpcy5zZGsuRmxvb3IubW92ZVRvKGluZGV4KS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBhd2FpdCB3YWl0KDcwMCk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJhYm91dCB0byBzYXZlIHRoZSBmbG9vclwiLCBpbmRleCk7XHJcbiAgICAgICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuc2F2ZUZsb29yKGRlZmF1dFpvbmVJRCwgbm9kZSk7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZWNlaXZlZCBmbG9vciB6b25lXCIsIHpvbmUpO1xyXG4gICAgICAgIHpvbmVzLnB1c2goem9uZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh6b25lcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHNhdmVGbG9vcihkZWZhdXRab25lSUQ6IHN0cmluZywgbm9kZTogTm9kZSk6IFByb21pc2U8Wm9uZT4ge1xyXG4gICAgbGV0IG5hbWUgPSB0aGlzLmN1cnJlbnRGbG9vci5pZDtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGbG9vci5uYW1lICE9PSAnJykge1xyXG4gICAgICBuYW1lID0gdGhpcy5jdXJyZW50Rmxvb3IubmFtZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxheWVyRmxvb3IgPSBhd2FpdCB0aGlzLmdldExheWVyQnlOYW1lKCdGTE9PUicpO1xyXG4gICAgY29uc3Qgc3dlZXBzSW5mbyA9IE9iamVjdC52YWx1ZXModGhpcy5zd2VlcHMpO1xyXG4gICAgY29uc3Qgc3dlZXBzRm9yRmxvb3IgPSBzd2VlcHNJbmZvLmZpbHRlcihcclxuICAgICAgKHN3ZWVwSW5mbykgPT4gc3dlZXBJbmZvLmZsb29ySW5mby5pZCA9PT0gdGhpcy5jdXJyZW50Rmxvb3IuaWRcclxuICAgICk7XHJcbiAgICBjb25zb2xlLmxvZygnY3VycmVudCBmbG9vcicsIHRoaXMuY3VycmVudEZsb29yKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcHMgZm9yIGZsb29yJywgc3dlZXBzRm9yRmxvb3IubGVuZ3RoKTtcclxuICAgIGNvbnN0IHN3ZWVwSURzOiBzdHJpbmdbXSA9IHN3ZWVwc0ZvckZsb29yLm1hcCgoc3dlZXApID0+IHN3ZWVwLnV1aWQpO1xyXG4gICAgY29uc3Qgem9uZSA9IGF3YWl0IHRoaXMuY3JlYXRlWm9uZShcclxuICAgICAgYMOJdGFnZSAke25hbWV9IC0gJHtub2RlLm1ldGFkYXRhfWAsXHJcbiAgICAgIGxheWVyRmxvb3IuaWQsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIGRlZmF1dFpvbmVJRCxcclxuICAgICAgc3dlZXBJRHMsXHJcbiAgICAgIG5vZGUsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KHsgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IHRoaXMuY3VycmVudEZsb29yLnNlcXVlbmNlIH0pXHJcbiAgICApO1xyXG4gICAgLy8gVE9ETyBsaW5rIHRvIHNjYW5zXHJcbiAgICBjb25zdCBiYXNlNjQgPSBhd2FpdCB0aGlzLnNkay5SZW5kZXJlci50YWtlU2NyZWVuU2hvdCh7XHJcbiAgICAgIHdpZHRoOiA0MDk2LFxyXG4gICAgICBoZWlnaHQ6IDIwNDgsXHJcbiAgICB9KTtcclxuICAgIGNvbnN0IHNwYWNlSURzaG9ydCA9IHRoaXMuc3BhY2VJRC5zbGljZSgwLCA4KTtcclxuICAgIGF3YWl0IHVwbG9hZEJhc2U2NEltYWdlKFxyXG4gICAgICBiYXNlNjQsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIGB2aXNpdHMvJHt0aGlzLm1vZGVsSUR9L3BsYW5zL2AsXHJcbiAgICAgIGBwbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9XyR7c3BhY2VJRHNob3J0fWBcclxuICAgICk7XHJcbiAgICAvLyBjcmVhdGUgUGxhbiBvYmplY3RcclxuICAgIGNvbnN0IHBsYW4gPSB7XHJcbiAgICAgIG5hbWU6IGBwbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9YCxcclxuICAgICAgYW5uZXhlOiBgdmlzaXRzLyR7dGhpcy5tb2RlbElEfS9wbGFucy9wbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9XyR7c3BhY2VJRHNob3J0fS5qcGVnYCxcclxuICAgICAgem9uZUlEOiB6b25lLmlkLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGlzQ3VycmVudEZvclpvbmU6IHRydWUsXHJcbiAgICAgIGlzTW9kaWZpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0ltcG9ydGVkTWF0dGVycG9ydDogdHJ1ZSxcclxuICAgIH0gYXMgUGxhbjtcclxuICAgIGF3YWl0IHRoaXMucGxhblNlcnZpY2UuY3JlYXRlUGxhbihwbGFuKTtcclxuICAgIC8vIGNvbnNvbGUubG9nKFwiZmxvb3Igc2F2ZWRcIik7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHpvbmUpO1xyXG4gIH1cclxuXHJcbiAgYWJhbmRvbigpIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnYWJhbmRvbm5pbmcgaW1wb3J0Jyk7XHJcbiAgICAgIHRoaXMuc3RvcCA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVGcmFtZSgpIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRGcmFtZSkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRGcmFtZS5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBnZXRMYXllckJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPExheWVyPiB7XHJcbiAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aGlzLnNwYWNlSUQpO1xyXG4gICAgY29uc3QgY3VycmVudE9yZ0lkID0gbWlzc2lvbi5vcmdhbmlzYXRpb25JRDtcclxuICAgIGNvbnN0IGxheWVycyA9IGF3YWl0IHRoaXMubGF5ZXJTZXJ2aWNlLmdldExheWVyQnlOYW1lRm9yT3JnYW5pc2F0aW9uKFxyXG4gICAgICBuYW1lLFxyXG4gICAgICBjdXJyZW50T3JnSWRcclxuICAgICk7XHJcbiAgICBpZiAobGF5ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIGxheWVyc1swXTtcclxuICAgIH1cclxuICAgIC8vIGNyZWF0ZSB0aGVuXHJcbiAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24obmFtZSwgY3VycmVudE9yZ0lkKTtcclxuICB9XHJcbn1cclxuIl19
|
|
466
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
467
|
+
type: Inject,
|
|
468
|
+
args: [MATTERPORT_SDK_KEY]
|
|
469
|
+
}] }, { type: i1.NavigationService }, { type: i2.ZoneService }, { type: i3.ViewerService }, { type: i4.LayerService }, { type: i5.BaseUserService }, { type: i6.PlanService }] });
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC1pbXBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0UsT0FBTyxFQUNMLFdBQVcsR0FNWixNQUFNLGtCQUFrQixDQUFDO0FBSzFCLE9BQU8sRUFDTCxjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLDBCQUEwQixFQUMxQixpQkFBaUIsR0FDbEIsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7O0FBYXRCLE1BQU0sT0FBTyx1QkFBdUI7SUF3Q2E7SUFDckM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN0NGLFlBQVksQ0FBQztJQUVkLEdBQUcsQ0FBTTtJQUVSLE1BQU0sQ0FBUztJQUVoQixNQUFNLENBQVM7SUFFZCxZQUFZLENBQUM7SUFFYixRQUFRLENBQVM7SUFFakIsUUFBUSxDQUFTO0lBRXpCLElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsT0FBTyxDQUFDLEtBQWE7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLElBQUksR0FBRyxLQUFLLENBQUM7SUFFYixlQUFlLEdBQXFCLElBQUksT0FBTyxFQUFXLENBQUM7SUFFM0QsbUJBQW1CLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFFN0QsZ0JBQWdCLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7SUFFakUsWUFDK0MsTUFBYyxFQUNuRCxpQkFBb0MsRUFDcEMsV0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsWUFBMEIsRUFDMUIsV0FBNEIsRUFDNUIsV0FBd0I7UUFOYSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ25ELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBRWxDLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQWU7UUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFFbEIsV0FBVztRQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLEdBQUcscUJBQXFCLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdkIsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7UUFDdEIsTUFBTSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUM7UUFDNUIsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4RCxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDNUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUM5QixNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLE1BQU0sRUFDTixLQUFLLElBQUksRUFBRTtnQkFDVCxJQUFJLENBQUM7b0JBQ0gsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUM1QyxNQUFNLEVBQ04sSUFBSSxDQUFDLE1BQU0sRUFDWCxFQUFFLENBQ0gsQ0FBQztvQkFDRixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUM1QixtQkFBbUIsRUFBRSxTQUFTLEdBQUcsQ0FBQyxVQUFlOzRCQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQzt3QkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7cUJBQ2IsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzlCLFNBQVMsR0FBRyxDQUFDLFlBQVk7d0JBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO29CQUNuQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUNiLENBQUM7b0JBRUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzt3QkFDNUIsbUJBQW1CLEVBQUUsU0FBUyxHQUFHLENBQUMsVUFBVTs0QkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRSxVQUFVLENBQUMsQ0FBQzs0QkFDNUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7d0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO3FCQUNiLENBQUMsQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQ2hELElBQUksY0FBYyxHQUFHLEtBQUssQ0FBQztvQkFDM0IsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUNoRCxNQUFNLFNBQVMsQ0FDYixHQUFHLEVBQUUsQ0FDSCxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO3dCQUN4RCxjQUFjLEtBQUssSUFBSSxDQUMxQixDQUFDO29CQUNGLElBQUksY0FBYyxFQUFFLENBQUM7d0JBQ25CLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQzt3QkFDaEQsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO29CQUNqRCxDQUFDO29CQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7b0JBQ3pCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuQixDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDakIsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQztnQkFDMUMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FDZCxPQUFlLEVBQ2YsT0FBZSxFQUNmLFlBQXFCLEtBQUssRUFDMUIsT0FBYSxJQUFJLEVBQ2pCLGdCQUFnQixHQUFHLElBQUk7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFFeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxVQUFVLFFBQVE7WUFDN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxRQUFRLENBQUMsS0FBSyxLQUFLLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztnQkFDbEMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUNyQixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzdDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxVQUFVLEdBQVcsRUFBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLGNBQWMsQ0FDbEIsVUFBVSxJQUFJLENBQUMsT0FBTyxhQUFhLEVBQ25DLElBQUksRUFDSixXQUFXLENBQ1osQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FDOUMsSUFBSSxDQUFDLFFBQVEsRUFDYixhQUFhLENBQUMsRUFBRSxFQUNoQixPQUFPLEVBQ1AsUUFBUSxDQUFDLEVBQUUsRUFDWCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFDeEIsSUFBSSxDQUNMLENBQUM7UUFDRixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUN4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2hCLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sZUFBZSxHQUFHO2dCQUN0QixpQkFBaUIsRUFBRSxTQUFTLENBQUMsSUFBSTtnQkFDakMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUN0QixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ2YsT0FBTzthQUNNLENBQUM7WUFDaEIsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQ3ZELGVBQWUsQ0FDaEIsQ0FBQztZQUNGLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FDZCxJQUFZLEVBQ1osT0FBZSxFQUNmLFVBQWtCLElBQUksRUFDdEIsV0FBbUIsSUFBSSxFQUN2QixTQUFtQixFQUFFLEVBQ3JCLE9BQWEsSUFBSSxFQUNqQixXQUFtQixJQUFJO1FBRXZCLE1BQU0sU0FBUyxHQUFHO1lBQ2hCLElBQUk7WUFDSixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTztZQUNQLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQ3pCLENBQUM7UUFDVix3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osU0FBUyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLFNBQVMsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLGdCQUFnQixHQUFHLElBQUk7UUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWhDLE9BQU8sSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ25DLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVyQyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFcEYsS0FBSyxJQUFJLEtBQUssR0FBRyxLQUFLLEVBQUUsS0FBSyxHQUFHLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBRXJELElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQztvQkFDMUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNmLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDbkIsTUFBTTtnQkFDUixDQUFDO2dCQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFFdkMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUM7Z0JBRW5ELElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7d0JBQ2xDLFFBQVEsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTt3QkFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWM7NEJBQzNELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTzs0QkFDeEMsQ0FBQyxDQUFDLFNBQVM7d0JBQ2IsY0FBYyxFQUFFLENBQUM7cUJBQ2xCLENBQUMsQ0FBQztvQkFFSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQywrQkFBK0IsQ0FDcEQsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDN0IsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDbkM7d0JBQ0UsV0FBVyxFQUFFLENBQUM7d0JBQ2QsZ0JBQWdCLEVBQUUsR0FBRzt3QkFDckIsbUJBQW1CLEVBQUUsSUFBSTt3QkFDekIsb0JBQW9CLEVBQUUsTUFBTTt3QkFDNUIscUJBQXFCLEVBQUUsS0FBSztxQkFDN0IsQ0FDRixDQUFDO29CQUVGLDBCQUEwQixDQUN4QixHQUFHLEVBQ0gsS0FBSyxDQUFDLElBQUksSUFBSSxNQUFNLEVBQ3BCLFVBQVUsSUFBSSxDQUFDLE9BQU8sVUFBVSxFQUNoQyxPQUFPLEVBQ1AsQ0FBQyxDQUNGLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTt3QkFDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNyQyxJQUFJLEtBQUssS0FBSyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQzNCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQzs0QkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7d0JBQ25CLENBQUM7b0JBQ0gsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDNUMsQ0FBQyxDQUFDLENBQUM7Z0JBRUwsQ0FBQztnQkFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkJBQTJCLE1BQU0saUJBQWlCLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3ZFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3JDLFNBQVM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7WUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLCtCQUErQixDQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUUsRUFDNUQsV0FBVyxHQUFHLENBQUMsRUFDZixnQkFBZ0IsR0FBRyxHQUFHLEVBQ3RCLG1CQUFtQixHQUFHLElBQUksRUFDMUIsb0JBQW9CLEdBQUcsSUFBSSxFQUMzQixxQkFBcUIsR0FBRyxLQUFLLEVBQzlCLEdBQUcsRUFBRTtRQUNKLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFFckIsT0FBTyxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUNiLElBQUksQ0FBQztnQkFDSCxJQUFJLG9CQUFvQixFQUFFLENBQUM7b0JBQ3pCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLHFCQUFxQixDQUFDLENBQUM7b0JBQzFFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDeEIsQ0FBQztnQkFFRCxNQUFNLEdBQUcsR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7b0JBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7b0JBQzdELElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsdUNBQXVDLG1CQUFtQixJQUFJLENBQUM7aUJBQ3pHLENBQUMsQ0FBQztnQkFFSCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLFNBQVMsR0FBRyxHQUFHLENBQUM7Z0JBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUVwRSxJQUFJLE9BQU8sSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDM0IsTUFBTSxTQUFTLENBQUM7Z0JBQ2xCLENBQUM7Z0JBRUQsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQztZQUNyQyxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sU0FBUyxJQUFJLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELGlCQUFpQixDQUFDLFFBQWdCLEVBQUUsU0FBUyxHQUFHLEtBQUs7UUFDbkQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUVyQixNQUFNLGFBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQztRQUVGLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4RixPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSw2QkFBNkIsUUFBUSxFQUFFLENBQUM7YUFDeEUsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4RixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO2dCQUNyQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUM1QixJQUFJLEdBQUc7d0JBQUUsR0FBRyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLDZCQUE2QixRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFZCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7Z0JBQ2YsSUFBSSxDQUFDO29CQUNILE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUNyRCxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOzRCQUN4QixZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ3BCLElBQUksQ0FBQztnQ0FBQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFVBQVU7b0NBQUUsU0FBUyxFQUFFLENBQUM7cUNBQU0sSUFBSSxTQUFTLElBQUksT0FBTyxTQUFTLENBQUMsV0FBVyxLQUFLLFVBQVU7b0NBQUUsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUFDLENBQUM7NEJBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBLFVBQVUsQ0FBQyxDQUFDOzRCQUM3SyxPQUFPLEVBQUUsQ0FBQzt3QkFDWixDQUFDO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksT0FBTyxTQUFTLEtBQUssVUFBVTt3QkFBRSxHQUFHLEdBQUcsU0FBUyxDQUFDO3lCQUNoRCxJQUFJLFNBQVMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxXQUFXLEtBQUssVUFBVTt3QkFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUN6RyxDQUFDO2dCQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ1gsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNwQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO2dCQUM5RCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQzNDLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUM1QixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdELENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVkLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFO2dCQUMxQixJQUFJLENBQUM7b0JBQ0gsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNuQixJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDNUQsT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDekMsQ0FBQzt5QkFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDaEUsT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztvQkFDdEMsQ0FBQzt5QkFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7d0JBQ3JFLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLENBQUM7b0JBRUQsSUFBSSxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzt3QkFDM0IsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNwQixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7d0JBQ3hCLE9BQU8sRUFBRSxDQUFDO29CQUNaLENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNYLGlDQUFpQztnQkFDbkMsQ0FBQztZQUNILENBQUMsQ0FBQztZQUVGLE1BQU0sUUFBUSxFQUFFLENBQUM7WUFDakIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsRUFBVTtRQUNkLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELGNBQWMsQ0FBQyxFQUFVLEVBQUUsT0FBZTtRQUN4QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVELEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxPQUFPLFVBQVUsQ0FBQyxDQUFDO1lBQ3BFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUN2QixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFNBQWlCLEVBQUUsMEJBQWtDLElBQUk7UUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDeEMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ25ELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLHVCQUF1QixDQUN0RCxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQy9DLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FDOUQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsZUFBZSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzFELFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUM3QixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxDQUFDO29CQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUM1QyxlQUFlLENBQUMsUUFBUSxDQUN6QixDQUFDO29CQUNGLEtBQUssR0FBRyxLQUFLLENBQUM7Z0JBQ2hCLENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUMzQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQzFCLFlBQW9CLEVBQ3BCLElBQVU7UUFFVixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2pELEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxTQUFTLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNqRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDdEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQUMsWUFBb0IsRUFBRSxJQUFVO1FBQ3RELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ2hDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDbEMsSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ2hDLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FDdEMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUMvRCxDQUFDO1FBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFhLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQ2hDLFNBQVMsSUFBSSxNQUFNLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFDbEMsVUFBVSxDQUFDLEVBQUUsRUFDYixJQUFJLEVBQ0osWUFBWSxFQUNaLFFBQVEsRUFDUixJQUFJLEVBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FDeEUsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQ3BELEtBQUssRUFBRSxJQUFJO1lBQ1gsTUFBTSxFQUFFLElBQUk7U0FDYixDQUFDLENBQUM7UUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxpQkFBaUIsQ0FDckIsTUFBTSxFQUNOLElBQUksRUFDSixVQUFVLElBQUksQ0FBQyxPQUFPLFNBQVMsRUFDL0IsY0FBYyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxZQUFZLEVBQUUsQ0FDckQsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHO1lBQ1gsSUFBSSxFQUFFLGNBQWMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDMUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDLE9BQU8scUJBQXFCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLFlBQVksT0FBTztZQUM5RixNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0QixVQUFVLEVBQUUsS0FBSztZQUNqQixvQkFBb0IsRUFBRSxJQUFJO1NBQ25CLENBQUM7UUFDVixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsT0FBTztRQUNMLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxjQUFjLENBQUMsSUFBWTtRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsNkJBQTZCLENBQ2xFLElBQUksRUFDSixZQUFZLENBQ2IsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN0QixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLDBCQUEwQixDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztJQUMxRSxDQUFDO3dHQXBqQlUsdUJBQXVCLGtCQXdDeEIsa0JBQWtCOzRHQXhDakIsdUJBQXVCLGNBRnRCLE1BQU07OzRGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQXlDSSxNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNQVRURVJQT1JUX1NES19LRVkgfSBmcm9tICcuLi90b2tlbnMvbWF0dGVycG9ydC1zZGsta2V5LnRva2VuJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3QsIHdhaXQsIHdhaXRVbnRpbCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgTGV2ZWxTdGF0dXMsXHJcbiAgTGF5ZXIsXHJcbiAgTm9kZSxcclxuICBab25lLFxyXG4gIE5hdmlnYXRpb24sXHJcbiAgUGxhbixcclxufSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5ZXJTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbGF5ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvbmF2aWdhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUGxhblNlcnZpY2UgfSBmcm9tICcuL21vZGVscy9wbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3pvbmUuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgdXBsb2FkSnNvblRvUzMsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2UsXHJcbiAgdXBsb2FkQmFzZTY0SW1hZ2VXaXRoUmV0cnksXHJcbiAgbGlzdEZpbGVzSW5Gb2xkZXIsXHJcbn0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVVzZXJTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3ZXJTZXJ2aWNlIH0gZnJvbSAnLi92aWV3ZXIuc2VydmljZSc7XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0SW1wb3J0U2VydmljZSB7XHJcbiAgcHJpdmF0ZSBjdXJyZW50RnJhbWU7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzd2VlcHM6IE9iamVjdDtcclxuXHJcbiAgcHVibGljIGZsb29yczogT2JqZWN0O1xyXG5cclxuICBwcml2YXRlIGN1cnJlbnRGbG9vcjtcclxuXHJcbiAgcHJpdmF0ZSBfbW9kZWxJRDogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF9zcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gIHB1YmxpYyBnZXQgc3BhY2VJRCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NwYWNlSUQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHNwYWNlSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fc3BhY2VJRCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBtb2RlbElEKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fbW9kZWxJRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbW9kZWxJRCh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9tb2RlbElEID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RvcCA9IGZhbHNlO1xyXG5cclxuICBwdWJsaWMgaW1wb3J0aW5nSW1hZ2VzOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcclxuXHJcbiAgcHVibGljIHN3ZWVwUHJvY2Vzc2VkQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcbiAgcHVibGljIHRvdGFsU3dlZXBzQ291bnQ6IFN1YmplY3Q8bnVtYmVyPiA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHZpZXdlclNlcnZpY2U6IFZpZXdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBwbGFuU2VydmljZTogUGxhblNlcnZpY2VcclxuICApIHtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXRTZGtGb3JNb2RlbChtb2RlbElEOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMuc3RvcCA9IGZhbHNlO1xyXG5cclxuICAgIC8vIExvYWQgU0RLXHJcbiAgICBjb25zb2xlLmxvZygnTG9hZGluZyBNYXR0ZXJwb3J0IFNESycpO1xyXG4gICAgdGhpcy5tb2RlbElEID0gbW9kZWxJRDtcclxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xyXG4gICAgaWYgKCFpZnJhbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY3JlYXRlIGlmcmFtZScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnNldFRvdXJVcmwoeyBtb2RlbDNkOiBtb2RlbElEIH0pO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy52aWV3ZXJTZXJ2aWNlLmdldFRvdXJVcmwoKTtcclxuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7XHJcbiAgICBpZnJhbWUuYWxsb3cgPSAneHItc3BhdGlhbC10cmFja2luZyc7XHJcbiAgICBpZnJhbWUuaGVpZ2h0ID0gJzEwMCUnO1xyXG4gICAgaWZyYW1lLndpZHRoID0gJzEwMCUnO1xyXG4gICAgaWZyYW1lLmlkID0gJ3ZpZXdlci1tb2R1bGUnO1xyXG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXItZnJhbWUnKTtcclxuICAgIGVsZW1lbnQuYXBwZW5kKGlmcmFtZSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGcmFtZSA9IGlmcmFtZTtcclxuICAgIGNvbnN0IHNob3djYXNlV2luZG93ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKFxyXG4gICAgICAgICdsb2FkJyxcclxuICAgICAgICBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLnNkayA9IGF3YWl0IHNob3djYXNlV2luZG93Lk1QX1NESy5jb25uZWN0KFxyXG4gICAgICAgICAgICAgIGlmcmFtZSxcclxuICAgICAgICAgICAgICB0aGlzLnNka0tleSxcclxuICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5GbG9vci5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mbG9vcnMgPSBjb2xsZWN0aW9uO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkZsb29yLmN1cnJlbnQuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIHVwZChjdXJyZW50Rmxvb3IpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudEZsb29yID0gY3VycmVudEZsb29yO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZGsuU3dlZXAuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIHVwZChjb2xsZWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGhlIGVudGlyZSB1cC10by1kYXRlIGNvbGxlY3Rpb24nLCBjb2xsZWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBzID0gY29sbGVjdGlvbjtcclxuICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNkay5TZXR0aW5ncy51cGRhdGUoJ2xhYmVscycsIGZhbHNlKTtcclxuICAgICAgICAgICAgbGV0IHRpbWVvdXRFeHBpcmVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gKHRpbWVvdXRFeHBpcmVkID0gdHJ1ZSksIDcwMDApO1xyXG4gICAgICAgICAgICBhd2FpdCB3YWl0VW50aWwoXHJcbiAgICAgICAgICAgICAgKCkgPT5cclxuICAgICAgICAgICAgICAgICh0aGlzLnN3ZWVwcyAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZmxvb3JzICE9PSB1bmRlZmluZWQpIHx8XHJcbiAgICAgICAgICAgICAgICB0aW1lb3V0RXhwaXJlZCA9PT0gdHJ1ZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBpZiAodGltZW91dEV4cGlyZWQpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygndGltZW91dCBpbnRpdGlhbGlzaW5nIE1hdHRlcnBvcnQnKTtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVqKG5ldyBFcnJvcignZXJyb3IgaW5pdCBNYXR0ZXJwb3J0JykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdpbml0IGRvbmUnKTtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcyh0cnVlKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgcmVqKG5ldyBFcnJvcignZXJyb3IgaW5pdCBNYXR0ZXJwb3J0JykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbXBvcnREYXRhKFxyXG4gICAgc3BhY2VJRDogc3RyaW5nLFxyXG4gICAgc3VyZmFjZTogbnVtYmVyLFxyXG4gICAgcmVsb2FkaW5nOiBib29sZWFuID0gZmFsc2UsXHJcbiAgICBub2RlOiBOb2RlID0gbnVsbCxcclxuICAgIG92ZXJyaWRlRXhpc3RpbmcgPSB0cnVlXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAoIXRoaXMuc3dlZXBzKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ25vIHN3ZWVwcyBpbml0aWFsaXplZCcpKTtcclxuICAgIH1cclxuICAgIGxldCBhcHBJc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS5zdWJzY3JpYmUoZnVuY3Rpb24gKGFwcFN0YXRlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdUaGUgY3VycmVudCBwaGFzZTogJywgYXBwU3RhdGUucGhhc2UpO1xyXG4gICAgICBpZiAoYXBwU3RhdGUucGhhc2UgPT09ICdhcHBwaGFzZS5wbGF5aW5nJykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdUaGUgYXBwIGlzIHBsYXlpbmcnKTtcclxuICAgICAgICBhcHBJc0xvYWRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGF3YWl0IHdhaXRVbnRpbCgoKSA9PiBhcHBJc0xvYWRlZCA9PT0gdHJ1ZSk7XHJcblxyXG4gICAgaWYgKHJlbG9hZGluZykge1xyXG4gICAgICBhd2FpdCB0aGlzLmltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nKTtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNwYWNlSUQgPSBzcGFjZUlEO1xyXG4gICAgbGV0IGZsb29yWm9uZXM6IFpvbmVbXSA9IFtdO1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShzcGFjZUlEKTtcclxuICAgIGNvbnN0IG1haW5ab25lID0gem9uZXMuZmluZCgoeikgPT4gIXoucGFyZW50SUQpO1xyXG4gICAgaWYgKCFtYWluWm9uZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdtaXNzaW5nIGRhdGEgKG5vIG1haW4gQnVpbGRpbmcgWm9uZSknKSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZygnaW1wb3J0aW5nIGRhdGEgZnJvbSBtYXR0ZXJwb3J0Jyk7XHJcbiAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoT2JqZWN0LnZhbHVlcyh0aGlzLnN3ZWVwcykpO1xyXG4gICAgYXdhaXQgdXBsb2FkSnNvblRvUzMoXHJcbiAgICAgIGB2aXNpdHMvJHt0aGlzLm1vZGVsSUR9L2ludmVudG9yeS9gLFxyXG4gICAgICBqc29uLFxyXG4gICAgICAnZGF0YS5qc29uJ1xyXG4gICAgKTtcclxuICAgIGNvbnN0IGxheWVyQnVpbGRpbmcgPSBhd2FpdCB0aGlzLmdldExheWVyQnlOYW1lKCdCVUlMRElORycpO1xyXG4gICAgY29uc3QgY3JlYXRlZERlZmF1bHRab25lID0gYXdhaXQgdGhpcy5jcmVhdGVab25lKFxyXG4gICAgICBub2RlLm1ldGFkYXRhLFxyXG4gICAgICBsYXllckJ1aWxkaW5nLmlkLFxyXG4gICAgICBzdXJmYWNlLFxyXG4gICAgICBtYWluWm9uZS5pZCxcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5zd2VlcHMpLFxyXG4gICAgICBub2RlXHJcbiAgICApO1xyXG4gICAgaWYgKCFjcmVhdGVkRGVmYXVsdFpvbmUpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mbG9vcnMpIHtcclxuICAgICAgZmxvb3Jab25lcyA9IGF3YWl0IHRoaXMuaW1wb3J0Rmxvb3JEYXRhKGNyZWF0ZWREZWZhdWx0Wm9uZS5pZCwgbm9kZSk7XHJcbiAgICB9XHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgT2JqZWN0LmtleXModGhpcy5zd2VlcHMpLm1hcChhc3luYyAoa2V5KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgc3dlZXBJbmZvID0gdGhpcy5zd2VlcHNba2V5XTtcclxuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uSW5wdXQgPSB7XHJcbiAgICAgICAgICBtYXR0ZXJwb3J0U3dlZXBJRDogc3dlZXBJbmZvLnV1aWQsXHJcbiAgICAgICAgICBwb3NpdGlvbjogSlNPTi5zdHJpbmdpZnkoc3dlZXBJbmZvLnBvc2l0aW9uKSxcclxuICAgICAgICAgIHJvdGF0aW9uOiBKU09OLnN0cmluZ2lmeShzd2VlcEluZm8ucm90YXRpb24pLFxyXG4gICAgICAgICAgbGV2ZWw6IExldmVsU3RhdHVzLkxPVyxcclxuICAgICAgICAgIG5vZGVJRDogbm9kZS5pZCxcclxuICAgICAgICAgIHNwYWNlSUQsXHJcbiAgICAgICAgfSBhcyBOYXZpZ2F0aW9uO1xyXG4gICAgICAgIGNvbnN0IG5hdiA9IGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3JlYXRlTmF2aWdhdGlvbihcclxuICAgICAgICAgIG5hdmlnYXRpb25JbnB1dFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKCFuYXYpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdjb3VsZCBjcmVhdGUgbmF2aWdhdGlvbicsIG5hdmlnYXRpb25JbnB1dC5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIGF3YWl0IHRoaXMuaW1wb3J0MzYwaW1hZ2VzKG92ZXJyaWRlRXhpc3RpbmcpO1xyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGNyZWF0ZVpvbmUoXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBsYXllcklEOiBzdHJpbmcsXHJcbiAgICBzdXJmYWNlOiBudW1iZXIgPSBudWxsLFxyXG4gICAgcGFyZW50SUQ6IHN0cmluZyA9IG51bGwsXHJcbiAgICBzd2VlcHM6IHN0cmluZ1tdID0gW10sXHJcbiAgICBub2RlOiBOb2RlID0gbnVsbCxcclxuICAgIG1ldGFkYXRhOiBzdHJpbmcgPSBudWxsXHJcbiAgKTogUHJvbWlzZTxab25lPiB7XHJcbiAgICBjb25zdCB6b25lSW5wdXQgPSB7XHJcbiAgICAgIG5hbWUsXHJcbiAgICAgIHNwYWNlSUQ6IHRoaXMuc3BhY2VJRCxcclxuICAgICAgbGF5ZXJJRCxcclxuICAgICAgc3dlZXBJRHM6IHN3ZWVwcyxcclxuICAgICAgbm9kZUlEczogbm9kZSA/IFtub2RlLmlkXSA6IG51bGwsXHJcbiAgICB9IGFzIFpvbmU7XHJcbiAgICByZW1vdmVOdWxsS2V5c0Zyb21PYmplY3Qoem9uZUlucHV0KTtcclxuICAgIGlmIChzdXJmYWNlKSB7XHJcbiAgICAgIHpvbmVJbnB1dC5zdXJmYWNlID0gc3VyZmFjZTtcclxuICAgIH1cclxuICAgIGlmIChwYXJlbnRJRCkge1xyXG4gICAgICB6b25lSW5wdXQucGFyZW50SUQgPSBwYXJlbnRJRDtcclxuICAgIH1cclxuICAgIGlmIChtZXRhZGF0YSkge1xyXG4gICAgICB6b25lSW5wdXQubWV0YWRhdGEgPSBtZXRhZGF0YTtcclxuICAgIH1cclxuICAgIGNvbnN0IG5ld0xvY2FsID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5jcmVhdGUoem9uZUlucHV0KTtcclxuICAgIHJldHVybiBuZXdMb2NhbDtcclxuICB9XHJcblxyXG4gIGFzeW5jIGltcG9ydDM2MGltYWdlcyhvdmVycmlkZUV4aXN0aW5nID0gdHJ1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc29sZS5sb2coJ0ltcG9ydGluZyAzNjAgaW1hZ2VzJyk7XHJcbiAgICB0aGlzLmltcG9ydGluZ0ltYWdlcy5uZXh0KHRydWUpO1xyXG5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xyXG4gICAgICBjb25zdCBzY2FucyA9IE9iamVjdC52YWx1ZXModGhpcy5zd2VlcHMpO1xyXG4gICAgICBjb25zdCBubWJTY2FucyA9IHNjYW5zLmxlbmd0aDtcclxuXHJcbiAgICAgIHRoaXMudG90YWxTd2VlcHNDb3VudC5uZXh0KG5tYlNjYW5zKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gb3ZlcnJpZGVFeGlzdGluZyA/IDAgOiBhd2FpdCB0aGlzLmdldFVwbG9hZGVkSW1hZ2VDb3VudCh0aGlzLm1vZGVsSUQpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaW5kZXggPSBzdGFydDsgaW5kZXggPCBubWJTY2FuczsgaW5kZXggKz0gMSkge1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zdG9wKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQWJhbmRvbmluZyBpbXBvcnQgYmVjYXVzZSBpdCB3YXMgY2FuY2VsbGVkJyk7XHJcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBzY2Fuc1tpbmRleF07XHJcbiAgICAgICAgY29uc29sZS5sb2coJ01vdmluZyB0byBzd2VlcDonLCBzd2VlcCk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1vdmVJZCA9IHN3ZWVwLmlkIHx8IHN3ZWVwLnV1aWQgfHwgc3dlZXAuc2lkO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zZGsuU3dlZXAubW92ZVRvKG1vdmVJZCwge1xyXG4gICAgICAgICAgICByb3RhdGlvbjogeyB4OiAwLCB5OiAwIH0sXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb246IHRoaXMuc2RrLkNhbWVyYSAmJiB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGVcclxuICAgICAgICAgICAgICA/IHRoaXMuc2RrLkNhbWVyYS5UcmFuc2l0aW9uVHlwZS5JTlNUQU5UXHJcbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRyYW5zaXRpb25UaW1lOiAwLFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgdGhpcy5jYXB0dXJlRXF1aXJlY3Rhbmd1bGFyV2l0aFJldHJ5KFxyXG4gICAgICAgICAgICB7IHdpZHRoOiAyMDQ4LCBoZWlnaHQ6IDEwMjQgfSxcclxuICAgICAgICAgICAgeyBtYXR0ZXJ0YWdzOiBmYWxzZSwgc3dlZXBzOiB0cnVlIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBtYXhBdHRlbXB0czogMyxcclxuICAgICAgICAgICAgICBpbml0aWFsQmFja29mZk1zOiA1MDAsXHJcbiAgICAgICAgICAgICAgcGVyQXR0ZW1wdFRpbWVvdXRNczogODAwMCxcclxuICAgICAgICAgICAgICBzd2VlcElkRm9yUmVhZHlDaGVjazogbW92ZUlkLFxyXG4gICAgICAgICAgICAgIHdhaXRGb3JTd2VlcFRpbWVvdXRNczogMTIwMDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICB1cGxvYWRCYXNlNjRJbWFnZVdpdGhSZXRyeShcclxuICAgICAgICAgICAgaW1nLFxyXG4gICAgICAgICAgICBzd2VlcC51dWlkIHx8IG1vdmVJZCxcclxuICAgICAgICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vc3dlZXBzL2AsXHJcbiAgICAgICAgICAgICdzd2VlcCcsXHJcbiAgICAgICAgICAgIDVcclxuICAgICAgICAgICkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3dlZXBQcm9jZXNzZWRDb3VudC5uZXh0KGluZGV4KTtcclxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBubWJTY2FucyAtIDEpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSW1wb3J0IDM2MCBkb25lJyk7XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZyYW1lKCk7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdG9wID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSkuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJFcnJvciB1cGxvYWRpbmcgc2NhbiA6IFwiLCBlKTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBjYXB0dXJlIHN3ZWVwICR7bW92ZUlkfSBhZnRlciByZXRyaWVzOmAsIGVycik7XHJcbiAgICAgICAgICB0aGlzLnN3ZWVwUHJvY2Vzc2VkQ291bnQubmV4dChpbmRleCk7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICAgIHRoaXMucmVtb3ZlRnJhbWUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2FwdHVyZUVxdWlyZWN0YW5ndWxhcldpdGhSZXRyeShvcHRpb25zLCByZW5kZXJPcHRpb25zLCB7XHJcbiAgICBtYXhBdHRlbXB0cyA9IDMsXHJcbiAgICBpbml0aWFsQmFja29mZk1zID0gNTAwLFxyXG4gICAgcGVyQXR0ZW1wdFRpbWVvdXRNcyA9IDgwMDAsXHJcbiAgICBzd2VlcElkRm9yUmVhZHlDaGVjayA9IG51bGwsXHJcbiAgICB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMgPSAxMjAwMFxyXG4gIH0gPSB7fSkge1xyXG4gICAgbGV0IGF0dGVtcHQgPSAwO1xyXG4gICAgbGV0IGxhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgd2hpbGUgKGF0dGVtcHQgPCBtYXhBdHRlbXB0cykge1xyXG4gICAgICBhdHRlbXB0ICs9IDE7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHN3ZWVwSWRGb3JSZWFkeUNoZWNrKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JTd2VlcFJlYWR5KHN3ZWVwSWRGb3JSZWFkeUNoZWNrLCB3YWl0Rm9yU3dlZXBUaW1lb3V0TXMpO1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zbGVlcCgxMjApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaW1nID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtcclxuICAgICAgICAgIHRoaXMuc2RrLlJlbmRlcmVyLnRha2VFcXVpcmVjdGFuZ3VsYXIob3B0aW9ucywgcmVuZGVyT3B0aW9ucyksXHJcbiAgICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHBlckF0dGVtcHRUaW1lb3V0TXMsIGB0YWtlRXF1aXJlY3Rhbmd1bGFyIHRpbWVkIG91dCBhZnRlciAke3BlckF0dGVtcHRUaW1lb3V0TXN9bXNgKVxyXG4gICAgICAgIF0pO1xyXG5cclxuICAgICAgICByZXR1cm4gaW1nO1xyXG4gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICBsYXN0RXJyb3IgPSBlcnI7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGB0YWtlRXF1aXJlY3Rhbmd1bGFyIGF0dGVtcHQgJHthdHRlbXB0fSBmYWlsZWQ6YCwgZXJyKTtcclxuXHJcbiAgICAgICAgaWYgKGF0dGVtcHQgPj0gbWF4QXR0ZW1wdHMpIHtcclxuICAgICAgICAgIHRocm93IGxhc3RFcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGJhY2tvZmYgPSBpbml0aWFsQmFja29mZk1zICogTWF0aC5wb3coMiwgYXR0ZW1wdCAtIDEpO1xyXG4gICAgICAgIGNvbnN0IGppdHRlciA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zbGVlcChiYWNrb2ZmICsgaml0dGVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRocm93IGxhc3RFcnJvciB8fCBuZXcgRXJyb3IoJ2NhcHR1cmVFcXVpcmVjdGFuZ3VsYXJXaXRoUmV0cnkgZmFpbGVkIHdpdGhvdXQgZXJyb3InKTtcclxuICB9XHJcblxyXG4gIHdhaXRGb3JTd2VlcFJlYWR5KHRhcmdldElkOiBzdHJpbmcsIHRpbWVvdXRNcyA9IDEwMDAwKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBzZGsgPSB0aGlzLnNkaztcclxuXHJcbiAgICBjb25zdCBtYXRjaGVzVGFyZ2V0ID0gKGRhdGEpID0+IHtcclxuICAgICAgaWYgKCFkYXRhKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFtkYXRhLmlkLCBkYXRhLnV1aWQsIGRhdGEuc2lkLCBkYXRhLnVpZF07XHJcbiAgICAgIHJldHVybiBmaWVsZHMuc29tZShmID0+ICEhZiAmJiBTdHJpbmcoZikgPT09IFN0cmluZyh0YXJnZXRJZCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC53YWl0VW50aWwgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2RrLlN3ZWVwLmN1cnJlbnQud2FpdFVudGlsKChkYXRhKSA9PiBtYXRjaGVzVGFyZ2V0KGRhdGEpKSxcclxuICAgICAgICB0aGlzLnRpbWVvdXRQcm9taXNlKHRpbWVvdXRNcywgYFRpbWVvdXQgd2FpdGluZyBmb3Igc3dlZXAgJHt0YXJnZXRJZH1gKVxyXG4gICAgICBdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2RrLlN3ZWVwICYmIHNkay5Td2VlcC5jdXJyZW50ICYmIHR5cGVvZiBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9mZikgb2ZmKCk7XHJcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaW1lb3V0IHdhaXRpbmcgZm9yIHN3ZWVwICR7dGFyZ2V0SWR9YCkpO1xyXG4gICAgICAgIH0sIHRpbWVvdXRNcyk7XHJcblxyXG4gICAgICAgIGxldCBvZmYgPSBudWxsO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBzdWJSZXN1bHQgPSBzZGsuU3dlZXAuY3VycmVudC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZXNUYXJnZXQoZGF0YSkpIHtcclxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xyXG4gICAgICAgICAgICAgIHRyeSB7IGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBzdWJSZXN1bHQoKTsgZWxzZSBpZiAoc3ViUmVzdWx0ICYmIHR5cGVvZiBzdWJSZXN1bHQudW5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpIHN1YlJlc3VsdC51bnN1YnNjcmliZSgpOyB9IGNhdGNoIChlKSB7LyppZ25vcmUqLyB9XHJcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGlmICh0eXBlb2Ygc3ViUmVzdWx0ID09PSAnZnVuY3Rpb24nKSBvZmYgPSBzdWJSZXN1bHQ7XHJcbiAgICAgICAgICBlbHNlIGlmIChzdWJSZXN1bHQgJiYgdHlwZW9mIHN1YlJlc3VsdC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgb2ZmID0gKCkgPT4gc3ViUmVzdWx0LnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ3Nkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZSBub3QgdXNhYmxlJykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcG9sbEludGVydmFsID0gMjAwO1xyXG4gICAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xyXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRpbWVvdXQgd2FpdGluZyBmb3Igc3dlZXAgJHt0YXJnZXRJZH1gKSk7XHJcbiAgICAgIH0sIHRpbWVvdXRNcyk7XHJcblxyXG4gICAgICBjb25zdCBjaGVja05vdyA9IGFzeW5jICgpID0+IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbGV0IGN1cnJlbnQgPSBudWxsO1xyXG4gICAgICAgICAgaWYgKHNkay5Td2VlcCAmJiB0eXBlb2Ygc2RrLlN3ZWVwLmdldEN1cnJlbnQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY3VycmVudCA9IGF3YWl0IHNkay5Td2VlcC5nZXRDdXJyZW50KCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHNkay5Td2VlcCAmJiB0eXBlb2Ygc2RrLlN3ZWVwLmN1cnJlbnQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgY3VycmVudCA9IGF3YWl0IHNkay5Td2VlcC5jdXJyZW50KCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHNkay5Td2VlcCAmJiBzZGsuU3dlZXAuY3VycmVudCAmJiBzZGsuU3dlZXAuY3VycmVudC52YWx1ZSkge1xyXG4gICAgICAgICAgICBjdXJyZW50ID0gc2RrLlN3ZWVwLmN1cnJlbnQudmFsdWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKG1hdGNoZXNUYXJnZXQoY3VycmVudCkpIHtcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAvLyBpZ25vcmUgYW5kIHJldHJ5IHVudGlsIHRpbWVvdXRcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBhd2FpdCBjaGVja05vdygpO1xyXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKGNoZWNrTm93LCBwb2xsSW50ZXJ2YWwpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzID0+IHNldFRpbWVvdXQocmVzLCBtcykpO1xyXG4gIH1cclxuXHJcbiAgdGltZW91dFByb21pc2UobXM6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxuZXZlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChfLCByZWplY3QpID0+IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSksIG1zKSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRVcGxvYWRlZEltYWdlQ291bnQobW9kZWxJRCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaW1hZ2VzID0gYXdhaXQgbGlzdEZpbGVzSW5Gb2xkZXIoYHZpc2l0cy8ke21vZGVsSUR9L3N3ZWVwcy9gKTtcclxuICAgICAgcmV0dXJuIGltYWdlcy5sZW5ndGg7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbW92ZVRvRmxvb3IoZmxvb3JOYW1lOiBzdHJpbmcsIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlOiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICBpZiAoIXRoaXMuZmxvb3JzKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdGbG9vciBhcmUgbm90IGxvYWRlZCB5ZXQnKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IGZsb29yTWF0dGVycG9ydCA9IE9iamVjdC52YWx1ZXModGhpcy5mbG9vcnMpLmZpbmQoXHJcbiAgICAgIChmbG9vcikgPT4gZmxvb3Iuc2VxdWVuY2UgPT09IG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlXHJcbiAgICApO1xyXG4gICAgaWYgKCFmbG9vck1hdHRlcnBvcnQpIHtcclxuICAgICAgZmxvb3JNYXR0ZXJwb3J0ID0gT2JqZWN0LnZhbHVlcyh0aGlzLmZsb29ycykuZmluZChcclxuICAgICAgICAoZmxvb3IpID0+IGZsb29yTmFtZS5pbmNsdWRlcyhmbG9vci5uYW1lKSAmJiBmbG9vci5uYW1lICE9ICcnXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWZsb29yTWF0dGVycG9ydCkge1xyXG4gICAgICBmbG9vck1hdHRlcnBvcnQgPSBPYmplY3QudmFsdWVzKHRoaXMuZmxvb3JzKS5maW5kKChmbG9vcikgPT5cclxuICAgICAgICBmbG9vck5hbWUuaW5jbHVkZXMoZmxvb3IuaWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBpZiAoZmxvb3JNYXR0ZXJwb3J0KSB7XHJcbiAgICAgIGxldCByZXRyeSA9IHRydWU7XHJcbiAgICAgIHdoaWxlIChyZXRyeSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBmbG9vckluZGV4ID0gYXdhaXQgdGhpcy5zZGsuRmxvb3IubW92ZVRvKFxyXG4gICAgICAgICAgICBmbG9vck1hdHRlcnBvcnQuc2VxdWVuY2VcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICByZXRyeSA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2Fubm90IG1vdmUgdG8gRmxvb3InLCBlcnJvcik7XHJcbiAgICAgICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oJ05vIG1hdHRlcnBvcnQgZmxvb3IgZm91bmQgdG8gbW92ZSB0bycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGltcG9ydEZsb29yRGF0YShcclxuICAgIGRlZmF1dFpvbmVJRDogc3RyaW5nLFxyXG4gICAgbm9kZTogTm9kZVxyXG4gICk6IFByb21pc2U8Wm9uZVtdPiB7XHJcbiAgICBjb25zdCB6b25lcyA9IFtdO1xyXG4gICAgYXdhaXQgdGhpcy5zZGsuTW9kZS5tb3ZlVG8odGhpcy5zZGsuTW9kZS5Nb2RlLkZMT09SUExBTik7XHJcbiAgICBjb25zdCBubWJGbG9vcnMgPSBPYmplY3Qua2V5cyh0aGlzLmZsb29ycykubGVuZ3RoO1xyXG4gICAgY29uc29sZS5sb2coJ1RvdGFsIG51bWJlciBvZiBmbG9vcnMnLCBubWJGbG9vcnMpO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG5tYkZsb29yczsgaW5kZXggKz0gMSkge1xyXG4gICAgICBjb25zb2xlLmxvZygnSW1wb3J0aW5nIGZsb29yJywgaW5kZXgpO1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5GbG9vci5tb3ZlVG8oaW5kZXgpLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHdhaXQoNzAwKTtcclxuICAgICAgICBjb25zdCB6b25lID0gYXdhaXQgdGhpcy5zYXZlRmxvb3IoZGVmYXV0Wm9uZUlELCBub2RlKTtcclxuICAgICAgICB6b25lcy5wdXNoKHpvbmUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoem9uZXMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzYXZlRmxvb3IoZGVmYXV0Wm9uZUlEOiBzdHJpbmcsIG5vZGU6IE5vZGUpOiBQcm9taXNlPFpvbmU+IHtcclxuICAgIGxldCBuYW1lID0gdGhpcy5jdXJyZW50Rmxvb3IuaWQ7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50Rmxvb3IubmFtZSAhPT0gJycpIHtcclxuICAgICAgbmFtZSA9IHRoaXMuY3VycmVudEZsb29yLm5hbWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYXllckZsb29yID0gYXdhaXQgdGhpcy5nZXRMYXllckJ5TmFtZSgnRkxPT1InKTtcclxuICAgIGNvbnN0IHN3ZWVwc0luZm8gPSBPYmplY3QudmFsdWVzKHRoaXMuc3dlZXBzKTtcclxuICAgIGNvbnN0IHN3ZWVwc0ZvckZsb29yID0gc3dlZXBzSW5mby5maWx0ZXIoXHJcbiAgICAgIChzd2VlcEluZm8pID0+IHN3ZWVwSW5mby5mbG9vckluZm8uaWQgPT09IHRoaXMuY3VycmVudEZsb29yLmlkXHJcbiAgICApO1xyXG4gICAgY29uc29sZS5sb2coJ2N1cnJlbnQgZmxvb3InLCB0aGlzLmN1cnJlbnRGbG9vcik7XHJcbiAgICBjb25zb2xlLmxvZygnc3dlZXBzIGZvciBmbG9vcicsIHN3ZWVwc0ZvckZsb29yLmxlbmd0aCk7XHJcbiAgICBjb25zdCBzd2VlcElEczogc3RyaW5nW10gPSBzd2VlcHNGb3JGbG9vci5tYXAoKHN3ZWVwKSA9PiBzd2VlcC51dWlkKTtcclxuICAgIGNvbnN0IHpvbmUgPSBhd2FpdCB0aGlzLmNyZWF0ZVpvbmUoXHJcbiAgICAgIGDDiXRhZ2UgJHtuYW1lfSAtICR7bm9kZS5tZXRhZGF0YX1gLFxyXG4gICAgICBsYXllckZsb29yLmlkLFxyXG4gICAgICBudWxsLFxyXG4gICAgICBkZWZhdXRab25lSUQsXHJcbiAgICAgIHN3ZWVwSURzLFxyXG4gICAgICBub2RlLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlOiB0aGlzLmN1cnJlbnRGbG9vci5zZXF1ZW5jZSB9KVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGJhc2U2NCA9IGF3YWl0IHRoaXMuc2RrLlJlbmRlcmVyLnRha2VTY3JlZW5TaG90KHtcclxuICAgICAgd2lkdGg6IDQwOTYsXHJcbiAgICAgIGhlaWdodDogMjA0OCxcclxuICAgIH0pO1xyXG4gICAgY29uc3Qgc3BhY2VJRHNob3J0ID0gdGhpcy5zcGFjZUlELnNsaWNlKDAsIDgpO1xyXG4gICAgYXdhaXQgdXBsb2FkQmFzZTY0SW1hZ2UoXHJcbiAgICAgIGJhc2U2NCxcclxuICAgICAgbnVsbCxcclxuICAgICAgYHZpc2l0cy8ke3RoaXMubW9kZWxJRH0vcGxhbnMvYCxcclxuICAgICAgYHBsYW5fZmxvb3JfJHt0aGlzLmN1cnJlbnRGbG9vci5pZH1fJHtzcGFjZUlEc2hvcnR9YFxyXG4gICAgKTtcclxuICAgIGNvbnN0IHBsYW4gPSB7XHJcbiAgICAgIG5hbWU6IGBwbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9YCxcclxuICAgICAgYW5uZXhlOiBgdmlzaXRzLyR7dGhpcy5tb2RlbElEfS9wbGFucy9wbGFuX2Zsb29yXyR7dGhpcy5jdXJyZW50Rmxvb3IuaWR9XyR7c3BhY2VJRHNob3J0fS5qcGVnYCxcclxuICAgICAgem9uZUlEOiB6b25lLmlkLFxyXG4gICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXHJcbiAgICAgIGlzQ3VycmVudEZvclpvbmU6IHRydWUsXHJcbiAgICAgIGlzTW9kaWZpZWQ6IGZhbHNlLFxyXG4gICAgICBpc0ltcG9ydGVkTWF0dGVycG9ydDogdHJ1ZSxcclxuICAgIH0gYXMgUGxhbjtcclxuICAgIGF3YWl0IHRoaXMucGxhblNlcnZpY2UuY3JlYXRlUGxhbihwbGFuKTtcclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoem9uZSk7XHJcbiAgfVxyXG5cclxuICBhYmFuZG9uKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdhYmFuZG9ubmluZyBpbXBvcnQnKTtcclxuICAgICAgdGhpcy5zdG9wID0gdHJ1ZTtcclxuICAgICAgdGhpcy5yZW1vdmVGcmFtZSgpO1xyXG4gICAgfSwgNTAwKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUZyYW1lKCkge1xyXG4gICAgaWYgKHRoaXMuY3VycmVudEZyYW1lKSB7XHJcbiAgICAgIHRoaXMuY3VycmVudEZyYW1lLnJlbW92ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0TGF5ZXJCeU5hbWUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxMYXllcj4ge1xyXG4gICAgY29uc3QgbWlzc2lvbiA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGhpcy5zcGFjZUlEKTtcclxuICAgIGNvbnN0IGN1cnJlbnRPcmdJZCA9IG1pc3Npb24ub3JnYW5pc2F0aW9uSUQ7XHJcbiAgICBjb25zdCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckJ5TmFtZUZvck9yZ2FuaXNhdGlvbihcclxuICAgICAgbmFtZSxcclxuICAgICAgY3VycmVudE9yZ0lkXHJcbiAgICApO1xyXG4gICAgaWYgKGxheWVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBsYXllcnNbMF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5sYXllclNlcnZpY2UuY3JlYXRlTGF5ZXJGb3JPcmdhbmlzYXRpb24obmFtZSwgY3VycmVudE9yZ0lkKTtcclxuICB9XHJcbn0iXX0=
|