@microsoft/ocsdk 0.3.3-main.8a81a1c → 0.3.4-main.097f56a

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/lib/SDK.js CHANGED
@@ -29,6 +29,8 @@ var _BrowserInfo = require("./Utils/BrowserInfo");
29
29
 
30
30
  var _Constants = _interopRequireDefault(require("./Common/Constants"));
31
31
 
32
+ var _endpointsCreators = require("./Utils/endpointsCreators");
33
+
32
34
  var _DeviceInfo = require("./Utils/DeviceInfo");
33
35
 
34
36
  var _Locales = _interopRequireDefault(require("./Common/Locales"));
@@ -53,6 +55,10 @@ var hash = _interopRequireWildcard(require("crypto"));
53
55
 
54
56
  var _CustomContextData = require("./Utils/CustomContextData");
55
57
 
58
+ var _throwClientHTTPError = _interopRequireDefault(require("./Utils/throwClientHTTPError"));
59
+
60
+ var _SessionInitRetryHandler = _interopRequireDefault(require("./Utils/SessionInitRetryHandler"));
61
+
56
62
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
57
63
 
58
64
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof3(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -190,7 +196,7 @@ var SDK = /*#__PURE__*/function () {
190
196
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
191
197
  data = response.data;
192
198
 
193
- if (data.LiveChatVersion && data.LiveChatVersion === _Enums.LiveChatVersion.V2) {
199
+ if (data.LiveChatVersion) {
194
200
  this.liveChatVersion = data.LiveChatVersion;
195
201
  }
196
202
 
@@ -302,7 +308,7 @@ var SDK = /*#__PURE__*/function () {
302
308
  _this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
303
309
 
304
310
  resolve(data);
305
- _context2.next = 15;
311
+ _context2.next = 16;
306
312
  break;
307
313
 
308
314
  case 10:
@@ -312,9 +318,13 @@ var SDK = /*#__PURE__*/function () {
312
318
 
313
319
  _this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds, requestPath, method, _context2.t0);
314
320
 
321
+ if (_context2.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
322
+ (0, _throwClientHTTPError["default"])();
323
+ }
324
+
315
325
  reject();
316
326
 
317
- case 15:
327
+ case 16:
318
328
  case "end":
319
329
  return _context2.stop();
320
330
  }
@@ -361,6 +371,7 @@ var SDK = /*#__PURE__*/function () {
361
371
  authenticatedUserToken,
362
372
  currentLiveChatVersion,
363
373
  headers,
374
+ endpoint,
364
375
  requestPath,
365
376
  queryParams,
366
377
  url,
@@ -392,22 +403,14 @@ var SDK = /*#__PURE__*/function () {
392
403
  }
393
404
 
394
405
  headers = _Constants["default"].defaultHeaders;
395
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
406
+ endpoint = (0, _endpointsCreators.createGetChatTokenEndpoint)(currentLiveChatVersion || this.liveChatVersion, authenticatedUserToken ? true : false);
396
407
 
397
- if (this.liveChatVersion === _Enums.LiveChatVersion.V2 || currentLiveChatVersion && currentLiveChatVersion === _Enums.LiveChatVersion.V2) {
398
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2GetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
399
-
400
- if (authenticatedUserToken) {
401
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatv2AuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
402
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
403
- }
404
- } else {
405
- if (authenticatedUserToken) {
406
- requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatAuthGetChatTokenPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
407
- headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
408
- }
408
+ if (authenticatedUserToken) {
409
+ headers[_OmnichannelHTTPHeaders["default"].authenticatedUserToken] = authenticatedUserToken;
409
410
  }
410
411
 
412
+ requestPath = "/".concat(endpoint, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
413
+
411
414
  if (reconnectId) {
412
415
  requestPath += "/".concat(reconnectId);
413
416
  }
@@ -429,23 +432,24 @@ var SDK = /*#__PURE__*/function () {
429
432
  });
430
433
  return _context5.abrupt("return", new Promise( /*#__PURE__*/function () {
431
434
  var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(resolve, reject) {
432
- var response, elapsedTimeInMilliseconds, data, _response, _elapsedTimeInMilliseconds2;
435
+ var getChatTokenError, response, elapsedTimeInMilliseconds, data, _response, _elapsedTimeInMilliseconds2;
433
436
 
434
437
  return _regenerator["default"].wrap(function _callee4$(_context4) {
435
438
  while (1) {
436
439
  switch (_context4.prev = _context4.next) {
437
440
  case 0:
438
- _context4.prev = 0;
439
- _context4.next = 3;
441
+ getChatTokenError = undefined;
442
+ _context4.prev = 1;
443
+ _context4.next = 4;
440
444
  return axiosInstance(options);
441
445
 
442
- case 3:
446
+ case 4:
443
447
  response = _context4.sent;
444
448
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
445
449
  data = response.data; // Resolves only if it contains chat token response which only happens on status 200
446
450
 
447
451
  if (!data) {
448
- _context4.next = 11;
452
+ _context4.next = 12;
449
453
  break;
450
454
  }
451
455
 
@@ -456,29 +460,30 @@ var SDK = /*#__PURE__*/function () {
456
460
  resolve(data);
457
461
  return _context4.abrupt("return");
458
462
 
459
- case 11:
463
+ case 12:
460
464
  if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
461
- _context4.next = 14;
465
+ _context4.next = 15;
462
466
  break;
463
467
  }
464
468
 
465
469
  reject(response);
466
470
  return _context4.abrupt("return");
467
471
 
468
- case 14:
469
- _context4.next = 23;
472
+ case 15:
473
+ _context4.next = 25;
470
474
  break;
471
475
 
472
- case 16:
473
- _context4.prev = 16;
474
- _context4.t0 = _context4["catch"](0);
476
+ case 17:
477
+ _context4.prev = 17;
478
+ _context4.t0 = _context4["catch"](1);
475
479
  _elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
476
480
 
477
- _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context4.t0); // Stop retry on 429
481
+ _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context4.t0);
478
482
 
483
+ getChatTokenError = _context4.t0; // Stop retry on 429
479
484
 
480
485
  if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this2.configuration.getChatTokenRetryOn429)) {
481
- _context4.next = 23;
486
+ _context4.next = 25;
482
487
  break;
483
488
  }
484
489
 
@@ -486,16 +491,21 @@ var SDK = /*#__PURE__*/function () {
486
491
  reject(_context4.t0);
487
492
  return _context4.abrupt("return");
488
493
 
489
- case 23:
494
+ case 25:
490
495
  if (!(currentRetryCount + 1 >= _this2.configuration.getChatTokenRetryCount)) {
491
- _context4.next = 26;
496
+ _context4.next = 28;
492
497
  break;
493
498
  }
494
499
 
495
- reject(new Error("The retry for getchattoken has exceeded its max value of ".concat(_this2.configuration.getChatTokenRetryCount)));
500
+ if (getChatTokenError && getChatTokenError.code == _Constants["default"].axiosTimeoutErrorCode) {
501
+ (0, _throwClientHTTPError["default"])();
502
+ } else {
503
+ reject(new Error("The retry for getchattoken has exceeded its max value of ".concat(_this2.configuration.getChatTokenRetryCount)));
504
+ }
505
+
496
506
  return _context4.abrupt("return");
497
507
 
498
- case 26:
508
+ case 28:
499
509
  // Retries until it reaches its limit
500
510
  setTimeout(function () {
501
511
  _this2.getChatToken(requestId, getChatTokenOptionalParams, currentRetryCount + 1).then(function (response) {
@@ -505,12 +515,12 @@ var SDK = /*#__PURE__*/function () {
505
515
  });
506
516
  }, _this2.configuration.getChatTokenTimeBetweenRetriesOnFailure);
507
517
 
508
- case 27:
518
+ case 29:
509
519
  case "end":
510
520
  return _context4.stop();
511
521
  }
512
522
  }
513
- }, _callee4, null, [[0, 16]]);
523
+ }, _callee4, null, [[1, 17]]);
514
524
  }));
515
525
 
516
526
  return function (_x6, _x7) {
@@ -518,7 +528,7 @@ var SDK = /*#__PURE__*/function () {
518
528
  };
519
529
  }()));
