@cloudbase/realtime 1.2.3-alpha.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +15 -0
- package/dist/cjs/common.js +1 -1
- package/dist/cjs/error.js +17 -16
- package/dist/cjs/index.js +5 -5
- package/dist/cjs/listener.js +2 -4
- package/dist/cjs/message.js +2 -2
- package/dist/cjs/snapshot.js +7 -7
- package/dist/cjs/utils.js +3 -2
- package/dist/cjs/virtual-websocket-client.js +86 -83
- package/dist/cjs/websocket-client.js +162 -176
- package/dist/cjs/ws-event.js +27 -26
- package/dist/esm/common.js +1 -1
- package/dist/esm/error.js +13 -15
- package/dist/esm/index.js +3 -3
- package/dist/esm/listener.js +2 -4
- package/dist/esm/message.js +2 -2
- package/dist/esm/snapshot.js +7 -7
- package/dist/esm/utils.js +1 -1
- package/dist/esm/virtual-websocket-client.js +75 -72
- package/dist/esm/websocket-client.js +156 -170
- package/dist/esm/ws-event.js +25 -25
- package/package.json +6 -22
- package/src/common.ts +5 -5
- package/src/error.ts +34 -40
- package/src/index.ts +15 -15
- package/src/listener.ts +11 -13
- package/src/message.ts +5 -7
- package/src/snapshot.ts +20 -20
- package/src/utils.ts +1 -1
- package/src/virtual-websocket-client.ts +446 -514
- package/src/websocket-client.ts +493 -518
- package/src/ws-event.ts +28 -28
- package/tsconfig.esm.json +2 -20
- package/tsconfig.json +2 -20
- package/.eslintrc +0 -30
|
@@ -13,7 +13,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
13
13
|
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
14
|
function step(op) {
|
|
15
15
|
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (_) try {
|
|
16
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
17
17
|
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
18
|
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
19
|
switch (op[0]) {
|
|
@@ -34,12 +34,14 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
-
var
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
38
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
39
|
+
if (ar || !(i in from)) {
|
|
40
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
41
|
+
ar[i] = from[i];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
43
45
|
};
|
|
44
46
|
import set from 'lodash.set';
|
|
45
47
|
import unset from 'lodash.unset';
|
|
@@ -47,7 +49,7 @@ import cloneDeep from 'lodash.clonedeep';
|
|
|
47
49
|
import { genRequestId } from './message';
|
|
48
50
|
import { RealtimeListener } from './listener';
|
|
49
51
|
import { Snapshot } from './snapshot';
|
|
50
|
-
import { ERR_CODE, CloudSDKError, isTimeoutError, CancelledError, isCancelledError, isRealtimeErrorMessageError } from './error';
|
|
52
|
+
import { ERR_CODE, CloudSDKError, isTimeoutError, CancelledError, isCancelledError, isRealtimeErrorMessageError, } from './error';
|
|
51
53
|
import { sleep } from './utils';
|
|
52
54
|
var WATCH_STATUS;
|
|
53
55
|
(function (WATCH_STATUS) {
|
|
@@ -123,14 +125,14 @@ var VirtualWebSocketClient = (function () {
|
|
|
123
125
|
collName: this.collectionName,
|
|
124
126
|
query: this.query,
|
|
125
127
|
limit: this.limit,
|
|
126
|
-
orderBy: this.orderBy
|
|
127
|
-
}
|
|
128
|
+
orderBy: this.orderBy,
|
|
129
|
+
},
|
|
128
130
|
};
|
|
129
131
|
return [4, this.send({
|
|
130
132
|
msg: initWatchMsg,
|
|
131
133
|
waitResponse: true,
|
|
132
134
|
skipOnMessage: true,
|
|
133
|
-
timeout: DEFAULT_INIT_WATCH_TIMEOUT
|
|
135
|
+
timeout: DEFAULT_INIT_WATCH_TIMEOUT,
|
|
134
136
|
})];
|
|
135
137
|
case 2:
|
|
136
138
|
initEventMsg = _b.sent();
|
|
@@ -138,7 +140,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
138
140
|
this.sessionInfo = {
|
|
139
141
|
queryID: initEventMsg.msgData.queryID,
|
|
140
142
|
currentEventId: currEvent - 1,
|
|
141
|
-
currentDocs: []
|
|
143
|
+
currentDocs: [],
|
|
142
144
|
};
|
|
143
145
|
if (events.length > 0) {
|
|
144
146
|
for (_i = 0, events_1 = events; _i < events_1.length; _i++) {
|
|
@@ -153,7 +155,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
153
155
|
id: currEvent,
|
|
154
156
|
docChanges: [],
|
|
155
157
|
docs: [],
|
|
156
|
-
type: 'init'
|
|
158
|
+
type: 'init',
|
|
157
159
|
});
|
|
158
160
|
this.listener.onChange(snapshot);
|
|
159
161
|
this.scheduleSendACK();
|
|
@@ -168,7 +170,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
168
170
|
this.handleWatchEstablishmentError(e_1, {
|
|
169
171
|
operationName: 'INIT_WATCH',
|
|
170
172
|
resolve: resolve,
|
|
171
|
-
reject: reject
|
|
173
|
+
reject: reject,
|
|
172
174
|
});
|
|
173
175
|
return [3, 4];
|
|
174
176
|
case 4: return [2];
|
|
@@ -188,7 +190,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
188
190
|
this._initWatchPromise = undefined;
|
|
189
191
|
return [7];
|
|
190
192
|
case 4:
|
|
191
|
-
console.log("[realtime] initWatch "
|
|
193
|
+
console.log("[realtime] initWatch ".concat(success ? 'success' : 'fail'));
|
|
192
194
|
return [2];
|
|
193
195
|
}
|
|
194
196
|
});
|
|
@@ -231,14 +233,14 @@ var VirtualWebSocketClient = (function () {
|
|
|
231
233
|
envId: envId,
|
|
232
234
|
collName: this.collectionName,
|
|
233
235
|
queryID: this.sessionInfo.queryID,
|
|
234
|
-
eventID: this.sessionInfo.currentEventId
|
|
235
|
-
}
|
|
236
|
+
eventID: this.sessionInfo.currentEventId,
|
|
237
|
+
},
|
|
236
238
|
};
|
|
237
239
|
return [4, this.send({
|
|
238
240
|
msg: rebuildWatchMsg,
|
|
239
241
|
waitResponse: true,
|
|
240
242
|
skipOnMessage: false,
|
|
241
|
-
timeout: DEFAULT_REBUILD_WATCH_TIMEOUT
|
|
243
|
+
timeout: DEFAULT_REBUILD_WATCH_TIMEOUT,
|
|
242
244
|
})];
|
|
243
245
|
case 2:
|
|
244
246
|
nextEventMsg = _a.sent();
|
|
@@ -252,7 +254,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
252
254
|
this.handleWatchEstablishmentError(e_2, {
|
|
253
255
|
operationName: 'REBUILD_WATCH',
|
|
254
256
|
resolve: resolve,
|
|
255
|
-
reject: reject
|
|
257
|
+
reject: reject,
|
|
256
258
|
});
|
|
257
259
|
return [3, 4];
|
|
258
260
|
case 4: return [2];
|
|
@@ -272,7 +274,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
272
274
|
this._rebuildWatchPromise = undefined;
|
|
273
275
|
return [7];
|
|
274
276
|
case 4:
|
|
275
|
-
console.log("[realtime] rebuildWatch "
|
|
277
|
+
console.log("[realtime] rebuildWatch ".concat(success ? 'success' : 'fail'));
|
|
276
278
|
return [2];
|
|
277
279
|
}
|
|
278
280
|
});
|
|
@@ -287,7 +289,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
287
289
|
errCode: isInitWatch
|
|
288
290
|
? ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_INIT_WATCH_FAIL
|
|
289
291
|
: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_REBUILD_WATCH_FAIL,
|
|
290
|
-
errMsg: e
|
|
292
|
+
errMsg: e,
|
|
291
293
|
}));
|
|
292
294
|
options.reject(e);
|
|
293
295
|
};
|
|
@@ -340,7 +342,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
340
342
|
case 3:
|
|
341
343
|
_a.sent();
|
|
342
344
|
if (!(this.watchStatus === WATCH_STATUS.PAUSED)) return [3, 4];
|
|
343
|
-
options.reject(new CancelledError(options.operationName
|
|
345
|
+
options.reject(new CancelledError("".concat(options.operationName, " cancelled due to pause after unknownError")));
|
|
344
346
|
return [3, 7];
|
|
345
347
|
case 4:
|
|
346
348
|
if (!!this.isWSConnected()) return [3, 6];
|
|
@@ -359,7 +361,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
359
361
|
case 9: return [2];
|
|
360
362
|
}
|
|
361
363
|
});
|
|
362
|
-
}); }
|
|
364
|
+
}); },
|
|
363
365
|
});
|
|
364
366
|
return [2];
|
|
365
367
|
});
|
|
@@ -383,10 +385,10 @@ var VirtualWebSocketClient = (function () {
|
|
|
383
385
|
watchId: this.watchId,
|
|
384
386
|
requestId: genRequestId(),
|
|
385
387
|
msgType: 'CLOSE_WATCH',
|
|
386
|
-
msgData: null
|
|
388
|
+
msgData: null,
|
|
387
389
|
};
|
|
388
390
|
return [4, this.send({
|
|
389
|
-
msg: closeWatchMsg
|
|
391
|
+
msg: closeWatchMsg,
|
|
390
392
|
})];
|
|
391
393
|
case 2:
|
|
392
394
|
_a.sent();
|
|
@@ -397,7 +399,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
397
399
|
e_4 = _a.sent();
|
|
398
400
|
this.closeWithError(new CloudSDKError({
|
|
399
401
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CLOSE_WATCH_FAIL,
|
|
400
|
-
errMsg: e_4
|
|
402
|
+
errMsg: e_4,
|
|
401
403
|
}));
|
|
402
404
|
return [3, 5];
|
|
403
405
|
case 4:
|
|
@@ -443,11 +445,11 @@ var VirtualWebSocketClient = (function () {
|
|
|
443
445
|
msgType: 'CHECK_LAST',
|
|
444
446
|
msgData: {
|
|
445
447
|
queryID: this.sessionInfo.queryID,
|
|
446
|
-
eventID: this.sessionInfo.currentEventId
|
|
447
|
-
}
|
|
448
|
+
eventID: this.sessionInfo.currentEventId,
|
|
449
|
+
},
|
|
448
450
|
};
|
|
449
451
|
return [4, this.send({
|
|
450
|
-
msg: ackMsg
|
|
452
|
+
msg: ackMsg,
|
|
451
453
|
})];
|
|
452
454
|
case 1:
|
|
453
455
|
_a.sent();
|
|
@@ -471,7 +473,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
471
473
|
case 'COLLECTION_PERMISSION_DENIED': {
|
|
472
474
|
this.closeWithError(new CloudSDKError({
|
|
473
475
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
|
|
474
|
-
errMsg: msg.msgData.code
|
|
476
|
+
errMsg: msg.msgData.code,
|
|
475
477
|
}));
|
|
476
478
|
return [2];
|
|
477
479
|
}
|
|
@@ -480,15 +482,15 @@ var VirtualWebSocketClient = (function () {
|
|
|
480
482
|
}
|
|
481
483
|
}
|
|
482
484
|
}
|
|
483
|
-
if (this._availableRetries.CHECK_LAST
|
|
484
|
-
this._availableRetries.CHECK_LAST > 0) {
|
|
485
|
+
if (this._availableRetries.CHECK_LAST
|
|
486
|
+
&& this._availableRetries.CHECK_LAST > 0) {
|
|
485
487
|
this._availableRetries.CHECK_LAST--;
|
|
486
488
|
this.scheduleSendACK();
|
|
487
489
|
}
|
|
488
490
|
else {
|
|
489
491
|
this.closeWithError(new CloudSDKError({
|
|
490
492
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_CHECK_LAST_FAIL,
|
|
491
|
-
errMsg: e_5
|
|
493
|
+
errMsg: e_5,
|
|
492
494
|
}));
|
|
493
495
|
}
|
|
494
496
|
return [3, 3];
|
|
@@ -530,7 +532,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
530
532
|
}
|
|
531
533
|
options.onUnknownError(e);
|
|
532
534
|
};
|
|
533
|
-
this.watchId = "watchid_"
|
|
535
|
+
this.watchId = "watchid_".concat(+new Date(), "_").concat(Math.random());
|
|
534
536
|
this.envId = options.envId;
|
|
535
537
|
this.collectionName = options.collectionName;
|
|
536
538
|
this.query = options.query;
|
|
@@ -547,14 +549,14 @@ var VirtualWebSocketClient = (function () {
|
|
|
547
549
|
this._availableRetries = {
|
|
548
550
|
INIT_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
|
|
549
551
|
REBUILD_WATCH: DEFAULT_MAX_AUTO_RETRY_ON_ERROR,
|
|
550
|
-
CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR
|
|
552
|
+
CHECK_LAST: DEFAULT_MAX_SEND_ACK_AUTO_RETRY_ON_ERROR,
|
|
551
553
|
};
|
|
552
554
|
this.listener = new RealtimeListener({
|
|
553
555
|
close: this.closeWatch,
|
|
554
556
|
onChange: options.onChange,
|
|
555
557
|
onError: options.onError,
|
|
556
558
|
debug: this.debug,
|
|
557
|
-
virtualClient: this
|
|
559
|
+
virtualClient: this,
|
|
558
560
|
});
|
|
559
561
|
this.initWatch();
|
|
560
562
|
}
|
|
@@ -570,7 +572,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
570
572
|
case WATCH_STATUS.LOGGINGIN:
|
|
571
573
|
case WATCH_STATUS.INITING:
|
|
572
574
|
case WATCH_STATUS.REBUILDING: {
|
|
573
|
-
console.warn("[realtime listener] internal non-fatal error: unexpected message received while "
|
|
575
|
+
console.warn("[realtime listener] internal non-fatal error: unexpected message received while ".concat(this.watchStatus));
|
|
574
576
|
return;
|
|
575
577
|
}
|
|
576
578
|
case WATCH_STATUS.CLOSED: {
|
|
@@ -589,7 +591,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
589
591
|
this.scheduleSendACK();
|
|
590
592
|
switch (msg.msgType) {
|
|
591
593
|
case 'NEXT_EVENT': {
|
|
592
|
-
console.warn("nextevent "
|
|
594
|
+
console.warn("nextevent ".concat(msg.msgData.currEvent, " ignored"), msg);
|
|
593
595
|
this.handleServerEvents(msg);
|
|
594
596
|
break;
|
|
595
597
|
}
|
|
@@ -600,33 +602,34 @@ var VirtualWebSocketClient = (function () {
|
|
|
600
602
|
this._waitExpectedTimeoutId = setTimeout(function () {
|
|
601
603
|
_this.rebuildWatch();
|
|
602
604
|
}, this.getWaitExpectedTimeoutLength());
|
|
603
|
-
console.log("[realtime] waitExpectedTimeoutLength "
|
|
605
|
+
console.log("[realtime] waitExpectedTimeoutLength ".concat(this.getWaitExpectedTimeoutLength()));
|
|
604
606
|
}
|
|
605
607
|
break;
|
|
606
608
|
}
|
|
607
609
|
case 'ERROR': {
|
|
608
610
|
this.closeWithError(new CloudSDKError({
|
|
609
611
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_SERVER_ERROR_MSG,
|
|
610
|
-
errMsg: msg.msgData.code
|
|
612
|
+
errMsg: "".concat(msg.msgData.code, " - ").concat(msg.msgData.message),
|
|
611
613
|
}));
|
|
612
614
|
break;
|
|
613
615
|
}
|
|
614
616
|
default: {
|
|
615
|
-
console.warn("[realtime listener] virtual client receive unexpected msg "
|
|
617
|
+
console.warn("[realtime listener] virtual client receive unexpected msg ".concat(msg.msgType, ": "), msg);
|
|
616
618
|
break;
|
|
617
619
|
}
|
|
618
620
|
}
|
|
619
621
|
};
|
|
620
622
|
VirtualWebSocketClient.prototype.closeWithError = function (error) {
|
|
623
|
+
var _a;
|
|
621
624
|
this.watchStatus = WATCH_STATUS.ERRORED;
|
|
622
625
|
this.clearACKSchedule();
|
|
623
626
|
this.listener.onError(error);
|
|
624
|
-
this.onWatchClose(this, (this.sessionInfo
|
|
625
|
-
console.log("[realtime] client closed ("
|
|
627
|
+
this.onWatchClose(this, ((_a = this.sessionInfo) === null || _a === void 0 ? void 0 : _a.queryID) || '');
|
|
628
|
+
console.log("[realtime] client closed (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
|
|
626
629
|
};
|
|
627
630
|
VirtualWebSocketClient.prototype.pause = function () {
|
|
628
631
|
this.watchStatus = WATCH_STATUS.PAUSED;
|
|
629
|
-
console.log("[realtime] client paused ("
|
|
632
|
+
console.log("[realtime] client paused (".concat(this.collectionName, " ").concat(this.query, ") (watchId ").concat(this.watchId, ")"));
|
|
630
633
|
};
|
|
631
634
|
VirtualWebSocketClient.prototype.resume = function () {
|
|
632
635
|
return __awaiter(this, void 0, void 0, function () {
|
|
@@ -635,18 +638,18 @@ var VirtualWebSocketClient = (function () {
|
|
|
635
638
|
switch (_a.label) {
|
|
636
639
|
case 0:
|
|
637
640
|
this.watchStatus = WATCH_STATUS.RESUMING;
|
|
638
|
-
console.log("[realtime] client resuming with "
|
|
641
|
+
console.log("[realtime] client resuming with ".concat(this.sessionInfo ? 'REBUILD_WATCH' : 'INIT_WATCH', " (").concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
|
|
639
642
|
_a.label = 1;
|
|
640
643
|
case 1:
|
|
641
644
|
_a.trys.push([1, 3, , 4]);
|
|
642
645
|
return [4, (this.sessionInfo ? this.rebuildWatch() : this.initWatch())];
|
|
643
646
|
case 2:
|
|
644
647
|
_a.sent();
|
|
645
|
-
console.log("[realtime] client successfully resumed ("
|
|
648
|
+
console.log("[realtime] client successfully resumed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"));
|
|
646
649
|
return [3, 4];
|
|
647
650
|
case 3:
|
|
648
651
|
e_6 = _a.sent();
|
|
649
|
-
console.error("[realtime] client resume failed ("
|
|
652
|
+
console.error("[realtime] client resume failed (".concat(this.collectionName, " ").concat(this.query, ") (").concat(this.watchId, ")"), e_6);
|
|
650
653
|
return [3, 4];
|
|
651
654
|
case 4: return [2];
|
|
652
655
|
}
|
|
@@ -654,10 +657,10 @@ var VirtualWebSocketClient = (function () {
|
|
|
654
657
|
});
|
|
655
658
|
};
|
|
656
659
|
VirtualWebSocketClient.prototype.useRetryTicket = function (operationName) {
|
|
657
|
-
if (this._availableRetries[operationName]
|
|
658
|
-
this._availableRetries[operationName] > 0) {
|
|
660
|
+
if (this._availableRetries[operationName]
|
|
661
|
+
&& this._availableRetries[operationName] > 0) {
|
|
659
662
|
this._availableRetries[operationName]--;
|
|
660
|
-
console.log("[realtime] "
|
|
663
|
+
console.log("[realtime] ".concat(operationName, " use a retry ticket, now only ").concat(this._availableRetries[operationName], " retry left"));
|
|
661
664
|
return true;
|
|
662
665
|
}
|
|
663
666
|
return false;
|
|
@@ -703,24 +706,24 @@ var VirtualWebSocketClient = (function () {
|
|
|
703
706
|
catch (e) {
|
|
704
707
|
this.closeWithError(new CloudSDKError({
|
|
705
708
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_RECEIVE_INVALID_SERVER_DATA,
|
|
706
|
-
errMsg: e
|
|
709
|
+
errMsg: e,
|
|
707
710
|
}));
|
|
708
711
|
return [2];
|
|
709
712
|
}
|
|
710
|
-
docs =
|
|
713
|
+
docs = __spreadArray([], sessionInfo.currentDocs, true);
|
|
711
714
|
initEncountered = false;
|
|
712
715
|
_loop_1 = function (i, len) {
|
|
713
|
-
var change, localDoc, doc, fieldPath, _i,
|
|
714
|
-
return __generator(this, function (
|
|
715
|
-
switch (
|
|
716
|
+
var change, localDoc, doc, fieldPath, _i, _b, fieldPath, err, err, doc, doc, err, ind, ind, docsSnapshot, docChanges, snapshot;
|
|
717
|
+
return __generator(this, function (_c) {
|
|
718
|
+
switch (_c.label) {
|
|
716
719
|
case 0:
|
|
717
720
|
change = allChangeEvents[i];
|
|
718
721
|
if (!(sessionInfo.currentEventId >= change.id)) return [3, 1];
|
|
719
722
|
if (!allChangeEvents[i - 1] || change.id > allChangeEvents[i - 1].id) {
|
|
720
|
-
console.warn("[realtime] duplicate event received, cur "
|
|
723
|
+
console.warn("[realtime] duplicate event received, cur ".concat(sessionInfo.currentEventId, " but got ").concat(change.id));
|
|
721
724
|
}
|
|
722
725
|
else {
|
|
723
|
-
console.error("[realtime listener] server non-fatal error: events out of order (the latter event's id is smaller than that of the former) (requestId "
|
|
726
|
+
console.error("[realtime listener] server non-fatal error: events out of order (the latter event's id is smaller than that of the former) (requestId ".concat(requestId, ")"));
|
|
724
727
|
}
|
|
725
728
|
return [2, "continue"];
|
|
726
729
|
case 1:
|
|
@@ -740,8 +743,8 @@ var VirtualWebSocketClient = (function () {
|
|
|
740
743
|
}
|
|
741
744
|
}
|
|
742
745
|
if (change.removedFields) {
|
|
743
|
-
for (_i = 0,
|
|
744
|
-
fieldPath =
|
|
746
|
+
for (_i = 0, _b = change.removedFields; _i < _b.length; _i++) {
|
|
747
|
+
fieldPath = _b[_i];
|
|
745
748
|
unset(doc, fieldPath);
|
|
746
749
|
}
|
|
747
750
|
}
|
|
@@ -755,7 +758,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
755
758
|
case 'enqueue': {
|
|
756
759
|
err = new CloudSDKError({
|
|
757
760
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
758
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId "
|
|
761
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"update\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
|
|
759
762
|
});
|
|
760
763
|
this_1.closeWithError(err);
|
|
761
764
|
throw err;
|
|
@@ -771,7 +774,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
771
774
|
if (!change.doc) {
|
|
772
775
|
err = new CloudSDKError({
|
|
773
776
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
774
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId "
|
|
777
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"replace\" (requestId ".concat(msg.requestId, ")"),
|
|
775
778
|
});
|
|
776
779
|
this_1.closeWithError(err);
|
|
777
780
|
throw err;
|
|
@@ -804,7 +807,7 @@ var VirtualWebSocketClient = (function () {
|
|
|
804
807
|
case 'enqueue': {
|
|
805
808
|
err = new CloudSDKError({
|
|
806
809
|
errCode: ERR_CODE.SDK_DATABASE_REALTIME_LISTENER_UNEXPECTED_FATAL_ERROR,
|
|
807
|
-
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId "
|
|
810
|
+
errMsg: "HandleServerEvents: full doc is not provided with dataType=\"limit\" and queueType=\"enqueue\" (requestId ".concat(msg.requestId, ")"),
|
|
808
811
|
});
|
|
809
812
|
this_1.closeWithError(err);
|
|
810
813
|
throw err;
|
|
@@ -853,9 +856,9 @@ var VirtualWebSocketClient = (function () {
|
|
|
853
856
|
break;
|
|
854
857
|
}
|
|
855
858
|
}
|
|
856
|
-
if (i === len - 1
|
|
857
|
-
(allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
|
|
858
|
-
docsSnapshot =
|
|
859
|
+
if (i === len - 1
|
|
860
|
+
|| (allChangeEvents[i + 1] && allChangeEvents[i + 1].id !== change.id)) {
|
|
861
|
+
docsSnapshot = __spreadArray([], docs, true);
|
|
859
862
|
docChanges = allChangeEvents
|
|
860
863
|
.slice(0, i + 1)
|
|
861
864
|
.filter(function (c) { return c.id === change.id; });
|
|
@@ -865,16 +868,16 @@ var VirtualWebSocketClient = (function () {
|
|
|
865
868
|
id: change.id,
|
|
866
869
|
docChanges: docChanges,
|
|
867
870
|
docs: docsSnapshot,
|
|
868
|
-
msgType: msgType
|
|
871
|
+
msgType: msgType,
|
|
869
872
|
});
|
|
870
873
|
this_1.listener.onChange(snapshot);
|
|
871
874
|
}
|
|
872
875
|
return [3, 4];
|
|
873
876
|
case 2:
|
|
874
|
-
console.warn("[realtime listener] event received is out of order, cur "
|
|
877
|
+
console.warn("[realtime listener] event received is out of order, cur ".concat(this_1.sessionInfo.currentEventId, " but got ").concat(change.id));
|
|
875
878
|
return [4, this_1.rebuildWatch()];
|
|
876
879
|
case 3:
|
|
877
|
-
|
|
880
|
+
_c.sent();
|
|
878
881
|
return [2, { value: void 0 }];
|
|
879
882
|
case 4: return [2];
|
|
880
883
|
}
|
|
@@ -904,8 +907,8 @@ var VirtualWebSocketClient = (function () {
|
|
|
904
907
|
console.error('[realtime listener] internal non-fatal error: sessionInfo lost after server event handling, this should never occur');
|
|
905
908
|
return;
|
|
906
909
|
}
|
|
907
|
-
if (this.sessionInfo.expectEventId
|
|
908
|
-
this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
|
|
910
|
+
if (this.sessionInfo.expectEventId
|
|
911
|
+
&& this.sessionInfo.currentEventId >= this.sessionInfo.expectEventId) {
|
|
909
912
|
this.clearWaitExpectedEvent();
|
|
910
913
|
}
|
|
911
914
|
if (this.sessionInfo.currentEventId < msg.msgData.currEvent) {
|
|
@@ -928,7 +931,7 @@ function getPublicEvent(event) {
|
|
|
928
931
|
dataType: event.DataType,
|
|
929
932
|
queueType: event.QueueType,
|
|
930
933
|
docId: event.DocID,
|
|
931
|
-
doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined
|
|
934
|
+
doc: event.Doc && event.Doc !== '{}' ? JSON.parse(event.Doc) : undefined,
|
|
932
935
|
};
|
|
933
936
|
if (event.DataType === 'update') {
|
|
934
937
|
if (event.UpdatedFields) {
|
|
@@ -940,4 +943,4 @@ function getPublicEvent(event) {
|
|
|
940
943
|
}
|
|
941
944
|
return e;
|
|
942
945
|
}
|
|
943
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxHQUFHLE1BQU0sWUFBWSxDQUFBO0FBQzVCLE9BQU8sS0FBSyxNQUFNLGNBQWMsQ0FBQTtBQUNoQyxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBaUJ4QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxPQUFPLEVBQ0wsUUFBUSxFQUNSLGFBQWEsRUFDYixjQUFjLEVBQ2QsY0FBYyxFQUNkLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFHNUIsTUFBTSxTQUFTLENBQUE7QUFDaEIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQTRDL0IsSUFBSyxZQVVKO0FBVkQsV0FBSyxZQUFZO0lBQ2YsdUNBQXVCLENBQUE7SUFDdkIsbUNBQW1CLENBQUE7SUFDbkIseUNBQXlCLENBQUE7SUFDekIsaUNBQWlCLENBQUE7SUFDakIsbUNBQW1CLENBQUE7SUFDbkIsbUNBQW1CLENBQUE7SUFDbkIsaUNBQWlCLENBQUE7SUFDakIsaUNBQWlCLENBQUE7SUFDakIscUNBQXFCLENBQUE7QUFDdkIsQ0FBQyxFQVZJLFlBQVksS0FBWixZQUFZLFFBVWhCO0FBRUQsSUFBTSxrQ0FBa0MsR0FBRyxHQUFHLENBQUE7QUFDOUMsSUFBTSwrQkFBK0IsR0FBRyxDQUFDLENBQUE7QUFDekMsSUFBTSx3Q0FBd0MsR0FBRyxDQUFDLENBQUE7QUFDbEQsSUFBTSxpQ0FBaUMsR0FBRyxFQUFFLEdB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QUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQTtJQUVELElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFFL0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7U0FDbEQ7UUFHRCxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUs5QyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO1NBQ2xEO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2V0IGZyb20gJ2xvZGFzaC5zZXQnXG5pbXBvcnQgdW5zZXQgZnJvbSAnbG9kYXNoLnVuc2V0J1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJ1xuaW1wb3J0IHsgZ2VuUmVxdWVzdElkIH0gZnJvbSAnLi9tZXNzYWdlJ1xuaW1wb3J0IHtcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnLFxuICBJREJFdmVudCxcbiAgSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnLFxuICBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnLFxuICBJUmVxdWVzdE1zZ1R5cGUsXG4gIElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyxcbiAgSVdhdGNoT3B0aW9uc1xufSBmcm9tICdAY2xvdWRiYXNlL3R5cGVzL3JlYWx0aW1lJ1xuaW1wb3J0IHsgXG4gIElTaW5nbGVEQkV2ZW50XG59IGZyb20gJ0BjbG91ZGJhc2UvdHlwZXMvZGF0YWJhc2UnXG4vLyBpbXBvcnQgUmVwb3J0ZXIgZnJvbSBcIi4vZXh0ZXJuYWxzL3B1YmxpYy1saWIvcmVwb3J0ZXJcIlxuaW1wb3J0IHsgUmVhbHRpbWVMaXN0ZW5lciB9IGZyb20gJy4vbGlzdGVuZXInXG5pbXBvcnQgeyBTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QnXG5pbXBvcnQgeyBJV1NTZW5kT3B0aW9ucywgSUxvZ2luUmVzdWx0IH0gZnJvbSAnLi93ZWJzb2NrZXQtY2xpZW50J1xuaW1wb3J0IHsgXG4gIEVSUl9DT0RFLFxuICBDbG91ZFNES0Vycm9yLFxuICBpc1RpbWVvdXRFcnJvcixcbiAgQ2FuY2VsbGVkRXJyb3IsXG4gIGlzQ2FuY2VsbGVkRXJyb3IsXG4gIGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvciwgXG4gIFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IsIFxuICBUaW1lb3V0RXJyb3IgXG59IGZyb20gJy4vZXJyb3InXG5pbXBvcnQgeyBzbGVlcCB9IGZyb20gJy4vdXRpbHMnXG5cbi8vID09PT09PT09PT09PT09PSBSZWFsdGltZSBWaXJ0dWFsIFdlYlNvY2tldCBDbGllbnQgKEludGVybmFsKSA9PT09PT09PT09PT09PT09PT09PVxuXG5pbnRlcmZhY2UgSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMgZXh0ZW5kcyBJV2F0Y2hPcHRpb25zIHtcbiAgLy8gd3M6IFJlYWx0aW1lV2ViU29ja2V0Q2xpZW50XG4gIGVudklkPzogc3RyaW5nXG4gIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmdcbiAgcXVlcnk6IHN0cmluZ1xuICBsaW1pdD86IG51bWJlclxuICBvcmRlckJ5PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBzZW5kOiA8VCA9IGFueT4ob3B0czogSVdTU2VuZE9wdGlvbnMpID0+IFByb21pc2U8VD5cbiAgbG9naW46IChlbnZJZD86IHN0cmluZywgcmVmcmVzaD86IGJvb2xlYW4pID0+IFByb21pc2U8YW55PlxuICBpc1dTQ29ubmVjdGVkOiAoKSA9PiBib29sZWFuXG4gIG9uY2VXU0Nvbm5lY3RlZDogKCkgPT4gUHJvbWlzZTx2b2lkPlxuICBnZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoOiAoKSA9PiBudW1iZXJcbiAgb25XYXRjaFN0YXJ0OiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgb25XYXRjaENsb3NlOiAoY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LCBxdWVyeUlEOiBzdHJpbmcpID0+IHZvaWRcbiAgZGVidWc/OiBib29sZWFuXG59XG5cbmludGVyZmFjZSBJV2F0Y2hTZXNzaW9uSW5mbyB7XG4gIHF1ZXJ5SUQ6IHN0cmluZ1xuICBjdXJyZW50RXZlbnRJZDogbnVtYmVyXG4gIGN1cnJlbnREb2NzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W11cbiAgZXhwZWN0RXZlbnRJZD86IG51bWJlclxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9ucyB7XG4gIG9uU2lnbkVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblRpbWVvdXRFcnJvcjogKGU6IFRpbWVvdXRFcnJvcikgPT4gdm9pZFxuICBvbkNhbmNlbGxlZEVycm9yOiAoZTogQ2FuY2VsbGVkRXJyb3IpID0+IHZvaWRcbiAgb25Ob3RSZXRyeWFibGVFcnJvcjogKGU6IFJlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IpID0+IHZvaWRcbiAgb25Vbmtub3duRXJyb3I6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuaW50ZXJmYWNlIElIYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvck9wdGlvbnMge1xuICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcgfCAnUkVCVUlMRF9XQVRDSCdcbiAgcmVzb2x2ZTogKHZhbHVlPzogUHJvbWlzZUxpa2U8dm9pZD4gfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgcmVqZWN0OiAoZTogYW55KSA9PiB2b2lkXG4gIC8vIHJldHJ5OiAocmVmcmVzaExvZ2luPzogYm9vbGVhbikgPT4gdm9pZFxuICAvLyBhYm9ydFdhdGNoOiAoZTogYW55KSA9PiB2b2lkXG59XG5cbmVudW0gV0FUQ0hfU1RBVFVTIHtcbiAgTE9HR0lOR0lOID0gJ0xPR0dJTkdJTicsXG4gIElOSVRJTkcgPSAnSU5JVElORycsXG4gIFJFQlVJTERJTkcgPSAnUkVCVUlMRElORycsXG4gIEFDVElWRSA9ICdBQ1RJVkUnLFxuICBFUlJPUkVEID0gJ0VSUk9SRUQnLFxuICBDTE9TSU5HID0gJ0NMT1NJTkcnLFxuICBDTE9TRUQgPSAnQ0xPU0VEJyxcbiAgUEFVU0VEID0gJ1BBVVNFRCcsXG4gIFJFU1VNSU5HID0gJ1JFU1VNSU5HJ1xufVxuXG5jb25zdCBERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SID0gMTAwXG5jb25zdCBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SID0gMlxuY29uc3QgREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUiA9IDJcbmNvbnN0IERFRkFVTFRfU0VORF9BQ0tfREVCT1VOQ0VfVElNRU9VVCA9IDEwICogMTAwMFxuY29uc3QgREVGQVVMVF9JTklUX1dBVENIX1RJTUVPVVQgPSAxMCAqIDEwMDBcbmNvbnN0IERFRkFVTFRfUkVCVUlMRF9XQVRDSF9USU1FT1VUID0gMTAgKiAxMDAwXG5cbmV4cG9ydCBjbGFzcyBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50IHtcbiAgLy8gcGFzc2VkIG92ZXJcbiAgd2F0Y2hJZDogc3RyaW5nXG4gIC8vIG93blxuICBsaXN0ZW5lcjogUmVhbHRpbWVMaXN0ZW5lclxuICBwcml2YXRlIGVudklkPzogc3RyaW5nXG4gIHByaXZhdGUgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBwcml2YXRlIHF1ZXJ5OiBzdHJpbmdcbiAgcHJpdmF0ZSBsaW1pdDogbnVtYmVyXG4gIHByaXZhdGUgb3JkZXJCeTogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICBwcml2YXRlIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPlxuICBwcml2YXRlIGxvZ2luOiAoZW52SWQ/OiBzdHJpbmcsIHJlZnJlc2g/OiBib29sZWFuKSA9PiBQcm9taXNlPGFueT5cbiAgcHJpdmF0ZSBpc1dTQ29ubmVjdGVkOiAoKSA9PiBib29sZWFuXG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDogKCkgPT4gbnVtYmVyXG4gIHByaXZhdGUgb25XYXRjaFN0YXJ0OiAoXG4gICAgY2xpZW50OiBWaXJ0dWFsV2ViU29ja2V0Q2xpZW50LFxuICAgIHF1ZXJ5SUQ6IHN0cmluZ1xuICApID0+IHZvaWRcbiAgcHJpdmF0ZSBvbldhdGNoQ2xvc2U6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZFxuICBwcml2YXRlIGRlYnVnPzogYm9vbGVhblxuXG4gIHByaXZhdGUgd2F0Y2hTdGF0dXM6IFdBVENIX1NUQVRVUyA9IFdBVENIX1NUQVRVUy5JTklUSU5HXG4gIHByaXZhdGUgX2F2YWlsYWJsZVJldHJpZXM6IFBhcnRpYWw8UmVjb3JkPElSZXF1ZXN0TXNnVHlwZSwgbnVtYmVyPj5cbiAgcHJpdmF0ZSBfYWNrVGltZW91dElkPzogbnVtYmVyXG4gIHByaXZhdGUgX2luaXRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG4gIHByaXZhdGUgX3JlYnVpbGRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+XG5cbiAgLy8gb2J0YWluZWRcbiAgcHJpdmF0ZSBzZXNzaW9uSW5mbz86IElXYXRjaFNlc3Npb25JbmZvXG5cbiAgLy8gaW50ZXJuYWxcbiAgcHJpdmF0ZSBfd2FpdEV4cGVjdGVkVGltZW91dElkPzogbnVtYmVyXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLndhdGNoSWQgPSBgd2F0Y2hpZF8keytuZXcgRGF0ZSgpfV8ke01hdGgucmFuZG9tKCl9YFxuICAgIHRoaXMuZW52SWQgPSBvcHRpb25zLmVudklkXG4gICAgdGhpcy5jb2xsZWN0aW9uTmFtZSA9IG9wdGlvbnMuY29sbGVjdGlvbk5hbWVcbiAgICB0aGlzLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeVxuICAgIHRoaXMubGltaXQgPSBvcHRpb25zLmxpbWl0XG4gICAgdGhpcy5vcmRlckJ5ID0gb3B0aW9ucy5vcmRlckJ5XG4gICAgdGhpcy5zZW5kID0gb3B0aW9ucy5zZW5kXG4gICAgdGhpcy5sb2dpbiA9IG9wdGlvbnMubG9naW5cbiAgICB0aGlzLmlzV1NDb25uZWN0ZWQgPSBvcHRpb25zLmlzV1NDb25uZWN0ZWRcbiAgICB0aGlzLm9uY2VXU0Nvbm5lY3RlZCA9IG9wdGlvbnMub25jZVdTQ29ubmVjdGVkXG4gICAgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoID0gb3B0aW9ucy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoXG4gICAgdGhpcy5vbldhdGNoU3RhcnQgPSBvcHRpb25zLm9uV2F0Y2hTdGFydFxuICAgIHRoaXMub25XYXRjaENsb3NlID0gb3B0aW9ucy5vbldhdGNoQ2xvc2VcbiAgICB0aGlzLmRlYnVnID0gb3B0aW9ucy5kZWJ1Z1xuXG4gICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcyA9IHtcbiAgICAgIElOSVRfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBSRUJVSUxEX1dBVENIOiBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgICAgQ0hFQ0tfTEFTVDogREVGQVVMVF9NQVhfU0VORF9BQ0tfQVVUT19SRVRSWV9PTl9FUlJPUlxuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXIgPSBuZXcgUmVhbHRpbWVMaXN0ZW5lcih7XG4gICAgICBjbG9zZTogdGhpcy5jbG9zZVdhdGNoLFxuICAgICAgb25DaGFuZ2U6IG9wdGlvbnMub25DaGFuZ2UsXG4gICAgICBvbkVycm9yOiBvcHRpb25zLm9uRXJyb3IsXG4gICAgICBkZWJ1ZzogdGhpcy5kZWJ1ZyxcbiAgICAgIHZpcnR1YWxDbGllbnQ6IHRoaXNcbiAgICB9KVxuXG4gICAgdGhpcy5pbml0V2F0Y2goKVxuICB9XG5cbiAgb25NZXNzYWdlKG1zZzogSVJlc3BvbnNlTWVzc2FnZSkge1xuICAgIC8vIHdhdGNoU3RhdHVzIHNhbml0eSBjaGVja1xuICAgIHN3aXRjaCAodGhpcy53YXRjaFN0YXR1cykge1xuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuUEFVU0VEOiB7XG4gICAgICAgIC8vIGlnbm9yZSBhbGwgYnV0IGVycm9yIG1lc3NhZ2VcbiAgICAgICAgaWYgKG1zZy5tc2dUeXBlICE9PSAnRVJST1InKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLkxPR0dJTkdJTjpcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLklOSVRJTkc6XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5SRUJVSUxESU5HOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGlsZSAke3RoaXMud2F0Y2hTdGF0dXN9YFxuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuQ0xPU0VEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgY2xvc2VkJ1xuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgY2FzZSBXQVRDSF9TVEFUVVMuRVJST1JFRDoge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hlbiB0aGUgd2F0Y2ggaGFzIGVuZGVkIHdpdGggZXJyb3InXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogc2Vzc2lvbkluZm8gbm90IGZvdW5kIHdoaWxlIG1lc3NhZ2UgaXMgcmVjZWl2ZWQuJ1xuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuXG4gICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgY2FzZSAnTkVYVF9FVkVOVCc6IHtcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKHd4Ll9pZ25vcmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBuZXh0ZXZlbnQgJHttc2cubXNnRGF0YS5jdXJyRXZlbnR9IGlnbm9yZWRgLCBtc2cpXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gd3guX2lnbm9yZSA9IGZhbHNlXG4gICAgICAgIC8vIHJldHVyblxuICAgICAgICAvLyB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmhhbmRsZVNlcnZlckV2ZW50cyhtc2cpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdDSEVDS19FVkVOVCc6IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgICAgICAvLyBjbGllbnQgZXZlbnRJRCA8IHNlcnZlciBldmVudElEOlxuICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG9uZSBvciBtb3JlIHBlbmRpbmcgZXZlbnRzIG5vdCB5ZXQgcmVjZWl2ZWQgYnV0IHNlbnQgYnkgdGhlIHNlcnZlclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZCA9IG1zZy5tc2dEYXRhLmN1cnJFdmVudFxuICAgICAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpXG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy8gbXVzdCByZWJ1aWxkIHdhdGNoXG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgfSwgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCkpXG5cbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBbcmVhbHRpbWVdIHdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGggJHt0aGlzLmdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGgoKX1gXG4gICAgICAgICAgKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnRVJST1InOiB7XG4gICAgICAgIC8vIHJlY2VpdmUgc2VydmVyIGVycm9yXG4gICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1NFUlZFUl9FUlJPUl9NU0cgYXMgc3RyaW5nLFxuICAgICAgICAgICAgZXJyTXNnOiBgJHttc2cubXNnRGF0YS5jb2RlfSAtICR7bXNnLm1zZ0RhdGEubWVzc2FnZX1gXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHZpcnR1YWwgY2xpZW50IHJlY2VpdmUgdW5leHBlY3RlZCBtc2cgJHttc2cubXNnVHlwZX06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgIClcbiAgICAgICAgLy8gfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsb3NlV2l0aEVycm9yKGVycm9yOiBhbnkpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkVSUk9SRURcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKVxuICAgIHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcilcbiAgICAvLyBSZXBvcnRlci5zdXJyb3VuZFRoaXJkQnlUcnlDYXRjaCgoKSA9PiB0aGlzLmxpc3RlbmVyLm9uRXJyb3IoZXJyb3IpKVxuICAgIHRoaXMub25XYXRjaENsb3NlKFxuICAgICAgdGhpcyxcbiAgICAgICh0aGlzLnNlc3Npb25JbmZvICYmIHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCkgfHwgJydcbiAgICApXG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCBjbG9zZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWBcbiAgICApXG4gICAgLy8gfVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5QQVVTRURcbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCBwYXVzZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKHdhdGNoSWQgJHt0aGlzLndhdGNoSWR9KWBcbiAgICApXG4gICAgLy8gfVxuICB9XG5cbiAgLy8gcmVzdW1lKCkge1xuICAvLyAgIHJldHVybiB0aGlzLnNlc3Npb25JbmZvID8gdGhpcy5yZWJ1aWxkV2F0Y2goKSA6IHRoaXMuaW5pdFdhdGNoKClcbiAgLy8gfVxuXG4gIGFzeW5jIHJlc3VtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLlJFU1VNSU5HXG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbcmVhbHRpbWVdIGNsaWVudCByZXN1bWluZyB3aXRoICR7XG4gICAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPyAnUkVCVUlMRF9XQVRDSCcgOiAnSU5JVF9XQVRDSCdcbiAgICAgIH0gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgXG4gICAgKVxuICAgIC8vIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCAodGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMucmVidWlsZFdhdGNoKCkgOiB0aGlzLmluaXRXYXRjaCgpKVxuXG4gICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgc3VjY2Vzc2Z1bGx5IHJlc3VtZWQgKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgXG4gICAgICApXG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgcmVzdW1lIGZhaWxlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWAsXG4gICAgICAgIGVcbiAgICAgIClcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9sb2dpbiA9IGFzeW5jIChcbiAgICBlbnZJZD86IHN0cmluZyxcbiAgICByZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPElMb2dpblJlc3VsdD4gPT4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuTE9HR0lOR0lOXG4gICAgY29uc3QgbG9naW5SZXN1bHQgPSBhd2FpdCB0aGlzLmxvZ2luKGVudklkLCByZWZyZXNoKVxuICAgIGlmICghdGhpcy5lbnZJZCkge1xuICAgICAgdGhpcy5lbnZJZCA9IGxvZ2luUmVzdWx0LmVudklkXG4gICAgfVxuICAgIHJldHVybiBsb2dpblJlc3VsdFxuICB9XG5cbiAgcHJpdmF0ZSBpbml0V2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuX2luaXRXYXRjaFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0V2F0Y2hQcm9taXNlXG4gICAgfVxuXG4gICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZW52SWQgfSA9IGF3YWl0IHRoaXMuX2xvZ2luKHRoaXMuZW52SWQsIGZvcmNlUmVmcmVzaExvZ2luKVxuXG4gICAgICAgICAgLy8gaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoYGNhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbylgKVxuICAgICAgICAgIC8vIH1cblxuICAgICAgICAgIGlmICgodGhpcy53YXRjaFN0YXR1cyBhcyBXQVRDSF9TVEFUVVMpID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLklOSVRJTkdcblxuICAgICAgICAgIGNvbnN0IGluaXRXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnID0ge1xuICAgICAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICAgIG1zZ1R5cGU6ICdJTklUX1dBVENIJyxcbiAgICAgICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICAgICAgZW52SWQsXG4gICAgICAgICAgICAgIGNvbGxOYW1lOiB0aGlzLmNvbGxlY3Rpb25OYW1lLFxuICAgICAgICAgICAgICBxdWVyeTogdGhpcy5xdWVyeSxcbiAgICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgICAgICAgIG9yZGVyQnk6IHRoaXMub3JkZXJCeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGluaXRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IGluaXRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IHRydWUsXG4gICAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX0lOSVRfV0FUQ0hfVElNRU9VVFxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBjb25zdCB7IGV2ZW50cywgY3VyckV2ZW50IH0gPSBpbml0RXZlbnRNc2cubXNnRGF0YVxuXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgICAgIHF1ZXJ5SUQ6IGluaXRFdmVudE1zZy5tc2dEYXRhLnF1ZXJ5SUQsXG4gICAgICAgICAgICBjdXJyZW50RXZlbnRJZDogY3VyckV2ZW50IC0gMSxcbiAgICAgICAgICAgIGN1cnJlbnREb2NzOiBbXVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEZJWDogaW4gaW5pdEV2ZW50IG1lc3NhZ2UsIGFsbCBldmVudHMgaGF2ZSBpZCAwLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjdXJyRXZlbnRcbiAgICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICAgICAgICAgICAgZS5JRCA9IGN1cnJFdmVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMoaW5pdEV2ZW50TXNnKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY3VyckV2ZW50XG4gICAgICAgICAgICBjb25zdCBzbmFwc2hvdCA9IG5ldyBTbmFwc2hvdCh7XG4gICAgICAgICAgICAgIGlkOiBjdXJyRXZlbnQsXG4gICAgICAgICAgICAgIGRvY0NoYW5nZXM6IFtdLFxuICAgICAgICAgICAgICBkb2NzOiBbXSxcbiAgICAgICAgICAgICAgdHlwZTogJ2luaXQnXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdClcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5vbldhdGNoU3RhcnQodGhpcywgdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEKVxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQUNUSVZFXG4gICAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5JTklUX1dBVENIID0gREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUlxuICAgICAgICAgIHJlc29sdmUoKVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvcihlLCB7XG4gICAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnSU5JVF9XQVRDSCcsXG4gICAgICAgICAgICByZXNvbHZlLFxuICAgICAgICAgICAgcmVqZWN0XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9pbml0V2F0Y2hQcm9taXNlXG4gICAgICBzdWNjZXNzID0gdHJ1ZVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pbml0V2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gaW5pdFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKVxuICAgIC8vIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVidWlsZFdhdGNoID0gYXN5bmMgKGZvcmNlUmVmcmVzaExvZ2luPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZVxuICAgIH1cblxuICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihcbiAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJylcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlKClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy5fbG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pXG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ2NhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdBVENIX1NUQVRVUykgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIHJlYnVpbGRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKVxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUkVCVUlMRElOR1xuXG4gICAgICAgICAgY29uc3QgcmVidWlsZFdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VSZWJ1aWxkV2F0Y2hNc2cgPSB7XG4gICAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICAgICAgbXNnVHlwZTogJ1JFQlVJTERfV0FUQ0gnLFxuICAgICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgICBlbnZJZCxcbiAgICAgICAgICAgICAgY29sbE5hbWU6IHRoaXMuY29sbGVjdGlvbk5hbWUsXG4gICAgICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG5leHRFdmVudE1zZyA9IGF3YWl0IHRoaXMuc2VuZDxJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnPih7XG4gICAgICAgICAgICBtc2c6IHJlYnVpbGRXYXRjaE1zZyxcbiAgICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBPbk1lc3NhZ2U6IGZhbHNlLFxuICAgICAgICAgICAgdGltZW91dDogREVGQVVMVF9SRUJVSUxEX1dBVENIX1RJTUVPVVRcbiAgICAgICAgICB9KVxuXG4gICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobmV4dEV2ZW50TXNnKVxuXG4gICAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5BQ1RJVkVcbiAgICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLlJFQlVJTERfV0FUQ0ggPSBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbk5hbWU6ICdSRUJVSUxEX1dBVENIJyxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3RcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2VcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICB9XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggJHtzdWNjZXNzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWwnfWApXG4gICAgLy8gfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvciA9IGFzeW5jIChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9uc1xuICApID0+IHtcbiAgICBjb25zdCBpc0luaXRXYXRjaCA9IG9wdGlvbnMub3BlcmF0aW9uTmFtZSA9PT0gJ0lOSVRfV0FUQ0gnXG5cbiAgICBjb25zdCBhYm9ydFdhdGNoID0gKCkgPT4ge1xuICAgICAgLy8gbW9jayB0ZW1wIGNvbW1lbnRcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBpc0luaXRXYXRjaFxuICAgICAgICAgICAgPyAoRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0lOSVRfV0FUQ0hfRkFJTCBhcyBzdHJpbmcpXG4gICAgICAgICAgICA6IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVCVUlMRF9XQVRDSF9GQUlMIGFzIHN0cmluZyksXG4gICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICBvcHRpb25zLnJlamVjdChlKVxuICAgIH1cblxuICAgIGNvbnN0IHJldHJ5ID0gKHJlZnJlc2hMb2dpbj86IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVJldHJ5VGlja2V0KG9wdGlvbnMub3BlcmF0aW9uTmFtZSkpIHtcbiAgICAgICAgaWYgKGlzSW5pdFdhdGNoKSB7XG4gICAgICAgICAgdGhpcy5faW5pdFdhdGNoUHJvbWlzZSA9IHVuZGVmaW5lZFxuICAgICAgICAgIG9wdGlvbnMucmVzb2x2ZSh0aGlzLmluaXRXYXRjaChyZWZyZXNoTG9naW4pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWRcbiAgICAgICAgICBvcHRpb25zLnJlc29sdmUodGhpcy5yZWJ1aWxkV2F0Y2gocmVmcmVzaExvZ2luKSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWJvcnRXYXRjaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVDb21tb25FcnJvcihlLCB7XG4gICAgICBvblNpZ25FcnJvcjogKCkgPT4gcmV0cnkodHJ1ZSksXG4gICAgICBvblRpbWVvdXRFcnJvcjogKCkgPT4gcmV0cnkoZmFsc2UpLFxuICAgICAgb25Ob3RSZXRyeWFibGVFcnJvcjogYWJvcnRXYXRjaCxcbiAgICAgIG9uQ2FuY2VsbGVkRXJyb3I6IG9wdGlvbnMucmVqZWN0LFxuICAgICAgb25Vbmtub3duRXJyb3I6IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBvbldTRGlzY29ubmVjdGVkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXVzZSgpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uY2VXU0Nvbm5lY3RlZCgpXG4gICAgICAgICAgICByZXRyeSh0cnVlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghdGhpcy5pc1dTQ29ubmVjdGVkKCkpIHtcbiAgICAgICAgICAgIGF3YWl0IG9uV1NEaXNjb25uZWN0ZWQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzbGVlcChERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SKVxuICAgICAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAgICAgLy8gY2FuY2VsXG4gICAgICAgICAgICAgIG9wdGlvbnMucmVqZWN0KFxuICAgICAgICAgICAgICAgIG5ldyBDYW5jZWxsZWRFcnJvcihcbiAgICAgICAgICAgICAgICAgIGAke29wdGlvbnMub3BlcmF0aW9uTmFtZX0gY2FuY2VsbGVkIGR1ZSB0byBwYXVzZSBhZnRlciB1bmtub3duRXJyb3JgXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgICBhd2FpdCBvbldTRGlzY29ubmVjdGVkKClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHJ5KGZhbHNlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgaGFuZGxpbmcgZXJyb3IsIGluIG9yZGVyIHRvIHByb3ZpZGUgbWF4aW11bSBlZmZvcnQgb24gU0VBTUlOR0xFU1MgRkFVTFQgVE9MRVJBTkNFLCBqdXN0IHJldHJ5XG4gICAgICAgICAgcmV0cnkodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGNsb3NlV2F0Y2ggPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcXVlcnlJZCA9IHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQgOiAnJ1xuXG4gICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdBVENIX1NUQVRVUy5BQ1RJVkUpIHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0VEXG4gICAgICB0aGlzLm9uV2F0Y2hDbG9zZSh0aGlzLCBxdWVyeUlkKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0lOR1xuXG4gICAgICBjb25zdCBjbG9zZVdhdGNoTXNnOiBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnID0ge1xuICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgIHJlcXVlc3RJZDogZ2VuUmVxdWVzdElkKCksXG4gICAgICAgIG1zZ1R5cGU6ICdDTE9TRV9XQVRDSCcsXG4gICAgICAgIG1zZ0RhdGE6IG51bGxcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBjbG9zZVdhdGNoTXNnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNlc3Npb25JbmZvID0gdW5kZWZpbmVkXG4gICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkNMT1NFRFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0xPU0VfV0FUQ0hfRkFJTCBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzY2hlZHVsZVNlbmRBQ0sgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGVhckFDS1NjaGVkdWxlKClcblxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBzdGF0dXMgYWZ0ZXIgdGltZW91dFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLl9hY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl93YWl0RXhwZWN0ZWRUaW1lb3V0SWQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZW5kQUNLKClcbiAgICAgIH1cbiAgICB9LCBERUZBVUxUX1NFTkRfQUNLX0RFQk9VTkNFX1RJTUVPVVQpXG4gIH1cblxuICBwcml2YXRlIGNsZWFyQUNLU2NoZWR1bGUgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX2Fja1RpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2Fja1RpbWVvdXRJZClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNlbmRBQ0sgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzICE9PSBXQVRDSF9TVEFUVVMuQUNUSVZFKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gY2FuIG5vdCBzZW5kIGFjayB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBpbml0V2F0Y2ggKGxhY2sgb2Ygc2Vzc2lvbkluZm8pJ1xuICAgICAgICApXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2tNc2c6IElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0hFQ0tfTEFTVCcsXG4gICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICBxdWVyeUlEOiB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQsXG4gICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZFxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgIG1zZzogYWNrTXNnXG4gICAgICB9KVxuXG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVE9ETzogcmVmYWN0b3JcbiAgICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkXG4gICAgICAgIHN3aXRjaCAobXNnLm1zZ0RhdGEuY29kZSkge1xuICAgICAgICAgIC8vIHNpZ25hdHVyZSBlcnJvciAtPiByZXRyeSB3aXRoIHJlZnJlc2hlZCBzaWduYXR1cmVcbiAgICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICAgIGNhc2UgJ1NJR05fRVhQSVJFRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gb3RoZXIgLT4gdGhyb3dcbiAgICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICAgIC8vIG11c3QgdGhyb3dcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoXG4gICAgICAgICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0hFQ0tfTEFTVF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IG1zZy5tc2dEYXRhLmNvZGVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBtYXliZSByZXRyeWFibGVcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNUICYmXG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLkNIRUNLX0xBU1QtLVxuICAgICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKFxuICAgICAgICAgIG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9DSEVDS19MQVNUX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICAgICAgZXJyTXNnOiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29tbW9uRXJyb3IgPSAoXG4gICAgZTogYW55LFxuICAgIG9wdGlvbnM6IElIYW5kbGVDb21tb25FcnJvck9wdGlvbnNcbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKGlzUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcihlKSkge1xuICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkXG4gICAgICBzd2l0Y2ggKG1zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgLy8gc2lnbmF0dXJlIGVycm9yIC0+IHJldHJ5IHdpdGggcmVmcmVzaGVkIHNpZ25hdHVyZVxuICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICBjYXNlICdTSUdOX0VYUElSRURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgb3B0aW9ucy5vblNpZ25FcnJvcihlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIC8vIG5vdC1yZXRyeWFibGUgZXJyb3IgLT4gdGhyb3dcbiAgICAgICAgY2FzZSAnUVVFUllJRF9JTlZBTElEX0VSUk9SJzpcbiAgICAgICAgY2FzZSAnU1lTX0VSUic6XG4gICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgIGNhc2UgJ0NPTExFQ1RJT05fUEVSTUlTU0lPTl9ERU5JRUQnOiB7XG4gICAgICAgICAgb3B0aW9ucy5vbk5vdFJldHJ5YWJsZUVycm9yKGUpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIG9wdGlvbnMub25Ob3RSZXRyeWFibGVFcnJvcihlKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RpbWVvdXRFcnJvcihlKSkge1xuICAgICAgLy8gdGltZW91dCBlcnJvclxuICAgICAgb3B0aW9ucy5vblRpbWVvdXRFcnJvcihlKVxuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIGlmIChpc0NhbmNlbGxlZEVycm9yKGUpKSB7XG4gICAgICAvLyBjYW5jZWxsZWQgZXJyb3JcbiAgICAgIG9wdGlvbnMub25DYW5jZWxsZWRFcnJvcihlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5rbm93biBlcnJvclxuICAgIG9wdGlvbnMub25Vbmtub3duRXJyb3IoZSlcbiAgfVxuXG4gIC8vIGNyZWRpdCBhIHJldHJ5IGNoYW5jZSBmcm9tIGF2YWlsYWJsZVJldHJpZXNcbiAgcHJpdmF0ZSB1c2VSZXRyeVRpY2tldChvcGVyYXRpb25OYW1lOiBJUmVxdWVzdE1zZ1R5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdICYmXG4gICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdISA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hLS1cblxuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgYFtyZWFsdGltZV0gJHtvcGVyYXRpb25OYW1lfSB1c2UgYSByZXRyeSB0aWNrZXQsIG5vdyBvbmx5ICR7dGhpcy5fYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXX0gcmV0cnkgbGVmdGBcbiAgICAgIClcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZVNlcnZlckV2ZW50cyhcbiAgICBtc2c6IElSZXNwb25zZU1lc3NhZ2VJbml0RXZlbnRNc2cgfCBJUmVzcG9uc2VNZXNzYWdlTmV4dEV2ZW50TXNnXG4gICkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpXG4gICAgICBhd2FpdCB0aGlzLl9oYW5kbGVTZXJ2ZXJFdmVudHMobXNnKVxuICAgICAgdGhpcy5fcG9zdEhhbmRsZVNlcnZlckV2ZW50c1ZhbGlkaXR5Q2hlY2sobXNnKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGhhbmRsZSBzZXJ2ZXIgZXZlbnRzIGZhaWxlZCB3aXRoIGVycm9yOiAnLFxuICAgICAgICBlXG4gICAgICApXG5cbiAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBlcnJvcjogaGFuZGxlIHNlcnZlciBldmVudHMgZmFpbGVkIHdpdGggZXJyb3I6ICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oe30sIGUsIHtcbiAgICAgIC8vICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgIC8vICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAvLyAgICAgfSlcbiAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgLy8gKVxuICAgICAgLy8gfVxuXG4gICAgICB0aHJvdyBlXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfaGFuZGxlU2VydmVyRXZlbnRzKFxuICAgIG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2dcbiAgKSB7XG4gICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1zZ1xuXG4gICAgY29uc3QgeyBldmVudHMgfSA9IG1zZy5tc2dEYXRhXG4gICAgY29uc3QgeyBtc2dUeXBlIH0gPSBtc2dcblxuICAgIGlmICghZXZlbnRzLmxlbmd0aCB8fCAhdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2Vzc2lvbkluZm8gPSB0aGlzLnNlc3Npb25JbmZvXG5cbiAgICBsZXQgYWxsQ2hhbmdlRXZlbnRzOiBJU2luZ2xlREJFdmVudFtdXG4gICAgdHJ5IHtcbiAgICAgIGFsbENoYW5nZUV2ZW50cyA9IGV2ZW50cy5tYXAoZ2V0UHVibGljRXZlbnQpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihcbiAgICAgICAgbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNFSVZFX0lOVkFMSURfU0VSVkVSX0RBVEEgYXMgc3RyaW5nLFxuICAgICAgICAgIGVyck1zZzogZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gYWdncmVnYXRlIGRvY3NcbiAgICBsZXQgZG9jcyA9IFsuLi5zZXNzaW9uSW5mby5jdXJyZW50RG9jc11cbiAgICBsZXQgaW5pdEVuY291bnRlcmVkID0gZmFsc2VcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYWxsQ2hhbmdlRXZlbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBhbGxDaGFuZ2VFdmVudHNbaV1cblxuICAgICAgaWYgKHNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID49IGNoYW5nZS5pZCkge1xuICAgICAgICBpZiAoIWFsbENoYW5nZUV2ZW50c1tpIC0gMV0gfHwgY2hhbmdlLmlkID4gYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXS5pZCkge1xuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudCwgZHJvcGFibGVcbiAgICAgICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW3JlYWx0aW1lXSBkdXBsaWNhdGUgZXZlbnQgcmVjZWl2ZWQsIGN1ciAke3Nlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkfSBidXQgZ290ICR7Y2hhbmdlLmlkfWBcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGFsbENoYW5nZUV2ZW50cyBzaG91bGQgYmUgaW4gYXNjZW5kaW5nIG9yZGVyIGFjY29yZGluZyB0byBldmVudElkLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW5zLCBtdXN0IHJlcG9ydCBhIG5vbi1mYXRhbCBlcnJvclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBzZXJ2ZXIgbm9uLWZhdGFsIGVycm9yOiBldmVudHMgb3V0IG9mIG9yZGVyICh0aGUgbGF0dGVyIGV2ZW50J3MgaWQgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZvcm1lcikgKHJlcXVlc3RJZCAke3JlcXVlc3RJZH0pYFxuICAgICAgICAgIClcblxuICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gc2VydmVyIG5vbi1mYXRhbCBlcnJvcjogZXZlbnRzIG91dCBvZiBvcmRlciAodGhlIGxhdHRlciBldmVudCdzIGlkIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBmb3JtZXIpICAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgLy8gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID09PSBjaGFuZ2UuaWQgLSAxKSB7XG4gICAgICAgIC8vIGNvcnJlY3Qgc2VxdWVuY2VcbiAgICAgICAgLy8gZmlyc3QgaGFuZGxlIGRhdGFUeXBlIHRoZW4gcXVldWVUeXBlOlxuICAgICAgICAvLyAxLiBkYXRhVHlwZTogd2UgT05MWSBwb3B1bGF0ZSBjaGFuZ2UuZG9jIGlmIG5lY2Nlc3NhcnlcbiAgICAgICAgLy8gMi4gcXVldWVUeXBlOiB3ZSBidWlsZCB0aGUgZGF0YSBzbmFwc2hvdFxuXG4gICAgICAgIHN3aXRjaCAoY2hhbmdlLmRhdGFUeXBlKSB7XG4gICAgICAgICAgY2FzZSAndXBkYXRlJzoge1xuICAgICAgICAgICAgLy8gb25seSBuZWVkIHRvIHBvcHVsYXRlIGNoYW5nZS5kb2Mgd2hlbiBpdCBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICd1cGRhdGUnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBsb2NhbERvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbCB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gY2xvbmVEZWVwKGxvY2FsRG9jKVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2UudXBkYXRlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGRQYXRoIGluIGNoYW5nZS51cGRhdGVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXQoZG9jLCBmaWVsZFBhdGgsIGNoYW5nZS51cGRhdGVkRmllbGRzW2ZpZWxkUGF0aF0pXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZS5yZW1vdmVkRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZFBhdGggb2YgY2hhbmdlLnJlbW92ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0KGRvYywgZmllbGRQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2NcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCB1cGRhdGUgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgdXBkYXRlIGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJ1cGRhdGVcIiBhbmQgcXVldWVUeXBlPVwiZW5xdWV1ZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlcGxhY2UnOiB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0aW9uXG4gICAgICAgICAgICBpZiAoIWNoYW5nZS5kb2MpIHtcbiAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwicmVwbGFjZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKVxuICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3JlbW92ZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLidcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHJlbW92ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2xpbWl0Jzoge1xuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRvYyA9IGRvY3MuZmluZChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKVxuICAgICAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgbGltaXQgZGF0YVR5cGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgLy8gZG9jIGlzIHByb3ZpZGVkIGJ5IHNlcnZlciwgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICBlcnJNc2c6IGBIYW5kbGVTZXJ2ZXJFdmVudHM6IGZ1bGwgZG9jIGlzIG5vdCBwcm92aWRlZCB3aXRoIGRhdGFUeXBlPVwibGltaXRcIiBhbmQgcXVldWVUeXBlPVwiZW5xdWV1ZVwiIChyZXF1ZXN0SWQgJHttc2cucmVxdWVzdElkfSlgXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihlcnIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UucXVldWVUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnaW5pdCc6IHtcbiAgICAgICAgICAgIGlmICghaW5pdEVuY291bnRlcmVkKSB7XG4gICAgICAgICAgICAgIGluaXRFbmNvdW50ZXJlZCA9IHRydWVcbiAgICAgICAgICAgICAgZG9jcyA9IFtjaGFuZ2UuZG9jXVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZClcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzLnNwbGljZShpbmQsIDEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgZGVxdWV1ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4nXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgICAgLy8gICBcIndzZXJyb3IudHh0XCIsXG4gICAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBkZXF1ZXVlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgLy8gICAgICAge30sXG4gICAgICAgICAgICAgIC8vICAgICAgIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgICAgICAvLyAgICl9IFxcbmBcbiAgICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndXBkYXRlJzoge1xuICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gZG9jcyAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICAgICAgLy8gICAgIGRvY3NcbiAgICAgICAgICAgIC8vICAgKX0gY2hhbmdlIGRvYyAke0pTT04uc3RyaW5naWZ5KGNoYW5nZSl9IFxcbmBcbiAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIGNvbnN0IGluZCA9IGRvY3MuZmluZEluZGV4KGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpXG4gICAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgZG9jc1tpbmRdID0gY2hhbmdlLmRvY1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHF1ZXVlVHlwZSB1cGRhdGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJ1xuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcXVldWVUeXBlIHVwZGF0ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGkgPT09IGxlbiAtIDEgfHxcbiAgICAgICAgICAoYWxsQ2hhbmdlRXZlbnRzW2kgKyAxXSAmJiBhbGxDaGFuZ2VFdmVudHNbaSArIDFdLmlkICE9PSBjaGFuZ2UuaWQpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGEgc2hhbGxvdyBzbGljZSBjcmVhdGVzIGEgc2hhbGxvdyBzbmFwc2hvdFxuICAgICAgICAgIGNvbnN0IGRvY3NTbmFwc2hvdCA9IFsuLi5kb2NzXVxuXG4gICAgICAgICAgLy8gd2Ugc2xpY2UgZmlyc3QgY2F1c2UnIGlmIHRoZXJlJ3JlIGFsbENoYW5nZUV2ZW50cyB0aGF0IGFyZSBvZiB0aGUgc2FtZSBpZCBhZnRlciB0aGlzIGNoYW5nZSwgd2UgZG9uJ3Qgd2FudCB0byBpbnZvbHZlIGl0IGZvciBpdCBpcyB1bmV4cGVjdGVkIGludmFsaWQgb3JkZXJcbiAgICAgICAgICBjb25zdCBkb2NDaGFuZ2VzID0gYWxsQ2hhbmdlRXZlbnRzXG4gICAgICAgICAgICAuc2xpY2UoMCwgaSArIDEpXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5pZCA9PT0gY2hhbmdlLmlkKVxuXG4gICAgICAgICAgLy8gYWxsIGNoYW5nZXMgb2YgdGhpcyBldmVudCBoYXMgYmVlbiBoYW5kbGUsIHdlIGNvdWxkIGRpc3BhdGNoIHRoZSBldmVudCBub3dcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY2hhbmdlLmlkXG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RG9jcyA9IGRvY3NcblxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICAgICAgICBkb2NDaGFuZ2VzLFxuICAgICAgICAgICAgZG9jczogZG9jc1NuYXBzaG90LFxuICAgICAgICAgICAgbXNnVHlwZVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICAvLyBSZXBvcnRlci5zdXJyb3VuZFRoaXJkQnlUcnlDYXRjaCgoKSA9PlxuICAgICAgICAgIHRoaXMubGlzdGVuZXIub25DaGFuZ2Uoc25hcHNob3QpXG4gICAgICAgICAgLy8gKSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG91dC1vZi1vcmRlciBldmVudFxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBldmVudCByZWNlaXZlZCBpcyBvdXQgb2Ygb3JkZXIsIGN1ciAke3RoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YFxuICAgICAgICApXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmVidWlsZCB3YXRjaFxuICAgICAgICBhd2FpdCB0aGlzLnJlYnVpbGRXYXRjaCgpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Bvc3RIYW5kbGVTZXJ2ZXJFdmVudHNWYWxpZGl0eUNoZWNrKFxuICAgIG1zZzogSVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZyB8IElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2dcbiAgKSB7XG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1cidcbiAgICAgIClcblxuICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgIC8vICAgYFtyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBzZXNzaW9uSW5mbyBsb3N0IGFmdGVyIHNlcnZlciBldmVudCBoYW5kbGluZywgdGhpcyBzaG91bGQgbmV2ZXIgb2NjdXIgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgLy8gICAgICAge30sXG4gICAgICAvLyAgICAgICB7XG4gICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgIC8vICAgICAgICAgd2F0Y2hJZDogbXNnLndhdGNoSWRcbiAgICAgIC8vICAgICAgIH1cbiAgICAgIC8vICAgICApXG4gICAgICAvLyAgICl9IFxcbmBcbiAgICAgIC8vIClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZCAmJlxuICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA+PSB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBjbGllbnQgZXZlbnRJZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNlcnZlciBldmVudCBpZCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcnXG4gICAgICApXG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZClcbiAgICAgIHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQdWJsaWNFdmVudChldmVudDogSURCRXZlbnQpOiBJU2luZ2xlREJFdmVudCB7XG4gIGNvbnN0IGU6IElTaW5nbGVEQkV2ZW50ID0ge1xuICAgIGlkOiBldmVudC5JRCxcbiAgICBkYXRhVHlwZTogZXZlbnQuRGF0YVR5cGUsXG4gICAgcXVldWVUeXBlOiBldmVudC5RdWV1ZVR5cGUsXG4gICAgZG9jSWQ6IGV2ZW50LkRvY0lELFxuICAgIGRvYzogZXZlbnQuRG9jICYmIGV2ZW50LkRvYyAhPT0gJ3t9JyA/IEpTT04ucGFyc2UoZXZlbnQuRG9jKSA6IHVuZGVmaW5lZFxuICB9XG5cbiAgaWYgKGV2ZW50LkRhdGFUeXBlID09PSAndXBkYXRlJykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZXZlbnQuVXBkYXRlZEZpZWxkcykge1xuICAgICAgZS51cGRhdGVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5VcGRhdGVkRmllbGRzKVxuICAgIH1cbiAgICAvLyBUT0RPOiB3YWl0IGZvciB0Y2IgdG8gY2hhbmdlIHJlbW92ZWRGaWVsZHMgdG8gUmVtb3ZlZEZpZWxkc1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoZXZlbnQucmVtb3ZlZEZpZWxkcyB8fCBldmVudC5SZW1vdmVkRmllbGRzKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAvLyBlLnJlbW92ZWRGaWVsZHMgPSBldmVudC5yZW1vdmVkRmllbGRzXG4gICAgICAvLyAgID8gSlNPTi5wYXJzZShldmVudC5yZW1vdmVkRmllbGRzKVxuICAgICAgLy8gICA6IEpTT04ucGFyc2UoZXZlbnQuUmVtb3ZlZEZpZWxkcylcbiAgICAgIGUucmVtb3ZlZEZpZWxkcyA9IEpTT04ucGFyc2UoZXZlbnQucmVtb3ZlZEZpZWxkcylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZVxufVxuIl19
|
|
946
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlydHVhbC13ZWJzb2NrZXQtY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZpcnR1YWwtd2Vic29ja2V0LWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQSxPQUFPLEdBQUcsTUFBTSxZQUFZLENBQUM7QUFDN0IsT0FBTyxLQUFLLE1BQU0sY0FBYyxDQUFDO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFpQnpDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLDJCQUEyQixHQUc1QixNQUFNLFNBQVMsQ0FBQztBQUNqQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBNENoQyxJQUFLLFlBVUo7QUFWRCxXQUFLLFlBQVk7SUFDZix1Q0FBdUIsQ0FBQTtJQUN2QixtQ0FBbUIsQ0FBQTtJQUNuQix5Q0FBeUIsQ0FBQTtJQUN6QixpQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBbUIsQ0FBQTtJQUNuQixtQ0FBbUIsQ0FBQTtJQUNuQixpQ0FBaUIsQ0FBQTtJQUNqQixpQ0FBaUIsQ0FBQTtJQUNqQixxQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBVkksWUFBWSxLQUFaLFlBQVksUUFVaEI7QUFFRCxJQUFNLGtDQUFrQyxHQUFHLEdBQUcsQ0FBQztBQUMvQyxJQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQUMxQyxJQUFNLHdDQUF3QyxHQUFHLENBQUMsQ0FBQztBQUNuRCxJQUFNLGlDQUFpQyxHQUFHLEVBQUUs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QUssQ0FBQyxTQUFTO1FBQzFCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztRQUNsQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7S0FDekUsQ0FBQztJQUVGLElBQUksS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7UUFFL0IsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLENBQUMsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDbkQ7UUFHRCxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtZQUs5QyxDQUFDLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ25EO0tBQ0Y7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1wbHVzcGx1cyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW1pc3VzZWQtcHJvbWlzZXMgKi9cbmltcG9ydCBzZXQgZnJvbSAnbG9kYXNoLnNldCc7XG5pbXBvcnQgdW5zZXQgZnJvbSAnbG9kYXNoLnVuc2V0JztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgeyBnZW5SZXF1ZXN0SWQgfSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHtcbiAgSVJlc3BvbnNlTWVzc2FnZSxcbiAgSVJlcXVlc3RNZXNzYWdlSW5pdFdhdGNoTXNnLFxuICBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnLFxuICBJREJFdmVudCxcbiAgSVJlcXVlc3RNZXNzYWdlUmVidWlsZFdhdGNoTXNnLFxuICBJUmVxdWVzdE1lc3NhZ2VDbG9zZVdhdGNoTXNnLFxuICBJUmVxdWVzdE1zZ1R5cGUsXG4gIElSZXNwb25zZU1lc3NhZ2VOZXh0RXZlbnRNc2csXG4gIElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyxcbiAgSVdhdGNoT3B0aW9ucyxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9yZWFsdGltZSc7XG5pbXBvcnQge1xuICBJU2luZ2xlREJFdmVudCxcbn0gZnJvbSAnQGNsb3VkYmFzZS90eXBlcy9kYXRhYmFzZSc7XG4vLyBpbXBvcnQgUmVwb3J0ZXIgZnJvbSBcIi4vZXh0ZXJuYWxzL3B1YmxpYy1saWIvcmVwb3J0ZXJcIlxuaW1wb3J0IHsgUmVhbHRpbWVMaXN0ZW5lciB9IGZyb20gJy4vbGlzdGVuZXInO1xuaW1wb3J0IHsgU25hcHNob3QgfSBmcm9tICcuL3NuYXBzaG90JztcbmltcG9ydCB7IElXU1NlbmRPcHRpb25zLCBJTG9naW5SZXN1bHQgfSBmcm9tICcuL3dlYnNvY2tldC1jbGllbnQnO1xuaW1wb3J0IHtcbiAgRVJSX0NPREUsXG4gIENsb3VkU0RLRXJyb3IsXG4gIGlzVGltZW91dEVycm9yLFxuICBDYW5jZWxsZWRFcnJvcixcbiAgaXNDYW5jZWxsZWRFcnJvcixcbiAgaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLFxuICBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yLFxuICBUaW1lb3V0RXJyb3IsXG59IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgc2xlZXAgfSBmcm9tICcuL3V0aWxzJztcblxuLy8gPT09PT09PT09PT09PT09IFJlYWx0aW1lIFZpcnR1YWwgV2ViU29ja2V0IENsaWVudCAoSW50ZXJuYWwpID09PT09PT09PT09PT09PT09PT09XG5cbmludGVyZmFjZSBJVmlydHVhbFdlYlNvY2tldENsaWVudENvbnN0cnVjdG9yT3B0aW9ucyBleHRlbmRzIElXYXRjaE9wdGlvbnMge1xuICAvLyB3czogUmVhbHRpbWVXZWJTb2NrZXRDbGllbnRcbiAgZW52SWQ/OiBzdHJpbmdcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZ1xuICBxdWVyeTogc3RyaW5nXG4gIGxpbWl0PzogbnVtYmVyXG4gIG9yZGVyQnk/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPlxuICBsb2dpbjogKGVudklkPzogc3RyaW5nLCByZWZyZXNoPzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+XG4gIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW5cbiAgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+XG4gIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6ICgpID0+IG51bWJlclxuICBvbldhdGNoU3RhcnQ6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBvbldhdGNoQ2xvc2U6IChjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsIHF1ZXJ5SUQ6IHN0cmluZykgPT4gdm9pZFxuICBkZWJ1Zz86IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIElXYXRjaFNlc3Npb25JbmZvIHtcbiAgcXVlcnlJRDogc3RyaW5nXG4gIGN1cnJlbnRFdmVudElkOiBudW1iZXJcbiAgY3VycmVudERvY3M6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICBleHBlY3RFdmVudElkPzogbnVtYmVyXG59XG5cbmludGVyZmFjZSBJSGFuZGxlQ29tbW9uRXJyb3JPcHRpb25zIHtcbiAgb25TaWduRXJyb3I6IChlOiBSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKSA9PiB2b2lkXG4gIG9uVGltZW91dEVycm9yOiAoZTogVGltZW91dEVycm9yKSA9PiB2b2lkXG4gIG9uQ2FuY2VsbGVkRXJyb3I6IChlOiBDYW5jZWxsZWRFcnJvcikgPT4gdm9pZFxuICBvbk5vdFJldHJ5YWJsZUVycm9yOiAoZTogUmVhbHRpbWVFcnJvck1lc3NhZ2VFcnJvcikgPT4gdm9pZFxuICBvblVua25vd25FcnJvcjogKGU6IGFueSkgPT4gdm9pZFxufVxuXG5pbnRlcmZhY2UgSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9ucyB7XG4gIG9wZXJhdGlvbk5hbWU6ICdJTklUX1dBVENIJyB8ICdSRUJVSUxEX1dBVENIJ1xuICByZXNvbHZlOiAodmFsdWU/OiBQcm9taXNlTGlrZTx2b2lkPiB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICByZWplY3Q6IChlOiBhbnkpID0+IHZvaWRcbiAgLy8gcmV0cnk6IChyZWZyZXNoTG9naW4/OiBib29sZWFuKSA9PiB2b2lkXG4gIC8vIGFib3J0V2F0Y2g6IChlOiBhbnkpID0+IHZvaWRcbn1cblxuZW51bSBXQVRDSF9TVEFUVVMge1xuICBMT0dHSU5HSU4gPSAnTE9HR0lOR0lOJyxcbiAgSU5JVElORyA9ICdJTklUSU5HJyxcbiAgUkVCVUlMRElORyA9ICdSRUJVSUxESU5HJyxcbiAgQUNUSVZFID0gJ0FDVElWRScsXG4gIEVSUk9SRUQgPSAnRVJST1JFRCcsXG4gIENMT1NJTkcgPSAnQ0xPU0lORycsXG4gIENMT1NFRCA9ICdDTE9TRUQnLFxuICBQQVVTRUQgPSAnUEFVU0VEJyxcbiAgUkVTVU1JTkcgPSAnUkVTVU1JTkcnXG59XG5cbmNvbnN0IERFRkFVTFRfV0FJVF9USU1FX09OX1VOS05PV05fRVJST1IgPSAxMDA7XG5jb25zdCBERUZBVUxUX01BWF9BVVRPX1JFVFJZX09OX0VSUk9SID0gMjtcbmNvbnN0IERFRkFVTFRfTUFYX1NFTkRfQUNLX0FVVE9fUkVUUllfT05fRVJST1IgPSAyO1xuY29uc3QgREVGQVVMVF9TRU5EX0FDS19ERUJPVU5DRV9USU1FT1VUID0gMTAgKiAxMDAwO1xuY29uc3QgREVGQVVMVF9JTklUX1dBVENIX1RJTUVPVVQgPSAxMCAqIDEwMDA7XG5jb25zdCBERUZBVUxUX1JFQlVJTERfV0FUQ0hfVElNRU9VVCA9IDEwICogMTAwMDtcblxuZXhwb3J0IGNsYXNzIFZpcnR1YWxXZWJTb2NrZXRDbGllbnQge1xuICAvLyBwYXNzZWQgb3ZlclxuICB3YXRjaElkOiBzdHJpbmc7XG4gIC8vIG93blxuICBsaXN0ZW5lcjogUmVhbHRpbWVMaXN0ZW5lcjtcbiAgcHJpdmF0ZSBlbnZJZD86IHN0cmluZztcbiAgcHJpdmF0ZSBjb2xsZWN0aW9uTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHF1ZXJ5OiBzdHJpbmc7XG4gIHByaXZhdGUgbGltaXQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBvcmRlckJ5OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBwcml2YXRlIHNlbmQ6IDxUID0gYW55PihvcHRzOiBJV1NTZW5kT3B0aW9ucykgPT4gUHJvbWlzZTxUPjtcbiAgcHJpdmF0ZSBsb2dpbjogKGVudklkPzogc3RyaW5nLCByZWZyZXNoPzogYm9vbGVhbikgPT4gUHJvbWlzZTxhbnk+O1xuICBwcml2YXRlIGlzV1NDb25uZWN0ZWQ6ICgpID0+IGJvb2xlYW47XG4gIHByaXZhdGUgb25jZVdTQ29ubmVjdGVkOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGdldFdhaXRFeHBlY3RlZFRpbWVvdXRMZW5ndGg6ICgpID0+IG51bWJlcjtcbiAgcHJpdmF0ZSBvbldhdGNoU3RhcnQ6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBvbldhdGNoQ2xvc2U6IChcbiAgICBjbGllbnQ6IFZpcnR1YWxXZWJTb2NrZXRDbGllbnQsXG4gICAgcXVlcnlJRDogc3RyaW5nXG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSB3YXRjaFN0YXR1czogV0FUQ0hfU1RBVFVTID0gV0FUQ0hfU1RBVFVTLklOSVRJTkc7XG4gIHByaXZhdGUgX2F2YWlsYWJsZVJldHJpZXM6IFBhcnRpYWw8UmVjb3JkPElSZXF1ZXN0TXNnVHlwZSwgbnVtYmVyPj47XG4gIHByaXZhdGUgX2Fja1RpbWVvdXRJZD86IG51bWJlcjtcbiAgcHJpdmF0ZSBfaW5pdFdhdGNoUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX3JlYnVpbGRXYXRjaFByb21pc2U/OiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIG9idGFpbmVkXG4gIHByaXZhdGUgc2Vzc2lvbkluZm8/OiBJV2F0Y2hTZXNzaW9uSW5mbztcblxuICAvLyBpbnRlcm5hbFxuICBwcml2YXRlIF93YWl0RXhwZWN0ZWRUaW1lb3V0SWQ/OiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogSVZpcnR1YWxXZWJTb2NrZXRDbGllbnRDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICB0aGlzLndhdGNoSWQgPSBgd2F0Y2hpZF8keytuZXcgRGF0ZSgpfV8ke01hdGgucmFuZG9tKCl9YDtcbiAgICB0aGlzLmVudklkID0gb3B0aW9ucy5lbnZJZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25OYW1lID0gb3B0aW9ucy5jb2xsZWN0aW9uTmFtZTtcbiAgICB0aGlzLnF1ZXJ5ID0gb3B0aW9ucy5xdWVyeTtcbiAgICB0aGlzLmxpbWl0ID0gb3B0aW9ucy5saW1pdDtcbiAgICB0aGlzLm9yZGVyQnkgPSBvcHRpb25zLm9yZGVyQnk7XG4gICAgdGhpcy5zZW5kID0gb3B0aW9ucy5zZW5kO1xuICAgIHRoaXMubG9naW4gPSBvcHRpb25zLmxvZ2luO1xuICAgIHRoaXMuaXNXU0Nvbm5lY3RlZCA9IG9wdGlvbnMuaXNXU0Nvbm5lY3RlZDtcbiAgICB0aGlzLm9uY2VXU0Nvbm5lY3RlZCA9IG9wdGlvbnMub25jZVdTQ29ubmVjdGVkO1xuICAgIHRoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCA9IG9wdGlvbnMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aDtcbiAgICB0aGlzLm9uV2F0Y2hTdGFydCA9IG9wdGlvbnMub25XYXRjaFN0YXJ0O1xuICAgIHRoaXMub25XYXRjaENsb3NlID0gb3B0aW9ucy5vbldhdGNoQ2xvc2U7XG4gICAgdGhpcy5kZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzID0ge1xuICAgICAgSU5JVF9XQVRDSDogREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUixcbiAgICAgIFJFQlVJTERfV0FUQ0g6IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1IsXG4gICAgICBDSEVDS19MQVNUOiBERUZBVUxUX01BWF9TRU5EX0FDS19BVVRPX1JFVFJZX09OX0VSUk9SLFxuICAgIH07XG5cbiAgICB0aGlzLmxpc3RlbmVyID0gbmV3IFJlYWx0aW1lTGlzdGVuZXIoe1xuICAgICAgY2xvc2U6IHRoaXMuY2xvc2VXYXRjaCxcbiAgICAgIG9uQ2hhbmdlOiBvcHRpb25zLm9uQ2hhbmdlLFxuICAgICAgb25FcnJvcjogb3B0aW9ucy5vbkVycm9yLFxuICAgICAgZGVidWc6IHRoaXMuZGVidWcsXG4gICAgICB2aXJ0dWFsQ2xpZW50OiB0aGlzLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbml0V2F0Y2goKTtcbiAgfVxuXG4gIG9uTWVzc2FnZShtc2c6IElSZXNwb25zZU1lc3NhZ2UpIHtcbiAgICAvLyB3YXRjaFN0YXR1cyBzYW5pdHkgY2hlY2tcbiAgICBzd2l0Y2ggKHRoaXMud2F0Y2hTdGF0dXMpIHtcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLlBBVVNFRDoge1xuICAgICAgICAvLyBpZ25vcmUgYWxsIGJ1dCBlcnJvciBtZXNzYWdlXG4gICAgICAgIGlmIChtc2cubXNnVHlwZSAhPT0gJ0VSUk9SJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLkxPR0dJTkdJTjpcbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLklOSVRJTkc6XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5SRUJVSUxESU5HOiB7XG4gICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGlsZSAke3RoaXMud2F0Y2hTdGF0dXN9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgV0FUQ0hfU1RBVFVTLkNMT1NFRDoge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiB1bmV4cGVjdGVkIG1lc3NhZ2UgcmVjZWl2ZWQgd2hlbiB0aGUgd2F0Y2ggaGFzIGNsb3NlZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFdBVENIX1NUQVRVUy5FUlJPUkVEOiB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHVuZXhwZWN0ZWQgbWVzc2FnZSByZWNlaXZlZCB3aGVuIHRoZSB3YXRjaCBoYXMgZW5kZWQgd2l0aCBlcnJvcicpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBzZXNzaW9uSW5mbyBub3QgZm91bmQgd2hpbGUgbWVzc2FnZSBpcyByZWNlaXZlZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpO1xuXG4gICAgc3dpdGNoIChtc2cubXNnVHlwZSkge1xuICAgICAgY2FzZSAnTkVYVF9FVkVOVCc6IHtcbiAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKHd4Ll9pZ25vcmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBuZXh0ZXZlbnQgJHttc2cubXNnRGF0YS5jdXJyRXZlbnR9IGlnbm9yZWRgLCBtc2cpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIHd4Ll9pZ25vcmUgPSBmYWxzZVxuICAgICAgICAvLyByZXR1cm5cbiAgICAgICAgLy8gfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobXNnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdDSEVDS19FVkVOVCc6IHtcbiAgICAgICAgaWYgKHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPCBtc2cubXNnRGF0YS5jdXJyRXZlbnQpIHtcbiAgICAgICAgICAvLyBjbGllbnQgZXZlbnRJRCA8IHNlcnZlciBldmVudElEOlxuICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIG9uZSBvciBtb3JlIHBlbmRpbmcgZXZlbnRzIG5vdCB5ZXQgcmVjZWl2ZWQgYnV0IHNlbnQgYnkgdGhlIHNlcnZlclxuICAgICAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZCA9IG1zZy5tc2dEYXRhLmN1cnJFdmVudDtcbiAgICAgICAgICB0aGlzLmNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKTtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgdGhpcy5fd2FpdEV4cGVjdGVkVGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAvLyBtdXN0IHJlYnVpbGQgd2F0Y2hcbiAgICAgICAgICAgIHRoaXMucmVidWlsZFdhdGNoKCk7XG4gICAgICAgICAgfSwgdGhpcy5nZXRXYWl0RXhwZWN0ZWRUaW1lb3V0TGVuZ3RoKCkpO1xuXG4gICAgICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gd2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCAke3RoaXMuZ2V0V2FpdEV4cGVjdGVkVGltZW91dExlbmd0aCgpfWApO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ0VSUk9SJzoge1xuICAgICAgICAvLyByZWNlaXZlIHNlcnZlciBlcnJvclxuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfU0VSVkVSX0VSUk9SX01TRyBhcyBzdHJpbmcsXG4gICAgICAgICAgZXJyTXNnOiBgJHttc2cubXNnRGF0YS5jb2RlfSAtICR7bXNnLm1zZ0RhdGEubWVzc2FnZX1gLFxuICAgICAgICB9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHZpcnR1YWwgY2xpZW50IHJlY2VpdmUgdW5leHBlY3RlZCBtc2cgJHttc2cubXNnVHlwZX06IGAsXG4gICAgICAgICAgbXNnXG4gICAgICAgICk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2VXaXRoRXJyb3IoZXJyb3I6IGFueSkge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuRVJST1JFRDtcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKTtcbiAgICB0aGlzLmxpc3RlbmVyLm9uRXJyb3IoZXJyb3IpO1xuICAgIC8vIFJlcG9ydGVyLnN1cnJvdW5kVGhpcmRCeVRyeUNhdGNoKCgpID0+IHRoaXMubGlzdGVuZXIub25FcnJvcihlcnJvcikpXG4gICAgdGhpcy5vbldhdGNoQ2xvc2UoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zZXNzaW9uSW5mbz8ucXVlcnlJRCB8fCAnJ1xuICAgICk7XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgY2xvc2VkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICh3YXRjaElkICR7dGhpcy53YXRjaElkfSlgKTtcbiAgICAvLyB9XG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLlBBVVNFRDtcbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgcGF1c2VkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICh3YXRjaElkICR7dGhpcy53YXRjaElkfSlgKTtcbiAgICAvLyB9XG4gIH1cblxuICAvLyByZXN1bWUoKSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnJlYnVpbGRXYXRjaCgpIDogdGhpcy5pbml0V2F0Y2goKVxuICAvLyB9XG5cbiAgYXN5bmMgcmVzdW1lKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUkVTVU1JTkc7XG5cbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICBjb25zb2xlLmxvZyhgW3JlYWx0aW1lXSBjbGllbnQgcmVzdW1pbmcgd2l0aCAke1xuICAgICAgdGhpcy5zZXNzaW9uSW5mbyA/ICdSRUJVSUxEX1dBVENIJyA6ICdJTklUX1dBVENIJ1xuICAgIH0gKCR7dGhpcy5jb2xsZWN0aW9uTmFtZX0gJHt0aGlzLnF1ZXJ5fSkgKCR7dGhpcy53YXRjaElkfSlgKTtcbiAgICAvLyB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgKHRoaXMuc2Vzc2lvbkluZm8gPyB0aGlzLnJlYnVpbGRXYXRjaCgpIDogdGhpcy5pbml0V2F0Y2goKSk7XG5cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gY2xpZW50IHN1Y2Nlc3NmdWxseSByZXN1bWVkICgke3RoaXMuY29sbGVjdGlvbk5hbWV9ICR7dGhpcy5xdWVyeX0pICgke3RoaXMud2F0Y2hJZH0pYCk7XG4gICAgICAvLyB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgW3JlYWx0aW1lXSBjbGllbnQgcmVzdW1lIGZhaWxlZCAoJHt0aGlzLmNvbGxlY3Rpb25OYW1lfSAke3RoaXMucXVlcnl9KSAoJHt0aGlzLndhdGNoSWR9KWAsXG4gICAgICAgIGVcbiAgICAgICk7XG4gICAgICAvLyB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfbG9naW4gPSBhc3luYyAoXG4gICAgZW52SWQ/OiBzdHJpbmcsXG4gICAgcmVmcmVzaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxJTG9naW5SZXN1bHQ+ID0+IHtcbiAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkxPR0dJTkdJTjtcbiAgICBjb25zdCBsb2dpblJlc3VsdCA9IGF3YWl0IHRoaXMubG9naW4oZW52SWQsIHJlZnJlc2gpO1xuICAgIGlmICghdGhpcy5lbnZJZCkge1xuICAgICAgdGhpcy5lbnZJZCA9IGxvZ2luUmVzdWx0LmVudklkO1xuICAgIH1cbiAgICByZXR1cm4gbG9naW5SZXN1bHQ7XG4gIH07XG5cbiAgcHJpdmF0ZSBpbml0V2F0Y2ggPSBhc3luYyAoZm9yY2VSZWZyZXNoTG9naW4/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHRoaXMuX2luaXRXYXRjaFByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0V2F0Y2hQcm9taXNlO1xuICAgIH1cblxuICAgIHRoaXMuX2luaXRXYXRjaFByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodGhpcy53YXRjaFN0YXR1cyA9PT0gV0FUQ0hfU1RBVFVTLlBBVVNFRCkge1xuICAgICAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdbcmVhbHRpbWVdIGluaXRXYXRjaCBjYW5jZWxsZWQgb24gcGF1c2UnKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgZW52SWQgfSA9IGF3YWl0IHRoaXMuX2xvZ2luKHRoaXMuZW52SWQsIGZvcmNlUmVmcmVzaExvZ2luKTtcblxuICAgICAgICAvLyBpZiAoIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoYGNhbiBub3QgcmVidWlsZFdhdGNoIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbylgKVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdBVENIX1NUQVRVUykgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSBpbml0V2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJyk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuSU5JVElORztcblxuICAgICAgICBjb25zdCBpbml0V2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZUluaXRXYXRjaE1zZyA9IHtcbiAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICBtc2dUeXBlOiAnSU5JVF9XQVRDSCcsXG4gICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgZW52SWQsXG4gICAgICAgICAgICBjb2xsTmFtZTogdGhpcy5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgICAgICBvcmRlckJ5OiB0aGlzLm9yZGVyQnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpbml0RXZlbnRNc2cgPSBhd2FpdCB0aGlzLnNlbmQ8SVJlc3BvbnNlTWVzc2FnZUluaXRFdmVudE1zZz4oe1xuICAgICAgICAgIG1zZzogaW5pdFdhdGNoTXNnLFxuICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiB0cnVlLFxuICAgICAgICAgIHRpbWVvdXQ6IERFRkFVTFRfSU5JVF9XQVRDSF9USU1FT1VULFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IGV2ZW50cywgY3VyckV2ZW50IH0gPSBpbml0RXZlbnRNc2cubXNnRGF0YTtcblxuICAgICAgICB0aGlzLnNlc3Npb25JbmZvID0ge1xuICAgICAgICAgIHF1ZXJ5SUQ6IGluaXRFdmVudE1zZy5tc2dEYXRhLnF1ZXJ5SUQsXG4gICAgICAgICAgY3VycmVudEV2ZW50SWQ6IGN1cnJFdmVudCAtIDEsXG4gICAgICAgICAgY3VycmVudERvY3M6IFtdLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIEZJWDogaW4gaW5pdEV2ZW50IG1lc3NhZ2UsIGFsbCBldmVudHMgaGF2ZSBpZCAwLCB3aGljaCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBjdXJyRXZlbnRcbiAgICAgICAgaWYgKGV2ZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgICAgICAgICAgZS5JRCA9IGN1cnJFdmVudDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMoaW5pdEV2ZW50TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID0gY3VyckV2ZW50O1xuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgIGlkOiBjdXJyRXZlbnQsXG4gICAgICAgICAgICBkb2NDaGFuZ2VzOiBbXSxcbiAgICAgICAgICAgIGRvY3M6IFtdLFxuICAgICAgICAgICAgdHlwZTogJ2luaXQnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMubGlzdGVuZXIub25DaGFuZ2Uoc25hcHNob3QpO1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbldhdGNoU3RhcnQodGhpcywgdGhpcy5zZXNzaW9uSW5mby5xdWVyeUlEKTtcbiAgICAgICAgdGhpcy53YXRjaFN0YXR1cyA9IFdBVENIX1NUQVRVUy5BQ1RJVkU7XG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuSU5JVF9XQVRDSCA9IERFRkFVTFRfTUFYX0FVVE9fUkVUUllfT05fRVJST1I7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvcihlLCB7XG4gICAgICAgICAgb3BlcmF0aW9uTmFtZTogJ0lOSVRfV0FUQ0gnLFxuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5faW5pdFdhdGNoUHJvbWlzZTtcbiAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pbml0V2F0Y2hQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgIGNvbnNvbGUubG9nKGBbcmVhbHRpbWVdIGluaXRXYXRjaCAke3N1Y2Nlc3MgPyAnc3VjY2VzcycgOiAnZmFpbCd9YCk7XG4gICAgLy8gfVxuICB9O1xuXG4gIHByaXZhdGUgcmVidWlsZFdhdGNoID0gYXN5bmMgKGZvcmNlUmVmcmVzaExvZ2luPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIGlmICh0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVidWlsZFdhdGNoUHJvbWlzZTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlID0gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJyk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBlbnZJZCB9ID0gYXdhaXQgdGhpcy5fbG9naW4odGhpcy5lbnZJZCwgZm9yY2VSZWZyZXNoTG9naW4pO1xuXG4gICAgICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2FuIG5vdCByZWJ1aWxkV2F0Y2ggd2l0aG91dCBhIHN1Y2Nlc3NmdWwgaW5pdFdhdGNoIChsYWNrIG9mIHNlc3Npb25JbmZvKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCh0aGlzLndhdGNoU3RhdHVzIGFzIFdBVENIX1NUQVRVUykgPT09IFdBVENIX1NUQVRVUy5QQVVTRUQpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnW3JlYWx0aW1lXSByZWJ1aWxkV2F0Y2ggY2FuY2VsbGVkIG9uIHBhdXNlJyk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuUkVCVUlMRElORztcblxuICAgICAgICBjb25zdCByZWJ1aWxkV2F0Y2hNc2c6IElSZXF1ZXN0TWVzc2FnZVJlYnVpbGRXYXRjaE1zZyA9IHtcbiAgICAgICAgICB3YXRjaElkOiB0aGlzLndhdGNoSWQsXG4gICAgICAgICAgcmVxdWVzdElkOiBnZW5SZXF1ZXN0SWQoKSxcbiAgICAgICAgICBtc2dUeXBlOiAnUkVCVUlMRF9XQVRDSCcsXG4gICAgICAgICAgbXNnRGF0YToge1xuICAgICAgICAgICAgZW52SWQsXG4gICAgICAgICAgICBjb2xsTmFtZTogdGhpcy5jb2xsZWN0aW9uTmFtZSxcbiAgICAgICAgICAgIHF1ZXJ5SUQ6IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCxcbiAgICAgICAgICAgIGV2ZW50SUQ6IHRoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBuZXh0RXZlbnRNc2cgPSBhd2FpdCB0aGlzLnNlbmQ8SVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZz4oe1xuICAgICAgICAgIG1zZzogcmVidWlsZFdhdGNoTXNnLFxuICAgICAgICAgIHdhaXRSZXNwb25zZTogdHJ1ZSxcbiAgICAgICAgICBza2lwT25NZXNzYWdlOiBmYWxzZSxcbiAgICAgICAgICB0aW1lb3V0OiBERUZBVUxUX1JFQlVJTERfV0FUQ0hfVElNRU9VVCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJFdmVudHMobmV4dEV2ZW50TXNnKTtcblxuICAgICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkFDVElWRTtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5SRUJVSUxEX1dBVENIID0gREVGQVVMVF9NQVhfQVVUT19SRVRSWV9PTl9FUlJPUjtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yKGUsIHtcbiAgICAgICAgICBvcGVyYXRpb25OYW1lOiAnUkVCVUlMRF9XQVRDSCcsXG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9yZWJ1aWxkV2F0Y2hQcm9taXNlO1xuICAgICAgc3VjY2VzcyA9IHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gaWYgKHByb2Nlc3MuZW52LkRFQlVHKSB7XG4gICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gcmVidWlsZFdhdGNoICR7c3VjY2VzcyA/ICdzdWNjZXNzJyA6ICdmYWlsJ31gKTtcbiAgICAvLyB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVXYXRjaEVzdGFibGlzaG1lbnRFcnJvciA9IGFzeW5jIChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZVdhdGNoRXN0YWJsaXNobWVudEVycm9yT3B0aW9uc1xuICApID0+IHtcbiAgICBjb25zdCBpc0luaXRXYXRjaCA9IG9wdGlvbnMub3BlcmF0aW9uTmFtZSA9PT0gJ0lOSVRfV0FUQ0gnO1xuXG4gICAgY29uc3QgYWJvcnRXYXRjaCA9ICgpID0+IHtcbiAgICAgIC8vIG1vY2sgdGVtcCBjb21tZW50XG4gICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgZXJyQ29kZTogaXNJbml0V2F0Y2hcbiAgICAgICAgICA/IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfSU5JVF9XQVRDSF9GQUlMIGFzIHN0cmluZylcbiAgICAgICAgICA6IChFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfUkVCVUlMRF9XQVRDSF9GQUlMIGFzIHN0cmluZyksXG4gICAgICAgIGVyck1zZzogZSxcbiAgICAgIH0pKTtcbiAgICAgIG9wdGlvbnMucmVqZWN0KGUpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXRyeSA9IChyZWZyZXNoTG9naW4/OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAodGhpcy51c2VSZXRyeVRpY2tldChvcHRpb25zLm9wZXJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGlmIChpc0luaXRXYXRjaCkge1xuICAgICAgICAgIHRoaXMuX2luaXRXYXRjaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgb3B0aW9ucy5yZXNvbHZlKHRoaXMuaW5pdFdhdGNoKHJlZnJlc2hMb2dpbikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3JlYnVpbGRXYXRjaFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgb3B0aW9ucy5yZXNvbHZlKHRoaXMucmVidWlsZFdhdGNoKHJlZnJlc2hMb2dpbikpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhYm9ydFdhdGNoKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaGFuZGxlQ29tbW9uRXJyb3IoZSwge1xuICAgICAgb25TaWduRXJyb3I6ICgpID0+IHJldHJ5KHRydWUpLFxuICAgICAgb25UaW1lb3V0RXJyb3I6ICgpID0+IHJldHJ5KGZhbHNlKSxcbiAgICAgIG9uTm90UmV0cnlhYmxlRXJyb3I6IGFib3J0V2F0Y2gsXG4gICAgICBvbkNhbmNlbGxlZEVycm9yOiBvcHRpb25zLnJlamVjdCxcbiAgICAgIG9uVW5rbm93bkVycm9yOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb25XU0Rpc2Nvbm5lY3RlZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25jZVdTQ29ubmVjdGVkKCk7XG4gICAgICAgICAgICByZXRyeSh0cnVlKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzV1NDb25uZWN0ZWQoKSkge1xuICAgICAgICAgICAgYXdhaXQgb25XU0Rpc2Nvbm5lY3RlZCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBzbGVlcChERUZBVUxUX1dBSVRfVElNRV9PTl9VTktOT1dOX0VSUk9SKTtcbiAgICAgICAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzID09PSBXQVRDSF9TVEFUVVMuUEFVU0VEKSB7XG4gICAgICAgICAgICAgIC8vIGNhbmNlbFxuICAgICAgICAgICAgICBvcHRpb25zLnJlamVjdChuZXcgQ2FuY2VsbGVkRXJyb3IoYCR7b3B0aW9ucy5vcGVyYXRpb25OYW1lfSBjYW5jZWxsZWQgZHVlIHRvIHBhdXNlIGFmdGVyIHVua25vd25FcnJvcmApKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaXNXU0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgICAgICAgIGF3YWl0IG9uV1NEaXNjb25uZWN0ZWQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHJ5KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIGVycm9yIHdoaWxlIGhhbmRsaW5nIGVycm9yLCBpbiBvcmRlciB0byBwcm92aWRlIG1heGltdW0gZWZmb3J0IG9uIFNFQU1JTkdMRVNTIEZBVUxUIFRPTEVSQU5DRSwganVzdCByZXRyeVxuICAgICAgICAgIHJldHJ5KHRydWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xuXG4gIHByaXZhdGUgY2xvc2VXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBxdWVyeUlkID0gdGhpcy5zZXNzaW9uSW5mbyA/IHRoaXMuc2Vzc2lvbkluZm8ucXVlcnlJRCA6ICcnO1xuXG4gICAgaWYgKHRoaXMud2F0Y2hTdGF0dXMgIT09IFdBVENIX1NUQVRVUy5BQ1RJVkUpIHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0VEO1xuICAgICAgdGhpcy5vbldhdGNoQ2xvc2UodGhpcywgcXVlcnlJZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMud2F0Y2hTdGF0dXMgPSBXQVRDSF9TVEFUVVMuQ0xPU0lORztcblxuICAgICAgY29uc3QgY2xvc2VXYXRjaE1zZzogSVJlcXVlc3RNZXNzYWdlQ2xvc2VXYXRjaE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0xPU0VfV0FUQ0gnLFxuICAgICAgICBtc2dEYXRhOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgdGhpcy5zZW5kKHtcbiAgICAgICAgbXNnOiBjbG9zZVdhdGNoTXNnLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLndhdGNoU3RhdHVzID0gV0FUQ0hfU1RBVFVTLkNMT1NFRDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX0NMT1NFX1dBVENIX0ZBSUwgYXMgc3RyaW5nLFxuICAgICAgICBlcnJNc2c6IGUsXG4gICAgICB9KSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25XYXRjaENsb3NlKHRoaXMsIHF1ZXJ5SWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNjaGVkdWxlU2VuZEFDSyA9ICgpID0+IHtcbiAgICB0aGlzLmNsZWFyQUNLU2NoZWR1bGUoKTtcblxuICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjaGVjayBzdGF0dXMgYWZ0ZXIgdGltZW91dFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLl9hY2tUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl93YWl0RXhwZWN0ZWRUaW1lb3V0SWQpIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVNlbmRBQ0soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VuZEFDSygpO1xuICAgICAgfVxuICAgIH0sIERFRkFVTFRfU0VORF9BQ0tfREVCT1VOQ0VfVElNRU9VVCk7XG4gIH07XG5cbiAgcHJpdmF0ZSBjbGVhckFDS1NjaGVkdWxlID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLl9hY2tUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9hY2tUaW1lb3V0SWQpO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIHNlbmRBQ0sgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLndhdGNoU3RhdHVzICE9PSBXQVRDSF9TVEFUVVMuQUNUSVZFKSB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNlc3Npb25JbmZvKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignW3JlYWx0aW1lIGxpc3RlbmVyXSBjYW4gbm90IHNlbmQgYWNrIHdpdGhvdXQgYSBzdWNjZXNzZnVsIGluaXRXYXRjaCAobGFjayBvZiBzZXNzaW9uSW5mbyknKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhY2tNc2c6IElSZXF1ZXN0TWVzc2FnZUNoZWNrTGFzdE1zZyA9IHtcbiAgICAgICAgd2F0Y2hJZDogdGhpcy53YXRjaElkLFxuICAgICAgICByZXF1ZXN0SWQ6IGdlblJlcXVlc3RJZCgpLFxuICAgICAgICBtc2dUeXBlOiAnQ0hFQ0tfTEFTVCcsXG4gICAgICAgIG1zZ0RhdGE6IHtcbiAgICAgICAgICBxdWVyeUlEOiB0aGlzLnNlc3Npb25JbmZvLnF1ZXJ5SUQsXG4gICAgICAgICAgZXZlbnRJRDogdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgIG1zZzogYWNrTXNnLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVE9ETzogcmVmYWN0b3JcbiAgICAgIGlmIChpc1JlYWx0aW1lRXJyb3JNZXNzYWdlRXJyb3IoZSkpIHtcbiAgICAgICAgY29uc3QgbXNnID0gZS5wYXlsb2FkO1xuICAgICAgICBzd2l0Y2ggKG1zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgICAvLyBzaWduYXR1cmUgZXJyb3IgLT4gcmV0cnkgd2l0aCByZWZyZXNoZWQgc2lnbmF0dXJlXG4gICAgICAgICAgY2FzZSAnQ0hFQ0tfTE9HSU5fRkFJTEVEJzpcbiAgICAgICAgICBjYXNlICdTSUdOX0VYUElSRURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NJR05fSU5WQUxJRF9FUlJPUic6XG4gICAgICAgICAgY2FzZSAnU0lHTl9QQVJBTV9JTlZBTElEJzoge1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkV2F0Y2goKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gb3RoZXIgLT4gdGhyb3dcbiAgICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICAgIGNhc2UgJ1NZU19FUlInOlxuICAgICAgICAgIGNhc2UgJ0lOVkFMSUlEX0VOVic6XG4gICAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICAgIC8vIG11c3QgdGhyb3dcbiAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IobmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0hFQ0tfTEFTVF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZXJyTXNnOiBtc2cubXNnRGF0YS5jb2RlLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gbWF5YmUgcmV0cnlhYmxlXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXMuQ0hFQ0tfTEFTVFxuICAgICAgICAmJiB0aGlzLl9hdmFpbGFibGVSZXRyaWVzLkNIRUNLX0xBU1QgPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5fYXZhaWxhYmxlUmV0cmllcy5DSEVDS19MQVNULS07XG4gICAgICAgIHRoaXMuc2NoZWR1bGVTZW5kQUNLKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKG5ldyBDbG91ZFNES0Vycm9yKHtcbiAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfQ0hFQ0tfTEFTVF9GQUlMIGFzIHN0cmluZyxcbiAgICAgICAgICBlcnJNc2c6IGUsXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb21tb25FcnJvciA9IChcbiAgICBlOiBhbnksXG4gICAgb3B0aW9uczogSUhhbmRsZUNvbW1vbkVycm9yT3B0aW9uc1xuICApOiB2b2lkID0+IHtcbiAgICBpZiAoaXNSZWFsdGltZUVycm9yTWVzc2FnZUVycm9yKGUpKSB7XG4gICAgICBjb25zdCBtc2cgPSBlLnBheWxvYWQ7XG4gICAgICBzd2l0Y2ggKG1zZy5tc2dEYXRhLmNvZGUpIHtcbiAgICAgICAgLy8gc2lnbmF0dXJlIGVycm9yIC0+IHJldHJ5IHdpdGggcmVmcmVzaGVkIHNpZ25hdHVyZVxuICAgICAgICBjYXNlICdDSEVDS19MT0dJTl9GQUlMRUQnOlxuICAgICAgICBjYXNlICdTSUdOX0VYUElSRURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTSUdOX1BBUkFNX0lOVkFMSUQnOiB7XG4gICAgICAgICAgb3B0aW9ucy5vblNpZ25FcnJvcihlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gbm90LXJldHJ5YWJsZSBlcnJvciAtPiB0aHJvd1xuICAgICAgICBjYXNlICdRVUVSWUlEX0lOVkFMSURfRVJST1InOlxuICAgICAgICBjYXNlICdTWVNfRVJSJzpcbiAgICAgICAgY2FzZSAnSU5WQUxJSURfRU5WJzpcbiAgICAgICAgY2FzZSAnQ09MTEVDVElPTl9QRVJNSVNTSU9OX0RFTklFRCc6IHtcbiAgICAgICAgICBvcHRpb25zLm9uTm90UmV0cnlhYmxlRXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBvcHRpb25zLm9uTm90UmV0cnlhYmxlRXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1RpbWVvdXRFcnJvcihlKSkge1xuICAgICAgLy8gdGltZW91dCBlcnJvclxuICAgICAgb3B0aW9ucy5vblRpbWVvdXRFcnJvcihlKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGlzQ2FuY2VsbGVkRXJyb3IoZSkpIHtcbiAgICAgIC8vIGNhbmNlbGxlZCBlcnJvclxuICAgICAgb3B0aW9ucy5vbkNhbmNlbGxlZEVycm9yKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHVua25vd24gZXJyb3JcbiAgICBvcHRpb25zLm9uVW5rbm93bkVycm9yKGUpO1xuICB9O1xuXG4gIC8vIGNyZWRpdCBhIHJldHJ5IGNoYW5jZSBmcm9tIGF2YWlsYWJsZVJldHJpZXNcbiAgcHJpdmF0ZSB1c2VSZXRyeVRpY2tldChvcGVyYXRpb25OYW1lOiBJUmVxdWVzdE1zZ1R5cGUpOiBib29sZWFuIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdXG4gICAgICAmJiB0aGlzLl9hdmFpbGFibGVSZXRyaWVzW29wZXJhdGlvbk5hbWVdISA+IDBcbiAgICApIHtcbiAgICAgIHRoaXMuX2F2YWlsYWJsZVJldHJpZXNbb3BlcmF0aW9uTmFtZV0hLS07XG5cbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgY29uc29sZS5sb2coYFtyZWFsdGltZV0gJHtvcGVyYXRpb25OYW1lfSB1c2UgYSByZXRyeSB0aWNrZXQsIG5vdyBvbmx5ICR7dGhpcy5fYXZhaWxhYmxlUmV0cmllc1tvcGVyYXRpb25OYW1lXX0gcmV0cnkgbGVmdGApO1xuICAgICAgLy8gfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTZXJ2ZXJFdmVudHMobXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnNjaGVkdWxlU2VuZEFDSygpO1xuICAgICAgYXdhaXQgdGhpcy5faGFuZGxlU2VydmVyRXZlbnRzKG1zZyk7XG4gICAgICB0aGlzLl9wb3N0SGFuZGxlU2VydmVyRXZlbnRzVmFsaWRpdHlDaGVjayhtc2cpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIChwcm9jZXNzLmVudi5ERUJVRykge1xuICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAnW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGhhbmRsZSBzZXJ2ZXIgZXZlbnRzIGZhaWxlZCB3aXRoIGVycm9yOiAnLFxuICAgICAgICBlXG4gICAgICApO1xuXG4gICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IGhhbmRsZSBzZXJ2ZXIgZXZlbnRzIGZhaWxlZCB3aXRoIGVycm9yOiAgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKHt9LCBlLCB7XG4gICAgICAvLyAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAvLyAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgLy8gICAgIH0pXG4gICAgICAvLyAgICl9IFxcbmBcbiAgICAgIC8vIClcbiAgICAgIC8vIH1cblxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9oYW5kbGVTZXJ2ZXJFdmVudHMobXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZykge1xuICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtc2c7XG5cbiAgICBjb25zdCB7IGV2ZW50cyB9ID0gbXNnLm1zZ0RhdGE7XG4gICAgY29uc3QgeyBtc2dUeXBlIH0gPSBtc2c7XG5cbiAgICBpZiAoIWV2ZW50cy5sZW5ndGggfHwgIXRoaXMuc2Vzc2lvbkluZm8pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlc3Npb25JbmZvIH0gPSB0aGlzO1xuXG4gICAgbGV0IGFsbENoYW5nZUV2ZW50czogSVNpbmdsZURCRXZlbnRbXTtcbiAgICB0cnkge1xuICAgICAgYWxsQ2hhbmdlRXZlbnRzID0gZXZlbnRzLm1hcChnZXRQdWJsaWNFdmVudCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5jbG9zZVdpdGhFcnJvcihuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9SRUNFSVZFX0lOVkFMSURfU0VSVkVSX0RBVEEgYXMgc3RyaW5nLFxuICAgICAgICBlcnJNc2c6IGUsXG4gICAgICB9KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYWdncmVnYXRlIGRvY3NcbiAgICBsZXQgZG9jcyA9IFsuLi5zZXNzaW9uSW5mby5jdXJyZW50RG9jc107XG4gICAgbGV0IGluaXRFbmNvdW50ZXJlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBhbGxDaGFuZ2VFdmVudHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNoYW5nZSA9IGFsbENoYW5nZUV2ZW50c1tpXTtcblxuICAgICAgaWYgKHNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkID49IGNoYW5nZS5pZCkge1xuICAgICAgICBpZiAoIWFsbENoYW5nZUV2ZW50c1tpIC0gMV0gfHwgY2hhbmdlLmlkID4gYWxsQ2hhbmdlRXZlbnRzW2kgLSAxXS5pZCkge1xuICAgICAgICAgIC8vIGR1cGxpY2F0ZSBldmVudCwgZHJvcGFibGVcbiAgICAgICAgICAvLyBUT0RPOiByZXBvcnRcbiAgICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtyZWFsdGltZV0gZHVwbGljYXRlIGV2ZW50IHJlY2VpdmVkLCBjdXIgJHtzZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZH0gYnV0IGdvdCAke2NoYW5nZS5pZH1gKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gYWxsQ2hhbmdlRXZlbnRzIHNob3VsZCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIGV2ZW50SWQsIHRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbnMsIG11c3QgcmVwb3J0IGEgbm9uLWZhdGFsIGVycm9yXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3JlYWx0aW1lIGxpc3RlbmVyXSBzZXJ2ZXIgbm9uLWZhdGFsIGVycm9yOiBldmVudHMgb3V0IG9mIG9yZGVyICh0aGUgbGF0dGVyIGV2ZW50J3MgaWQgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGZvcm1lcikgKHJlcXVlc3RJZCAke3JlcXVlc3RJZH0pYCk7XG5cbiAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIHNlcnZlciBub24tZmF0YWwgZXJyb3I6IGV2ZW50cyBvdXQgb2Ygb3JkZXIgKHRoZSBsYXR0ZXIgZXZlbnQncyBpZCBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgZm9ybWVyKSAgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAvLyAgICAgT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAvLyAgICAgICB7fSxcbiAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgLy8gICAgICAgICByZXF1ZXN0SWQ6IG1zZy5yZXF1ZXN0SWQsXG4gICAgICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAvLyAgICAgKVxuICAgICAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgICAgIC8vIClcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWQgPT09IGNoYW5nZS5pZCAtIDEpIHtcbiAgICAgICAgLy8gY29ycmVjdCBzZXF1ZW5jZVxuICAgICAgICAvLyBmaXJzdCBoYW5kbGUgZGF0YVR5cGUgdGhlbiBxdWV1ZVR5cGU6XG4gICAgICAgIC8vIDEuIGRhdGFUeXBlOiB3ZSBPTkxZIHBvcHVsYXRlIGNoYW5nZS5kb2MgaWYgbmVjY2Vzc2FyeVxuICAgICAgICAvLyAyLiBxdWV1ZVR5cGU6IHdlIGJ1aWxkIHRoZSBkYXRhIHNuYXBzaG90XG5cbiAgICAgICAgc3dpdGNoIChjaGFuZ2UuZGF0YVR5cGUpIHtcbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICAvLyBvbmx5IG5lZWQgdG8gcG9wdWxhdGUgY2hhbmdlLmRvYyB3aGVuIGl0IGlzIG5vdCBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKCFjaGFuZ2UuZG9jKSB7XG4gICAgICAgICAgICAgIHN3aXRjaCAoY2hhbmdlLnF1ZXVlVHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3VwZGF0ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZGVxdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsRG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGEgcGFydGlhbCB1cGRhdGVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gY2xvbmVEZWVwKGxvY2FsRG9jKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnVwZGF0ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBpbiBjaGFuZ2UudXBkYXRlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0KGRvYywgZmllbGRQYXRoLCBjaGFuZ2UudXBkYXRlZEZpZWxkc1tmaWVsZFBhdGhdKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbmdlLnJlbW92ZWRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkUGF0aCBvZiBjaGFuZ2UucmVtb3ZlZEZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXQoZG9jLCBmaWVsZFBhdGgpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2M7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgdXBkYXRlIGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHVwZGF0ZSBkYXRhVHlwZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgICAgICAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgICAgICAgICAgICAgICAvLyApXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2FzZSAnZW5xdWV1ZSc6IHtcbiAgICAgICAgICAgICAgICAgIC8vIGRvYyBpcyBwcm92aWRlZCBieSBzZXJ2ZXIsIHRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGVyckNvZGU6IEVSUl9DT0RFLlNES19EQVRBQkFTRV9SRUFMVElNRV9MSVNURU5FUl9VTkVYUEVDVEVEX0ZBVEFMX0VSUk9SIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgZXJyTXNnOiBgSGFuZGxlU2VydmVyRXZlbnRzOiBmdWxsIGRvYyBpcyBub3QgcHJvdmlkZWQgd2l0aCBkYXRhVHlwZT1cInVwZGF0ZVwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVwbGFjZSc6IHtcbiAgICAgICAgICAgIC8vIHZhbGlkYXRpb25cbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgQ2xvdWRTREtFcnJvcih7XG4gICAgICAgICAgICAgICAgZXJyQ29kZTogRVJSX0NPREUuU0RLX0RBVEFCQVNFX1JFQUxUSU1FX0xJU1RFTkVSX1VORVhQRUNURURfRkFUQUxfRVJST1IgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJyZXBsYWNlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB0aGlzLmNsb3NlV2l0aEVycm9yKGVycik7XG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdyZW1vdmUnOiB7XG4gICAgICAgICAgICBjb25zdCBkb2MgPSBkb2NzLmZpbmQoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZCk7XG4gICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgIGNoYW5nZS5kb2MgPSBkb2M7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBUT0RPIHJlcG9ydFxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgcmVtb3ZlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpO1xuXG4gICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHJlbW92ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdsaW1pdCc6IHtcbiAgICAgICAgICAgIGlmICghY2hhbmdlLmRvYykge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkZXF1ZXVlJzoge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZG9jID0gZG9jcy5maW5kKGRvYyA9PiBkb2MuX2lkID09PSBjaGFuZ2UuZG9jSWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2UuZG9jID0gZG9jO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIGxpbWl0IGRhdGFUeXBlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2VucXVldWUnOiB7XG4gICAgICAgICAgICAgICAgICAvLyBkb2MgaXMgcHJvdmlkZWQgYnkgc2VydmVyLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1clxuICAgICAgICAgICAgICAgICAgY29uc3QgZXJyID0gbmV3IENsb3VkU0RLRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBlcnJDb2RlOiBFUlJfQ09ERS5TREtfREFUQUJBU0VfUkVBTFRJTUVfTElTVEVORVJfVU5FWFBFQ1RFRF9GQVRBTF9FUlJPUiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIGVyck1zZzogYEhhbmRsZVNlcnZlckV2ZW50czogZnVsbCBkb2MgaXMgbm90IHByb3ZpZGVkIHdpdGggZGF0YVR5cGU9XCJsaW1pdFwiIGFuZCBxdWV1ZVR5cGU9XCJlbnF1ZXVlXCIgKHJlcXVlc3RJZCAke21zZy5yZXF1ZXN0SWR9KWAsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VXaXRoRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGNoYW5nZS5xdWV1ZVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdpbml0Jzoge1xuICAgICAgICAgICAgaWYgKCFpbml0RW5jb3VudGVyZWQpIHtcbiAgICAgICAgICAgICAgaW5pdEVuY291bnRlcmVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZG9jcyA9IFtjaGFuZ2UuZG9jXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRvY3MucHVzaChjaGFuZ2UuZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlbnF1ZXVlJzoge1xuICAgICAgICAgICAgZG9jcy5wdXNoKGNoYW5nZS5kb2MpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2RlcXVldWUnOiB7XG4gICAgICAgICAgICBjb25zdCBpbmQgPSBkb2NzLmZpbmRJbmRleChkb2MgPT4gZG9jLl9pZCA9PT0gY2hhbmdlLmRvY0lkKTtcbiAgICAgICAgICAgIGlmIChpbmQgPiAtMSkge1xuICAgICAgICAgICAgICBkb2NzLnNwbGljZShpbmQsIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVE9ETyByZXBvcnRcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIGRlcXVldWUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuJyk7XG5cbiAgICAgICAgICAgICAgLy8gd3JpdGVUb0ZpbGUoXG4gICAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgICAvLyAgIGBbcmVhbHRpbWUgbGlzdGVuZXJdIGludGVybmFsIG5vbi1mYXRhbCBzZXJ2ZXIgZXJyb3I6IHVuZXhwZWN0ZWQgZGVxdWV1ZSBldmVudCB3aGVyZSBubyBkb2MgaXMgYXNzb2NpYXRlZC4gJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgIC8vICAgICAgIHt9LFxuICAgICAgICAgICAgICAvLyAgICAgICB7XG4gICAgICAgICAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgICAgICAgICAvLyAgICAgICAgIHdhdGNoSWQ6IG1zZy53YXRjaElkXG4gICAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgLy8gICApfSBcXG5gXG4gICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1cGRhdGUnOiB7XG4gICAgICAgICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgICAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBkb2NzICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgZG9jc1xuICAgICAgICAgICAgLy8gICApfSBjaGFuZ2UgZG9jICR7SlNPTi5zdHJpbmdpZnkoY2hhbmdlKX0gXFxuYFxuICAgICAgICAgICAgLy8gKVxuICAgICAgICAgICAgY29uc3QgaW5kID0gZG9jcy5maW5kSW5kZXgoZG9jID0+IGRvYy5faWQgPT09IGNoYW5nZS5kb2NJZCk7XG4gICAgICAgICAgICBpZiAoaW5kID4gLTEpIHtcbiAgICAgICAgICAgICAgZG9jc1tpbmRdID0gY2hhbmdlLmRvYztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE8gcmVwb3J0XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIHNlcnZlciBlcnJvcjogdW5leHBlY3RlZCBxdWV1ZVR5cGUgdXBkYXRlIGV2ZW50IHdoZXJlIG5vIGRvYyBpcyBhc3NvY2lhdGVkLicpO1xuXG4gICAgICAgICAgICAgIC8vIHdyaXRlVG9GaWxlKFxuICAgICAgICAgICAgICAvLyAgIFwid3NlcnJvci50eHRcIixcbiAgICAgICAgICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgc2VydmVyIGVycm9yOiB1bmV4cGVjdGVkIHF1ZXVlVHlwZSB1cGRhdGUgZXZlbnQgd2hlcmUgbm8gZG9jIGlzIGFzc29jaWF0ZWQuICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIC8vICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAvLyAgICAgICB7fSxcbiAgICAgICAgICAgICAgLy8gICAgICAge1xuICAgICAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3RJZDogbXNnLnJlcXVlc3RJZCxcbiAgICAgICAgICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAgIC8vICAgICApXG4gICAgICAgICAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgICAgICAgICAvLyApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaSA9PT0gbGVuIC0gMVxuICAgICAgICAgIHx8IChhbGxDaGFuZ2VFdmVudHNbaSArIDFdICYmIGFsbENoYW5nZUV2ZW50c1tpICsgMV0uaWQgIT09IGNoYW5nZS5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gYSBzaGFsbG93IHNsaWNlIGNyZWF0ZXMgYSBzaGFsbG93IHNuYXBzaG90XG4gICAgICAgICAgY29uc3QgZG9jc1NuYXBzaG90ID0gWy4uLmRvY3NdO1xuXG4gICAgICAgICAgLy8gd2Ugc2xpY2UgZmlyc3QgY2F1c2UnIGlmIHRoZXJlJ3JlIGFsbENoYW5nZUV2ZW50cyB0aGF0IGFyZSBvZiB0aGUgc2FtZSBpZCBhZnRlciB0aGlzIGNoYW5nZSwgd2UgZG9uJ3Qgd2FudCB0byBpbnZvbHZlIGl0IGZvciBpdCBpcyB1bmV4cGVjdGVkIGludmFsaWQgb3JkZXJcbiAgICAgICAgICBjb25zdCBkb2NDaGFuZ2VzID0gYWxsQ2hhbmdlRXZlbnRzXG4gICAgICAgICAgICAuc2xpY2UoMCwgaSArIDEpXG4gICAgICAgICAgICAuZmlsdGVyKGMgPT4gYy5pZCA9PT0gY2hhbmdlLmlkKTtcblxuICAgICAgICAgIC8vIGFsbCBjaGFuZ2VzIG9mIHRoaXMgZXZlbnQgaGFzIGJlZW4gaGFuZGxlLCB3ZSBjb3VsZCBkaXNwYXRjaCB0aGUgZXZlbnQgbm93XG4gICAgICAgICAgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA9IGNoYW5nZS5pZDtcbiAgICAgICAgICB0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnREb2NzID0gZG9jcztcblxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID0gbmV3IFNuYXBzaG90KHtcbiAgICAgICAgICAgIGlkOiBjaGFuZ2UuaWQsXG4gICAgICAgICAgICBkb2NDaGFuZ2VzLFxuICAgICAgICAgICAgZG9jczogZG9jc1NuYXBzaG90LFxuICAgICAgICAgICAgbXNnVHlwZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFJlcG9ydGVyLnN1cnJvdW5kVGhpcmRCeVRyeUNhdGNoKCgpID0+XG4gICAgICAgICAgdGhpcy5saXN0ZW5lci5vbkNoYW5nZShzbmFwc2hvdCk7XG4gICAgICAgICAgLy8gKSgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG91dC1vZi1vcmRlciBldmVudFxuICAgICAgICAvLyBpZiAocHJvY2Vzcy5lbnYuREVCVUcpIHtcbiAgICAgICAgLy8gVE9ETzogcmVwb3J0XG4gICAgICAgIGNvbnNvbGUud2FybihgW3JlYWx0aW1lIGxpc3RlbmVyXSBldmVudCByZWNlaXZlZCBpcyBvdXQgb2Ygb3JkZXIsIGN1ciAke3RoaXMuc2Vzc2lvbkluZm8uY3VycmVudEV2ZW50SWR9IGJ1dCBnb3QgJHtjaGFuZ2UuaWR9YCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gcmVidWlsZCB3YXRjaFxuICAgICAgICBhd2FpdCB0aGlzLnJlYnVpbGRXYXRjaCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcG9zdEhhbmRsZVNlcnZlckV2ZW50c1ZhbGlkaXR5Q2hlY2sobXNnOiBJUmVzcG9uc2VNZXNzYWdlSW5pdEV2ZW50TXNnIHwgSVJlc3BvbnNlTWVzc2FnZU5leHRFdmVudE1zZykge1xuICAgIGlmICghdGhpcy5zZXNzaW9uSW5mbykge1xuICAgICAgY29uc29sZS5lcnJvcignW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1cicpO1xuXG4gICAgICAvLyB3cml0ZVRvRmlsZShcbiAgICAgIC8vICAgXCJ3c2Vycm9yLnR4dFwiLFxuICAgICAgLy8gICBgW3JlYWx0aW1lIGxpc3RlbmVyXSBpbnRlcm5hbCBub24tZmF0YWwgZXJyb3I6IHNlc3Npb25JbmZvIGxvc3QgYWZ0ZXIgc2VydmVyIGV2ZW50IGhhbmRsaW5nLCB0aGlzIHNob3VsZCBuZXZlciBvY2N1ciAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgLy8gICAgIE9iamVjdC5hc3NpZ24oXG4gICAgICAvLyAgICAgICB7fSxcbiAgICAgIC8vICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgcmVxdWVzdElkOiBtc2cucmVxdWVzdElkLFxuICAgICAgLy8gICAgICAgICB3YXRjaElkOiBtc2cud2F0Y2hJZFxuICAgICAgLy8gICAgICAgfVxuICAgICAgLy8gICAgIClcbiAgICAgIC8vICAgKX0gXFxuYFxuICAgICAgLy8gKVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2Vzc2lvbkluZm8uZXhwZWN0RXZlbnRJZFxuICAgICAgJiYgdGhpcy5zZXNzaW9uSW5mby5jdXJyZW50RXZlbnRJZCA+PSB0aGlzLnNlc3Npb25JbmZvLmV4cGVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHRoaXMuY2xlYXJXYWl0RXhwZWN0ZWRFdmVudCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNlc3Npb25JbmZvLmN1cnJlbnRFdmVudElkIDwgbXNnLm1zZ0RhdGEuY3VyckV2ZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWFsdGltZSBsaXN0ZW5lcl0gaW50ZXJuYWwgbm9uLWZhdGFsIGVycm9yOiBjbGllbnQgZXZlbnRJZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNlcnZlciBldmVudCBpZCBhZnRlciBzZXJ2ZXIgZXZlbnQgaGFuZGxpbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFyV2FpdEV4cGVjdGVkRXZlbnQoKSB7XG4gICAgaWYgKHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3dhaXRFeHBlY3RlZFRpbWVvdXRJZCk7XG4gICAgICB0aGlzLl93YWl0RXhwZWN0ZWRUaW1lb3V0SWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFB1YmxpY0V2ZW50KGV2ZW50OiBJREJFdmVudCk6IElTaW5nbGVEQkV2ZW50IHtcbiAgY29uc3QgZTogSVNpbmdsZURCRXZlbnQgPSB7XG4gICAgaWQ6IGV2ZW50LklELFxuICAgIGRhdGFUeXBlOiBldmVudC5EYXRhVHlwZSxcbiAgICBxdWV1ZVR5cGU6IGV2ZW50LlF1ZXVlVHlwZSxcbiAgICBkb2NJZDogZXZlbnQuRG9jSUQsXG4gICAgZG9jOiBldmVudC5Eb2MgJiYgZXZlbnQuRG9jICE9PSAne30nID8gSlNPTi5wYXJzZShldmVudC5Eb2MpIDogdW5kZWZpbmVkLFxuICB9O1xuXG4gIGlmIChldmVudC5EYXRhVHlwZSA9PT0gJ3VwZGF0ZScpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGV2ZW50LlVwZGF0ZWRGaWVsZHMpIHtcbiAgICAgIGUudXBkYXRlZEZpZWxkcyA9IEpTT04ucGFyc2UoZXZlbnQuVXBkYXRlZEZpZWxkcyk7XG4gICAgfVxuICAgIC8vIFRPRE86IHdhaXQgZm9yIHRjYiB0byBjaGFuZ2UgcmVtb3ZlZEZpZWxkcyB0byBSZW1vdmVkRmllbGRzXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChldmVudC5yZW1vdmVkRmllbGRzIHx8IGV2ZW50LlJlbW92ZWRGaWVsZHMpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIC8vIGUucmVtb3ZlZEZpZWxkcyA9IGV2ZW50LnJlbW92ZWRGaWVsZHNcbiAgICAgIC8vICAgPyBKU09OLnBhcnNlKGV2ZW50LnJlbW92ZWRGaWVsZHMpXG4gICAgICAvLyAgIDogSlNPTi5wYXJzZShldmVudC5SZW1vdmVkRmllbGRzKVxuICAgICAgZS5yZW1vdmVkRmllbGRzID0gSlNPTi5wYXJzZShldmVudC5yZW1vdmVkRmllbGRzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZTtcbn1cbiJdfQ==
|