520
530
 
521
- case 20:
531
+ case 21:
522
532
  case "end":
523
533
  return _context5.stop();
524
534
  }
@@ -604,10 +614,14 @@ var SDK = /*#__PURE__*/function () {
604
614
 
605
615
  _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context6.t0);
606
616
 
617
+ if (_context6.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
618
+ (0, _throwClientHTTPError["default"])();
619
+ }
620
+
607
621
  reject(_context6.t0);
608
622
  return _context6.abrupt("return");
609
623
 
610
- case 20:
624
+ case 21:
611
625
  case "end":
612
626
  return _context6.stop();
613
627
  }
@@ -705,10 +719,14 @@ var SDK = /*#__PURE__*/function () {
705
719
 
706
720
  _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context8.t0);
707
721
 
722
+ if (_context8.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
723
+ (0, _throwClientHTTPError["default"])();
724
+ }
725
+
708
726
  reject(_context8.t0);
709
727
  return _context8.abrupt("return");
710
728
 
711
- case 21:
729
+ case 22:
712
730
  case "end":
713
731
  return _context8.stop();
714
732
  }
@@ -863,7 +881,7 @@ var SDK = /*#__PURE__*/function () {
863
881
  resolve(_data);
864
882
  }
865
883
 
866
- _context10.next = 14;
884
+ _context10.next = 15;
867
885
  break;
868
886
 
869
887
  case 9:
@@ -873,9 +891,13 @@ var SDK = /*#__PURE__*/function () {
873
891
 
874
892
  _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context10.t0);
875
893
 
894
+ if (_context10.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
895
+ (0, _throwClientHTTPError["default"])();
896
+ }
897
+
876
898
  reject(_context10.t0);
877
899
 
878
- case 14:
900
+ case 15:
879
901
  case "end":
880
902
  return _context10.stop();
881
903
  }
@@ -942,7 +964,8 @@ var SDK = /*#__PURE__*/function () {
942
964
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, "Session Init Started", requestId);
943
965
  axiosInstance = _axios["default"].create();
944
966
  (0, _axiosRetry["default"])(axiosInstance, {
945
- retries: this.configuration.maxRequestRetriesOnFailure
967
+ retries: this.configuration.maxRequestRetriesOnFailure,
968
+ shouldRetry: _SessionInitRetryHandler["default"]
946
969
  });
947
970
  reconnectId = sessionInitOptionalParams.reconnectId, authenticatedUserToken = sessionInitOptionalParams.authenticatedUserToken, initContext = sessionInitOptionalParams.initContext, getContext = sessionInitOptionalParams.getContext;
948
971
  headers = _Constants["default"].defaultHeaders;
@@ -1007,7 +1030,7 @@ var SDK = /*#__PURE__*/function () {
1007
1030
  response = _context12.sent;
1008
1031
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1009
1032
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
1010
- _context12.next = 35;
1033
+ _context12.next = 36;
1011
1034
  break;
1012
1035
 
1013
1036
  case 30:
@@ -1015,9 +1038,14 @@ var SDK = /*#__PURE__*/function () {
1015
1038
  _context12.t0 = _context12["catch"](22);
1016
1039
  _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1017
1040
  this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context12.t0, data);
1041
+
1042
+ if (_context12.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1043
+ (0, _throwClientHTTPError["default"])();
1044
+ }
1045
+
1018
1046
  throw _context12.t0;
1019
1047
 
1020
- case 35:
1048
+ case 36:
1021
1049
  case "end":
1022
1050
  return _context12.stop();
1023
1051
  }
@@ -1117,7 +1145,7 @@ var SDK = /*#__PURE__*/function () {
1117
1145
  _this6.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESUCCEEDED, "Session Close succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1118
1146
 
1119
1147
  resolve();
1120
- _context13.next = 14;
1148
+ _context13.next = 15;
1121
1149
  break;
1122
1150
 
1123
1151
  case 9:
@@ -1127,9 +1155,13 @@ var SDK = /*#__PURE__*/function () {
1127
1155
 
1128
1156
  _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context13.t0);
1129
1157
 
1158
+ if (_context13.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1159
+ (0, _throwClientHTTPError["default"])();
1160
+ }
1161
+
1130
1162
  reject();
1131
1163
 
1132
- case 14:
1164
+ case 15:
1133
1165
  case "end":
1134
1166
  return _context13.stop();
1135
1167
  }
@@ -1217,7 +1249,7 @@ var SDK = /*#__PURE__*/function () {
1217
1249
  return _context15.abrupt("return", Promise.reject(new Error("Validate Auth Chat Record Failed. Record is not found or request is not authorized")));
1218
1250
 
1219
1251
  case 23:
1220
- _context15.next = 34;
1252
+ _context15.next = 35;
1221
1253
  break;
1222
1254
 
1223
1255
  case 25:
@@ -1226,17 +1258,21 @@ var SDK = /*#__PURE__*/function () {
1226
1258
  _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1227
1259
  this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context15.t0);
1228
1260
 
1261
+ if (_context15.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1262
+ (0, _throwClientHTTPError["default"])();
1263
+ }
1264
+
1229
1265
  if (!(_context15.t0.toString() === "Error: Request failed with status code 404")) {
1230
- _context15.next = 33;
1266
+ _context15.next = 34;
1231
1267
  break;
1232
1268
  }
1233
1269
 
1234
1270
  return _context15.abrupt("return", Promise.resolve({}));
1235
1271
 
1236
- case 33:
1272
+ case 34:
1237
1273
  return _context15.abrupt("return", Promise.reject());
1238
1274
 
1239
- case 34:
1275
+ case 35:
1240
1276
  case "end":
1241
1277
  return _context15.stop();
1242
1278
  }
@@ -1322,7 +1358,7 @@ var SDK = /*#__PURE__*/function () {
1322
1358
  _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1323
1359
 
1324
1360
  resolve();
1325
- _context16.next = 14;
1361
+ _context16.next = 15;
1326
1362
  break;
1327
1363
 
1328
1364
  case 9:
@@ -1332,9 +1368,13 @@ var SDK = /*#__PURE__*/function () {
1332
1368
 
1333
1369
  _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context16.t0);
1334
1370
 
1371
+ if (_context16.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1372
+ (0, _throwClientHTTPError["default"])();
1373
+ }
1374
+
1335
1375
  reject();
1336
1376
 
1337
- case 14:
1377
+ case 15:
1338
1378
  case "end":
1339
1379
  return _context16.stop();
1340
1380
  }
@@ -1446,7 +1486,7 @@ var SDK = /*#__PURE__*/function () {
1446
1486
  _this8.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1447
1487
 
1448
1488
  resolve(data);
1449
- _context18.next = 15;
1489
+ _context18.next = 16;
1450
1490
  break;
1451
1491
 
1452
1492
  case 10:
@@ -1456,9 +1496,13 @@ var SDK = /*#__PURE__*/function () {
1456
1496
 
1457
1497
  _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context18.t0);
1458
1498
 
1499
+ if (_context18.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1500
+ (0, _throwClientHTTPError["default"])();
1501
+ }
1502
+
1459
1503
  reject();
1460
1504
 
1461
- case 15:
1505
+ case 16:
1462
1506
  case "end":
1463
1507
  return _context18.stop();
1464
1508
  }
@@ -1567,7 +1611,7 @@ var SDK = /*#__PURE__*/function () {
1567
1611
  _this9.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1568
1612
 
1569
1613
  resolve(data);
1570
- _context20.next = 15;
1614
+ _context20.next = 16;
1571
1615
  break;
1572
1616
 
1573
1617
  case 10:
@@ -1577,9 +1621,13 @@ var SDK = /*#__PURE__*/function () {
1577
1621
 
1578
1622
  _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context20.t0);
1579
1623
 
1624
+ if (_context20.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1625
+ (0, _throwClientHTTPError["default"])();
1626
+ }
1627
+
1580
1628
  reject(_context20.t0);
1581
1629
 
1582
- case 15:
1630
+ case 16:
1583
1631
  case "end":
1584
1632
  return _context20.stop();
1585
1633
  }
@@ -1681,7 +1729,7 @@ var SDK = /*#__PURE__*/function () {
1681
1729
  _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1682
1730
 
1683
1731
  resolve();
1684
- _context22.next = 14;
1732
+ _context22.next = 15;
1685
1733
  break;
1686
1734
 
1687
1735
  case 9:
@@ -1691,9 +1739,13 @@ var SDK = /*#__PURE__*/function () {
1691
1739
 
1692
1740
  _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context22.t0);
1693
1741
 
1742
+ if (_context22.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1743
+ (0, _throwClientHTTPError["default"])();
1744
+ }
1745
+
1694
1746
  reject();
1695
1747
 
1696
- case 14:
1748
+ case 15:
1697
1749
  case "end":
1698
1750
  return _context22.stop();
1699
1751
  }
@@ -1780,7 +1832,7 @@ var SDK = /*#__PURE__*/function () {
1780
1832
  _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1781
1833
 
1782
1834
  resolve(data);
1783
- _context24.next = 15;
1835
+ _context24.next = 16;
1784
1836
  break;
1785
1837
 
1786
1838
  case 10:
@@ -1790,9 +1842,13 @@ var SDK = /*#__PURE__*/function () {
1790
1842
 
1791
1843
  _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context24.t0);
1792
1844
 
1845
+ if (_context24.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1846
+ (0, _throwClientHTTPError["default"])();
1847
+ }
1848
+
1793
1849
  reject();
1794
1850
 
1795
- case 15:
1851
+ case 16:
1796
1852
  case "end":
1797
1853
  return _context24.stop();
1798
1854
  }
@@ -1885,7 +1941,7 @@ var SDK = /*#__PURE__*/function () {
1885
1941
  response = _context26.sent;
1886
1942
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1887
1943
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1888
- _context26.next = 27;
1944
+ _context26.next = 28;
1889
1945
  break;
1890
1946
 
1891
1947
  case 22:
@@ -1893,9 +1949,14 @@ var SDK = /*#__PURE__*/function () {
1893
1949
  _context26.t0 = _context26["catch"](14);
1894
1950
  _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
1895
1951
  this.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context26.t0);
1952
+
1953
+ if (_context26.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1954
+ (0, _throwClientHTTPError["default"])();
1955
+ }
1956
+
1896
1957
  throw _context26.t0;
1897
1958
 
1898
- case 27:
1959
+ case 28:
1899
1960
  case "end":
1900
1961
  return _context26.stop();
1901
1962
  }
@@ -1991,7 +2052,7 @@ var SDK = /*#__PURE__*/function () {
1991
2052
  _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1992
2053
 
1993
2054
  resolve();
1994
- _context27.next = 14;
2055
+ _context27.next = 15;
1995
2056
  break;
1996
2057
 
1997
2058
  case 9:
@@ -2001,9 +2062,13 @@ var SDK = /*#__PURE__*/function () {
2001
2062
 
2002
2063
  _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context27.t0);
2003
2064
 
2065
+ if (_context27.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
2066
+ (0, _throwClientHTTPError["default"])();
2067
+ }
2068
+
2004
2069
  reject(_context27.t0);
2005
2070
 
2006
- case 14:
2071
+ case 15:
2007
2072
  case "end":
2008
2073
  return _context27.stop();
2009
2074
  }
@@ -2032,13 +2097,13 @@ var SDK = /*#__PURE__*/function () {
2032
2097
  }()
2033
2098
  /**
2034
2099
  * Helper function for logging.
2035
- *
2100
+ *
2036
2101
  * @param logLevel Log level for logging.
2037
2102
  * @param telemetryEventType Telemetry event type in which event will be logged.
2038
2103
  * @param description Description of the event.
2039
2104
  * @param requestId Request ID
2040
2105
  * @param response Response
2041
- * @param elapsedTimeInMilliseconds Elapsed time in ms
2106
+ * @param elapsedTimeInMilliseconds Elapsed time in ms
2042
2107
  * @param requestPath Request path
2043
2108
  * @param method Method
2044
2109
  * @param error Error
@@ -2050,7 +2115,7 @@ var SDK = /*#__PURE__*/function () {
2050
2115
  value: function logWithLogger(logLevel, telemetryEventType, description, requestId, response, elapsedTimeInMilliseconds, requestPath, method, error, requestPayload) {
2051
2116
  var _response2;
2052
2117
 
2053
- // eslint-disable-line @typescript-eslint/no-explicit-any
2118
+ // eslint-disable-line @typescript-eslint/no-explicit-any
2054
2119
  if (!this.logger) {
2055
2120
  return;
2056
2121
  }
@@ -2120,4 +2185,4 @@ exports["default"] = SDK;
2120
2185
  defaultRequestTimeout: undefined,
2121
2186
  requestTimeoutConfig: SDK.defaultRequestTimeoutConfig
2122
2187
  });
2123
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiaGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsImdldENoYXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIlYyIiwiR0VUQ0hBVENPTkZJR1NVQ0NFU1MiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4iLCJyZWNvbm5lY3RJZCIsImRlZmF1bHRIZWFkZXJzIiwiTGl2ZUNoYXRBdXRoTGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJPbW5pY2hhbm5lbEhUVFBIZWFkZXJzIiwib3B0aW9ucyIsImdldExXSURldGFpbHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkVSUk9SIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwidW5kZWZpbmVkIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VG9rZW5QYXRoIiwiTGl2ZUNoYXR2MkdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUb2tlblBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRoIiwicXVlcnlQYXJhbXMiLCJnZXRDaGF0VG9rZW4iLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsInNldFRpbWVvdXQiLCJ0aGVuIiwiZXJyb3IiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFMiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGgiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGgiLCJzZXNzaW9uSW5pdCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwiTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGgiLCJ3aWRnZXRBcHBJZCIsImdldFN1cnZleUludml0ZUxpbmsiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUdxQkEsRztBQStCbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFB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dUM7QUFRakV3RSxFQUFBQSxzQkFBc0IsRUFBRSxLQVJ5QztBQVNqRVksRUFBQUEsbUJBQW1CLEVBQUUsS0FUNEM7QUFVakVZLEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFUSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVLLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFUyxFQUFBQSxnQ0FBZ0MsRUFBRSxJQWIrQjtBQWNqRTlFLEVBQUFBLG9CQUFvQixFQUFFLElBZDJDO0FBZWpFb0YsRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEckssRywwQkFvQnNDO0FBQ3ZEMkYsRUFBQUEsc0JBQXNCLEVBQUUsRUFEK0I7QUFFdkRJLEVBQUFBLHVDQUF1QyxFQUFFLEtBRmM7QUFHdkRWLEVBQUFBLHNCQUFzQixFQUFFLEtBSCtCO0FBSXZEMUMsRUFBQUEsMEJBQTBCLEVBQUUsQ0FKMkI7QUFLdkRLLEVBQUFBLHFCQUFxQixFQUFFeUIsU0FMZ0M7QUFNdkR4QixFQUFBQSxvQkFBb0IsRUFBRWpELEdBQUcsQ0FBQzJQO0FBTjZCLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbm5lbElkLCBMaXZlQ2hhdFZlcnNpb24gfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU0RLIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES1wiO1xuaW1wb3J0IElTREtDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSVNES0NvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vTW9kZWwvTG9nTGV2ZWxcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9DU0RLVGVsZW1ldHJ5RXZlbnQgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBRdWV1ZUF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9RdWV1ZUF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdEF2YWlsYWJpbGl0eSBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIGZyb20gXCIuL01vZGVsL1JlY29ubmVjdE1hcHBpbmdSZWNvcmRcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IGF4aW9zUmV0cnkgZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeVwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VGltZW91dENvbmZpZyB9IGZyb20gXCIuL0NvbW1vbi9SZXF1ZXN0VGltZW91dENvbmZpZ1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnOiBSZXF1ZXN0VGltZW91dENvbmZpZyA9IHtcbiAgICBnZXRDaGF0Q29uZmlnOiAzMDAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiA1MDAwLFxuICAgIGdldENoYXRUb2tlbjogMTAwMDAsXG4gICAgc2Vzc2lvbkluaXQ6IDUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxMDAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDUwMDAsXG4gICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiA1MDAwLFxuICAgIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2U6IDEwMDAwLFxuICAgIGdldFN1cnZleUludml0ZUxpbms6IDEwMDAwLFxuICAgIGdldENoYXRUcmFuc2NyaXB0czogMzAwMDAsXG4gICAgZW1haWxUcmFuc2NyaXB0OiA1MDAwLFxuICAgIGZldGNoRGF0YU1hc2tpbmdJbmZvOiAxMDAwLFxuICAgIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0OiA1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiA1MDAwLFxuICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDUwMDBcbiAgfTtcblxuICBwcml2YXRlIHN0YXRpYyBkZWZhdWx0Q29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSB7XG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZ1xuICB9O1xuXG4gIGxpdmVDaGF0VmVyc2lvbjogbnVtYmVyO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUcsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGxldCBoZWFkZXJzID0ge307XG4gICAgaWYgKGJ5cGFzc0NhY2hlKSB7XG4gICAgICBoZWFkZXJzID0geyAuLi5Db25zdGFudHMuYnlwYXNzQ2FjaGVIZWFkZXJzLCAuLi5oZWFkZXJzIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZS5nZXQodXJsLCB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgIH0pO1xuICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uICYmIGRhdGEuTGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgfVxuICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgfVxuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIHJlcXVlc3RQYXRoICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRva2VuUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VG9rZW5QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBgY2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgcmVxdWVzdFBhdGggKz0gYD8ke3F1ZXJ5UGFyYW1zfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgcmV0cnlPbjQyOTogdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkgfSk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIGNoYXQgdG9rZW4gcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBkYXRhLnJlcXVlc3RJZCA9IHJlcXVlc3RJZDtcblxuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cblxuICAgICAgICAvLyBTdG9wIHJldHJ5IG9uIDQyOVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBUaGUgcmV0cnkgZm9yIGdldGNoYXR0b2tlbiBoYXMgZXhjZWVkZWQgaXRzIG1heCB2YWx1ZSBvZiAke3RoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50fWApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEpO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShwb3N0Q2hhdFJlc3BvbnNlKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgfTtcblxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIHJlcXVlc3RJZCB9ID0gZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3N1cnZleU93bmVySWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYXQgdHJhbnNjcmlwdHMgZm9yIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIGNoYXRJZCBDaGF0IHRocmVhZCBJZC5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdHJhbnNjcmlwdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRyYW5zY3JpcHRzKHJlcXVlc3RJZDogc3RyaW5nLCBjaGF0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIH0gPSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVELCBcIkVtYWlsIFRyYW5zY3JpcHQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggZGF0YSBtYXNraW5nIGluZm8gb2YgdGhlIG9yZy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24gKE9wdGlvbmFsKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBmZXRjaERhdGFNYXNraW5nSW5mbyhyZXF1ZXN0SWQ6IHN0cmluZyk6IFByb21pc2U8SURhdGFNYXNraW5nSW5mbz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1RBUlRFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMucmVxdWVzdElkXSA9IHJlcXVlc3RJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELCBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICByZWplY3QoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlcyBhIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50IG5ldHdvcmsgY2FsbCB0byBPbW5pY2hhbm5lbC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudFxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkgc2Vjb25kYXJ5Q2hhbm5lbCBldmVudCByZXF1ZXN0IGJvZHlcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHk6IG9iamVjdCwgc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM6IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZW5kIHR5cGluZyBpbmRpY2F0b3JcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2VuZFR5cGluZ0luZGljYXRvcihyZXF1ZXN0SWQ6IHN0cmluZywgY3VycmVudExpdmVDaGF0VmVyc2lvbjogbnVtYmVyLCBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM6IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIGF2b2lkaW5nIGxvZ2dpbmcgSW5mbyBmb3IgdHlwaW5naW5kaWNhdG9yIHRvIHJlZHVjZSBsb2cgdHJhZmZpY1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgY3VzdG9tZXJEaXNwbGF5TmFtZSB9ID0gc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zO1xuICAgIGlmICghY3VycmVudExpdmVDaGF0VmVyc2lvbiB8fCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICE9PSBMaXZlQ2hhdFZlcnNpb24uVjIpIHsgdGhyb3cgbmV3IEVycm9yKCdUeXBpbmcgaW5kaWNhdG9yIGlzIG9ubHkgc3VwcG9ydGVkIG9uIHYyJykgfVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRofS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaWYgKGN1c3RvbWVyRGlzcGxheU5hbWUpIHtcbiAgICAgIGhlYWRlcnNbQ29uc3RhbnRzLmN1c3RvbWVyRGlzcGxheU5hbWVdID0gY3VzdG9tZXJEaXNwbGF5TmFtZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZW5kVHlwaW5nSW5kaWNhdG9yXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SU1VDQ0VFREVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgKiBcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXMgXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG59XG4iXX0=
2188
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjEiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJRyIsInJlcXVlc3RQYXRoIiwiT21uaWNoYW5uZWxFbmRwb2ludHMiLCJMaXZlQ2hhdENvbmZpZ1BhdGgiLCJvcmdJZCIsIndpZGdldElkIiwibWV0aG9kIiwidXJsIiwib3JnVXJsIiwiYXhpb3NJbnN0YW5jZSIsImF4aW9zIiwiY3JlYXRlIiwicmV0cmllcyIsIm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIiwiaGVhZGVycyIsImJ5cGFzc0NhY2hlSGVhZGVycyIsImdldCIsInRpbWVvdXQiLCJkZWZhdWx0UmVxdWVzdFRpbWVvdXQiLCJyZXF1ZXN0VGltZW91dENvbmZpZyIsImdldENoYXRDb25maWciLCJyZXNwb25zZSIsImVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJtaWxsaVNlY29uZHNFbGFwc2VkIiwiZGF0YSIsIkdFVENIQVRDT05GSUdTVUNDRVNTIiwiZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zIiwiR0VUTFdJU1RBVFVTU1RBUlRFRCIsIkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGgiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9wdGlvbnMiLCJnZXRMV0lEZXRhaWxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJHRVRMV0lTVEFUVVNTVUNDRUVERUQiLCJFUlJPUiIsIkdFVExXSVNUQVRVU0ZBSUxFRCIsInVuZGVmaW5lZCIsImNvZGUiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyIsImN1cnJlbnRSZXRyeUNvdW50IiwiY3VycmVudExpdmVDaGF0VmVyc2lvbiIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsInF1ZXJ5UGFyYW1zIiwiZ2V0Q2hhdFRva2VuIiwicmV0cnlPbjQyOSIsImdldENoYXRUb2tlblJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5FcnJvciIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsInNldFRpbWVvdXQiLCJ0aGVuIiwiZXJyb3IiLCJnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmUiLCJyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMiLCJHRVRSRUNPTk5FQ1RBQkxFQ0hBVFMiLCJMaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGgiLCJnZXRSZWNvbm5lY3RhYmxlQ2hhdHMiLCJHRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFkiLCJMaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkiLCJXQVJOIiwicXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCIsIkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aCIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsIkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVEIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlGQUlMRUQiLCJzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTklOSVRTVEFSVEVEIiwic2hvdWxkUmV0cnkiLCJzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwic2Vzc2lvbkluaXQiLCJTRVNTSU9OSU5JVFNVQ0NFRURFRCIsIlNFU1NJT05JTklURkFJTEVEIiwic2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OQ0xPU0VTVEFSVEVEIiwiTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRoIiwiaXNSZWNvbm5lY3RDaGF0IiwiaXNQZXJzaXN0ZW50Q2hhdCIsImNoYXRJZCIsIkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGgiLCJzZXNzaW9uQ2xvc2UiLCJTRVNTSU9OQ0xPU0VTVUNDRUVERUQiLCJTRVNTSU9OQ0xPU0VGQUlMRUQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1RBUlRFRCIsIkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGgiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJnZXRTdXJ2ZXlJbnZpdGVMaW5rIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJWMiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiZW1haWxUcmFuc2NyaXB0IiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0IiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQStCbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBLFFBQTNGQyxhQUEyRix1RUFB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RUFBQUEsc0JBQXNCLEVBQUUsS0FIK0I7QUFJdkR4QyxFQUFBQSwwQkFBMEIsRUFBRSxDQUoyQjtBQUt2REssRUFBQUEscUJBQXFCLEVBQUV3QixTQUxnQztBQU12RHZCLEVBQUFBLG9CQUFvQixFQUFFakQsR0FBRyxDQUFDNlA7QUFONkIsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFubmVsSWQsIExpdmVDaGF0VmVyc2lvbiB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IGF4aW9zLCB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gXCJheGlvc1wiO1xuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT0NTREtUZWxlbWV0cnlFdmVudCB9IGZyb20gXCIuL0NvbW1vbi9FbnVtc1wiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9VdGlscy91dWlkXCI7XG5pbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IEN1c3RvbUNvbnRleHREYXRhIH0gZnJvbSBcIi4vVXRpbHMvQ3VzdG9tQ29udGV4dERhdGFcIjtcbmltcG9ydCB7IFJlcXVlc3RUaW1lb3V0Q29uZmlnIH0gZnJvbSBcIi4vQ29tbW9uL1JlcXVlc3RUaW1lb3V0Q29uZmlnXCI7XG5pbXBvcnQgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yIGZyb20gXCIuL1V0aWxzL3Rocm93Q2xpZW50SFRUUEVycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDEwMDAwLFxuICAgIHNlc3Npb25Jbml0OiA1MDAwLFxuICAgIHNlc3Npb25DbG9zZTogMTAwMDAsXG4gICAgZ2V0UmVjb25uZWN0YWJsZUNoYXRzOiA1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxMDAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxMDAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogMTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogNTAwMCxcbiAgICBnZXRBZ2VudEF2YWlsYWJpbGl0eTogNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiA1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGdldENoYXRUb2tlblJldHJ5Q291bnQ6IDEwLFxuICAgIGdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZTogMTAwMDAsXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOTogZmFsc2UsXG4gICAgbWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmU6IDMsXG4gICAgZGVmYXVsdFJlcXVlc3RUaW1lb3V0OiB1bmRlZmluZWQsXG4gICAgcmVxdWVzdFRpbWVvdXRDb25maWc6IFNESy5kZWZhdWx0UmVxdWVzdFRpbWVvdXRDb25maWdcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHLCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcbiAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgIH1cblxuICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICBkYXRhLmhlYWRlcnNbXCJkYXRlXCJdID0gcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl07XG4gICAgfVxuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRVNTLCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgcmVjb25uZWN0IGlkIG9uIHRoZSBlbmRwb2ludCBpZiB2YWlsYWJsZVxuICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgfVxuICAgIHJlcXVlc3RQYXRoICs9IGA/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExXSVNUQVRVU1NVQ0NFRURFRCwgXCJHZXQgTFdJIERldGFpbHMgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBjaGF0IHRva2VuIGZyb20gT21uaWNoYW5uZWwgdG8gam9pbiBUMSB0aHJlYWQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIGdldGNoYXR0b2tlbiAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRva2VuLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUb2tlbihyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXM6IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyA9IHt9LCBjdXJyZW50UmV0cnlDb3VudDogbnVtYmVyID0gMCk6IFByb21pc2U8RmV0Y2hDaGF0VG9rZW5SZXNwb25zZT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbmZlcnJhYmxlLXR5cGVzXG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRva2VuXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLCByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgZ2V0Q2hhdFRva2VuRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gY29udGVudCBmb3IgcmVjb25uZWN0IGNoYXQgY2FzZSBzaG91bGRuJ3QgYmUgcmV0cmllZC5cbiAgICAgICAgaWYgKHJlY29ubmVjdElkICYmIHJlc3BvbnNlLnN0YXR1cyA9PT0gQ29uc3RhbnRzLm5vQ29udGVudFN0YXR1c0NvZGUpIHtcbiAgICAgICAgICByZWplY3QocmVzcG9uc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTkZBSUxFRCwgXCJHZXQgQ2hhdCBUb2tlbiBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgZ2V0Q2hhdFRva2VuRXJyb3IgPSBlcnJvcjtcblxuICAgICAgICAvLyBTdG9wIHJldHJ5IG9uIDQyOVxuICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkucmVzcG9uc2U/LnN0YXR1cyA9PT0gQ29uc3RhbnRzLnRvb01hbnlSZXF1ZXN0c1N0YXR1c0NvZGUgJiYgIXRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcmV0dXJuL3JlamVjdCB0byByZWN1cnNpdmVseSByZXRyeSBvbiBmYWlsdXJlcyB1cCB0byBjaGF0IHRva2VuIHJldHJ5IGNvdW50IGxpbWl0XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2UgY2FzZVxuICAgICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50ICsgMSA+PSB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCkge1xuICAgICAgICBpZiAoZ2V0Q2hhdFRva2VuRXJyb3IgJiYgZ2V0Q2hhdFRva2VuRXJyb3IuY29kZSA9PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIHJldHJ5IGZvciBnZXRjaGF0dG9rZW4gaGFzIGV4Y2VlZGVkIGl0cyBtYXggdmFsdWUgb2YgJHt0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlDb3VudH1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIGNoYXQgU3RhcnRlZFwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdGFibGVDaGF0c1xuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCByZXF1ZXN0SWQgPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0QWdlbnRBdmFpbGFiaWxpdHkocmVxdWVzdElkOiBzdHJpbmcsIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IElHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPFF1ZXVlQXZhaWxhYmlsaXR5PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1RBUlRFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkdldEFnZW50QXZhaWxhYmlsaXR5UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD1sY3dgO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVjb25uZWN0SWQsIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGluaXRDb250ZXh0LCBnZXRDb250ZXh0IH0gPSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgfVxuXG4gICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IGBjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICByZXF1ZXN0UGF0aCArPSBgPyR7cXVlcnlQYXJhbXN9YDtcbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIC8vIFNldCBkZWZhdWx0IGxvY2FsZSBpZiBsb2NhbGUgaXMgZW1wdHlcbiAgICBpZiAoIWRhdGEubG9jYWxlKSB7XG4gICAgICBkYXRhLmxvY2FsZSA9IENvbnN0YW50cy5kZWZhdWx0TG9jYWxlO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGxvY2FsZVxuICAgIGlmIChkYXRhLmxvY2FsZSAmJiAhTG9jYWxlcy5zdXBwb3J0ZWRMb2NhbGVzLmluY2x1ZGVzKGRhdGEubG9jYWxlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgbG9jYWxlOiAnJHtkYXRhLmxvY2FsZX0nYCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uSW5pdFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBjbG9zZSAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gY2xvc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkNsb3NlKHJlcXVlc3RJZDogc3RyaW5nLCBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogSVNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1RBUlRFRCwgXCJTZXNzaW9uIENsb3NlIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaXNSZWNvbm5lY3RDaGF0LCBpc1BlcnNpc3RlbnRDaGF0LCBjaGF0SWQgfSA9IHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhLmNoYXRJZCA9IGNoYXRJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFU1VDQ0VFREVELCBcIlNlc3Npb24gQ2xvc2Ugc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgaWYgKHJlc3BvbnNlLmRhdGE/LmF1dGhDaGF0RXhpc3QgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5WQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFURkFJTEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy53aWRnZXRBcHBJZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aG9yaXphdGlvbl0gPSB0b2tlbjtcblxuICAgIGlmICh0aGlzLmxpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyIHx8IChjdXJyZW50TGl2ZUNoYXRWZXJzaW9uICYmIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMikpIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW1haWwgdHJhbnNjcmlwdCB0byBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGVtYWlsUmVxdWVzdEJvZHkgRW1haWwgcmVxdWVzdCBib2R5LlxuICAgKiBAcGFyYW0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZW1haWwgdHJhbnNjcmlwdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBlbWFpbFRyYW5zY3JpcHQocmVxdWVzdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGVtYWlsUmVxdWVzdEJvZHk6IG9iamVjdCwgZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM6IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNUQVJURUQsIFwiRW1haWwgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gbG9nTGV2ZWwgTG9nIGxldmVsIGZvciBsb2dnaW5nLlxuICAgKiBAcGFyYW0gdGVsZW1ldHJ5RXZlbnRUeXBlIFRlbGVtZXRyeSBldmVudCB0eXBlIGluIHdoaWNoIGV2ZW50IHdpbGwgYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3QgSURcbiAgICogQHBhcmFtIHJlc3BvbnNlIFJlc3BvbnNlXG4gICAqIEBwYXJhbSBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIEVsYXBzZWQgdGltZSBpbiBtc1xuICAgKiBAcGFyYW0gcmVxdWVzdFBhdGggUmVxdWVzdCBwYXRoXG4gICAqIEBwYXJhbSBtZXRob2QgTWV0aG9kXG4gICAqIEBwYXJhbSBlcnJvciBFcnJvclxuICAgKiBAcGFyYW0gZGF0YSBEYXRhXG4gICAqL1xuICBwcml2YXRlIGxvZ1dpdGhMb2dnZXIobG9nTGV2ZWw6IExvZ0xldmVsLCB0ZWxlbWV0cnlFdmVudFR5cGU6IE9DU0RLVGVsZW1ldHJ5RXZlbnQsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHJlcXVlc3RJZD86IHN0cmluZywgcmVzcG9uc2U/OiBBeGlvc1Jlc3BvbnNlPGFueT4sIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM/OiBudW1iZXIsIHJlcXVlc3RQYXRoPzogc3RyaW5nLCBtZXRob2Q/OiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgcmVxdWVzdFBheWxvYWQ/OiBhbnkpOiB2b2lkIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICAgIFxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cbn0iXX0=