@microsoft/ocsdk 0.4.5 → 0.4.6-main.18f297e

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
@@ -155,15 +155,73 @@ var SDK = /*#__PURE__*/function () {
155
155
  this.liveChatVersion = _Enums.LiveChatVersion.V2;
156
156
  }
157
157
  /**
158
- * Fetches chat config.
159
- * @param requestId: RequestId to use to get chat config (Optional).
158
+ * Fetches LCW FCS Details of the Org.
160
159
  */
161
160
 
162
161
 
163
162
  (0, _createClass2["default"])(SDK, [{
163
+ key: "getLcwFcsDetails",
164
+ value: function () {
165
+ var _getLcwFcsDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
166
+ var timer, requestPath, method, url, axiosInstance, _this$configuration$d, response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds;
167
+
168
+ return _regenerator["default"].wrap(function _callee$(_context) {
169
+ while (1) {
170
+ switch (_context.prev = _context.next) {
171
+ case 0:
172
+ timer = _Timer.Timer.TIMER();
173
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSTARTED, "Get LCW FCS details started", "");
174
+ requestPath = "/".concat(_OmnichannelEndpoints["default"].LcwFcsDetailsPath, "/").concat(this.omnichannelConfiguration.orgId);
175
+ method = "GET";
176
+ url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
177
+ axiosInstance = _axios["default"].create();
178
+ (0, _axiosRetry["default"])(axiosInstance, {
179
+ retries: this.configuration.maxRequestRetriesOnFailure,
180
+ waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatConfig
181
+ });
182
+ _context.prev = 7;
183
+ _context.next = 10;
184
+ return axiosInstance.get(url, {
185
+ timeout: (_this$configuration$d = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d !== void 0 ? _this$configuration$d : this.configuration.requestTimeoutConfig.getChatConfig
186
+ });
187
+
188
+ case 10:
189
+ response = _context.sent;
190
+ elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
191
+ data = response.data;
192
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSSUCCEEDED, "Get LCW FCS details succeeded", "", response, elapsedTimeInMilliseconds, requestPath, method);
193
+ return _context.abrupt("return", data);
194
+
195
+ case 17:
196
+ _context.prev = 17;
197
+ _context.t0 = _context["catch"](7);
198
+ _elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
199
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLCWFCSDETAILSFAILED, "Get LCW FCS details failed", "", undefined, _elapsedTimeInMilliseconds, requestPath, method, _context.t0);
200
+ throw _context.t0;
201
+
202
+ case 22:
203
+ case "end":
204
+ return _context.stop();
205
+ }
206
+ }
207
+ }, _callee, this, [[7, 17]]);
208
+ }));
209
+
210
+ function getLcwFcsDetails() {
211
+ return _getLcwFcsDetails.apply(this, arguments);
212
+ }
213
+
214
+ return getLcwFcsDetails;
215
+ }()
216
+ /**
217
+ * Fetches chat config.
218
+ * @param requestId: RequestId to use to get chat config (Optional).
219
+ */
220
+
221
+ }, {
164
222
  key: "getChatConfig",
165
223
  value: function () {
166
- var _getChatConfig = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(requestId) {
224
+ var _getChatConfig = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(requestId) {
167
225
  var bypassCache,
168
226
  timer,
169
227
  requestPath,
@@ -171,18 +229,18 @@ var SDK = /*#__PURE__*/function () {
171
229
  url,
172
230
  axiosInstance,
173
231
  headers,
174
- _this$configuration$d,
232
+ _this$configuration$d2,
175
233
  response,
176
234
  elapsedTimeInMilliseconds,
177
235
  data,
178
- _elapsedTimeInMilliseconds,
179
- _args = arguments;
236
+ _elapsedTimeInMilliseconds2,
237
+ _args2 = arguments;
180
238
 
181
- return _regenerator["default"].wrap(function _callee$(_context) {
239
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
182
240
  while (1) {
183
- switch (_context.prev = _context.next) {
241
+ switch (_context2.prev = _context2.next) {
184
242
  case 0:
185
- bypassCache = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
243
+ bypassCache = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : false;
186
244
  timer = _Timer.Timer.TIMER();
187
245
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFSTARTED, "Get Chat config started", requestId);
188
246
 
@@ -204,15 +262,15 @@ var SDK = /*#__PURE__*/function () {
204
262
  headers = _objectSpread(_objectSpread({}, _Constants["default"].bypassCacheHeaders), headers);
205
263
  }
206
264
 
207
- _context.prev = 11;
208
- _context.next = 14;
265
+ _context2.prev = 11;
266
+ _context2.next = 14;
209
267
  return axiosInstance.get(url, {
210
268
  headers: headers,
211
- timeout: (_this$configuration$d = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d !== void 0 ? _this$configuration$d : this.configuration.requestTimeoutConfig.getChatConfig
269
+ timeout: (_this$configuration$d2 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d2 !== void 0 ? _this$configuration$d2 : this.configuration.requestTimeoutConfig.getChatConfig
212
270
  });
213
271
 
214
272
  case 14:
215
- response = _context.sent;
273
+ response = _context2.sent;
216
274
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
217
275
  data = response.data;
218
276
 
@@ -226,22 +284,22 @@ var SDK = /*#__PURE__*/function () {
226
284
  data.headers["date"] = response.headers["date"];
227
285
  }
228
286
 
229
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
230
- return _context.abrupt("return", data);
287
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGSUCCEEDED, "Get Chat config succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
288
+ return _context2.abrupt("return", data);
231
289
 
232
290
  case 24:
233
- _context.prev = 24;
234
- _context.t0 = _context["catch"](11);
235
- _elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
236
- this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds, requestPath, method, _context.t0);
237
- return _context.abrupt("return", Promise.reject(_context.t0));
291
+ _context2.prev = 24;
292
+ _context2.t0 = _context2["catch"](11);
293
+ _elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
294
+ this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATCONFIGFAILED, "Get Chat config failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context2.t0);
295
+ return _context2.abrupt("return", Promise.reject(_context2.t0));
238
296
 
239
297
  case 29:
240
298
  case "end":
241
- return _context.stop();
299
+ return _context2.stop();
242
300
  }
243
301
  }
244
- }, _callee, this, [[11, 24]]);
302
+ }, _callee2, this, [[11, 24]]);
245
303
  }));
246
304
 
247
305
  function getChatConfig(_x) {
@@ -259,8 +317,8 @@ var SDK = /*#__PURE__*/function () {
259
317
  }, {
260
318
  key: "getLWIDetails",
261
319
  value: function () {
262
- var _getLWIDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(requestId) {
263
- var _this$configuration$d2,
320
+ var _getLWIDetails = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(requestId) {
321
+ var _this$configuration$d3,
264
322
  _this2 = this;
265
323
 
266
324
  var getLWIDetailsOptionalParams,
@@ -274,12 +332,12 @@ var SDK = /*#__PURE__*/function () {
274
332
  url,
275
333
  method,
276
334
  options,
277
- _args3 = arguments;
278
- return _regenerator["default"].wrap(function _callee3$(_context3) {
335
+ _args4 = arguments;
336
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
279
337
  while (1) {
280
- switch (_context3.prev = _context3.next) {
338
+ switch (_context4.prev = _context4.next) {
281
339
  case 0:
282
- getLWIDetailsOptionalParams = _args3.length > 1 && _args3[1] !== undefined ? _args3[1] : {};
340
+ getLWIDetailsOptionalParams = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : {};
283
341
  timer = _Timer.Timer.TIMER();
284
342
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSTARTED, "Get LWI Details Started", requestId);
285
343
 
@@ -331,22 +389,22 @@ var SDK = /*#__PURE__*/function () {
331
389
  method: method,
332
390
  url: url,
333
391
  params: params,
334
- timeout: (_this$configuration$d2 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d2 !== void 0 ? _this$configuration$d2 : this.configuration.requestTimeoutConfig.getLWIDetails
392
+ timeout: (_this$configuration$d3 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d3 !== void 0 ? _this$configuration$d3 : this.configuration.requestTimeoutConfig.getLWIDetails
335
393
  };
336
- return _context3.abrupt("return", new Promise( /*#__PURE__*/function () {
337
- var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(resolve, reject) {
338
- var response, elapsedTimeInMilliseconds, data, _headers, _elapsedTimeInMilliseconds2;
394
+ return _context4.abrupt("return", new Promise( /*#__PURE__*/function () {
395
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(resolve, reject) {
396
+ var response, elapsedTimeInMilliseconds, data, _headers, _elapsedTimeInMilliseconds3;
339
397
 
340
- return _regenerator["default"].wrap(function _callee2$(_context2) {
398
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
341
399
  while (1) {
342
- switch (_context2.prev = _context2.next) {
400
+ switch (_context3.prev = _context3.next) {
343
401
  case 0:
344
- _context2.prev = 0;
345
- _context2.next = 3;
402
+ _context3.prev = 0;
403
+ _context3.next = 3;
346
404
  return axiosInstance(options);
347
405
 
348
406
  case 3:
349
- response = _context2.sent;
407
+ response = _context3.sent;
350
408
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
351
409
  data = response.data, _headers = response.headers;
352
410
 
@@ -355,28 +413,28 @@ var SDK = /*#__PURE__*/function () {
355
413
  _this2.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETLWISTATUSSUCCEEDED, "Get LWI Details succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
356
414
 
357
415
  resolve(data);
358
- _context2.next = 17;
416
+ _context3.next = 17;
359
417
  break;
360
418
 
361
419
  case 11:
362
- _context2.prev = 11;
363
- _context2.t0 = _context2["catch"](0);
364
- _elapsedTimeInMilliseconds2 = timer.milliSecondsElapsed;
420
+ _context3.prev = 11;
421
+ _context3.t0 = _context3["catch"](0);
422
+ _elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
365
423
 
366
- _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds2, requestPath, method, _context2.t0);
424
+ _this2.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETLWISTATUSFAILED, "Get LWI Details failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context3.t0);
367
425
 
368
- if ((0, _isExpectedAxiosError["default"])(_context2.t0, _Constants["default"].axiosTimeoutErrorCode)) {
426
+ if ((0, _isExpectedAxiosError["default"])(_context3.t0, _Constants["default"].axiosTimeoutErrorCode)) {
369
427
  (0, _throwClientHTTPError["default"])();
370
428
  }
371
429
 
372
- reject(_context2.t0);
430
+ reject(_context3.t0);
373
431
 
374
432
  case 17:
375
433
  case "end":
376
- return _context2.stop();
434
+ return _context3.stop();
377
435
  }
378
436
  }
379
- }, _callee2, null, [[0, 11]]);
437
+ }, _callee3, null, [[0, 11]]);
380
438
  }));
381
439
 
382
440
  return function (_x3, _x4) {
@@ -386,10 +444,10 @@ var SDK = /*#__PURE__*/function () {
386
444
 
387
445
  case 18:
388
446
  case "end":
389
- return _context3.stop();
447
+ return _context4.stop();
390
448
  }
391
449
  }
392
- }, _callee3, this);
450
+ }, _callee4, this);
393
451
  }));
394
452
 
395
453
  function getLWIDetails(_x2) {
@@ -407,8 +465,8 @@ var SDK = /*#__PURE__*/function () {
407
465
  }, {
408
466
  key: "getChatToken",
409
467
  value: function () {
410
- var _getChatToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(requestId) {
411
- var _this$configuration$d3,
468
+ var _getChatToken = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(requestId) {
469
+ var _this$configuration$d4,
412
470
  _this3 = this;
413
471
 
414
472
  var getChatTokenOptionalParams,
@@ -426,20 +484,20 @@ var SDK = /*#__PURE__*/function () {
426
484
  method,
427
485
  options,
428
486
  axiosInstance,
429
- _args5 = arguments;
430
- return _regenerator["default"].wrap(function _callee5$(_context5) {
487
+ _args6 = arguments;
488
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
431
489
  while (1) {
432
- switch (_context5.prev = _context5.next) {
490
+ switch (_context6.prev = _context6.next) {
433
491
  case 0:
434
- getChatTokenOptionalParams = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : {};
435
- currentRetryCount = _args5.length > 2 && _args5[2] !== undefined ? _args5[2] : 0;
492
+ getChatTokenOptionalParams = _args6.length > 1 && _args6[1] !== undefined ? _args6[1] : {};
493
+ currentRetryCount = _args6.length > 2 && _args6[2] !== undefined ? _args6[2] : 0;
436
494
  // eslint-disable-line @typescript-eslint/no-inferrable-types
437
495
  timer = _Timer.Timer.TIMER();
438
496
  reconnectId = getChatTokenOptionalParams.reconnectId, authenticatedUserToken = getChatTokenOptionalParams.authenticatedUserToken, currentLiveChatVersion = getChatTokenOptionalParams.currentLiveChatVersion, refreshToken = getChatTokenOptionalParams.refreshToken;
439
497
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSTARTED, "Get Chat Token Started", requestId);
440
498
 
441
499
  if (!(currentRetryCount < 0)) {
442
- _context5.next = 7;
500
+ _context6.next = 7;
443
501
  break;
444
502
  }
445
503
 
@@ -487,7 +545,7 @@ var SDK = /*#__PURE__*/function () {
487
545
  method: method,
488
546
  url: url,
489
547
  params: params,
490
- timeout: (_this$configuration$d3 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d3 !== void 0 ? _this$configuration$d3 : this.configuration.requestTimeoutConfig.getChatToken
548
+ timeout: (_this$configuration$d4 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d4 !== void 0 ? _this$configuration$d4 : this.configuration.requestTimeoutConfig.getChatToken
491
549
  };
492
550
  axiosInstance = _axios["default"].create();
493
551
  (0, _axiosRetry["default"])(axiosInstance, {
@@ -496,22 +554,22 @@ var SDK = /*#__PURE__*/function () {
496
554
  retryOn429: this.configuration.getChatTokenRetryOn429,
497
555
  waitTimeInMsBetweenRetries: this.configuration.waitTimeBetweenRetriesConfig.getChatToken
498
556
  });
499
- return _context5.abrupt("return", new Promise( /*#__PURE__*/function () {
500
- var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(resolve, reject) {
501
- var getChatTokenError, response, elapsedTimeInMilliseconds, data, _headers2, _response, _elapsedTimeInMilliseconds3;
557
+ return _context6.abrupt("return", new Promise( /*#__PURE__*/function () {
558
+ var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(resolve, reject) {
559
+ var getChatTokenError, response, elapsedTimeInMilliseconds, data, _headers2, _response, _elapsedTimeInMilliseconds4;
502
560
 
503
- return _regenerator["default"].wrap(function _callee4$(_context4) {
561
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
504
562
  while (1) {
505
- switch (_context4.prev = _context4.next) {
563
+ switch (_context5.prev = _context5.next) {
506
564
  case 0:
507
565
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
508
566
  getChatTokenError = undefined;
509
- _context4.prev = 1;
510
- _context4.next = 4;
567
+ _context5.prev = 1;
568
+ _context5.next = 4;
511
569
  return axiosInstance(options);
512
570
 
513
571
  case 4:
514
- response = _context4.sent;
572
+ response = _context5.sent;
515
573
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
516
574
  data = response.data, _headers2 = response.headers;
517
575
 
@@ -525,7 +583,7 @@ var SDK = /*#__PURE__*/function () {
525
583
 
526
584
 
527
585
  if (!data) {
528
- _context4.next = 14;
586
+ _context5.next = 14;
529
587
  break;
530
588
  }
531
589
 
@@ -534,42 +592,42 @@ var SDK = /*#__PURE__*/function () {
534
592
  _this3.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTOKENSUCCEEDED, "Get Chat Token succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
535
593
 
536
594
  resolve(data);
537
- return _context4.abrupt("return");
595
+ return _context5.abrupt("return");
538
596
 
539
597
  case 14:
540
598
  if (!(reconnectId && response.status === _Constants["default"].noContentStatusCode)) {
541
- _context4.next = 17;
599
+ _context5.next = 17;
542
600
  break;
543
601
  }
544
602
 
545
603
  reject(response);
546
- return _context4.abrupt("return");
604
+ return _context5.abrupt("return");
547
605
 
548
606
  case 17:
549
- _context4.next = 27;
607
+ _context5.next = 27;
550
608
  break;
551
609
 
552
610
  case 19:
553
- _context4.prev = 19;
554
- _context4.t0 = _context4["catch"](1);
555
- _elapsedTimeInMilliseconds3 = timer.milliSecondsElapsed;
611
+ _context5.prev = 19;
612
+ _context5.t0 = _context5["catch"](1);
613
+ _elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
556
614
 
557
- _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds3, requestPath, method, _context4.t0);
615
+ _this3.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTOKENFAILED, "Get Chat Token failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context5.t0);
558
616
 
559
- getChatTokenError = _context4.t0; // Stop retry on 429
617
+ getChatTokenError = _context5.t0; // Stop retry on 429
560
618
 
561
- if (!(((_response = _context4.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this3.configuration.getChatTokenRetryOn429)) {
562
- _context4.next = 27;
619
+ if (!(((_response = _context5.t0.response) === null || _response === void 0 ? void 0 : _response.status) === _Constants["default"].tooManyRequestsStatusCode && !_this3.configuration.getChatTokenRetryOn429)) {
620
+ _context5.next = 27;
563
621
  break;
564
622
  }
565
623
 
566
624
  // eslint-disable-line @typescript-eslint/no-explicit-any
567
- reject(_context4.t0);
568
- return _context4.abrupt("return");
625
+ reject(_context5.t0);
626
+ return _context5.abrupt("return");
569
627
 
570
628
  case 27:
571
629
  if (!(currentRetryCount + 1 >= _this3.configuration.getChatTokenRetryCount)) {
572
- _context4.next = 30;
630
+ _context5.next = 30;
573
631
  break;
574
632
  }
575
633
 
@@ -579,7 +637,7 @@ var SDK = /*#__PURE__*/function () {
579
637
  reject(getChatTokenError);
580
638
  }
581
639
 
582
- return _context4.abrupt("return");
640
+ return _context5.abrupt("return");
583
641
 
584
642
  case 30:
585
643
  // Retries until it reaches its limit
@@ -593,10 +651,10 @@ var SDK = /*#__PURE__*/function () {
593
651
 
594
652
  case 31:
595
653
  case "end":
596
- return _context4.stop();
654
+ return _context5.stop();
597
655
  }
598
656
  }
599
- }, _callee4, null, [[1, 19]]);
657
+ }, _callee5, null, [[1, 19]]);
600
658
  }));
601
659
 
602
660
  return function (_x6, _x7) {
@@ -606,10 +664,10 @@ var SDK = /*#__PURE__*/function () {
606
664
 
607
665
  case 22:
608
666
  case "end":
609
- return _context5.stop();
667
+ return _context6.stop();
610
668
  }
611
669
  }
612
- }, _callee5, this);
670
+ }, _callee6, this);
613
671
  }));
614
672
 
615
673
  function getChatToken(_x5) {
@@ -626,14 +684,14 @@ var SDK = /*#__PURE__*/function () {
626
684
  }, {
627
685
  key: "getReconnectableChats",
628
686
  value: function () {
629
- var _getReconnectableChats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(reconnectableChatsParams) {
630
- var _this$configuration$d4,
687
+ var _getReconnectableChats = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(reconnectableChatsParams) {
688
+ var _this$configuration$d5,
631
689
  _this4 = this;
632
690
 
633
691
  var timer, authenticatedUserToken, requestPath, headers, url, method, options, axiosInstance, requestId;
634
- return _regenerator["default"].wrap(function _callee7$(_context7) {
692
+ return _regenerator["default"].wrap(function _callee8$(_context8) {
635
693
  while (1) {
636
- switch (_context7.prev = _context7.next) {
694
+ switch (_context8.prev = _context8.next) {
637
695
  case 0:
638
696
  timer = _Timer.Timer.TIMER();
639
697
  authenticatedUserToken = reconnectableChatsParams.authenticatedUserToken;
@@ -649,24 +707,24 @@ var SDK = /*#__PURE__*/function () {
649
707
  headers: headers,
650
708
  method: method,
651
709
  url: url,
652
- timeout: (_this$configuration$d4 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d4 !== void 0 ? _this$configuration$d4 : this.configuration.requestTimeoutConfig.getReconnectableChats
710
+ timeout: (_this$configuration$d5 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d5 !== void 0 ? _this$configuration$d5 : this.configuration.requestTimeoutConfig.getReconnectableChats
653
711
  };
654
712
  axiosInstance = _axios["default"].create();
655
713
  requestId = this.omnichannelConfiguration.orgId;
656
- return _context7.abrupt("return", new Promise( /*#__PURE__*/function () {
657
- var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(resolve, reject) {
658
- var response, elapsedTimeInMilliseconds, data, _headers3, _elapsedTimeInMilliseconds4;
714
+ return _context8.abrupt("return", new Promise( /*#__PURE__*/function () {
715
+ var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(resolve, reject) {
716
+ var response, elapsedTimeInMilliseconds, data, _headers3, _elapsedTimeInMilliseconds5;
659
717
 
660
- return _regenerator["default"].wrap(function _callee6$(_context6) {
718
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
661
719
  while (1) {
662
- switch (_context6.prev = _context6.next) {
720
+ switch (_context7.prev = _context7.next) {
663
721
  case 0:
664
- _context6.prev = 0;
665
- _context6.next = 3;
722
+ _context7.prev = 0;
723
+ _context7.next = 3;
666
724
  return axiosInstance(options);
667
725
 
668
726
  case 3:
669
- response = _context6.sent;
727
+ response = _context7.sent;
670
728
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
671
729
  data = response.data, _headers3 = response.headers;
672
730
 
@@ -674,40 +732,40 @@ var SDK = /*#__PURE__*/function () {
674
732
 
675
733
 
676
734
  if (!data) {
677
- _context6.next = 11;
735
+ _context7.next = 11;
678
736
  break;
679
737
  }
680
738
 
681
739
  _this4.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats Succeeded and old session returned", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
682
740
 
683
741
  resolve(data);
684
- return _context6.abrupt("return");
742
+ return _context7.abrupt("return");
685
743
 
686
744
  case 11:
687
745
  // No data found in the old sessions so returning null
688
746
  resolve();
689
- return _context6.abrupt("return");
747
+ return _context7.abrupt("return");
690
748
 
691
749
  case 15:
692
- _context6.prev = 15;
693
- _context6.t0 = _context6["catch"](0);
694
- _elapsedTimeInMilliseconds4 = timer.milliSecondsElapsed;
750
+ _context7.prev = 15;
751
+ _context7.t0 = _context7["catch"](0);
752
+ _elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
695
753
 
696
- _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds4, requestPath, method, _context6.t0);
754
+ _this4.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTABLECHATS, "Get Reconnectable Chats failed", requestId, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context7.t0);
697
755
 
698
- if ((0, _isExpectedAxiosError["default"])(_context6.t0, _Constants["default"].axiosTimeoutErrorCode)) {
756
+ if ((0, _isExpectedAxiosError["default"])(_context7.t0, _Constants["default"].axiosTimeoutErrorCode)) {
699
757
  (0, _throwClientHTTPError["default"])();
700
758
  }
701
759
 
702
- reject(_context6.t0);
703
- return _context6.abrupt("return");
760
+ reject(_context7.t0);
761
+ return _context7.abrupt("return");
704
762
 
705
763
  case 22:
706
764
  case "end":
707
- return _context6.stop();
765
+ return _context7.stop();
708
766
  }
709
767
  }
710
- }, _callee6, null, [[0, 15]]);
768
+ }, _callee7, null, [[0, 15]]);
711
769
  }));
712
770
 
713
771
  return function (_x9, _x10) {
@@ -717,10 +775,10 @@ var SDK = /*#__PURE__*/function () {
717
775
 
718
776
  case 14:
719
777
  case "end":
720
- return _context7.stop();
778
+ return _context8.stop();
721
779
  }
722
780
  }
723
- }, _callee7, this);
781
+ }, _callee8, this);
724
782
  }));
725
783
 
726
784
  function getReconnectableChats(_x8) {
@@ -737,14 +795,14 @@ var SDK = /*#__PURE__*/function () {
737
795
  }, {
738
796
  key: "getReconnectAvailability",
739
797
  value: function () {
740
- var _getReconnectAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(reconnectId) {
741
- var _this$configuration$d5,
798
+ var _getReconnectAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(reconnectId) {
799
+ var _this$configuration$d6,
742
800
  _this5 = this;
743
801
 
744
802
  var timer, requestPath, headers, url, method, options, axiosInstance;
745
- return _regenerator["default"].wrap(function _callee9$(_context9) {
803
+ return _regenerator["default"].wrap(function _callee10$(_context10) {
746
804
  while (1) {
747
- switch (_context9.prev = _context9.next) {
805
+ switch (_context10.prev = _context10.next) {
748
806
  case 0:
749
807
  timer = _Timer.Timer.TIMER();
750
808
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnectable availability Started");
@@ -757,63 +815,63 @@ var SDK = /*#__PURE__*/function () {
757
815
  headers: headers,
758
816
  method: method,
759
817
  url: url,
760
- timeout: (_this$configuration$d5 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d5 !== void 0 ? _this$configuration$d5 : this.configuration.requestTimeoutConfig.getReconnectAvailability
818
+ timeout: (_this$configuration$d6 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d6 !== void 0 ? _this$configuration$d6 : this.configuration.requestTimeoutConfig.getReconnectAvailability
761
819
  };
762
820
  axiosInstance = _axios["default"].create();
763
- return _context9.abrupt("return", new Promise( /*#__PURE__*/function () {
764
- var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(resolve, reject) {
765
- var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds5;
821
+ return _context10.abrupt("return", new Promise( /*#__PURE__*/function () {
822
+ var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(resolve, reject) {
823
+ var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds6;
766
824
 
767
- return _regenerator["default"].wrap(function _callee8$(_context8) {
825
+ return _regenerator["default"].wrap(function _callee9$(_context9) {
768
826
  while (1) {
769
- switch (_context8.prev = _context8.next) {
827
+ switch (_context9.prev = _context9.next) {
770
828
  case 0:
771
- _context8.prev = 0;
772
- _context8.next = 3;
829
+ _context9.prev = 0;
830
+ _context9.next = 3;
773
831
  return axiosInstance(options);
774
832
 
775
833
  case 3:
776
- response = _context8.sent;
834
+ response = _context9.sent;
777
835
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
778
836
  data = response.data;
779
837
 
780
838
  if (!data) {
781
- _context8.next = 10;
839
+ _context9.next = 10;
782
840
  break;
783
841
  }
784
842
 
785
843
  _this5.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability succeeded", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
786
844
 
787
845
  resolve(data);
788
- return _context8.abrupt("return");
846
+ return _context9.abrupt("return");
789
847
 
790
848
  case 10:
791
849
  // No data found so returning null
792
850
  _this5.logWithLogger(_LogLevel.LogLevel.WARN, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect availability didn't send any valid data", undefined, response, elapsedTimeInMilliseconds, requestPath, method);
793
851
 
794
852
  resolve();
795
- return _context8.abrupt("return");
853
+ return _context9.abrupt("return");
796
854
 
797
855
  case 15:
798
- _context8.prev = 15;
799
- _context8.t0 = _context8["catch"](0);
800
- _elapsedTimeInMilliseconds5 = timer.milliSecondsElapsed;
856
+ _context9.prev = 15;
857
+ _context9.t0 = _context9["catch"](0);
858
+ _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
801
859
 
802
- _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds5, requestPath, method, _context8.t0);
860
+ _this5.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETRECONNECTAVAILABILITY, "Get Reconnect Availability failed", undefined, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context9.t0);
803
861
 
804
- if ((0, _isExpectedAxiosError["default"])(_context8.t0, _Constants["default"].axiosTimeoutErrorCode)) {
862
+ if ((0, _isExpectedAxiosError["default"])(_context9.t0, _Constants["default"].axiosTimeoutErrorCode)) {
805
863
  (0, _throwClientHTTPError["default"])();
806
864
  }
807
865
 
808
- reject(_context8.t0);
809
- return _context8.abrupt("return");
866
+ reject(_context9.t0);
867
+ return _context9.abrupt("return");
810
868
 
811
869
  case 22:
812
870
  case "end":
813
- return _context8.stop();
871
+ return _context9.stop();
814
872
  }
815
873
  }
816
- }, _callee8, null, [[0, 15]]);
874
+ }, _callee9, null, [[0, 15]]);
817
875
  }));
818
876
 
819
877
  return function (_x12, _x13) {
@@ -823,10 +881,10 @@ var SDK = /*#__PURE__*/function () {
823
881
 
824
882
  case 10:
825
883
  case "end":
826
- return _context9.stop();
884
+ return _context10.stop();
827
885
  }
828
886
  }
829
- }, _callee9, this);
887
+ }, _callee10, this);
830
888
  }));
831
889
 
832
890
  function getReconnectAvailability(_x11) {
@@ -844,8 +902,8 @@ var SDK = /*#__PURE__*/function () {
844
902
  }, {
845
903
  key: "getAgentAvailability",
846
904
  value: function () {
847
- var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(requestId) {
848
- var _this$configuration$d6,
905
+ var _getAgentAvailability = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(requestId) {
906
+ var _this$configuration$d7,
849
907
  _this6 = this;
850
908
 
851
909
  var queueAvailabilityOptionalParams,
@@ -862,12 +920,12 @@ var SDK = /*#__PURE__*/function () {
862
920
  url,
863
921
  method,
864
922
  options,
865
- _args11 = arguments;
866
- return _regenerator["default"].wrap(function _callee11$(_context11) {
923
+ _args12 = arguments;
924
+ return _regenerator["default"].wrap(function _callee12$(_context12) {
867
925
  while (1) {
868
- switch (_context11.prev = _context11.next) {
926
+ switch (_context12.prev = _context12.next) {
869
927
  case 0:
870
- queueAvailabilityOptionalParams = _args11.length > 1 && _args11[1] !== undefined ? _args11[1] : {};
928
+ queueAvailabilityOptionalParams = _args12.length > 1 && _args12[1] !== undefined ? _args12[1] : {};
871
929
  timer = _Timer.Timer.TIMER();
872
930
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYSTARTED, "Get agent availability Started", requestId);
873
931
  requestPath = "/".concat(_OmnichannelEndpoints["default"].GetAgentAvailabilityPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=lcw");
@@ -908,11 +966,11 @@ var SDK = /*#__PURE__*/function () {
908
966
  data.cacheKey = hash.createHash('sha256').update(JSON.stringify(cachObj)).digest('hex').toString();
909
967
 
910
968
  if (!(getContext && !window.document)) {
911
- _context11.next = 17;
969
+ _context12.next = 17;
912
970
  break;
913
971
  }
914
972
 
915
- return _context11.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
973
+ return _context12.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
916
974
 
917
975
  case 17:
918
976
  if (getContext) {
@@ -928,11 +986,11 @@ var SDK = /*#__PURE__*/function () {
928
986
 
929
987
 
930
988
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
931
- _context11.next = 21;
989
+ _context12.next = 21;
932
990
  break;
933
991
  }
934
992
 
935
- return _context11.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
993
+ return _context12.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
936
994
 
937
995
  case 21:
938
996
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
@@ -942,22 +1000,22 @@ var SDK = /*#__PURE__*/function () {
942
1000
  headers: headers,
943
1001
  method: method,
944
1002
  url: url,
945
- timeout: (_this$configuration$d6 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d6 !== void 0 ? _this$configuration$d6 : this.configuration.requestTimeoutConfig.getAgentAvailability
1003
+ timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.getAgentAvailability
946
1004
  };
947
- return _context11.abrupt("return", new Promise( /*#__PURE__*/function () {
948
- var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(resolve, reject) {
949
- var response, elapsedTimeInMilliseconds, _data, _headers4, _elapsedTimeInMilliseconds6;
1005
+ return _context12.abrupt("return", new Promise( /*#__PURE__*/function () {
1006
+ var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(resolve, reject) {
1007
+ var response, elapsedTimeInMilliseconds, _data, _headers4, _elapsedTimeInMilliseconds7;
950
1008
 
951
- return _regenerator["default"].wrap(function _callee10$(_context10) {
1009
+ return _regenerator["default"].wrap(function _callee11$(_context11) {
952
1010
  while (1) {
953
- switch (_context10.prev = _context10.next) {
1011
+ switch (_context11.prev = _context11.next) {
954
1012
  case 0:
955
- _context10.prev = 0;
956
- _context10.next = 3;
1013
+ _context11.prev = 0;
1014
+ _context11.next = 3;
957
1015
  return axiosInstance(options);
958
1016
 
959
1017
  case 3:
960
- response = _context10.sent;
1018
+ response = _context11.sent;
961
1019
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
962
1020
  _data = response.data, _headers4 = response.headers;
963
1021
 
@@ -969,28 +1027,28 @@ var SDK = /*#__PURE__*/function () {
969
1027
  resolve(_data);
970
1028
  }
971
1029
 
972
- _context10.next = 16;
1030
+ _context11.next = 16;
973
1031
  break;
974
1032
 
975
1033
  case 10:
976
- _context10.prev = 10;
977
- _context10.t0 = _context10["catch"](0);
978
- _elapsedTimeInMilliseconds6 = timer.milliSecondsElapsed;
1034
+ _context11.prev = 10;
1035
+ _context11.t0 = _context11["catch"](0);
1036
+ _elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
979
1037
 
980
- _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds6, requestPath, method, _context10.t0);
1038
+ _this6.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETAGENTAVAILABILITYFAILED, "Get agent availability failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context11.t0);
981
1039
 
982
- if ((0, _isExpectedAxiosError["default"])(_context10.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1040
+ if ((0, _isExpectedAxiosError["default"])(_context11.t0, _Constants["default"].axiosTimeoutErrorCode)) {
983
1041
  (0, _throwClientHTTPError["default"])();
984
1042
  }
985
1043
 
986
- reject(_context10.t0);
1044
+ reject(_context11.t0);
987
1045
 
988
1046
  case 16:
989
1047
  case "end":
990
- return _context10.stop();
1048
+ return _context11.stop();
991
1049
  }
992
1050
  }
993
- }, _callee10, null, [[0, 10]]);
1051
+ }, _callee11, null, [[0, 10]]);
994
1052
  }));
995
1053
 
996
1054
  return function (_x15, _x16) {
@@ -1000,10 +1058,10 @@ var SDK = /*#__PURE__*/function () {
1000
1058
 
1001
1059
  case 25:
1002
1060
  case "end":
1003
- return _context11.stop();
1061
+ return _context12.stop();
1004
1062
  }
1005
1063
  }
1006
- }, _callee11, this);
1064
+ }, _callee12, this);
1007
1065
  }));
1008
1066
 
1009
1067
  function getAgentAvailability(_x14) {
@@ -1021,8 +1079,8 @@ var SDK = /*#__PURE__*/function () {
1021
1079
  }, {
1022
1080
  key: "sessionInit",
1023
1081
  value: function () {
1024
- var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(requestId) {
1025
- var _this$configuration$d7,
1082
+ var _sessionInit = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(requestId) {
1083
+ var _this$configuration$d8,
1026
1084
  _this7 = this;
1027
1085
 
1028
1086
  var sessionInitOptionalParams,
@@ -1039,12 +1097,12 @@ var SDK = /*#__PURE__*/function () {
1039
1097
  url,
1040
1098
  method,
1041
1099
  options,
1042
- _args13 = arguments;
1043
- return _regenerator["default"].wrap(function _callee13$(_context13) {
1100
+ _args14 = arguments;
1101
+ return _regenerator["default"].wrap(function _callee14$(_context14) {
1044
1102
  while (1) {
1045
- switch (_context13.prev = _context13.next) {
1103
+ switch (_context14.prev = _context14.next) {
1046
1104
  case 0:
1047
- sessionInitOptionalParams = _args13.length > 1 && _args13[1] !== undefined ? _args13[1] : {};
1105
+ sessionInitOptionalParams = _args14.length > 1 && _args14[1] !== undefined ? _args14[1] : {};
1048
1106
  timer = _Timer.Timer.TIMER();
1049
1107
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSTARTED, "Session Init Started", requestId);
1050
1108
  axiosInstance = _axios["default"].create();
@@ -1085,11 +1143,11 @@ var SDK = /*#__PURE__*/function () {
1085
1143
  data = initContext || {};
1086
1144
 
1087
1145
  if (!(getContext && !window.document)) {
1088
- _context13.next = 16;
1146
+ _context14.next = 16;
1089
1147
  break;
1090
1148
  }
1091
1149
 
1092
- return _context13.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1150
+ return _context14.abrupt("return", Promise.reject(new Error("getContext is only supported on web browsers")));
1093
1151
 
1094
1152
  case 16:
1095
1153
  if (getContext) {
@@ -1106,11 +1164,11 @@ var SDK = /*#__PURE__*/function () {
1106
1164
 
1107
1165
 
1108
1166
  if (!(data.locale && !_Locales["default"].supportedLocales.includes(data.locale))) {
1109
- _context13.next = 20;
1167
+ _context14.next = 20;
1110
1168
  break;
1111
1169
  }
1112
1170
 
1113
- return _context13.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1171
+ return _context14.abrupt("return", Promise.reject(new Error("Unsupported locale: '".concat(data.locale, "'"))));
1114
1172
 
1115
1173
  case 20:
1116
1174
  url = "".concat(this.omnichannelConfiguration.orgUrl).concat(requestPath);
@@ -1121,22 +1179,22 @@ var SDK = /*#__PURE__*/function () {
1121
1179
  method: method,
1122
1180
  url: url,
1123
1181
  params: params,
1124
- timeout: (_this$configuration$d7 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d7 !== void 0 ? _this$configuration$d7 : this.configuration.requestTimeoutConfig.sessionInit
1182
+ timeout: (_this$configuration$d8 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d8 !== void 0 ? _this$configuration$d8 : this.configuration.requestTimeoutConfig.sessionInit
1125
1183
  };
1126
- return _context13.abrupt("return", new Promise( /*#__PURE__*/function () {
1127
- var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(resolve, reject) {
1128
- var response, elapsedTimeInMilliseconds, _headers5, _elapsedTimeInMilliseconds7;
1184
+ return _context14.abrupt("return", new Promise( /*#__PURE__*/function () {
1185
+ var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(resolve, reject) {
1186
+ var response, elapsedTimeInMilliseconds, _headers5, _elapsedTimeInMilliseconds8;
1129
1187
 
1130
- return _regenerator["default"].wrap(function _callee12$(_context12) {
1188
+ return _regenerator["default"].wrap(function _callee13$(_context13) {
1131
1189
  while (1) {
1132
- switch (_context12.prev = _context12.next) {
1190
+ switch (_context13.prev = _context13.next) {
1133
1191
  case 0:
1134
- _context12.prev = 0;
1135
- _context12.next = 3;
1192
+ _context13.prev = 0;
1193
+ _context13.next = 3;
1136
1194
  return axiosInstance(options);
1137
1195
 
1138
1196
  case 3:
1139
- response = _context12.sent;
1197
+ response = _context13.sent;
1140
1198
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1141
1199
  _headers5 = response.headers;
1142
1200
 
@@ -1145,28 +1203,28 @@ var SDK = /*#__PURE__*/function () {
1145
1203
  _this7.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONINITSUCCEEDED, "Session Init Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method, undefined, data);
1146
1204
 
1147
1205
  resolve();
1148
- _context12.next = 17;
1206
+ _context13.next = 17;
1149
1207
  break;
1150
1208
 
1151
1209
  case 11:
1152
- _context12.prev = 11;
1153
- _context12.t0 = _context12["catch"](0);
1154
- _elapsedTimeInMilliseconds7 = timer.milliSecondsElapsed;
1210
+ _context13.prev = 11;
1211
+ _context13.t0 = _context13["catch"](0);
1212
+ _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1155
1213
 
1156
- _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds7, requestPath, method, _context12.t0, data);
1214
+ _this7.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONINITFAILED, "Session Init failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context13.t0, data);
1157
1215
 
1158
- if ((0, _isExpectedAxiosError["default"])(_context12.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1216
+ if ((0, _isExpectedAxiosError["default"])(_context13.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1159
1217
  (0, _throwClientHTTPError["default"])();
1160
1218
  }
1161
1219
 
1162
- reject(_context12.t0);
1220
+ reject(_context13.t0);
1163
1221
 
1164
1222
  case 17:
1165
1223
  case "end":
1166
- return _context12.stop();
1224
+ return _context13.stop();
1167
1225
  }
1168
1226
  }
1169
- }, _callee12, null, [[0, 11]]);
1227
+ }, _callee13, null, [[0, 11]]);
1170
1228
  }));
1171
1229
 
1172
1230
  return function (_x18, _x19) {
@@ -1176,10 +1234,10 @@ var SDK = /*#__PURE__*/function () {
1176
1234
 
1177
1235
  case 24:
1178
1236
  case "end":
1179
- return _context13.stop();
1237
+ return _context14.stop();
1180
1238
  }
1181
1239
  }
1182
- }, _callee13, this);
1240
+ }, _callee14, this);
1183
1241
  }));
1184
1242
 
1185
1243
  function sessionInit(_x17) {
@@ -1197,8 +1255,8 @@ var SDK = /*#__PURE__*/function () {
1197
1255
  }, {
1198
1256
  key: "sessionClose",
1199
1257
  value: function () {
1200
- var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(requestId) {
1201
- var _this$configuration$d8,
1258
+ var _sessionClose = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(requestId) {
1259
+ var _this$configuration$d9,
1202
1260
  _this8 = this;
1203
1261
 
1204
1262
  var sessionCloseOptionalParams,
@@ -1214,12 +1272,12 @@ var SDK = /*#__PURE__*/function () {
1214
1272
  url,
1215
1273
  method,
1216
1274
  options,
1217
- _args15 = arguments;
1218
- return _regenerator["default"].wrap(function _callee15$(_context15) {
1275
+ _args16 = arguments;
1276
+ return _regenerator["default"].wrap(function _callee16$(_context16) {
1219
1277
  while (1) {
1220
- switch (_context15.prev = _context15.next) {
1278
+ switch (_context16.prev = _context16.next) {
1221
1279
  case 0:
1222
- sessionCloseOptionalParams = _args15.length > 1 && _args15[1] !== undefined ? _args15[1] : {};
1280
+ sessionCloseOptionalParams = _args16.length > 1 && _args16[1] !== undefined ? _args16[1] : {};
1223
1281
  timer = _Timer.Timer.TIMER();
1224
1282
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SESSIONCLOSESTARTED, "Session Close Started", requestId);
1225
1283
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSessionClosePath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
@@ -1258,22 +1316,22 @@ var SDK = /*#__PURE__*/function () {
1258
1316
  headers: headers,
1259
1317
  method: method,
1260
1318
  url: url,
1261
- timeout: (_this$configuration$d8 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d8 !== void 0 ? _this$configuration$d8 : this.configuration.requestTimeoutConfig.sessionClose
1319
+ timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.sessionClose
1262
1320
  };
1263
- return _context15.abrupt("return", new Promise( /*#__PURE__*/function () {
1264
- var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(resolve, reject) {
1265
- var response, _headers6, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds8;
1321
+ return _context16.abrupt("return", new Promise( /*#__PURE__*/function () {
1322
+ var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(resolve, reject) {
1323
+ var response, _headers6, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1266
1324
 
1267
- return _regenerator["default"].wrap(function _callee14$(_context14) {
1325
+ return _regenerator["default"].wrap(function _callee15$(_context15) {
1268
1326
  while (1) {
1269
- switch (_context14.prev = _context14.next) {
1327
+ switch (_context15.prev = _context15.next) {
1270
1328
  case 0:
1271
- _context14.prev = 0;
1272
- _context14.next = 3;
1329
+ _context15.prev = 0;
1330
+ _context15.next = 3;
1273
1331
  return axiosInstance(options);
1274
1332
 
1275
1333
  case 3:
1276
- response = _context14.sent;
1334
+ response = _context15.sent;
1277
1335
  _headers6 = response.headers;
1278
1336
 
1279
1337
  _this8.setAuthCodeNonce(_headers6);
@@ -1284,28 +1342,28 @@ var SDK = /*#__PURE__*/function () {
1284
1342
 
1285
1343
  resolve(); // eslint-disable-next-line @typescript-eslint/no-explicit-any
1286
1344
 
1287
- _context14.next = 17;
1345
+ _context15.next = 17;
1288
1346
  break;
1289
1347
 
1290
1348
  case 11:
1291
- _context14.prev = 11;
1292
- _context14.t0 = _context14["catch"](0);
1293
- _elapsedTimeInMilliseconds8 = timer.milliSecondsElapsed;
1349
+ _context15.prev = 11;
1350
+ _context15.t0 = _context15["catch"](0);
1351
+ _elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
1294
1352
 
1295
- _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds8, requestPath, method, _context14.t0);
1353
+ _this8.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SESSIONCLOSEFAILED, "Session close failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context15.t0);
1296
1354
 
1297
- if (_context14.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1355
+ if (_context15.t0.code === _Constants["default"].axiosTimeoutErrorCode) {
1298
1356
  (0, _throwClientHTTPError["default"])();
1299
1357
  }
1300
1358
 
1301
- reject(_context14.t0);
1359
+ reject(_context15.t0);
1302
1360
 
1303
1361
  case 17:
1304
1362
  case "end":
1305
- return _context14.stop();
1363
+ return _context15.stop();
1306
1364
  }
1307
1365
  }
1308
- }, _callee14, null, [[0, 11]]);
1366
+ }, _callee15, null, [[0, 11]]);
1309
1367
  }));
1310
1368
 
1311
1369
  return function (_x21, _x22) {
@@ -1315,10 +1373,10 @@ var SDK = /*#__PURE__*/function () {
1315
1373
 
1316
1374
  case 18:
1317
1375
  case "end":
1318
- return _context15.stop();
1376
+ return _context16.stop();
1319
1377
  }
1320
1378
  }
1321
- }, _callee15, this);
1379
+ }, _callee16, this);
1322
1380
  }));
1323
1381
 
1324
1382
  function sessionClose(_x20) {
@@ -1336,14 +1394,14 @@ var SDK = /*#__PURE__*/function () {
1336
1394
  }, {
1337
1395
  key: "validateAuthChatRecord",
1338
1396
  value: function () {
1339
- var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(requestId, validateAuthChatRecordOptionalParams) {
1340
- var _this$configuration$d9,
1397
+ var _validateAuthChatRecord = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(requestId, validateAuthChatRecordOptionalParams) {
1398
+ var _this$configuration$d10,
1341
1399
  _this9 = this;
1342
1400
 
1343
1401
  var timer, authenticatedUserToken, chatId, requestPath, axiosInstance, headers, url, method, options;
1344
- return _regenerator["default"].wrap(function _callee17$(_context17) {
1402
+ return _regenerator["default"].wrap(function _callee18$(_context18) {
1345
1403
  while (1) {
1346
- switch (_context17.prev = _context17.next) {
1404
+ switch (_context18.prev = _context18.next) {
1347
1405
  case 0:
1348
1406
  timer = _Timer.Timer.TIMER();
1349
1407
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDSTARTED, "Validate Auth Chat Record Started", requestId);
@@ -1369,22 +1427,22 @@ var SDK = /*#__PURE__*/function () {
1369
1427
  headers: headers,
1370
1428
  method: method,
1371
1429
  url: url,
1372
- timeout: (_this$configuration$d9 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d9 !== void 0 ? _this$configuration$d9 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
1430
+ timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.validateAuthChatRecordTimeout
1373
1431
  };
1374
- return _context17.abrupt("return", new Promise( /*#__PURE__*/function () {
1375
- var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee16(resolve, reject) {
1376
- var _response$data, response, _headers7, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds9;
1432
+ return _context18.abrupt("return", new Promise( /*#__PURE__*/function () {
1433
+ var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee17(resolve, reject) {
1434
+ var _response$data, response, _headers7, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1377
1435
 
1378
- return _regenerator["default"].wrap(function _callee16$(_context16) {
1436
+ return _regenerator["default"].wrap(function _callee17$(_context17) {
1379
1437
  while (1) {
1380
- switch (_context16.prev = _context16.next) {
1438
+ switch (_context17.prev = _context17.next) {
1381
1439
  case 0:
1382
- _context16.prev = 0;
1383
- _context16.next = 3;
1440
+ _context17.prev = 0;
1441
+ _context17.next = 3;
1384
1442
  return axiosInstance(options);
1385
1443
 
1386
1444
  case 3:
1387
- response = _context16.sent;
1445
+ response = _context17.sent;
1388
1446
  _headers7 = response.headers;
1389
1447
 
1390
1448
  _this9.setAuthCodeNonce(_headers7);
@@ -1402,33 +1460,33 @@ var SDK = /*#__PURE__*/function () {
1402
1460
  } // eslint-disable-next-line @typescript-eslint/no-explicit-any
1403
1461
 
1404
1462
 
1405
- _context16.next = 16;
1463
+ _context17.next = 16;
1406
1464
  break;
1407
1465
 
1408
1466
  case 10:
1409
- _context16.prev = 10;
1410
- _context16.t0 = _context16["catch"](0);
1411
- _elapsedTimeInMilliseconds9 = timer.milliSecondsElapsed;
1467
+ _context17.prev = 10;
1468
+ _context17.t0 = _context17["catch"](0);
1469
+ _elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
1412
1470
 
1413
- _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds9, requestPath, method, _context16.t0);
1471
+ _this9.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.VALIDATEAUTHCHATRECORDFAILED, "Validate Auth Chat Record failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context17.t0);
1414
1472
 
1415
- if ((0, _isExpectedAxiosError["default"])(_context16.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1473
+ if ((0, _isExpectedAxiosError["default"])(_context17.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1416
1474
  (0, _throwClientHTTPError["default"])();
1417
1475
  }
1418
1476
 
1419
- if (_context16.t0.toString() === "Error: Request failed with status code 404") {
1477
+ if (_context17.t0.toString() === "Error: Request failed with status code 404") {
1420
1478
  // backward compatibility
1421
1479
  resolve({});
1422
1480
  } else {
1423
- reject(_context16.t0);
1481
+ reject(_context17.t0);
1424
1482
  }
1425
1483
 
1426
1484
  case 16:
1427
1485
  case "end":
1428
- return _context16.stop();
1486
+ return _context17.stop();
1429
1487
  }
1430
1488
  }
1431
- }, _callee16, null, [[0, 10]]);
1489
+ }, _callee17, null, [[0, 10]]);
1432
1490
  }));
1433
1491
 
1434
1492
  return function (_x25, _x26) {
@@ -1438,10 +1496,10 @@ var SDK = /*#__PURE__*/function () {
1438
1496
 
1439
1497
  case 13:
1440
1498
  case "end":
1441
- return _context17.stop();
1499
+ return _context18.stop();
1442
1500
  }
1443
1501
  }
1444
- }, _callee17, this);
1502
+ }, _callee18, this);
1445
1503
  }));
1446
1504
 
1447
1505
  function validateAuthChatRecord(_x23, _x24) {
@@ -1460,8 +1518,8 @@ var SDK = /*#__PURE__*/function () {
1460
1518
  }, {
1461
1519
  key: "submitPostChatResponse",
1462
1520
  value: function () {
1463
- var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(requestId, postChatResponse) {
1464
- var _this$configuration$d10,
1521
+ var _submitPostChatResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(requestId, postChatResponse) {
1522
+ var _this$configuration$d11,
1465
1523
  _this10 = this;
1466
1524
 
1467
1525
  var submitPostChatResponseOptionalParams,
@@ -1473,12 +1531,12 @@ var SDK = /*#__PURE__*/function () {
1473
1531
  url,
1474
1532
  method,
1475
1533
  options,
1476
- _args19 = arguments;
1477
- return _regenerator["default"].wrap(function _callee19$(_context19) {
1534
+ _args20 = arguments;
1535
+ return _regenerator["default"].wrap(function _callee20$(_context20) {
1478
1536
  while (1) {
1479
- switch (_context19.prev = _context19.next) {
1537
+ switch (_context20.prev = _context20.next) {
1480
1538
  case 0:
1481
- submitPostChatResponseOptionalParams = _args19.length > 2 && _args19[2] !== undefined ? _args19[2] : {};
1539
+ submitPostChatResponseOptionalParams = _args20.length > 2 && _args20[2] !== undefined ? _args20[2] : {};
1482
1540
  timer = _Timer.Timer.TIMER();
1483
1541
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSTARTED, "Submit Post Chat Started", requestId);
1484
1542
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSubmitPostChatPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
@@ -1504,22 +1562,22 @@ var SDK = /*#__PURE__*/function () {
1504
1562
  headers: headers,
1505
1563
  method: method,
1506
1564
  url: url,
1507
- timeout: (_this$configuration$d10 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d10 !== void 0 ? _this$configuration$d10 : this.configuration.requestTimeoutConfig.submitPostChatResponse
1565
+ timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.submitPostChatResponse
1508
1566
  };
1509
- return _context19.abrupt("return", new Promise( /*#__PURE__*/function () {
1510
- var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee18(resolve, reject) {
1511
- var response, _headers8, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds10;
1567
+ return _context20.abrupt("return", new Promise( /*#__PURE__*/function () {
1568
+ var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee19(resolve, reject) {
1569
+ var response, _headers8, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds11;
1512
1570
 
1513
- return _regenerator["default"].wrap(function _callee18$(_context18) {
1571
+ return _regenerator["default"].wrap(function _callee19$(_context19) {
1514
1572
  while (1) {
1515
- switch (_context18.prev = _context18.next) {
1573
+ switch (_context19.prev = _context19.next) {
1516
1574
  case 0:
1517
- _context18.prev = 0;
1518
- _context18.next = 3;
1575
+ _context19.prev = 0;
1576
+ _context19.next = 3;
1519
1577
  return axiosInstance(options);
1520
1578
 
1521
1579
  case 3:
1522
- response = _context18.sent;
1580
+ response = _context19.sent;
1523
1581
  _headers8 = response.headers;
1524
1582
 
1525
1583
  _this10.setAuthCodeNonce(_headers8);
@@ -1529,28 +1587,28 @@ var SDK = /*#__PURE__*/function () {
1529
1587
  _this10.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATSUCCEEDED, "Submit Post Chat succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1530
1588
 
1531
1589
  resolve();
1532
- _context18.next = 17;
1590
+ _context19.next = 17;
1533
1591
  break;
1534
1592
 
1535
1593
  case 11:
1536
- _context18.prev = 11;
1537
- _context18.t0 = _context18["catch"](0);
1538
- _elapsedTimeInMilliseconds10 = timer.milliSecondsElapsed;
1594
+ _context19.prev = 11;
1595
+ _context19.t0 = _context19["catch"](0);
1596
+ _elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
1539
1597
 
1540
- _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds10, requestPath, method, _context18.t0);
1598
+ _this10.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SUBMITPOSTCHATFAILED, "Submit Post Chat Failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context19.t0);
1541
1599
 
1542
- if ((0, _isExpectedAxiosError["default"])(_context18.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1600
+ if ((0, _isExpectedAxiosError["default"])(_context19.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1543
1601
  (0, _throwClientHTTPError["default"])();
1544
1602
  }
1545
1603
 
1546
- reject(_context18.t0);
1604
+ reject(_context19.t0);
1547
1605
 
1548
1606
  case 17:
1549
1607
  case "end":
1550
- return _context18.stop();
1608
+ return _context19.stop();
1551
1609
  }
1552
1610
  }
1553
- }, _callee18, null, [[0, 11]]);
1611
+ }, _callee19, null, [[0, 11]]);
1554
1612
  }));
1555
1613
 
1556
1614
  return function (_x29, _x30) {
@@ -1560,10 +1618,10 @@ var SDK = /*#__PURE__*/function () {
1560
1618
 
1561
1619
  case 13:
1562
1620
  case "end":
1563
- return _context19.stop();
1621
+ return _context20.stop();
1564
1622
  }
1565
1623
  }
1566
- }, _callee19, this);
1624
+ }, _callee20, this);
1567
1625
  }));
1568
1626
 
1569
1627
  function submitPostChatResponse(_x27, _x28) {
@@ -1582,8 +1640,8 @@ var SDK = /*#__PURE__*/function () {
1582
1640
  }, {
1583
1641
  key: "getSurveyInviteLink",
1584
1642
  value: function () {
1585
- var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(surveyOwnerId, surveyInviteAPIRequestBody) {
1586
- var _this$configuration$d11,
1643
+ var _getSurveyInviteLink = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(surveyOwnerId, surveyInviteAPIRequestBody) {
1644
+ var _this$configuration$d12,
1587
1645
  _this11 = this;
1588
1646
 
1589
1647
  var getsurveyInviteLinkOptionalParams,
@@ -1596,12 +1654,12 @@ var SDK = /*#__PURE__*/function () {
1596
1654
  url,
1597
1655
  method,
1598
1656
  options,
1599
- _args21 = arguments;
1600
- return _regenerator["default"].wrap(function _callee21$(_context21) {
1657
+ _args22 = arguments;
1658
+ return _regenerator["default"].wrap(function _callee22$(_context22) {
1601
1659
  while (1) {
1602
- switch (_context21.prev = _context21.next) {
1660
+ switch (_context22.prev = _context22.next) {
1603
1661
  case 0:
1604
- getsurveyInviteLinkOptionalParams = _args21.length > 2 && _args21[2] !== undefined ? _args21[2] : {};
1662
+ getsurveyInviteLinkOptionalParams = _args22.length > 2 && _args22[2] !== undefined ? _args22[2] : {};
1605
1663
  timer = _Timer.Timer.TIMER();
1606
1664
 
1607
1665
  if (this.logger) {
@@ -1640,22 +1698,22 @@ var SDK = /*#__PURE__*/function () {
1640
1698
  headers: headers,
1641
1699
  method: method,
1642
1700
  url: url,
1643
- timeout: (_this$configuration$d11 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d11 !== void 0 ? _this$configuration$d11 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
1701
+ timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getSurveyInviteLink
1644
1702
  };
1645
- return _context21.abrupt("return", new Promise( /*#__PURE__*/function () {
1646
- var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee20(resolve, reject) {
1647
- var response, data, _headers9, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds11;
1703
+ return _context22.abrupt("return", new Promise( /*#__PURE__*/function () {
1704
+ var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee21(resolve, reject) {
1705
+ var response, data, _headers9, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds12;
1648
1706
 
1649
- return _regenerator["default"].wrap(function _callee20$(_context20) {
1707
+ return _regenerator["default"].wrap(function _callee21$(_context21) {
1650
1708
  while (1) {
1651
- switch (_context20.prev = _context20.next) {
1709
+ switch (_context21.prev = _context21.next) {
1652
1710
  case 0:
1653
- _context20.prev = 0;
1654
- _context20.next = 3;
1711
+ _context21.prev = 0;
1712
+ _context21.next = 3;
1655
1713
  return axiosInstance(options);
1656
1714
 
1657
1715
  case 3:
1658
- response = _context20.sent;
1716
+ response = _context21.sent;
1659
1717
  data = response.data, _headers9 = response.headers;
1660
1718
 
1661
1719
  _this11.setAuthCodeNonce(_headers9);
@@ -1665,28 +1723,28 @@ var SDK = /*#__PURE__*/function () {
1665
1723
  _this11.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKSUCCEEDED, "Get Survey Invite Link Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1666
1724
 
1667
1725
  resolve(data);
1668
- _context20.next = 17;
1726
+ _context21.next = 17;
1669
1727
  break;
1670
1728
 
1671
1729
  case 11:
1672
- _context20.prev = 11;
1673
- _context20.t0 = _context20["catch"](0);
1674
- _elapsedTimeInMilliseconds11 = timer.milliSecondsElapsed;
1730
+ _context21.prev = 11;
1731
+ _context21.t0 = _context21["catch"](0);
1732
+ _elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
1675
1733
 
1676
- _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds11, requestPath, method, _context20.t0);
1734
+ _this11.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETSURVEYINVITELINKFAILED, "Get Survey Invite Link failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context21.t0);
1677
1735
 
1678
- if ((0, _isExpectedAxiosError["default"])(_context20.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1736
+ if ((0, _isExpectedAxiosError["default"])(_context21.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1679
1737
  (0, _throwClientHTTPError["default"])();
1680
1738
  }
1681
1739
 
1682
- reject(_context20.t0);
1740
+ reject(_context21.t0);
1683
1741
 
1684
1742
  case 17:
1685
1743
  case "end":
1686
- return _context20.stop();
1744
+ return _context21.stop();
1687
1745
  }
1688
1746
  }
1689
- }, _callee20, null, [[0, 11]]);
1747
+ }, _callee21, null, [[0, 11]]);
1690
1748
  }));
1691
1749
 
1692
1750
  return function (_x33, _x34) {
@@ -1696,10 +1754,10 @@ var SDK = /*#__PURE__*/function () {
1696
1754
 
1697
1755
  case 15:
1698
1756
  case "end":
1699
- return _context21.stop();
1757
+ return _context22.stop();
1700
1758
  }
1701
1759
  }
1702
- }, _callee21, this);
1760
+ }, _callee22, this);
1703
1761
  }));
1704
1762
 
1705
1763
  function getSurveyInviteLink(_x31, _x32) {
@@ -1719,8 +1777,8 @@ var SDK = /*#__PURE__*/function () {
1719
1777
  }, {
1720
1778
  key: "getChatTranscripts",
1721
1779
  value: function () {
1722
- var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(requestId, chatId, token) {
1723
- var _this$configuration$d12,
1780
+ var _getChatTranscripts = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(requestId, chatId, token) {
1781
+ var _this$configuration$d13,
1724
1782
  _this12 = this;
1725
1783
 
1726
1784
  var getChatTranscriptsOptionalParams,
@@ -1733,12 +1791,12 @@ var SDK = /*#__PURE__*/function () {
1733
1791
  url,
1734
1792
  method,
1735
1793
  options,
1736
- _args23 = arguments;
1737
- return _regenerator["default"].wrap(function _callee23$(_context23) {
1794
+ _args24 = arguments;
1795
+ return _regenerator["default"].wrap(function _callee24$(_context24) {
1738
1796
  while (1) {
1739
- switch (_context23.prev = _context23.next) {
1797
+ switch (_context24.prev = _context24.next) {
1740
1798
  case 0:
1741
- getChatTranscriptsOptionalParams = _args23.length > 3 && _args23[3] !== undefined ? _args23[3] : {};
1799
+ getChatTranscriptsOptionalParams = _args24.length > 3 && _args24[3] !== undefined ? _args24[3] : {};
1742
1800
  timer = _Timer.Timer.TIMER();
1743
1801
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSTARTED, "Get Chat Transcript Started", requestId);
1744
1802
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatGetChatTranscriptPath, "/").concat(chatId, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
@@ -1775,22 +1833,22 @@ var SDK = /*#__PURE__*/function () {
1775
1833
  headers: headers,
1776
1834
  method: method,
1777
1835
  url: url,
1778
- timeout: (_this$configuration$d12 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d12 !== void 0 ? _this$configuration$d12 : this.configuration.requestTimeoutConfig.getChatTranscripts
1836
+ timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.getChatTranscripts
1779
1837
  };
1780
- return _context23.abrupt("return", new Promise( /*#__PURE__*/function () {
1781
- var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee22(resolve, reject) {
1782
- var response, elapsedTimeInMilliseconds, data, _headers10, _elapsedTimeInMilliseconds12;
1838
+ return _context24.abrupt("return", new Promise( /*#__PURE__*/function () {
1839
+ var _ref11 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee23(resolve, reject) {
1840
+ var response, elapsedTimeInMilliseconds, data, _headers10, _elapsedTimeInMilliseconds13;
1783
1841
 
1784
- return _regenerator["default"].wrap(function _callee22$(_context22) {
1842
+ return _regenerator["default"].wrap(function _callee23$(_context23) {
1785
1843
  while (1) {
1786
- switch (_context22.prev = _context22.next) {
1844
+ switch (_context23.prev = _context23.next) {
1787
1845
  case 0:
1788
- _context22.prev = 0;
1789
- _context22.next = 3;
1846
+ _context23.prev = 0;
1847
+ _context23.next = 3;
1790
1848
  return axiosInstance(options);
1791
1849
 
1792
1850
  case 3:
1793
- response = _context22.sent;
1851
+ response = _context23.sent;
1794
1852
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
1795
1853
  data = response.data, _headers10 = response.headers;
1796
1854
 
@@ -1799,28 +1857,28 @@ var SDK = /*#__PURE__*/function () {
1799
1857
  _this12.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTSUCCEEDED, "Get Chat Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1800
1858
 
1801
1859
  resolve(data);
1802
- _context22.next = 17;
1860
+ _context23.next = 17;
1803
1861
  break;
1804
1862
 
1805
1863
  case 11:
1806
- _context22.prev = 11;
1807
- _context22.t0 = _context22["catch"](0);
1808
- _elapsedTimeInMilliseconds12 = timer.milliSecondsElapsed;
1864
+ _context23.prev = 11;
1865
+ _context23.t0 = _context23["catch"](0);
1866
+ _elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
1809
1867
 
1810
- _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds12, requestPath, method, _context22.t0);
1868
+ _this12.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.GETCHATTRANSCRIPTFAILED, "Get Chat Transcript failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context23.t0);
1811
1869
 
1812
- if ((0, _isExpectedAxiosError["default"])(_context22.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1870
+ if ((0, _isExpectedAxiosError["default"])(_context23.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1813
1871
  (0, _throwClientHTTPError["default"])();
1814
1872
  }
1815
1873
 
1816
- reject(_context22.t0);
1874
+ reject(_context23.t0);
1817
1875
 
1818
1876
  case 17:
1819
1877
  case "end":
1820
- return _context22.stop();
1878
+ return _context23.stop();
1821
1879
  }
1822
1880
  }
1823
- }, _callee22, null, [[0, 11]]);
1881
+ }, _callee23, null, [[0, 11]]);
1824
1882
  }));
1825
1883
 
1826
1884
  return function (_x38, _x39) {
@@ -1830,10 +1888,10 @@ var SDK = /*#__PURE__*/function () {
1830
1888
 
1831
1889
  case 17:
1832
1890
  case "end":
1833
- return _context23.stop();
1891
+ return _context24.stop();
1834
1892
  }
1835
1893
  }
1836
- }, _callee23, this);
1894
+ }, _callee24, this);
1837
1895
  }));
1838
1896
 
1839
1897
  function getChatTranscripts(_x35, _x36, _x37) {
@@ -1853,8 +1911,8 @@ var SDK = /*#__PURE__*/function () {
1853
1911
  }, {
1854
1912
  key: "emailTranscript",
1855
1913
  value: function () {
1856
- var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(requestId, token, emailRequestBody) {
1857
- var _this$configuration$d13,
1914
+ var _emailTranscript = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(requestId, token, emailRequestBody) {
1915
+ var _this$configuration$d14,
1858
1916
  _this13 = this;
1859
1917
 
1860
1918
  var emailTranscriptOptionalParams,
@@ -1866,12 +1924,12 @@ var SDK = /*#__PURE__*/function () {
1866
1924
  url,
1867
1925
  method,
1868
1926
  options,
1869
- _args25 = arguments;
1870
- return _regenerator["default"].wrap(function _callee25$(_context25) {
1927
+ _args26 = arguments;
1928
+ return _regenerator["default"].wrap(function _callee26$(_context26) {
1871
1929
  while (1) {
1872
- switch (_context25.prev = _context25.next) {
1930
+ switch (_context26.prev = _context26.next) {
1873
1931
  case 0:
1874
- emailTranscriptOptionalParams = _args25.length > 3 && _args25[3] !== undefined ? _args25[3] : {};
1932
+ emailTranscriptOptionalParams = _args26.length > 3 && _args26[3] !== undefined ? _args26[3] : {};
1875
1933
  timer = _Timer.Timer.TIMER();
1876
1934
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSTARTED, "Email Transcript Started", requestId);
1877
1935
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatTranscriptEmailRequestPath, "/").concat(requestId, "?channelId=").concat(this.omnichannelConfiguration.channelId);
@@ -1901,22 +1959,22 @@ var SDK = /*#__PURE__*/function () {
1901
1959
  headers: headers,
1902
1960
  method: method,
1903
1961
  url: url,
1904
- timeout: (_this$configuration$d13 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d13 !== void 0 ? _this$configuration$d13 : this.configuration.requestTimeoutConfig.emailTranscript
1962
+ timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.emailTranscript
1905
1963
  };
1906
- return _context25.abrupt("return", new Promise( /*#__PURE__*/function () {
1907
- var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee24(resolve, reject) {
1908
- var response, _headers11, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds13;
1964
+ return _context26.abrupt("return", new Promise( /*#__PURE__*/function () {
1965
+ var _ref12 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee25(resolve, reject) {
1966
+ var response, _headers11, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds14;
1909
1967
 
1910
- return _regenerator["default"].wrap(function _callee24$(_context24) {
1968
+ return _regenerator["default"].wrap(function _callee25$(_context25) {
1911
1969
  while (1) {
1912
- switch (_context24.prev = _context24.next) {
1970
+ switch (_context25.prev = _context25.next) {
1913
1971
  case 0:
1914
- _context24.prev = 0;
1915
- _context24.next = 3;
1972
+ _context25.prev = 0;
1973
+ _context25.next = 3;
1916
1974
  return axiosInstance(options);
1917
1975
 
1918
1976
  case 3:
1919
- response = _context24.sent;
1977
+ response = _context25.sent;
1920
1978
  _headers11 = response.headers;
1921
1979
 
1922
1980
  _this13.setAuthCodeNonce(_headers11);
@@ -1926,28 +1984,28 @@ var SDK = /*#__PURE__*/function () {
1926
1984
  _this13.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTSUCCEEDED, "Email Transcript succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
1927
1985
 
1928
1986
  resolve();
1929
- _context24.next = 17;
1987
+ _context25.next = 17;
1930
1988
  break;
1931
1989
 
1932
1990
  case 11:
1933
- _context24.prev = 11;
1934
- _context24.t0 = _context24["catch"](0);
1935
- _elapsedTimeInMilliseconds13 = timer.milliSecondsElapsed;
1991
+ _context25.prev = 11;
1992
+ _context25.t0 = _context25["catch"](0);
1993
+ _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
1936
1994
 
1937
- _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds13, requestPath, method, _context24.t0);
1995
+ _this13.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.EMAILTRANSCRIPTFAILED, "Email Transcript Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context25.t0);
1938
1996
 
1939
- if ((0, _isExpectedAxiosError["default"])(_context24.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1997
+ if ((0, _isExpectedAxiosError["default"])(_context25.t0, _Constants["default"].axiosTimeoutErrorCode)) {
1940
1998
  (0, _throwClientHTTPError["default"])();
1941
1999
  }
1942
2000
 
1943
- reject(_context24.t0);
2001
+ reject(_context25.t0);
1944
2002
 
1945
2003
  case 17:
1946
2004
  case "end":
1947
- return _context24.stop();
2005
+ return _context25.stop();
1948
2006
  }
1949
2007
  }
1950
- }, _callee24, null, [[0, 11]]);
2008
+ }, _callee25, null, [[0, 11]]);
1951
2009
  }));
1952
2010
 
1953
2011
  return function (_x43, _x44) {
@@ -1957,10 +2015,10 @@ var SDK = /*#__PURE__*/function () {
1957
2015
 
1958
2016
  case 17:
1959
2017
  case "end":
1960
- return _context25.stop();
2018
+ return _context26.stop();
1961
2019
  }
1962
2020
  }
1963
- }, _callee25, this);
2021
+ }, _callee26, this);
1964
2022
  }));
1965
2023
 
1966
2024
  function emailTranscript(_x40, _x41, _x42) {
@@ -1977,14 +2035,14 @@ var SDK = /*#__PURE__*/function () {
1977
2035
  }, {
1978
2036
  key: "fetchDataMaskingInfo",
1979
2037
  value: function () {
1980
- var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(requestId) {
1981
- var _this$configuration$d14,
2038
+ var _fetchDataMaskingInfo = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(requestId) {
2039
+ var _this$configuration$d15,
1982
2040
  _this14 = this;
1983
2041
 
1984
2042
  var timer, requestPath, axiosInstance, headers, url, method, options;
1985
- return _regenerator["default"].wrap(function _callee27$(_context27) {
2043
+ return _regenerator["default"].wrap(function _callee28$(_context28) {
1986
2044
  while (1) {
1987
- switch (_context27.prev = _context27.next) {
2045
+ switch (_context28.prev = _context28.next) {
1988
2046
  case 0:
1989
2047
  timer = _Timer.Timer.TIMER();
1990
2048
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSTARTED, "Fetch Data Masking Started", requestId);
@@ -2009,50 +2067,50 @@ var SDK = /*#__PURE__*/function () {
2009
2067
  headers: headers,
2010
2068
  method: method,
2011
2069
  url: url,
2012
- timeout: (_this$configuration$d14 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d14 !== void 0 ? _this$configuration$d14 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
2070
+ timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.fetchDataMaskingInfo
2013
2071
  };
2014
- return _context27.abrupt("return", new Promise( /*#__PURE__*/function () {
2015
- var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee26(resolve, reject) {
2016
- var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds14;
2072
+ return _context28.abrupt("return", new Promise( /*#__PURE__*/function () {
2073
+ var _ref13 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee27(resolve, reject) {
2074
+ var response, elapsedTimeInMilliseconds, data, _elapsedTimeInMilliseconds15;
2017
2075
 
2018
- return _regenerator["default"].wrap(function _callee26$(_context26) {
2076
+ return _regenerator["default"].wrap(function _callee27$(_context27) {
2019
2077
  while (1) {
2020
- switch (_context26.prev = _context26.next) {
2078
+ switch (_context27.prev = _context27.next) {
2021
2079
  case 0:
2022
- _context26.prev = 0;
2023
- _context26.next = 3;
2080
+ _context27.prev = 0;
2081
+ _context27.next = 3;
2024
2082
  return axiosInstance(options);
2025
2083
 
2026
2084
  case 3:
2027
- response = _context26.sent;
2085
+ response = _context27.sent;
2028
2086
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2029
2087
  data = response.data;
2030
2088
 
2031
2089
  _this14.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGSUCCEEDED, "Fetch Data Masking succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2032
2090
 
2033
2091
  resolve(data);
2034
- _context26.next = 16;
2092
+ _context27.next = 16;
2035
2093
  break;
2036
2094
 
2037
2095
  case 10:
2038
- _context26.prev = 10;
2039
- _context26.t0 = _context26["catch"](0);
2040
- _elapsedTimeInMilliseconds14 = timer.milliSecondsElapsed;
2096
+ _context27.prev = 10;
2097
+ _context27.t0 = _context27["catch"](0);
2098
+ _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2041
2099
 
2042
- _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds14, requestPath, method, _context26.t0);
2100
+ _this14.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.FETCHDATAMASKINGFAILED, "Fetch Data Masking Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context27.t0);
2043
2101
 
2044
- if ((0, _isExpectedAxiosError["default"])(_context26.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2102
+ if ((0, _isExpectedAxiosError["default"])(_context27.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2045
2103
  (0, _throwClientHTTPError["default"])();
2046
2104
  }
2047
2105
 
2048
- reject(_context26.t0);
2106
+ reject(_context27.t0);
2049
2107
 
2050
2108
  case 16:
2051
2109
  case "end":
2052
- return _context26.stop();
2110
+ return _context27.stop();
2053
2111
  }
2054
2112
  }
2055
- }, _callee26, null, [[0, 10]]);
2113
+ }, _callee27, null, [[0, 10]]);
2056
2114
  }));
2057
2115
 
2058
2116
  return function (_x46, _x47) {
@@ -2062,10 +2120,10 @@ var SDK = /*#__PURE__*/function () {
2062
2120
 
2063
2121
  case 14:
2064
2122
  case "end":
2065
- return _context27.stop();
2123
+ return _context28.stop();
2066
2124
  }
2067
2125
  }
2068
- }, _callee27, this);
2126
+ }, _callee28, this);
2069
2127
  }));
2070
2128
 
2071
2129
  function fetchDataMaskingInfo(_x45) {
@@ -2084,8 +2142,8 @@ var SDK = /*#__PURE__*/function () {
2084
2142
  }, {
2085
2143
  key: "makeSecondaryChannelEventRequest",
2086
2144
  value: function () {
2087
- var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(requestId, secondaryChannelEventRequestBody) {
2088
- var _this$configuration$d15,
2145
+ var _makeSecondaryChannelEventRequest = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(requestId, secondaryChannelEventRequestBody) {
2146
+ var _this$configuration$d16,
2089
2147
  _this15 = this;
2090
2148
 
2091
2149
  var secondaryChannelEventOptionalParams,
@@ -2097,12 +2155,12 @@ var SDK = /*#__PURE__*/function () {
2097
2155
  url,
2098
2156
  method,
2099
2157
  options,
2100
- _args29 = arguments;
2101
- return _regenerator["default"].wrap(function _callee29$(_context29) {
2158
+ _args30 = arguments;
2159
+ return _regenerator["default"].wrap(function _callee30$(_context30) {
2102
2160
  while (1) {
2103
- switch (_context29.prev = _context29.next) {
2161
+ switch (_context30.prev = _context30.next) {
2104
2162
  case 0:
2105
- secondaryChannelEventOptionalParams = _args29.length > 2 && _args29[2] !== undefined ? _args29[2] : {};
2163
+ secondaryChannelEventOptionalParams = _args30.length > 2 && _args30[2] !== undefined ? _args30[2] : {};
2106
2164
  timer = _Timer.Timer.TIMER();
2107
2165
  this.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSTARTED, "Secondary Channel Event Request Started", requestId);
2108
2166
  requestPath = "/".concat(_OmnichannelEndpoints["default"].LiveChatSecondaryChannelEventPath, "/").concat(this.omnichannelConfiguration.orgId, "/").concat(this.omnichannelConfiguration.widgetId, "/").concat(requestId);
@@ -2131,22 +2189,22 @@ var SDK = /*#__PURE__*/function () {
2131
2189
  headers: headers,
2132
2190
  method: method,
2133
2191
  url: url,
2134
- timeout: (_this$configuration$d15 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d15 !== void 0 ? _this$configuration$d15 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
2192
+ timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.makeSecondaryChannelEventRequest
2135
2193
  };
2136
- return _context29.abrupt("return", new Promise( /*#__PURE__*/function () {
2137
- var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee28(resolve, reject) {
2138
- var response, _headers12, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds15;
2194
+ return _context30.abrupt("return", new Promise( /*#__PURE__*/function () {
2195
+ var _ref14 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee29(resolve, reject) {
2196
+ var response, _headers12, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds16;
2139
2197
 
2140
- return _regenerator["default"].wrap(function _callee28$(_context28) {
2198
+ return _regenerator["default"].wrap(function _callee29$(_context29) {
2141
2199
  while (1) {
2142
- switch (_context28.prev = _context28.next) {
2200
+ switch (_context29.prev = _context29.next) {
2143
2201
  case 0:
2144
- _context28.prev = 0;
2145
- _context28.next = 3;
2202
+ _context29.prev = 0;
2203
+ _context29.next = 3;
2146
2204
  return axiosInstance(options);
2147
2205
 
2148
2206
  case 3:
2149
- response = _context28.sent;
2207
+ response = _context29.sent;
2150
2208
  _headers12 = response.headers;
2151
2209
 
2152
2210
  _this15.setAuthCodeNonce(_headers12);
@@ -2156,28 +2214,28 @@ var SDK = /*#__PURE__*/function () {
2156
2214
  _this15.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTSUCCEEDED, "Secondary Channel Event Request Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2157
2215
 
2158
2216
  resolve();
2159
- _context28.next = 17;
2217
+ _context29.next = 17;
2160
2218
  break;
2161
2219
 
2162
2220
  case 11:
2163
- _context28.prev = 11;
2164
- _context28.t0 = _context28["catch"](0);
2165
- _elapsedTimeInMilliseconds15 = timer.milliSecondsElapsed;
2221
+ _context29.prev = 11;
2222
+ _context29.t0 = _context29["catch"](0);
2223
+ _elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
2166
2224
 
2167
- _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds15, requestPath, method, _context28.t0);
2225
+ _this15.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SECONDARYCHANNELEVENTREQUESTFAILED, "Secondary Channel Event Request Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context29.t0);
2168
2226
 
2169
- if ((0, _isExpectedAxiosError["default"])(_context28.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2227
+ if ((0, _isExpectedAxiosError["default"])(_context29.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2170
2228
  (0, _throwClientHTTPError["default"])();
2171
2229
  }
2172
2230
 
2173
- reject(_context28.t0);
2231
+ reject(_context29.t0);
2174
2232
 
2175
2233
  case 17:
2176
2234
  case "end":
2177
- return _context28.stop();
2235
+ return _context29.stop();
2178
2236
  }
2179
2237
  }
2180
- }, _callee28, null, [[0, 11]]);
2238
+ }, _callee29, null, [[0, 11]]);
2181
2239
  }));
2182
2240
 
2183
2241
  return function (_x50, _x51) {
@@ -2187,10 +2245,10 @@ var SDK = /*#__PURE__*/function () {
2187
2245
 
2188
2246
  case 16:
2189
2247
  case "end":
2190
- return _context29.stop();
2248
+ return _context30.stop();
2191
2249
  }
2192
2250
  }
2193
- }, _callee29, this);
2251
+ }, _callee30, this);
2194
2252
  }));
2195
2253
 
2196
2254
  function makeSecondaryChannelEventRequest(_x48, _x49) {
@@ -2206,8 +2264,8 @@ var SDK = /*#__PURE__*/function () {
2206
2264
  }, {
2207
2265
  key: "sendTypingIndicator",
2208
2266
  value: function () {
2209
- var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(requestId, currentLiveChatVersion) {
2210
- var _this$configuration$d16,
2267
+ var _sendTypingIndicator = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee32(requestId, currentLiveChatVersion) {
2268
+ var _this$configuration$d17,
2211
2269
  _this16 = this;
2212
2270
 
2213
2271
  var sendTypingIndicatorOptionalParams,
@@ -2219,26 +2277,26 @@ var SDK = /*#__PURE__*/function () {
2219
2277
  url,
2220
2278
  method,
2221
2279
  options,
2222
- _args31 = arguments;
2223
- return _regenerator["default"].wrap(function _callee31$(_context31) {
2280
+ _args32 = arguments;
2281
+ return _regenerator["default"].wrap(function _callee32$(_context32) {
2224
2282
  while (1) {
2225
- switch (_context31.prev = _context31.next) {
2283
+ switch (_context32.prev = _context32.next) {
2226
2284
  case 0:
2227
- sendTypingIndicatorOptionalParams = _args31.length > 2 && _args31[2] !== undefined ? _args31[2] : {};
2285
+ sendTypingIndicatorOptionalParams = _args32.length > 2 && _args32[2] !== undefined ? _args32[2] : {};
2228
2286
 
2229
2287
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2230
- _context31.next = 3;
2288
+ _context32.next = 3;
2231
2289
  break;
2232
2290
  }
2233
2291
 
2234
- return _context31.abrupt("return", Promise.resolve());
2292
+ return _context32.abrupt("return", Promise.resolve());
2235
2293
 
2236
2294
  case 3:
2237
2295
  timer = _Timer.Timer.TIMER();
2238
2296
  customerDisplayName = sendTypingIndicatorOptionalParams.customerDisplayName;
2239
2297
 
2240
2298
  if (!(!currentLiveChatVersion || currentLiveChatVersion !== _Enums.LiveChatVersion.V2)) {
2241
- _context31.next = 7;
2299
+ _context32.next = 7;
2242
2300
  break;
2243
2301
  }
2244
2302
 
@@ -2261,49 +2319,49 @@ var SDK = /*#__PURE__*/function () {
2261
2319
  headers: headers,
2262
2320
  method: method,
2263
2321
  url: url,
2264
- timeout: (_this$configuration$d16 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d16 !== void 0 ? _this$configuration$d16 : this.configuration.requestTimeoutConfig.sendTypingIndicator
2322
+ timeout: (_this$configuration$d17 = this.configuration.defaultRequestTimeout) !== null && _this$configuration$d17 !== void 0 ? _this$configuration$d17 : this.configuration.requestTimeoutConfig.sendTypingIndicator
2265
2323
  };
2266
- return _context31.abrupt("return", new Promise( /*#__PURE__*/function () {
2267
- var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee30(resolve, reject) {
2268
- var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds16;
2324
+ return _context32.abrupt("return", new Promise( /*#__PURE__*/function () {
2325
+ var _ref15 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee31(resolve, reject) {
2326
+ var response, elapsedTimeInMilliseconds, _elapsedTimeInMilliseconds17;
2269
2327
 
2270
- return _regenerator["default"].wrap(function _callee30$(_context30) {
2328
+ return _regenerator["default"].wrap(function _callee31$(_context31) {
2271
2329
  while (1) {
2272
- switch (_context30.prev = _context30.next) {
2330
+ switch (_context31.prev = _context31.next) {
2273
2331
  case 0:
2274
- _context30.prev = 0;
2275
- _context30.next = 3;
2332
+ _context31.prev = 0;
2333
+ _context31.next = 3;
2276
2334
  return axiosInstance(options);
2277
2335
 
2278
2336
  case 3:
2279
- response = _context30.sent;
2337
+ response = _context31.sent;
2280
2338
  elapsedTimeInMilliseconds = timer.milliSecondsElapsed;
2281
2339
 
2282
2340
  _this16.logWithLogger(_LogLevel.LogLevel.INFO, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORSUCCEEDED, "Send Typing Indicator Succeeded", requestId, response, elapsedTimeInMilliseconds, requestPath, method);
2283
2341
 
2284
2342
  resolve();
2285
- _context30.next = 15;
2343
+ _context31.next = 15;
2286
2344
  break;
2287
2345
 
2288
2346
  case 9:
2289
- _context30.prev = 9;
2290
- _context30.t0 = _context30["catch"](0);
2291
- _elapsedTimeInMilliseconds16 = timer.milliSecondsElapsed;
2347
+ _context31.prev = 9;
2348
+ _context31.t0 = _context31["catch"](0);
2349
+ _elapsedTimeInMilliseconds17 = timer.milliSecondsElapsed;
2292
2350
 
2293
- _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds16, requestPath, method, _context30.t0);
2351
+ _this16.logWithLogger(_LogLevel.LogLevel.ERROR, _Enums.OCSDKTelemetryEvent.SENDTYPINGINDICATORFAILED, "Send Typing Indicator Failed", requestId, undefined, _elapsedTimeInMilliseconds17, requestPath, method, _context31.t0);
2294
2352
 
2295
- if ((0, _isExpectedAxiosError["default"])(_context30.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2353
+ if ((0, _isExpectedAxiosError["default"])(_context31.t0, _Constants["default"].axiosTimeoutErrorCode)) {
2296
2354
  (0, _throwClientHTTPError["default"])();
2297
2355
  }
2298
2356
 
2299
- reject(_context30.t0);
2357
+ reject(_context31.t0);
2300
2358
 
2301
2359
  case 15:
2302
2360
  case "end":
2303
- return _context30.stop();
2361
+ return _context31.stop();
2304
2362
  }
2305
2363
  }
2306
- }, _callee30, null, [[0, 9]]);
2364
+ }, _callee31, null, [[0, 9]]);
2307
2365
  }));
2308
2366
 
2309
2367
  return function (_x54, _x55) {
@@ -2313,10 +2371,10 @@ var SDK = /*#__PURE__*/function () {
2313
2371
 
2314
2372
  case 17:
2315
2373
  case "end":
2316
- return _context31.stop();
2374
+ return _context32.stop();
2317
2375
  }
2318
2376
  }
2319
- }, _callee31, this);
2377
+ }, _callee32, this);
2320
2378
  }));
2321
2379
 
2322
2380
  function sendTypingIndicator(_x52, _x53) {
@@ -2419,4 +2477,4 @@ exports["default"] = SDK;
2419
2477
  useUnauthReconnectIdSigQueryParam: false,
2420
2478
  waitTimeBetweenRetriesConfig: _waitTimeBetweenRetriesConfigs.waitTimeBetweenRetriesConfigs
2421
2479
  });
2422
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJyZXF1ZXN0SWQiLCJieXBhc3NDYWNoZSIsInRpbWVyIiwiVGltZXIiLCJUSU1FUiIsImxvZ1dpdGhMb2dnZXIiLCJMb2dMZXZlbCIsIklORk8iLCJPQ1NES1RlbGVtZXRyeUV2ZW50IiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxpdmVDaGF0Q29uZmlnUGF0aCIsIm9yZ0lkIiwid2lkZ2V0SWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwiYnlwYXNzQ2FjaGVIZWFkZXJzIiwiZ2V0IiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJHRVRDSEFUQ09ORklHU1VDQ0VERUQiLCJHRVRDSEFUQ09ORklHRkFJTEVEIiwidW5kZWZpbmVkIiwiUHJvbWlzZSIsInJlamVjdCIsImdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyIsIkdFVExXSVNUQVRVU1NUQVJURUQiLCJMaXZlQ2hhdExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwiaGVhZGVyT3ZlcndyaXRlcyIsImdldExXSURldGFpbHMiLCJhdXRoZW50aWNhdGVkVXNlclRva2VuIiwicmVjb25uZWN0SWQiLCJkZWZhdWx0SGVhZGVycyIsIkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRoIiwic2V0U2Vzc2lvbklkSGVhZGVyIiwidXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtIiwicGFyYW1zIiwic2lnIiwib3B0aW9ucyIsInJlc29sdmUiLCJzZXRBdXRoQ29kZU5vbmNlIiwiR0VUTFdJU1RBVFVTU1VDQ0VFREVEIiwiRVJST1IiLCJHRVRMV0lTVEFUVVNGQUlMRUQiLCJheGlvc1RpbWVvdXRFcnJvckNvZGUiLCJnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyIsImN1cnJlbnRSZXRyeUNvdW50IiwiY3VycmVudExpdmVDaGF0VmVyc2lvbiIsInJlZnJlc2hUb2tlbiIsIkdFVENIQVRUT0tFTlNUQVJURUQiLCJlbmRwb2ludCIsImdldENoYXRUb2tlbiIsInJldHJ5T240MjkiLCJnZXRDaGF0VG9rZW5SZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuRXJyb3IiLCJ0b0xvd2VyQ2FzZSIsIkdFVENIQVRUT0tFTlNVQ0NFRURFRCIsInN0YXR1cyIsIm5vQ29udGVudFN0YXR1c0NvZGUiLCJHRVRDSEFUVE9LRU5GQUlMRUQiLCJ0b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlIiwiZ2V0Q2hhdFRva2VuUmV0cnlDb3VudCIsImNvZGUiLCJzZXRUaW1lb3V0IiwidGhlbiIsImVycm9yIiwiZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlIiwicmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIiwiR0VUUkVDT05ORUNUQUJMRUNIQVRTIiwiTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRoIiwiZ2V0UmVjb25uZWN0YWJsZUNoYXRzIiwiR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZIiwiTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5IiwiV0FSTiIsInF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQiLCJHZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGgiLCJnZXRBZ2VudEF2YWlsYWJpbGl0eSIsImluaXRDb250ZXh0IiwiZ2V0Q29udGV4dCIsImNhY2hPYmoiLCJjdXN0b21Db250ZXh0RGF0YSIsInRlbXBBcnIiLCJDdXN0b21Db250ZXh0RGF0YSIsInNvcnQiLCJhc3NpZ24iLCJwb3J0YWxjb250YWN0aWQiLCJjYWNoZUtleSIsImhhc2giLCJjcmVhdGVIYXNoIiwidXBkYXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsImRpZ2VzdCIsInRvU3RyaW5nIiwid2luZG93IiwiZG9jdW1lbnQiLCJicm93c2VyIiwiQnJvd3NlckluZm8iLCJnZXRCcm93c2VyTmFtZSIsImRldmljZSIsIkRldmljZUluZm8iLCJnZXREZXZpY2VUeXBlIiwib3JpZ2ludXJsIiwibG9jYXRpb24iLCJocmVmIiwib3MiLCJPU0luZm8iLCJnZXRPc1R5cGUiLCJsb2NhbGUiLCJkZWZhdWx0TG9jYWxlIiwiTG9jYWxlcyIsInN1cHBvcnRlZExvY2FsZXMiLCJHRVRBR0VOVEFWQUlMQUJJTElUWVNVQ0NFRURFRCIsIkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVEIiwic2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05JTklUU1RBUlRFRCIsInNlc3Npb25Jbml0Iiwic2hvdWxkUmV0cnkiLCJzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciIsIkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRoIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRoIiwiU0VTU0lPTklOSVRTVUNDRUVERUQiLCJTRVNTSU9OSU5JVEZBSUxFRCIsInNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zIiwiU0VTU0lPTkNMT1NFU1RBUlRFRCIsIkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aCIsInNlc3Npb25DbG9zZSIsImlzUmVjb25uZWN0Q2hhdCIsImlzUGVyc2lzdGVudENoYXQiLCJjaGF0SWQiLCJMaXZlQ2hhdEF1dGhTZXNzaW9uQ2xvc2VQYXRoIiwiU0VTU0lPTkNMT1NFU1VDQ0VFREVEIiwiU0VTU0lPTkNMT1NFRkFJTEVEIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQiLCJMaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRoIiwidmFsaWRhdGVBdXRoQ2hhdFJlY29yZCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0IiwiYXV0aENoYXRFeGlzdCIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JERkFJTEVEIiwicG9zdENoYXRSZXNwb25zZSIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyIsIlNVQk1JVFBPU1RDSEFUU1RBUlRFRCIsIkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRoIiwic3VibWl0UG9zdENoYXRSZXNwb25zZSIsIkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aCIsIlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVEIiwiU1VCTUlUUE9TVENIQVRGQUlMRUQiLCJzdXJ2ZXlPd25lcklkIiwic3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkiLCJnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMiLCJsb2ciLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCIsIlN1cnZleU93bmVySWQiLCJMaXZlQ2hhdEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwiZ2V0U3VydmV5SW52aXRlTGluayIsIkxpdmVDaGF0QXV0aEdldFN1cnZleUludml0ZUxpbmtQYXRoIiwid2lkZ2V0QXBwSWQiLCJHRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVEIiwiR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCIsInRva2VuIiwiZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMiLCJHRVRDSEFUVFJBTlNDUklQVFNUQVJURUQiLCJMaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aCIsImdldENoYXRUcmFuc2NyaXB0cyIsIm9yZ2FuaXphdGlvbklkIiwiYXV0aG9yaXphdGlvbiIsIkxpdmVDaGF0djJHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkxpdmVDaGF0QXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aCIsIkdFVENIQVRUUkFOU0NSSVBUU1VDQ0VFREVEIiwiR0VUQ0hBVFRSQU5TQ1JJUFRGQUlMRUQiLCJlbWFpbFJlcXVlc3RCb2R5IiwiZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMiLCJFTUFJTFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsImVtYWlsVHJhbnNjcmlwdCIsIkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRoIiwiRU1BSUxUUkFOU0NSSVBUU1VDQ0VFREVEIiwiRU1BSUxUUkFOU0NSSVBURkFJTEVEIiwiRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQiLCJMaXZlQ2hhdEZldGNoRGF0YU1hc2tpbmdJbmZvUGF0aCIsImZldGNoRGF0YU1hc2tpbmdJbmZvIiwiRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCIsIkZFVENIREFUQU1BU0tJTkdGQUlMRUQiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSIsInNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQiLCJMaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdCIsIkxpdmVDaGF0QXV0aFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGgiLCJkZWZhdWx0Q2hhbm5lbElkIiwiU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQiLCJzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMiLCJjdXN0b21lckRpc3BsYXlOYW1lIiwiU2VuZFR5cGluZ0luZGljYXRvclBhdGgiLCJzZW5kVHlwaW5nSW5kaWNhdG9yIiwiU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQiLCJsb2dMZXZlbCIsInRlbGVtZXRyeUV2ZW50VHlwZSIsImRlc2NyaXB0aW9uIiwicmVxdWVzdFBheWxvYWQiLCJMb2dnaW5nU2FuaXRpemVyIiwic3RyaXBFcnJvclNlbnNpdGl2ZVByb3BlcnRpZXMiLCJzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCIsInN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMiLCJwcmVDaGF0UmVzcG9uc2UiLCJzdHJpcFByZUNoYXRSZXNwb25zZSIsInN0cmlwR2VvbG9jYXRpb24iLCJjdXN0b21EYXRhIiwiUmVxdWVzdElkIiwiUmVnaW9uIiwiRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyIsIlRyYW5zYWN0aW9uSWQiLCJ0cmFuc2FjdGlvbmlkIiwiUmVxdWVzdFBhdGgiLCJSZXF1ZXN0TWV0aG9kIiwiUmVzcG9uc2VTdGF0dXNDb2RlIiwiRXhjZXB0aW9uRGV0YWlscyIsIlJlcXVlc3RQYXlsb2FkIiwic3Vic3RyaW5nIiwiZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnIiwid2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBRUE7O0FBQ0E7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBb0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQU9BOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0lBRXFCQSxHO0FBbUNuQixlQUEyQkMsd0JBQTNCLEVBQW1MO0FBQUE7O0FBQUEsUUFBM0ZDLGFBQTJGLHVFQUF4REYsR0FBRyxDQUFDRyxvQkFBb0Q7QUFBQSxRQUF0QkMsTUFBc0I7QUFBQTtBQUFBLFNBQXhKSCx3QkFBd0osR0FBeEpBLHdCQUF3SjtBQUFBLFNBQTNGQyxhQUEyRixHQUEzRkEsYUFBMkY7QUFBQSxTQUF0QkUsTUFBc0IsR0FBdEJBLE1BQXNCO0FBQUE7QUFBQTtBQUFBLCtEQXV0Q3hKLFVBQUNDLE9BQUQsRUFBa0I7QUFDM0MsVUFBSUEsT0FBSixhQUFJQSxPQUFKLGVBQUlBLE9BQU8sQ0FBRUMsYUFBYixFQUE0QjtBQUMxQixRQUFBLEtBQUksQ0FBQ0osYUFBTCxDQUFtQkssYUFBbkIsR0FBbUNGLE9BQW5DLGFBQW1DQSxPQUFuQyx1QkFBbUNBLE9BQU8sQ0FBRUMsYUFBNUM7QUFDRDtBQUNGLEtBM3RDa0w7QUFBQSxpRUE4dEN0SixVQUFDRSxTQUFELEVBQWdDSCxPQUFoQyxFQUFpRDtBQUM1RSxVQUFJRyxTQUFKLEVBQWU7QUFDYkgsUUFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJDLFdBQXhCLENBQVAsR0FBOENGLFNBQTlDO0FBQ0Q7QUFDRixLQWx1Q2tMOztBQUNqTDtBQUNBLFFBQUksQ0FBQ0csTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS1YsYUFBakIsRUFBZ0NXLE1BQWpDLElBQTJDLHlCQUFRWCxhQUFSLE1BQTJCLFFBQTFFLEVBQW9GO0FBQ2xGLFdBQUtBLGFBQUwsR0FBcUJGLEdBQUcsQ0FBQ0csb0JBQXpCO0FBQ0QsS0FKZ0wsQ0FNakw7OztBQUNBLG9DQUFrQlEsTUFBTSxDQUFDQyxJQUFQLENBQVlaLEdBQUcsQ0FBQ0csb0JBQWhCLENBQWxCLGtDQUF5RDtBQUFwRCxVQUFNVyxHQUFHLG1CQUFUOztBQUNILFVBQUksQ0FBQyxLQUFLWixhQUFMLENBQW1CYSxjQUFuQixDQUFrQ0QsR0FBbEMsQ0FBTCxFQUE2QztBQUFFO0FBQzdDLGFBQUtaLGFBQUwsV0FBc0JZLEdBQXRCLEtBQStCZCxHQUFHLENBQUNHLG9CQUFKLFdBQTRCVyxHQUE1QixFQUEvQjtBQUNEO0FBQ0YsS0FYZ0wsQ0Fhakw7OztBQUNBLHNDQUFrQkgsTUFBTSxDQUFDQyxJQUFQLENBQVlaLEdBQUcsQ0FBQ0csb0JBQUosQ0FBeUIsc0JBQXpCLENBQVosQ0FBbEIscUNBQWlGO0FBQTVFLFVBQU1XLElBQUcscUJBQVQ7O0FBQ0gsVUFBSSxDQUFDLEtBQUtaLGFBQUwsQ0FBbUIsc0JBQW5CLEVBQTJDYSxjQUEzQyxDQUEwREQsSUFBMUQsQ0FBTCxFQUFxRTtBQUFFO0FBQ3JFLGFBQUtaLGFBQUwsQ0FBbUIsc0JBQW5CLFlBQThDWSxJQUE5QyxLQUF1RGQsR0FBRyxDQUFDRyxvQkFBSixDQUF5QixzQkFBekIsWUFBb0RXLElBQXBELEVBQXZEO0FBQ0Q7QUFDRixLQWxCZ0wsQ0FvQmpMOzs7QUFDQSxRQUFRRSxTQUFSLEdBQXNCZix3QkFBdEIsQ0FBUWUsU0FBUjs7QUFDQSxRQUFJLENBQUNMLE1BQU0sQ0FBQ00sTUFBUCxDQUFjQyxnQkFBZCxFQUF5QkMsUUFBekIsQ0FBa0NILFNBQWxDLENBQUwsRUFBZ0U7QUFDOUQsWUFBTSxJQUFJSSxLQUFKLHFCQUFOO0FBQ0QsS0F4QmdMLENBMEJqTDs7O0FBQ0EsUUFBTUMseUNBQXlDLEdBQUdWLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZWCx3QkFBWixDQUFsRDs7QUEzQmlMLCtDQTRCL0pxQixzQkFBVUMsMENBNUJxSjtBQUFBOztBQUFBO0FBNEJqTCwwREFBd0U7QUFBQSxZQUE3RFQsS0FBNkQ7O0FBQ3RFLFlBQUksQ0FBQ08seUNBQXlDLENBQUNGLFFBQTFDLENBQW1ETCxLQUFuRCxDQUFMLEVBQThEO0FBQzVELGdCQUFNLElBQUlNLEtBQUosb0JBQXNCTixLQUF0QixtQ0FBTjtBQUNEO0FBQ0Y7QUFoQ2dMO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBa0NqTCxTQUFLVSxlQUFMLEdBQXVCQyx1QkFBZ0JDLEVBQXZDO0FBQ0Q7QUFFRDtBQUNGO0FBQ0E7QUFDQTs7Ozs7O3lHQUNFLGlCQUEyQkMsU0FBM0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUE4Q0MsZ0JBQUFBLFdBQTlDLDJEQUE0RCxLQUE1RDtBQUNRQyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQkMscUJBQXRELEVBQTZFLHlCQUE3RSxFQUF3R1QsU0FBeEc7O0FBQ0Esb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUtVLGdCQUFBQSxXQVBSLGNBTzBCQyxpQ0FBcUJDLGtCQVAvQyxjQU9xRSxLQUFLdEMsd0JBQUwsQ0FBOEJ1QyxLQVBuRyxjQU80RyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQVAxSSx3QkFPZ0tkLFNBUGhLLHdCQU91TCxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBUHJOO0FBUVEwQixnQkFBQUEsTUFSUixHQVFpQixLQVJqQjtBQVNRQyxnQkFBQUEsR0FUUixhQVNpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQVQvQyxTQVN3RFAsV0FUeEQ7QUFVUVEsZ0JBQUFBLGFBVlIsR0FVd0JDLGtCQUFNQyxNQUFOLEVBVnhCO0FBWUUsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJHLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFESjtBQUV4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEQztBQUZwRCxpQkFBMUI7QUFLSS9DLGdCQUFBQSxPQWpCTixHQWlCZ0IsRUFqQmhCOztBQWtCRSxvQkFBSXVCLFdBQUosRUFBaUI7QUFDZnZCLGtCQUFBQSxPQUFPLG1DQUFRaUIsc0JBQVUrQixrQkFBbEIsR0FBeUNoRCxPQUF6QyxDQUFQO0FBQ0Q7O0FBcEJIO0FBQUE7QUFBQSx1QkF1QjJCd0MsYUFBYSxDQUFDUyxHQUFkLENBQWtCWCxHQUFsQixFQUF1QjtBQUM1Q3RDLGtCQUFBQSxPQUFPLEVBQVBBLE9BRDRDO0FBRTVDa0Qsa0JBQUFBLE9BQU8sMkJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIseUVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDTDtBQUZqRCxpQkFBdkIsQ0F2QjNCOztBQUFBO0FBdUJVTSxnQkFBQUEsUUF2QlY7QUEyQlVDLGdCQUFBQSx5QkEzQlYsR0EyQnNDOUIsS0FBSyxDQUFDK0IsbUJBM0I1QztBQTRCWUMsZ0JBQUFBLElBNUJaLEdBNEJxQkgsUUE1QnJCLENBNEJZRyxJQTVCWjs7QUE4Qkksb0JBQUlBLElBQUksQ0FBQ3BDLGVBQVQsRUFBMEI7QUFDeEIsdUJBQUtELGVBQUwsR0FBdUJxQyxJQUFJLENBQUNwQyxlQUE1QjtBQUNEOztBQUVEb0MsZ0JBQUFBLElBQUksQ0FBQ3hELE9BQUwsR0FBZSxFQUFmOztBQUNBLG9CQUFJcUQsUUFBUSxDQUFDckQsT0FBVCxJQUFvQnFELFFBQVEsQ0FBQ3JELE9BQVQsQ0FBaUIsTUFBakIsQ0FBeEIsRUFBa0Q7QUFDaER3RCxrQkFBQUEsSUFBSSxDQUFDeEQsT0FBTCxDQUFhLE1BQWIsSUFBdUJxRCxRQUFRLENBQUNyRCxPQUFULENBQWlCLE1BQWpCLENBQXZCO0FBQ0Q7O0FBQ0QscUJBQUsyQixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjJCLHFCQUF0RCxFQUE2RSwyQkFBN0UsRUFBMEduQyxTQUExRyxFQUFxSCtCLFFBQXJILEVBQStIQyx5QkFBL0gsRUFDRXRCLFdBREYsRUFDZUssTUFEZjtBQXRDSixpREF5Q1dtQixJQXpDWDs7QUFBQTtBQUFBO0FBQUE7QUEyQ1VGLGdCQUFBQSwwQkEzQ1YsR0EyQ3NDOUIsS0FBSyxDQUFDK0IsbUJBM0M1QztBQTRDSSxxQkFBSzVCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEIsbUJBQXRELEVBQTJFLHdCQUEzRSxFQUFxR3BDLFNBQXJHLEVBQWdIcUMsU0FBaEgsRUFBMkhMLDBCQUEzSCxFQUNFdEIsV0FERixFQUNlSyxNQURmO0FBNUNKLGlEQThDV3VCLE9BQU8sQ0FBQ0MsTUFBUixhQTlDWDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQWtEQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt5R0FDRSxrQkFBMkJ2QyxTQUEzQjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBOEN3QyxnQkFBQUEsMkJBQTlDLDhEQUEwRyxFQUExRztBQUNRdEMsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JpQyxtQkFBdEQsRUFBMkUseUJBQTNFLEVBQXNHekMsU0FBdEc7O0FBRUEsb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0QsaUJBTkgsQ0FRRTs7O0FBQ0lVLGdCQUFBQSxXQVROLGNBU3dCQyxpQ0FBcUIrQiwrQkFUN0MsY0FTZ0YsS0FBS3BFLHdCQUFMLENBQThCdUMsS0FUOUcsY0FTdUgsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFUckosY0FTaUtkLFNBVGpLO0FBVVFrQixnQkFBQUEsYUFWUixHQVV3QkMsa0JBQU1DLE1BQU4sRUFWeEI7QUFZRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFeUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUM3RCxtQ0FBdUJGLGFBQXhCLENBQXBCO0FBQ3hCeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDLDBCQURKO0FBRXhCQyxrQkFBQUEsMEJBQTBCLEVBQUUsS0FBS2hELGFBQUwsQ0FBbUJpRCw0QkFBbkIsQ0FBZ0RvQjtBQUZwRCxpQkFBMUIsRUFaRixDQWlCRTs7QUFDUUMsZ0JBQUFBLHNCQWxCVixHQWtCa0RMLDJCQWxCbEQsQ0FrQlVLLHNCQWxCVixFQWtCa0NDLFdBbEJsQyxHQWtCa0ROLDJCQWxCbEQsQ0FrQmtDTSxXQWxCbEM7QUFtQlFwRSxnQkFBQUEsT0FuQlIsR0FtQjZCaUIsc0JBQVVvRCxjQW5CdkMsRUFxQkU7O0FBQ0Esb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCbkMsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCcUMsbUNBQTVCLGNBQW1FLEtBQUsxRSx3QkFBTCxDQUE4QnVDLEtBQWpHLGNBQTBHLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBQXhJLGNBQW9KZCxTQUFwSixDQUFYO0FBQ0F0QixrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUIrRCxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0FuRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJGLGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDRDs7QUFFRCxxQkFBS3FFLGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7O0FBRUEsb0JBQUksQ0FBQyxLQUFLSCxhQUFMLENBQW1CMkUsaUNBQXhCLEVBQTJEO0FBQ3pEO0FBQ0Esc0JBQUlKLFdBQUosRUFBaUI7QUFDZnBDLG9CQUFBQSxXQUFXLGVBQVFvQyxXQUFSLENBQVg7QUFDRDtBQUNGOztBQUVLSyxnQkFBQUEsTUFyQ1IsR0FxQzRDO0FBQ3hDOUQsa0JBQUFBLFNBQVMsRUFBRSxLQUFLZix3QkFBTCxDQUE4QmU7QUFERCxpQkFyQzVDOztBQXlDRSxvQkFBSSxLQUFLZCxhQUFMLENBQW1CMkUsaUNBQXZCLEVBQTBEO0FBQ3hELHNCQUFJSixXQUFKLEVBQWlCO0FBQ2ZLLG9CQUFBQSxNQUFNLENBQUNDLEdBQVAsR0FBYU4sV0FBYjtBQUNEO0FBQ0Y7O0FBRUs5QixnQkFBQUEsR0EvQ1IsYUErQ2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BL0MvQyxTQStDd0RQLFdBL0N4RDtBQWdEUUssZ0JBQUFBLE1BaERSLEdBZ0RpQixLQWhEakI7QUFpRFFzQyxnQkFBQUEsT0FqRFIsR0FpRHNDO0FBQ2xDM0Usa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENtQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUprQztBQUtsQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtyRCxhQUFMLENBQW1Cc0QscUJBQXJCLDJFQUE4QyxLQUFLdEQsYUFBTCxDQUFtQnVELG9CQUFuQixDQUF3Q2M7QUFMM0QsaUJBakR0QztBQUFBLGtEQXlEUyxJQUFJTixPQUFKO0FBQUEsMkdBQVksa0JBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRckIsYUFBYSxDQUFDbUMsT0FBRCxDQUZyQjs7QUFBQTtBQUVUdEIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21COUIsS0FBSyxDQUFDK0IsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSVdILFFBSlgsQ0FJUEcsSUFKTyxFQUlEeEQsUUFKQyxHQUlXcUQsUUFKWCxDQUlEckQsT0FKQzs7QUFLZiw0QkFBQSxNQUFJLENBQUM2RSxnQkFBTCxDQUFzQjdFLFFBQXRCOztBQUVBLDRCQUFBLE1BQUksQ0FBQzJCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CZ0QscUJBQXRELEVBQTZFLDJCQUE3RSxFQUEwR3hELFNBQTFHLEVBQXFIK0IsUUFBckgsRUFBK0hDLHlCQUEvSCxFQUEwSnRCLFdBQTFKLEVBQXVLSyxNQUF2Szs7QUFDQXVDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFSZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVdURiw0QkFBQUEsMkJBWFMsR0FXbUI5QixLQUFLLENBQUMrQixtQkFYekI7O0FBWWYsNEJBQUEsTUFBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNtRCxLQUE1QixFQUFtQ2pELDJCQUFvQmtELGtCQUF2RCxFQUEyRSx3QkFBM0UsRUFBcUcxRCxTQUFyRyxFQUFnSHFDLFNBQWhILEVBQTJITCwyQkFBM0gsRUFBc0p0QixXQUF0SixFQUFtS0ssTUFBbks7O0FBQ0EsZ0NBQUksb0RBQTRCcEIsc0JBQVVnRSxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sY0FBTjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBekRUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBNkVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O3dHQUNFLGtCQUEwQnZDLFNBQTFCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDNEQsZ0JBQUFBLDBCQUE3Qyw4REFBdUcsRUFBdkc7QUFBMkdDLGdCQUFBQSxpQkFBM0csOERBQXVJLENBQXZJO0FBQTZLO0FBQ3JLM0QsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFVTBDLGdCQUFBQSxXQUZWLEdBRXdGYywwQkFGeEYsQ0FFVWQsV0FGVixFQUV1QkQsc0JBRnZCLEdBRXdGZSwwQkFGeEYsQ0FFdUJmLHNCQUZ2QixFQUUrQ2lCLHNCQUYvQyxHQUV3RkYsMEJBRnhGLENBRStDRSxzQkFGL0MsRUFFdUVDLFlBRnZFLEdBRXdGSCwwQkFGeEYsQ0FFdUVHLFlBRnZFO0FBR0UscUJBQUsxRCxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQndELG1CQUF0RCxFQUEyRSx3QkFBM0UsRUFBcUdoRSxTQUFyRzs7QUFIRixzQkFLTTZELGlCQUFpQixHQUFHLENBTDFCO0FBQUE7QUFBQTtBQUFBOztBQUFBLHNCQU1VLElBQUlwRSxLQUFKLDZCQU5WOztBQUFBO0FBU0Usb0JBQUksQ0FBQ08sU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUt0QixnQkFBQUEsT0FiUixHQWE2QmlCLHNCQUFVb0QsY0FidkM7QUFlUWtCLGdCQUFBQSxRQWZSLEdBZW1CLG1EQUEyQkgsc0JBQXNCLElBQXVCLEtBQUtqRSxlQUE3RSxFQUE4RmdELHNCQUFzQixHQUFHLElBQUgsR0FBVSxLQUE5SCxDQWZuQjs7QUFpQkUsb0JBQUlBLHNCQUFKLEVBQTRCO0FBQzFCbkUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCK0Qsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBbkUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUc4QixnQkFBQUEsV0F0Qk4sY0FzQndCdUQsUUF0QnhCLGNBc0JvQyxLQUFLM0Ysd0JBQUwsQ0FBOEJ1QyxLQXRCbEUsY0FzQjJFLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBdEJ6RyxjQXNCcUhkLFNBdEJySDs7QUF3QkUsb0JBQUksQ0FBQyxLQUFLekIsYUFBTCxDQUFtQjJFLGlDQUF4QixFQUEyRDtBQUN6RCxzQkFBSUosV0FBSixFQUFpQjtBQUNmcEMsb0JBQUFBLFdBQVcsZUFBUW9DLFdBQVIsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUtLLGdCQUFBQSxNQTlCUixHQThCNEM7QUFDeEM5RCxrQkFBQUEsU0FBUyxFQUFFLEtBQUtmLHdCQUFMLENBQThCZTtBQURELGlCQTlCNUM7O0FBa0NFLG9CQUFJMEUsWUFBSixFQUFrQjtBQUNoQlosa0JBQUFBLE1BQU0sQ0FBQ1ksWUFBUCxHQUFzQixNQUF0QjtBQUNEOztBQUVELG9CQUFJLEtBQUt4RixhQUFMLENBQW1CMkUsaUNBQXZCLEVBQTBEO0FBQ3hELHNCQUFJSixXQUFKLEVBQWlCO0FBQ2ZLLG9CQUFBQSxNQUFNLENBQUNDLEdBQVAsR0FBYU4sV0FBYjtBQUNEO0FBQ0Y7O0FBRUs5QixnQkFBQUEsR0E1Q1IsYUE0Q2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BNUMvQyxTQTRDd0RQLFdBNUN4RDtBQTZDUUssZ0JBQUFBLE1BN0NSLEdBNkNpQixLQTdDakI7QUE4Q1FzQyxnQkFBQUEsT0E5Q1IsR0E4Q3NDO0FBQ2xDM0Usa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENtQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUprQztBQUtsQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtyRCxhQUFMLENBQW1Cc0QscUJBQXJCLDJFQUE4QyxLQUFLdEQsYUFBTCxDQUFtQnVELG9CQUFuQixDQUF3Q29DO0FBTDNELGlCQTlDdEM7QUFzRFFoRCxnQkFBQUEsYUF0RFIsR0FzRHdCQyxrQkFBTUMsTUFBTixFQXREeEI7QUF3REUsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJ5QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzdELG1DQUF1QkYsYUFBeEIsQ0FETTtBQUV4QnlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFGSjtBQUd4QjZDLGtCQUFBQSxVQUFVLEVBQUUsS0FBSzVGLGFBQUwsQ0FBbUI2RixzQkFIUDtBQUl4QjdDLGtCQUFBQSwwQkFBMEIsRUFBRSxLQUFLaEQsYUFBTCxDQUFtQmlELDRCQUFuQixDQUFnRDBDO0FBSnBELGlCQUExQjtBQXhERixrREErRFMsSUFBSTVCLE9BQUo7QUFBQSw0R0FBWSxrQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDakI7QUFDSThCLDRCQUFBQSxpQkFGYSxHQUVXaEMsU0FGWDtBQUFBO0FBQUE7QUFBQSxtQ0FJUW5CLGFBQWEsQ0FBQ21DLE9BQUQsQ0FKckI7O0FBQUE7QUFJVHRCLDRCQUFBQSxRQUpTO0FBS1RDLDRCQUFBQSx5QkFMUyxHQUttQjlCLEtBQUssQ0FBQytCLG1CQUx6QjtBQU1QQyw0QkFBQUEsSUFOTyxHQU1XSCxRQU5YLENBTVBHLElBTk8sRUFNRHhELFNBTkMsR0FNV3FELFFBTlgsQ0FNRHJELE9BTkM7O0FBT2YsNEJBQUEsTUFBSSxDQUFDNkUsZ0JBQUwsQ0FBc0I3RSxTQUF0Qjs7QUFFQSxnQ0FBSUEsU0FBSixFQUFhO0FBQ1gsa0NBQUlBLFNBQU8sQ0FBQ0ksbUNBQXVCQyxXQUF2QixDQUFtQ3VGLFdBQW5DLEVBQUQsQ0FBWCxFQUErRDtBQUM3RCxnQ0FBQSxNQUFJLENBQUN6RixTQUFMLEdBQWlCSCxTQUFPLENBQUNJLG1DQUF1QkMsV0FBdkIsQ0FBbUN1RixXQUFuQyxFQUFELENBQXhCO0FBQ0Q7QUFDRiw2QkFiYyxDQWVmOzs7QUFmZSxpQ0FnQlhwQyxJQWhCVztBQUFBO0FBQUE7QUFBQTs7QUFpQmJBLDRCQUFBQSxJQUFJLENBQUNsQyxTQUFMLEdBQWlCQSxTQUFqQjs7QUFDQSw0QkFBQSxNQUFJLENBQUNLLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CK0QscUJBQXRELEVBQTZFLDBCQUE3RSxFQUF5R3ZFLFNBQXpHLEVBQW9IK0IsUUFBcEgsRUFBOEhDLHlCQUE5SCxFQUF5SnRCLFdBQXpKLEVBQXNLSyxNQUF0Szs7QUFDQXVDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFuQmE7O0FBQUE7QUFBQSxrQ0F3QlhZLFdBQVcsSUFBSWYsUUFBUSxDQUFDeUMsTUFBVCxLQUFvQjdFLHNCQUFVOEUsbUJBeEJsQztBQUFBO0FBQUE7QUFBQTs7QUF5QmJsQyw0QkFBQUEsTUFBTSxDQUFDUixRQUFELENBQU47QUF6QmE7O0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQThCVEMsNEJBQUFBLDJCQTlCUyxHQThCbUI5QixLQUFLLENBQUMrQixtQkE5QnpCOztBQStCZiw0QkFBQSxNQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU21ELEtBQTVCLEVBQW1DakQsMkJBQW9Ca0Usa0JBQXZELEVBQTJFLHVCQUEzRSxFQUFvRzFFLFNBQXBHLEVBQStHcUMsU0FBL0csRUFBMEhMLDJCQUExSCxFQUFxSnRCLFdBQXJKLEVBQWtLSyxNQUFsSzs7QUFDQXNELDRCQUFBQSxpQkFBaUIsZUFBakIsQ0FoQ2UsQ0FrQ2Y7O0FBbENlLGtDQW1DWCwyQkFBZXRDLFFBQWYsd0RBQXlCeUMsTUFBekIsTUFBb0M3RSxzQkFBVWdGLHlCQUE5QyxJQUEyRSxDQUFDLE1BQUksQ0FBQ3BHLGFBQUwsQ0FBbUI2RixzQkFuQ3BGO0FBQUE7QUFBQTtBQUFBOztBQW1DOEc7QUFDM0g3Qiw0QkFBQUEsTUFBTSxjQUFOO0FBcENhOztBQUFBO0FBQUEsa0NBNENic0IsaUJBQWlCLEdBQUcsQ0FBcEIsSUFBeUIsTUFBSSxDQUFDdEYsYUFBTCxDQUFtQnFHLHNCQTVDL0I7QUFBQTtBQUFBO0FBQUE7O0FBNkNmLGdDQUFJUCxpQkFBaUIsSUFBSUEsaUJBQWlCLENBQUNRLElBQWxCLElBQTBCbEYsc0JBQVVnRSxxQkFBN0QsRUFBb0Y7QUFDbEY7QUFDRCw2QkFGRCxNQUVPO0FBQ0xwQiw4QkFBQUEsTUFBTSxDQUFDOEIsaUJBQUQsQ0FBTjtBQUNEOztBQWpEYzs7QUFBQTtBQXFEakI7QUFDQVMsNEJBQUFBLFVBQVUsQ0FBQyxZQUFNO0FBQ2YsOEJBQUEsTUFBSSxDQUFDWixZQUFMLENBQWtCbEUsU0FBbEIsRUFBNkI0RCwwQkFBN0IsRUFBeURDLGlCQUFpQixHQUFHLENBQTdFLEVBQWdGa0IsSUFBaEYsQ0FBcUYsVUFBQ2hELFFBQUQ7QUFBQSx1Q0FBY3VCLE9BQU8sQ0FBQ3ZCLFFBQUQsQ0FBckI7QUFBQSwrQkFBckYsV0FBNEgsVUFBQ2lELEtBQUQ7QUFBQSx1Q0FBV3pDLE1BQU0sQ0FBQ3lDLEtBQUQsQ0FBakI7QUFBQSwrQkFBNUg7QUFDRCw2QkFGUyxFQUVQLE1BQUksQ0FBQ3pHLGFBQUwsQ0FBbUIwRyx1Q0FGWixDQUFWOztBQXREaUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBL0RUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBMkhBO0FBQ0Y7QUFDQTtBQUNBOzs7OztpSEFDRSxrQkFBbUNDLHdCQUFuQztBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNRaEYsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFVXlDLGdCQUFBQSxzQkFGVixHQUVxQ3FDLHdCQUZyQyxDQUVVckMsc0JBRlY7QUFHRSxxQkFBS3hDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CMkUscUJBQXRELEVBQTZFLGdDQUE3RTtBQUVNekUsZ0JBQUFBLFdBTFIsY0FLMEJDLGlDQUFxQnlFLGlDQUwvQyxjQUtvRixLQUFLOUcsd0JBQUwsQ0FBOEJ1QyxLQUxsSCxjQUsySCxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUx6SixjQUtxSyxLQUFLeEMsd0JBQUwsQ0FBOEJ1QyxLQUxuTSx3QkFLc04sS0FBS3ZDLHdCQUFMLENBQThCZSxTQUxwUDtBQU1RWCxnQkFBQUEsT0FOUixHQU02QmlCLHNCQUFVb0QsY0FOdkM7QUFPRXJFLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUVBLHFCQUFLcUUsa0JBQUwsQ0FBd0IsS0FBS3BFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNc0MsZ0JBQUFBLEdBWlIsYUFZaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUFaL0MsU0FZd0RQLFdBWnhEO0FBYVFLLGdCQUFBQSxNQWJSLEdBYWlCLEtBYmpCO0FBY1FzQyxnQkFBQUEsT0FkUixHQWNzQztBQUNsQzNFLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFGa0M7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSGtDO0FBSWxDWSxrQkFBQUEsT0FBTyw0QkFBRSxLQUFLckQsYUFBTCxDQUFtQnNELHFCQUFyQiwyRUFBOEMsS0FBS3RELGFBQUwsQ0FBbUJ1RCxvQkFBbkIsQ0FBd0N1RDtBQUozRCxpQkFkdEM7QUFxQlFuRSxnQkFBQUEsYUFyQlIsR0FxQndCQyxrQkFBTUMsTUFBTixFQXJCeEI7QUF1QlFwQixnQkFBQUEsU0F2QlIsR0F1Qm9CLEtBQUsxQix3QkFBTCxDQUE4QnVDLEtBdkJsRDtBQUFBLGtEQXlCUyxJQUFJeUIsT0FBSjtBQUFBLDRHQUFZLGtCQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1RDLDRCQUFBQSx5QkFIUyxHQUdtQjlCLEtBQUssQ0FBQytCLG1CQUh6QjtBQUlQQyw0QkFBQUEsSUFKTyxHQUlXSCxRQUpYLENBSVBHLElBSk8sRUFJRHhELFNBSkMsR0FJV3FELFFBSlgsQ0FJRHJELE9BSkM7O0FBS2YsNEJBQUEsTUFBSSxDQUFDNkUsZ0JBQUwsQ0FBc0I3RSxTQUF0QixFQUxlLENBT2Y7OztBQVBlLGlDQVFYd0QsSUFSVztBQUFBO0FBQUE7QUFBQTs7QUFTYiw0QkFBQSxNQUFJLENBQUM3QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjJFLHFCQUF0RCxFQUE2RSw0REFBN0UsRUFBMkluRixTQUEzSSxFQUFzSitCLFFBQXRKLEVBQWdLQyx5QkFBaEssRUFBMkx0QixXQUEzTCxFQUF3TUssTUFBeE07O0FBRUF1Qyw0QkFBQUEsT0FBTyxDQUFDcEIsSUFBRCxDQUFQO0FBWGE7O0FBQUE7QUFjZjtBQUNBb0IsNEJBQUFBLE9BQU87QUFmUTs7QUFBQTtBQUFBO0FBQUE7QUFrQlR0Qiw0QkFBQUEsMkJBbEJTLEdBa0JtQjlCLEtBQUssQ0FBQytCLG1CQWxCekI7O0FBbUJmLDRCQUFBLE1BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0IyRSxxQkFBdkQsRUFBOEUsZ0NBQTlFLEVBQWdIbkYsU0FBaEgsRUFBMkhxQyxTQUEzSCxFQUFzSUwsMkJBQXRJLEVBQWlLdEIsV0FBakssRUFBOEtLLE1BQTlLOztBQUNBLGdDQUFJLG9EQUE0QnBCLHNCQUFVZ0UscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGNBQU47QUF2QmU7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBekJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBc0RBO0FBQ0Y7QUFDQTtBQUNBOzs7OztvSEFDRSxrQkFBc0NPLFdBQXRDO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1E1QyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjhFLHdCQUF0RCxFQUFnRix3Q0FBaEY7QUFFTTVFLGdCQUFBQSxXQUpSLGNBSTBCQyxpQ0FBcUI0RSxpQ0FKL0MsY0FJb0YsS0FBS2pILHdCQUFMLENBQThCdUMsS0FKbEgsY0FJMkgsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFKekosY0FJcUtnQyxXQUpySztBQUtRcEUsZ0JBQUFBLE9BTFIsR0FLNkJpQixzQkFBVW9ELGNBTHZDO0FBT0UscUJBQUtFLGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7QUFFTXNDLGdCQUFBQSxHQVRSLGFBU2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BVC9DLFNBU3dEUCxXQVR4RDtBQVVRSyxnQkFBQUEsTUFWUixHQVVpQixLQVZqQjtBQVdRc0MsZ0JBQUFBLE9BWFIsR0FXc0M7QUFDbEMzRSxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1ksa0JBQUFBLE9BQU8sNEJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsMkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDMEQ7QUFKM0QsaUJBWHRDO0FBa0JRdEUsZ0JBQUFBLGFBbEJSLEdBa0J3QkMsa0JBQU1DLE1BQU4sRUFsQnhCO0FBQUEsa0RBbUJTLElBQUlrQixPQUFKO0FBQUEsNEdBQVksa0JBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRckIsYUFBYSxDQUFDbUMsT0FBRCxDQUZyQjs7QUFBQTtBQUVUdEIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21COUIsS0FBSyxDQUFDK0IsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSUVILFFBSkYsQ0FJUEcsSUFKTzs7QUFBQSxpQ0FLWEEsSUFMVztBQUFBO0FBQUE7QUFBQTs7QUFNYiw0QkFBQSxNQUFJLENBQUM3QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQjhFLHdCQUF0RCxFQUFnRixzQ0FBaEYsRUFBd0hqRCxTQUF4SCxFQUFtSU4sUUFBbkksRUFBNklDLHlCQUE3SSxFQUF3S3RCLFdBQXhLLEVBQXFMSyxNQUFyTDs7QUFFQXVDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFSYTs7QUFBQTtBQVdmO0FBQ0EsNEJBQUEsTUFBSSxDQUFDN0IsYUFBTCxDQUFtQkMsbUJBQVNtRixJQUE1QixFQUFrQ2pGLDJCQUFvQjhFLHdCQUF0RCxFQUFnRix1REFBaEYsRUFBeUlqRCxTQUF6SSxFQUFvSk4sUUFBcEosRUFBOEpDLHlCQUE5SixFQUF5THRCLFdBQXpMLEVBQXNNSyxNQUF0TTs7QUFFQXVDLDRCQUFBQSxPQUFPO0FBZFE7O0FBQUE7QUFBQTtBQUFBO0FBaUJUdEIsNEJBQUFBLDJCQWpCUyxHQWlCbUI5QixLQUFLLENBQUMrQixtQkFqQnpCOztBQWtCZiw0QkFBQSxNQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU21ELEtBQTVCLEVBQW1DakQsMkJBQW9COEUsd0JBQXZELEVBQWlGLG1DQUFqRixFQUFzSGpELFNBQXRILEVBQWlJQSxTQUFqSSxFQUE0SUwsMkJBQTVJLEVBQXVLdEIsV0FBdkssRUFBb0xLLE1BQXBMOztBQUNBLGdDQUFJLG9EQUE0QnBCLHNCQUFVZ0UscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGNBQU47QUF0QmU7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBbkJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBK0NBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O2dIQUNFLG1CQUFrQ3ZDLFNBQWxDO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFxRDBGLGdCQUFBQSwrQkFBckQsaUVBQTRILEVBQTVIO0FBQ1F4RixnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQm1GLDJCQUF0RCxFQUFtRixnQ0FBbkYsRUFBcUgzRixTQUFySDtBQUVNVSxnQkFBQUEsV0FKUixjQUkwQkMsaUNBQXFCaUYsd0JBSi9DLGNBSTJFLEtBQUt0SCx3QkFBTCxDQUE4QnVDLEtBSnpHLGNBSWtILEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBSmhKLGNBSTRKZCxTQUo1SjtBQUtRa0IsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBTUUsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJ5QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzdELG1DQUF1QkYsYUFBeEIsQ0FETTtBQUV4QnlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFGSjtBQUd4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEcUU7QUFIcEQsaUJBQTFCO0FBTVFoRCxnQkFBQUEsc0JBWlYsR0FZOEQ2QywrQkFaOUQsQ0FZVTdDLHNCQVpWLEVBWWtDaUQsV0FabEMsR0FZOERKLCtCQVo5RCxDQVlrQ0ksV0FabEMsRUFZK0NDLFVBWi9DLEdBWThETCwrQkFaOUQsQ0FZK0NLLFVBWi9DO0FBY1FySCxnQkFBQUEsT0FkUixHQWM2QmlCLHNCQUFVb0QsY0FkdkM7O0FBZ0JFLG9CQUFJRixzQkFBSixFQUE0QjtBQUMxQm5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNEOztBQUVELHFCQUFLcUUsa0JBQUwsQ0FBd0IsS0FBS3BFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNd0QsZ0JBQUFBLElBdkJSLEdBdUI0QjRELFdBQVcsSUFBSSxFQXZCM0M7QUF5QlFFLGdCQUFBQSxPQXpCUixHQXlCa0I7QUFDZCwyQkFBUyxLQUFLMUgsd0JBQUwsQ0FBOEJ1QyxLQUR6QjtBQUVkLDhCQUFZLEtBQUt2Qyx3QkFBTCxDQUE4QndDO0FBRjVCLGlCQXpCbEI7O0FBOEJFLG9CQUFJb0IsSUFBSSxJQUFJQSxJQUFJLENBQUMrRCxpQkFBakIsRUFBb0M7QUFDNUJDLGtCQUFBQSxPQUQ0QixHQUNsQkMscUNBQWtCQyxJQUFsQixDQUF1QmxFLElBQUksQ0FBQytELGlCQUE1QixDQURrQjtBQUVsQ2pILGtCQUFBQSxNQUFNLENBQUNxSCxNQUFQLENBQWNMLE9BQWQsRUFBdUI7QUFBRSxxQ0FBaUJFO0FBQW5CLG1CQUF2QjtBQUNEOztBQUVELG9CQUFJaEUsSUFBSSxDQUFDb0UsZUFBVCxFQUEwQjtBQUN4QnRILGtCQUFBQSxNQUFNLENBQUNxSCxNQUFQLENBQWNMLE9BQWQsRUFBdUI7QUFBRSx1Q0FBbUI5RCxJQUFJLENBQUNvRTtBQUExQixtQkFBdkI7QUFDRDs7QUFFRHBFLGdCQUFBQSxJQUFJLENBQUNxRSxRQUFMLEdBQWdCQyxJQUFJLENBQUNDLFVBQUwsQ0FBZ0IsUUFBaEIsRUFBMEJDLE1BQTFCLENBQWlDQyxJQUFJLENBQUNDLFNBQUwsQ0FBZVosT0FBZixDQUFqQyxFQUEwRGEsTUFBMUQsQ0FBaUUsS0FBakUsRUFBd0VDLFFBQXhFLEVBQWhCOztBQXZDRixzQkF5Q01mLFVBQVUsSUFBSSxDQUFDZ0IsTUFBTSxDQUFDQyxRQXpDNUI7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBMENXMUUsT0FBTyxDQUFDQyxNQUFSLENBQWUsSUFBSTlDLEtBQUosZ0RBQWYsQ0ExQ1g7O0FBQUE7QUE2Q0Usb0JBQUlzRyxVQUFKLEVBQWdCO0FBQ2Q3RCxrQkFBQUEsSUFBSSxDQUFDK0UsT0FBTCxHQUFlQyx5QkFBWUMsY0FBWixFQUFmO0FBQ0FqRixrQkFBQUEsSUFBSSxDQUFDa0YsTUFBTCxHQUFjQyx1QkFBV0MsYUFBWCxFQUFkO0FBQ0FwRixrQkFBQUEsSUFBSSxDQUFDcUYsU0FBTCxHQUFpQlIsTUFBTSxDQUFDUyxRQUFQLENBQWdCQyxJQUFqQztBQUNBdkYsa0JBQUFBLElBQUksQ0FBQ3dGLEVBQUwsR0FBVUMsZUFBT0MsU0FBUCxFQUFWO0FBQ0Q7O0FBRUQsb0JBQUksQ0FBQzFGLElBQUksQ0FBQzJGLE1BQVYsRUFBa0I7QUFDaEIzRixrQkFBQUEsSUFBSSxDQUFDMkYsTUFBTCxHQUFjbEksc0JBQVVtSSxhQUF4QjtBQUNELGlCQXRESCxDQXdERTs7O0FBeERGLHNCQXlETTVGLElBQUksQ0FBQzJGLE1BQUwsSUFBZSxDQUFDRSxvQkFBUUMsZ0JBQVIsQ0FBeUJ4SSxRQUF6QixDQUFrQzBDLElBQUksQ0FBQzJGLE1BQXZDLENBekR0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREEwRFd2RixPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJOUMsS0FBSixnQ0FBa0N5QyxJQUFJLENBQUMyRixNQUF2QyxPQUFmLENBMURYOztBQUFBO0FBNkRRN0csZ0JBQUFBLEdBN0RSLGFBNkRpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQTdEL0MsU0E2RHdEUCxXQTdEeEQ7QUE4RFFLLGdCQUFBQSxNQTlEUixHQThEaUIsTUE5RGpCO0FBZ0VRc0MsZ0JBQUFBLE9BaEVSLEdBZ0VzQztBQUNsQ25CLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDeEQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENZLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtyRCxhQUFMLENBQW1Cc0QscUJBQXJCLDJFQUE4QyxLQUFLdEQsYUFBTCxDQUFtQnVELG9CQUFuQixDQUF3QytEO0FBTDNELGlCQWhFdEM7QUFBQSxtREF3RVMsSUFBSXZELE9BQUo7QUFBQSw0R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFyQixhQUFhLENBQUNtQyxPQUFELENBRnJCOztBQUFBO0FBRVR0Qiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI5QixLQUFLLENBQUMrQixtQkFIekI7QUFJUEMsNEJBQUFBLEtBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSUR4RCxTQUpDLEdBSVdxRCxRQUpYLENBSURyRCxPQUpDOztBQUtmLDRCQUFBLE1BQUksQ0FBQzZFLGdCQUFMLENBQXNCN0UsU0FBdEI7O0FBRUEsZ0NBQUl3RCxLQUFKLEVBQVU7QUFDUiw4QkFBQSxNQUFJLENBQUM3QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnlILDZCQUF0RCxFQUFxRixrQ0FBckYsRUFBeUhqSSxTQUF6SCxFQUFvSStCLFFBQXBJLEVBQThJQyx5QkFBOUksRUFBeUt0QixXQUF6SyxFQUFzTEssTUFBdEw7O0FBRUF1Qyw4QkFBQUEsT0FBTyxDQUFDcEIsS0FBRCxDQUFQO0FBQ0Q7O0FBWGM7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFhVEYsNEJBQUFBLDJCQWJTLEdBYW1COUIsS0FBSyxDQUFDK0IsbUJBYnpCOztBQWNmLDRCQUFBLE1BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0IwSCwwQkFBdkQsRUFBbUYsK0JBQW5GLEVBQW9IbEksU0FBcEgsRUFBK0hxQyxTQUEvSCxFQUEwSUwsMkJBQTFJLEVBQXFLdEIsV0FBckssRUFBa0xLLE1BQWxMOztBQUVBLGdDQUFJLHFEQUE2QnBCLHNCQUFVZ0UscUJBQXZDLENBQUosRUFBbUU7QUFDakU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBbkJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXhFVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQWdHQTtBQUNGO0FBQ0E7QUFDQTtBQUNBOzs7Ozt1R0FDRSxtQkFBeUJ2QyxTQUF6QjtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNENtSSxnQkFBQUEseUJBQTVDLGlFQUFvRyxFQUFwRztBQUNRakksZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I0SCxrQkFBdEQsRUFBMEUsc0JBQTFFLEVBQWtHcEksU0FBbEc7QUFDTWtCLGdCQUFBQSxhQUhSLEdBR3dCQyxrQkFBTUMsTUFBTixFQUh4QjtBQUtFLDRDQUFXRixhQUFYLEVBQTBCO0FBQ3hCRyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0MsMEJBREo7QUFFeEJDLGtCQUFBQSwwQkFBMEIsRUFBRSxLQUFLaEQsYUFBTCxDQUFtQmlELDRCQUFuQixDQUFnRDZHLFdBRnBEO0FBR3hCQyxrQkFBQUEsV0FBVyxFQUFFQyxtQ0FIVztBQUl4QjVGLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDN0QsbUNBQXVCRixhQUF4QjtBQUpNLGlCQUExQjtBQU9Ra0UsZ0JBQUFBLFdBWlYsR0FZMkVxRix5QkFaM0UsQ0FZVXJGLFdBWlYsRUFZdUJELHNCQVp2QixHQVkyRXNGLHlCQVozRSxDQVl1QnRGLHNCQVp2QixFQVkrQ2lELFdBWi9DLEdBWTJFcUMseUJBWjNFLENBWStDckMsV0FaL0MsRUFZNERDLFVBWjVELEdBWTJFb0MseUJBWjNFLENBWTREcEMsVUFaNUQ7QUFhUXJILGdCQUFBQSxPQWJSLEdBYTZCaUIsc0JBQVVvRCxjQWJ2QztBQWNNckMsZ0JBQUFBLFdBZE4sY0Fjd0JDLGlDQUFxQjZILHVCQWQ3QyxjQWN3RSxLQUFLbEssd0JBQUwsQ0FBOEJ1QyxLQWR0RyxjQWMrRyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQWQ3SSxjQWN5SmQsU0Fkeko7O0FBZUUsb0JBQUk2QyxzQkFBSixFQUE0QjtBQUMxQm5DLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQjhILDJCQUE1QixjQUEyRCxLQUFLbkssd0JBQUwsQ0FBOEJ1QyxLQUF6RixjQUFrRyxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUFoSSxjQUE0SWQsU0FBNUksQ0FBWDtBQUNBdEIsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCK0Qsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBbkUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUQscUJBQUtxRSxrQkFBTCxDQUF3QixLQUFLcEUsU0FBN0IsRUFBd0NILE9BQXhDOztBQUVBLG9CQUFJLENBQUMsS0FBS0gsYUFBTCxDQUFtQjJFLGlDQUF4QixFQUEyRDtBQUN6RCxzQkFBSUosV0FBSixFQUFpQjtBQUNmcEMsb0JBQUFBLFdBQVcsZUFBUW9DLFdBQVIsQ0FBWDtBQUNEO0FBQ0Y7O0FBRUtLLGdCQUFBQSxNQTdCUixHQTZCNEM7QUFDeEM5RCxrQkFBQUEsU0FBUyxFQUFFLEtBQUtmLHdCQUFMLENBQThCZTtBQURELGlCQTdCNUM7O0FBaUNFLG9CQUFJLEtBQUtkLGFBQUwsQ0FBbUIyRSxpQ0FBdkIsRUFBMEQ7QUFDeEQsc0JBQUlKLFdBQUosRUFBaUI7QUFDZkssb0JBQUFBLE1BQU0sQ0FBQ0MsR0FBUCxHQUFhTixXQUFiO0FBQ0Q7QUFDRjs7QUFFS1osZ0JBQUFBLElBdkNSLEdBdUM0QjRELFdBQVcsSUFBSSxFQXZDM0M7O0FBQUEsc0JBeUNNQyxVQUFVLElBQUksQ0FBQ2dCLE1BQU0sQ0FBQ0MsUUF6QzVCO0FBQUE7QUFBQTtBQUFBOztBQUFBLG1EQTBDVzFFLE9BQU8sQ0FBQ0MsTUFBUixDQUFlLElBQUk5QyxLQUFKLGdEQUFmLENBMUNYOztBQUFBO0FBNkNFLG9CQUFJc0csVUFBSixFQUFnQjtBQUNkN0Qsa0JBQUFBLElBQUksQ0FBQytFLE9BQUwsR0FBZUMseUJBQVlDLGNBQVosRUFBZjtBQUNBakYsa0JBQUFBLElBQUksQ0FBQ2tGLE1BQUwsR0FBY0MsdUJBQVdDLGFBQVgsRUFBZDtBQUNBcEYsa0JBQUFBLElBQUksQ0FBQ3FGLFNBQUwsR0FBaUJSLE1BQU0sQ0FBQ1MsUUFBUCxDQUFnQkMsSUFBakM7QUFDQXZGLGtCQUFBQSxJQUFJLENBQUN3RixFQUFMLEdBQVVDLGVBQU9DLFNBQVAsRUFBVjtBQUNELGlCQWxESCxDQW9ERTs7O0FBQ0Esb0JBQUksQ0FBQzFGLElBQUksQ0FBQzJGLE1BQVYsRUFBa0I7QUFDaEIzRixrQkFBQUEsSUFBSSxDQUFDMkYsTUFBTCxHQUFjbEksc0JBQVVtSSxhQUF4QjtBQUNELGlCQXZESCxDQXlERTs7O0FBekRGLHNCQTBETTVGLElBQUksQ0FBQzJGLE1BQUwsSUFBZSxDQUFDRSxvQkFBUUMsZ0JBQVIsQ0FBeUJ4SSxRQUF6QixDQUFrQzBDLElBQUksQ0FBQzJGLE1BQXZDLENBMUR0QjtBQUFBO0FBQUE7QUFBQTs7QUFBQSxtREEyRFd2RixPQUFPLENBQUNDLE1BQVIsQ0FBZSxJQUFJOUMsS0FBSixnQ0FBa0N5QyxJQUFJLENBQUMyRixNQUF2QyxPQUFmLENBM0RYOztBQUFBO0FBOERRN0csZ0JBQUFBLEdBOURSLGFBOERpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQTlEL0MsU0E4RHdEUCxXQTlEeEQ7QUErRFFLLGdCQUFBQSxNQS9EUixHQStEaUIsTUEvRGpCO0FBZ0VRc0MsZ0JBQUFBLE9BaEVSLEdBZ0VzQztBQUNsQ25CLGtCQUFBQSxJQUFJLEVBQUpBLElBRGtDO0FBRWxDeEQsa0JBQUFBLE9BQU8sRUFBUEEsT0FGa0M7QUFHbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUhrQztBQUlsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FKa0M7QUFLbENtQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUxrQztBQU1sQ3ZCLGtCQUFBQSxPQUFPLDRCQUFFLEtBQUtyRCxhQUFMLENBQW1Cc0QscUJBQXJCLDJFQUE4QyxLQUFLdEQsYUFBTCxDQUFtQnVELG9CQUFuQixDQUF3Q3VHO0FBTjNELGlCQWhFdEM7QUFBQSxtREF5RVMsSUFBSS9GLE9BQUo7QUFBQSw0R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFyQixhQUFhLENBQUNtQyxPQUFELENBRnJCOztBQUFBO0FBRVR0Qiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI5QixLQUFLLENBQUMrQixtQkFIekI7QUFJUHZELDRCQUFBQSxTQUpPLEdBSUtxRCxRQUpMLENBSVByRCxPQUpPOztBQUtmLDRCQUFBLE1BQUksQ0FBQzZFLGdCQUFMLENBQXNCN0UsU0FBdEI7O0FBRUEsNEJBQUEsTUFBSSxDQUFDMkIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JrSSxvQkFBdEQsRUFBNEUsd0JBQTVFLEVBQXNHMUksU0FBdEcsRUFBaUgrQixRQUFqSCxFQUEySEMseUJBQTNILEVBQXNKdEIsV0FBdEosRUFBbUtLLE1BQW5LLEVBQTJLc0IsU0FBM0ssRUFBc0xILElBQXRMOztBQUNBb0IsNEJBQUFBLE9BQU87QUFSUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVVUdEIsNEJBQUFBLDJCQVZTLEdBVW1COUIsS0FBSyxDQUFDK0IsbUJBVnpCOztBQVdmLDRCQUFBLE1BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0JtSSxpQkFBdkQsRUFBMEUscUJBQTFFLEVBQWlHM0ksU0FBakcsRUFBNEdxQyxTQUE1RyxFQUF1SEwsMkJBQXZILEVBQWtKdEIsV0FBbEosRUFBK0pLLE1BQS9KLGlCQUE4S21CLElBQTlLOztBQUNBLGdDQUFJLHFEQUE0QnZDLHNCQUFVZ0UscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBZmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBekVUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBNkZBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7Ozs7O3dHQUNFLG1CQUEwQnZDLFNBQTFCO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNkM0SSxnQkFBQUEsMEJBQTdDLGlFQUF1RyxFQUF2RztBQUNRMUksZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JxSSxtQkFBdEQsRUFBMkUsdUJBQTNFLEVBQW9HN0ksU0FBcEc7QUFFSVUsZ0JBQUFBLFdBSk4sY0FJd0JDLGlDQUFxQm1JLHdCQUo3QyxjQUl5RSxLQUFLeEssd0JBQUwsQ0FBOEJ1QyxLQUp2RyxjQUlnSCxLQUFLdkMsd0JBQUwsQ0FBOEJ3QyxRQUo5SSxjQUkwSmQsU0FKMUosd0JBSWlMLEtBQUsxQix3QkFBTCxDQUE4QmUsU0FKL007QUFLUTZCLGdCQUFBQSxhQUxSLEdBS3dCQyxrQkFBTUMsTUFBTixFQUx4QjtBQU1FLDRDQUFXRixhQUFYLEVBQTBCO0FBQ3hCeUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUM3RCxtQ0FBdUJGLGFBQXhCLENBRE07QUFFeEJ5QyxrQkFBQUEsT0FBTyxFQUFFLEtBQUs5QyxhQUFMLENBQW1CK0MsMEJBRko7QUFHeEJDLGtCQUFBQSwwQkFBMEIsRUFBRSxLQUFLaEQsYUFBTCxDQUFtQmlELDRCQUFuQixDQUFnRHVIO0FBSHBELGlCQUExQjtBQU1RbEcsZ0JBQUFBLHNCQVpWLEdBWWdGK0YsMEJBWmhGLENBWVUvRixzQkFaVixFQVlrQ21HLGVBWmxDLEdBWWdGSiwwQkFaaEYsQ0FZa0NJLGVBWmxDLEVBWW1EQyxnQkFabkQsR0FZZ0ZMLDBCQVpoRixDQVltREssZ0JBWm5ELEVBWXFFQyxNQVpyRSxHQVlnRk4sMEJBWmhGLENBWXFFTSxNQVpyRTtBQWNReEssZ0JBQUFBLE9BZFIsR0FjNkJpQixzQkFBVW9ELGNBZHZDO0FBZVFiLGdCQUFBQSxJQWZSLEdBZW9CLEVBZnBCLEVBZXdCOztBQUN0QkEsZ0JBQUFBLElBQUksQ0FBQ2dILE1BQUwsR0FBY0EsTUFBZDs7QUFFQSxvQkFBSXJHLHNCQUFKLEVBQTRCO0FBQzFCbkMsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCd0ksNEJBQTVCLGNBQTRELEtBQUs3Syx3QkFBTCxDQUE4QnVDLEtBQTFGLGNBQW1HLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBQWpJLGNBQTZJZCxTQUE3SSx3QkFBb0ssS0FBSzFCLHdCQUFMLENBQThCZSxTQUFsTSxDQUFYO0FBQ0FYLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNEOztBQUVELHFCQUFLcUUsa0JBQUwsQ0FBd0IsS0FBS3BFLFNBQTdCLEVBQXdDSCxPQUF4Qzs7QUFFQSxvQkFBSXNLLGVBQUosRUFBcUI7QUFDbkJ0SSxrQkFBQUEsV0FBVywyQkFBWDtBQUNEOztBQUVELG9CQUFJdUksZ0JBQUosRUFBc0I7QUFDcEJ2SSxrQkFBQUEsV0FBVyw0QkFBWDtBQUNEOztBQUVLTSxnQkFBQUEsR0FsQ1IsYUFrQ2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BbEMvQyxTQWtDd0RQLFdBbEN4RDtBQW1DUUssZ0JBQUFBLE1BbkNSLEdBbUNpQixNQW5DakI7QUFvQ1FzQyxnQkFBQUEsT0FwQ1IsR0FvQ3NDO0FBQ2xDbkIsa0JBQUFBLElBQUksRUFBSkEsSUFEa0M7QUFFbEN4RCxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1ksa0JBQUFBLE9BQU8sNEJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsMkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDaUg7QUFMM0QsaUJBcEN0QztBQUFBLG1EQTRDUyxJQUFJekcsT0FBSjtBQUFBLDRHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1ByRCw0QkFBQUEsU0FITyxHQUdLcUQsUUFITCxDQUdQckQsT0FITzs7QUFJZiw0QkFBQSxNQUFJLENBQUM2RSxnQkFBTCxDQUFzQjdFLFNBQXRCOztBQUVNc0QsNEJBQUFBLHlCQU5TLEdBTW1COUIsS0FBSyxDQUFDK0IsbUJBTnpCOztBQU9mLDRCQUFBLE1BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEkscUJBQXRELEVBQTZFLHlCQUE3RSxFQUF3R3BKLFNBQXhHLEVBQW1IK0IsUUFBbkgsRUFBNkhDLHlCQUE3SCxFQUF3SnRCLFdBQXhKLEVBQXFLSyxNQUFySzs7QUFFQXVDLDRCQUFBQSxPQUFPLEdBVFEsQ0FVakI7O0FBVmlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBWVR0Qiw0QkFBQUEsMkJBWlMsR0FZbUI5QixLQUFLLENBQUMrQixtQkFaekI7O0FBYWYsNEJBQUEsTUFBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNtRCxLQUE1QixFQUFtQ2pELDJCQUFvQjZJLGtCQUF2RCxFQUEyRSxzQkFBM0UsRUFBbUdySixTQUFuRyxFQUE4R3FDLFNBQTlHLEVBQXlITCwyQkFBekgsRUFBb0p0QixXQUFwSixFQUFpS0ssTUFBaks7O0FBQ0EsZ0NBQUksY0FBTThELElBQU4sS0FBZWxGLHNCQUFVZ0UscUJBQTdCLEVBQW9EO0FBQ2xEO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkE1Q1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFrRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTs7Ozs7a0hBQ0UsbUJBQW9DdkMsU0FBcEMsRUFBdURzSixvQ0FBdkQ7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUXBKLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CK0ksNkJBQXRELEVBQXFGLG1DQUFyRixFQUEwSHZKLFNBQTFIO0FBRVE2QyxnQkFBQUEsc0JBSlYsR0FJNkN5RyxvQ0FKN0MsQ0FJVXpHLHNCQUpWLEVBSWtDcUcsTUFKbEMsR0FJNkNJLG9DQUo3QyxDQUlrQ0osTUFKbEM7QUFLUXhJLGdCQUFBQSxXQUxSLGNBSzBCQyxpQ0FBcUI2SSxxQ0FML0MsY0FLd0YsS0FBS2xMLHdCQUFMLENBQThCdUMsS0FMdEgsY0FLK0gsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFMN0osY0FLeUtvSSxNQUx6SyxjQUttTGxKLFNBTG5MLHdCQUswTSxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBTHhPO0FBTVE2QixnQkFBQUEsYUFOUixHQU13QkMsa0JBQU1DLE1BQU4sRUFOeEI7QUFRRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUN4QnlCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDN0QsbUNBQXVCRixhQUF4QixDQURNO0FBRXhCeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDLDBCQUZKO0FBR3hCQyxrQkFBQUEsMEJBQTBCLEVBQUUsS0FBS2hELGFBQUwsQ0FBbUJpRCw0QkFBbkIsQ0FBZ0RpSTtBQUhwRCxpQkFBMUI7QUFNTS9LLGdCQUFBQSxPQWRSLEdBYzZCaUIsc0JBQVVvRCxjQWR2Qzs7QUFlRSxvQkFBSUYsc0JBQUosRUFBNEI7QUFDMUJuRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUIrRCxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0FuRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJGLGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDRDs7QUFFRCxxQkFBS3FFLGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7QUFFTXNDLGdCQUFBQSxHQXRCUixhQXNCaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUF0Qi9DLFNBc0J3RFAsV0F0QnhEO0FBdUJRSyxnQkFBQUEsTUF2QlIsR0F1QmlCLEtBdkJqQjtBQXdCUXNDLGdCQUFBQSxPQXhCUixHQXdCc0M7QUFDbEMzRSxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1ksa0JBQUFBLE9BQU8sNEJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsMkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDNEg7QUFKM0QsaUJBeEJ0QztBQUFBLG1EQStCUyxJQUFJcEgsT0FBSjtBQUFBLDRHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1ByRCw0QkFBQUEsU0FITyxHQUdLcUQsUUFITCxDQUdQckQsT0FITzs7QUFJZiw0QkFBQSxNQUFJLENBQUM2RSxnQkFBTCxDQUFzQjdFLFNBQXRCOztBQUVNc0QsNEJBQUFBLHlCQU5TLEdBTW1COUIsS0FBSyxDQUFDK0IsbUJBTnpCOztBQU9mLGdDQUFJLG1CQUFBRixRQUFRLENBQUNHLElBQVQsa0VBQWV5SCxhQUFmLE1BQWlDLElBQXJDLEVBQTJDO0FBQ3pDLDhCQUFBLE1BQUksQ0FBQ3RKLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cb0osK0JBQXRELEVBQXVGLHFDQUF2RixFQUE4SDVKLFNBQTlILEVBQXlJK0IsUUFBekksRUFBbUpDLHlCQUFuSixFQUE4S3RCLFdBQTlLLEVBQTJMSyxNQUEzTDs7QUFFQXVDLDhCQUFBQSxPQUFPLENBQUN2QixRQUFRLENBQUNHLElBQVYsQ0FBUDtBQUNELDZCQUpELE1BSU87QUFDTCw4QkFBQSxNQUFJLENBQUM3QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnFKLDRCQUF0RCxFQUFvRixvRkFBcEYsRUFBMEs3SixTQUExSyxFQUFxTCtCLFFBQXJMLEVBQStMQyx5QkFBL0wsRUFBME50QixXQUExTixFQUF1T0ssTUFBdk87O0FBRUF3Qiw4QkFBQUEsTUFBTSxDQUFDLElBQUk5QyxLQUFKLENBQVUsb0ZBQVYsQ0FBRCxDQUFOO0FBQ0QsNkJBZmMsQ0FpQmpCOzs7QUFqQmlCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBbUJUdUMsNEJBQUFBLDJCQW5CUyxHQW1CbUI5QixLQUFLLENBQUMrQixtQkFuQnpCOztBQXFCZiw0QkFBQSxNQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU21ELEtBQTVCLEVBQW1DakQsMkJBQW9CcUosNEJBQXZELEVBQXFGLGtDQUFyRixFQUF5SDdKLFNBQXpILEVBQW9JcUMsU0FBcEksRUFBK0lMLDJCQUEvSSxFQUEwS3RCLFdBQTFLLEVBQXVMSyxNQUF2TDs7QUFFQSxnQ0FBSSxxREFBNEJwQixzQkFBVWdFLHFCQUF0QyxDQUFKLEVBQWtFO0FBQ2hFO0FBQ0Q7O0FBRUQsZ0NBQUksY0FBTW1ELFFBQU4sT0FBcUIsNENBQXpCLEVBQXVFO0FBQUU7QUFDdkV4RCw4QkFBQUEsT0FBTyxDQUFDLEVBQUQsQ0FBUDtBQUNELDZCQUZELE1BRU87QUFDTGYsOEJBQUFBLE1BQU0sZUFBTjtBQUNEOztBQS9CYztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkEvQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFtRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztrSEFDRSxtQkFBb0N2QyxTQUFwQyxFQUF1RDhKLGdCQUF2RDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFpRkMsZ0JBQUFBLG9DQUFqRixpRUFBK0osRUFBL0o7QUFDUTdKLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cd0oscUJBQXRELEVBQTZFLDBCQUE3RSxFQUF5R2hLLFNBQXpHO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUJzSiwwQkFKN0MsY0FJMkUsS0FBSzNMLHdCQUFMLENBQThCdUMsS0FKekcsY0FJa0gsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFKaEosY0FJNEpkLFNBSjVKLHdCQUltTCxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBSmpOO0FBS1E2QixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFPRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUFFeUIsa0JBQUFBLGdCQUFnQixFQUFFLENBQUM3RCxtQ0FBdUJGLGFBQXhCLENBQXBCO0FBQ3hCeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDLDBCQURKO0FBRXhCQyxrQkFBQUEsMEJBQTBCLEVBQUUsS0FBS2hELGFBQUwsQ0FBbUJpRCw0QkFBbkIsQ0FBZ0QwSTtBQUZwRCxpQkFBMUI7QUFLUXJILGdCQUFBQSxzQkFaVixHQVlxQ2tILG9DQVpyQyxDQVlVbEgsc0JBWlY7QUFhUW5FLGdCQUFBQSxPQWJSLEdBYTZCaUIsc0JBQVVvRCxjQWJ2Qzs7QUFlRSxvQkFBSUYsc0JBQUosRUFBNEI7QUFDMUJuQyxrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUJ3Siw4QkFBNUIsY0FBOEQsS0FBSzdMLHdCQUFMLENBQThCdUMsS0FBNUYsY0FBcUcsS0FBS3ZDLHdCQUFMLENBQThCd0MsUUFBbkksY0FBK0lkLFNBQS9JLHdCQUFzSyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQXBNLENBQVg7QUFDQVgsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCK0Qsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBbkUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0Q7O0FBRUtvQyxnQkFBQUEsR0FyQlIsYUFxQmlCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BckIvQyxTQXFCd0RQLFdBckJ4RDtBQXNCUUssZ0JBQUFBLE1BdEJSLEdBc0JpQixNQXRCakI7QUF1QlFzQyxnQkFBQUEsT0F2QlIsR0F1QnNDO0FBQ2xDbkIsa0JBQUFBLElBQUksRUFBRXlFLElBQUksQ0FBQ0MsU0FBTCxDQUFla0QsZ0JBQWYsQ0FENEI7QUFFbENwTCxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1ksa0JBQUFBLE9BQU8sNkJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsNkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDb0k7QUFMM0QsaUJBdkJ0QztBQUFBLG1EQStCUyxJQUFJNUgsT0FBSjtBQUFBLDRHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1ByRCw0QkFBQUEsU0FITyxHQUdLcUQsUUFITCxDQUdQckQsT0FITzs7QUFJZiw0QkFBQSxPQUFJLENBQUM2RSxnQkFBTCxDQUFzQjdFLFNBQXRCOztBQUVNc0QsNEJBQUFBLHlCQU5TLEdBTW1COUIsS0FBSyxDQUFDK0IsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEosdUJBQXRELEVBQStFLDRCQUEvRSxFQUE2R3BLLFNBQTdHLEVBQXdIK0IsUUFBeEgsRUFBa0lDLHlCQUFsSSxFQUE2SnRCLFdBQTdKLEVBQTBLSyxNQUExSzs7QUFFQXVDLDRCQUFBQSxPQUFPO0FBVFE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFZVHRCLDRCQUFBQSw0QkFaUyxHQVltQjlCLEtBQUssQ0FBQytCLG1CQVp6Qjs7QUFhZiw0QkFBQSxPQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU21ELEtBQTVCLEVBQW1DakQsMkJBQW9CNkosb0JBQXZELEVBQTZFLHlCQUE3RSxFQUF3R3JLLFNBQXhHLEVBQW1IcUMsU0FBbkgsRUFBOEhMLDRCQUE5SCxFQUF5SnRCLFdBQXpKLEVBQXNLSyxNQUF0Szs7QUFDQSxnQ0FBSSxxREFBNEJwQixzQkFBVWdFLHFCQUF0QyxDQUFKLEVBQWtFO0FBQ2hFO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkEvQlQ7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFxREE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OzsrR0FDRSxtQkFBaUMrSCxhQUFqQyxFQUF3REMsMEJBQXhEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBNEZDLGdCQUFBQSxpQ0FBNUYsaUVBQW9LLEVBQXBLO0FBQ1F0SyxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjs7QUFFRSxvQkFBSSxLQUFLM0IsTUFBVCxFQUFpQjtBQUNmLHVCQUFLQSxNQUFMLENBQVlnTSxHQUFaLENBQWdCbkssbUJBQVNDLElBQXpCLEVBQ0VDLDJCQUFvQmtLLDBCQUR0QixFQUVFO0FBQUVDLG9CQUFBQSxhQUFhLEVBQUVMO0FBQWpCLG1CQUZGLEVBR0UsZ0NBSEY7QUFJRDs7QUFDRzVKLGdCQUFBQSxXQVJOLGNBUXdCQyxpQ0FBcUJpSywrQkFSN0MsY0FRZ0YsS0FBS3RNLHdCQUFMLENBQThCdUMsS0FSOUcsY0FRdUh5SixhQVJ2SDtBQVNRcEosZ0JBQUFBLGFBVFIsR0FTd0JDLGtCQUFNQyxNQUFOLEVBVHhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFBRXlCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDN0QsbUNBQXVCRixhQUF4QixDQUFwQjtBQUN4QnlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFESjtBQUV4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEcUo7QUFGcEQsaUJBQTFCO0FBS1FoSSxnQkFBQUEsc0JBZlYsR0FlZ0QySCxpQ0FmaEQsQ0FlVTNILHNCQWZWLEVBZWtDN0MsU0FmbEMsR0FlZ0R3SyxpQ0FmaEQsQ0Fla0N4SyxTQWZsQztBQWlCUXRCLGdCQUFBQSxPQWpCUixHQWlCNkJpQixzQkFBVW9ELGNBakJ2Qzs7QUFtQkUsb0JBQUlGLHNCQUFKLEVBQTRCO0FBQzFCbkMsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCbUssbUNBQTVCLGNBQW1FLEtBQUt4TSx3QkFBTCxDQUE4QnVDLEtBQWpHLGNBQTBHeUosYUFBMUcsQ0FBWDtBQUNBNUwsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCK0Qsc0JBQXhCLENBQVAsR0FBeURBLHNCQUF6RDtBQUNBbkUsa0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCRixhQUF4QixDQUFQLEdBQWdELEtBQUtMLGFBQUwsQ0FBbUJLLGFBQW5FO0FBQ0FGLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QmlNLFdBQXhCLENBQVAsR0FBOEMsS0FBS3pNLHdCQUFMLENBQThCd0MsUUFBNUU7QUFDRDs7QUFFRCxxQkFBS21DLGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7O0FBRUEsb0JBQUlzQixTQUFKLEVBQWU7QUFDYnRCLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QmtCLFNBQXhCLENBQVAsR0FBNENBLFNBQTVDO0FBQ0Q7O0FBRUtnQixnQkFBQUEsR0FoQ1IsYUFnQ2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BaEMvQyxTQWdDd0RQLFdBaEN4RDtBQWlDUUssZ0JBQUFBLE1BakNSLEdBaUNpQixNQWpDakI7QUFrQ1FzQyxnQkFBQUEsT0FsQ1IsR0FrQ3NDO0FBQ2xDbkIsa0JBQUFBLElBQUksRUFBRXlFLElBQUksQ0FBQ0MsU0FBTCxDQUFlMkQsMEJBQWYsQ0FENEI7QUFFbEM3TCxrQkFBQUEsT0FBTyxFQUFQQSxPQUZrQztBQUdsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BSGtDO0FBSWxDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUprQztBQUtsQ1ksa0JBQUFBLE9BQU8sNkJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsNkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDK0k7QUFMM0QsaUJBbEN0QztBQUFBLG1EQTBDUyxJQUFJdkksT0FBSjtBQUFBLDZHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1BHLDRCQUFBQSxJQUhPLEdBR1dILFFBSFgsQ0FHUEcsSUFITyxFQUdEeEQsU0FIQyxHQUdXcUQsUUFIWCxDQUdEckQsT0FIQzs7QUFJZiw0QkFBQSxPQUFJLENBQUM2RSxnQkFBTCxDQUFzQjdFLFNBQXRCOztBQUVNc0QsNEJBQUFBLHlCQU5TLEdBTW1COUIsS0FBSyxDQUFDK0IsbUJBTnpCOztBQU9mLDRCQUFBLE9BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cd0ssNEJBQXRELEVBQW9GLGtDQUFwRixFQUF3SGhMLFNBQXhILEVBQW1JK0IsUUFBbkksRUFBNklDLHlCQUE3SSxFQUF3S3RCLFdBQXhLLEVBQXFMSyxNQUFyTDs7QUFFQXVDLDRCQUFBQSxPQUFPLENBQUNwQixJQUFELENBQVA7QUFUZTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVlURiw0QkFBQUEsNEJBWlMsR0FZbUI5QixLQUFLLENBQUMrQixtQkFaekI7O0FBYWYsNEJBQUEsT0FBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNtRCxLQUE1QixFQUFtQ2pELDJCQUFvQnlLLHlCQUF2RCxFQUFrRiwrQkFBbEYsRUFBbUhqTCxTQUFuSCxFQUE4SHFDLFNBQTlILEVBQXlJTCw0QkFBekksRUFBb0t0QixXQUFwSyxFQUFpTEssTUFBakw7O0FBQ0EsZ0NBQUkscURBQTRCcEIsc0JBQVVnRSxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sZUFBTjs7QUFqQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBMUNUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBZ0VBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs4R0FDRSxtQkFBZ0N2QyxTQUFoQyxFQUFtRGtKLE1BQW5ELEVBQW1FZ0MsS0FBbkU7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFrRkMsZ0JBQUFBLGdDQUFsRixpRUFBd0osRUFBeEo7QUFDUWpMLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9CNEssd0JBQXRELEVBQWdGLDZCQUFoRixFQUErR3BMLFNBQS9HO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUIwSyw2QkFKN0MsY0FJOEVuQyxNQUo5RSxjQUl3RmxKLFNBSnhGLHdCQUkrRyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBSjdJO0FBS1E2QixnQkFBQUEsYUFMUixHQUt3QkMsa0JBQU1DLE1BQU4sRUFMeEI7QUFPRSw0Q0FBV0YsYUFBWCxFQUEwQjtBQUN4QnlCLGtCQUFBQSxnQkFBZ0IsRUFBRSxDQUFDN0QsbUNBQXVCRixhQUF4QixDQURNO0FBRXhCeUMsa0JBQUFBLE9BQU8sRUFBRSxLQUFLOUMsYUFBTCxDQUFtQitDLDBCQUZKO0FBR3hCQyxrQkFBQUEsMEJBQTBCLEVBQUUsS0FBS2hELGFBQUwsQ0FBbUJpRCw0QkFBbkIsQ0FBZ0Q4SjtBQUhwRCxpQkFBMUI7QUFNUXpJLGdCQUFBQSxzQkFiVixHQWE2RHNJLGdDQWI3RCxDQWFVdEksc0JBYlYsRUFha0NpQixzQkFibEMsR0FhNkRxSCxnQ0FiN0QsQ0Fha0NySCxzQkFibEM7QUFjUXBGLGdCQUFBQSxPQWRSLEdBYzZCaUIsc0JBQVVvRCxjQWR2QztBQWVFckUsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCeU0sY0FBeEIsQ0FBUCxHQUFpRCxLQUFLak4sd0JBQUwsQ0FBOEJ1QyxLQUEvRTtBQUNBbkMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCaU0sV0FBeEIsQ0FBUCxHQUE4QyxLQUFLek0sd0JBQUwsQ0FBOEJ3QyxRQUE1RTtBQUNBcEMsZ0JBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCME0sYUFBeEIsQ0FBUCxHQUFnRE4sS0FBaEQ7O0FBRUEsb0JBQUksS0FBS3JMLGVBQUwsS0FBeUJDLHVCQUFnQkMsRUFBekMsSUFBZ0QrRCxzQkFBc0IsSUFBSUEsc0JBQXNCLEtBQUtoRSx1QkFBZ0JDLEVBQXpILEVBQThIO0FBQzVIVyxrQkFBQUEsV0FBVyxjQUFPQyxpQ0FBcUI4SywrQkFBNUIsY0FBK0R2QyxNQUEvRCxjQUF5RWxKLFNBQXpFLHdCQUFnRyxLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQTlILENBQVg7O0FBQ0Esc0JBQUl3RCxzQkFBSixFQUE0QjtBQUMxQm5FLG9CQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLG9CQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsb0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCK0ssbUNBQTVCLGNBQW1FeEMsTUFBbkUsY0FBNkVsSixTQUE3RSx3QkFBb0csS0FBSzFCLHdCQUFMLENBQThCZSxTQUFsSSxDQUFYO0FBQ0Q7QUFDRixpQkFQRCxNQVFLLElBQUl3RCxzQkFBSixFQUE0QjtBQUMvQm5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCZ0wsaUNBQTVCLGNBQWlFekMsTUFBakUsY0FBMkVsSixTQUEzRSx3QkFBa0csS0FBSzFCLHdCQUFMLENBQThCZSxTQUFoSSxDQUFYO0FBQ0Q7O0FBRUQscUJBQUs0RCxrQkFBTCxDQUF3QixLQUFLcEUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRU1zQyxnQkFBQUEsR0FuQ1IsYUFtQ2lCLEtBQUsxQyx3QkFBTCxDQUE4QjJDLE1BbkMvQyxTQW1Dd0RQLFdBbkN4RDtBQW9DUUssZ0JBQUFBLE1BcENSLEdBb0NpQixLQXBDakI7QUFxQ1FzQyxnQkFBQUEsT0FyQ1IsR0FxQ3NDO0FBQ2xDM0Usa0JBQUFBLE9BQU8sRUFBUEEsT0FEa0M7QUFFbENxQyxrQkFBQUEsTUFBTSxFQUFOQSxNQUZrQztBQUdsQ0Msa0JBQUFBLEdBQUcsRUFBSEEsR0FIa0M7QUFJbENZLGtCQUFBQSxPQUFPLDZCQUFFLEtBQUtyRCxhQUFMLENBQW1Cc0QscUJBQXJCLDZFQUE4QyxLQUFLdEQsYUFBTCxDQUFtQnVELG9CQUFuQixDQUF3Q3dKO0FBSjNELGlCQXJDdEM7QUFBQSxtREE0Q1MsSUFBSWhKLE9BQUo7QUFBQSw2R0FBWSxtQkFBT2dCLE9BQVAsRUFBZ0JmLE1BQWhCO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUNBRVFyQixhQUFhLENBQUNtQyxPQUFELENBRnJCOztBQUFBO0FBRVR0Qiw0QkFBQUEsUUFGUztBQUdUQyw0QkFBQUEseUJBSFMsR0FHbUI5QixLQUFLLENBQUMrQixtQkFIekI7QUFJUEMsNEJBQUFBLElBSk8sR0FJV0gsUUFKWCxDQUlQRyxJQUpPLEVBSUR4RCxVQUpDLEdBSVdxRCxRQUpYLENBSURyRCxPQUpDOztBQUtmLDRCQUFBLE9BQUksQ0FBQzZFLGdCQUFMLENBQXNCN0UsVUFBdEI7O0FBRUEsNEJBQUEsT0FBSSxDQUFDMkIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0JvTCwwQkFBdEQsRUFBa0YsK0JBQWxGLEVBQW1INUwsU0FBbkgsRUFBOEgrQixRQUE5SCxFQUF3SUMseUJBQXhJLEVBQW1LdEIsV0FBbkssRUFBZ0xLLE1BQWhMOztBQUVBdUMsNEJBQUFBLE9BQU8sQ0FBQ3BCLElBQUQsQ0FBUDtBQVRlO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBWVRGLDRCQUFBQSw0QkFaUyxHQVltQjlCLEtBQUssQ0FBQytCLG1CQVp6Qjs7QUFhZiw0QkFBQSxPQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU21ELEtBQTVCLEVBQW1DakQsMkJBQW9CcUwsdUJBQXZELEVBQWdGLDRCQUFoRixFQUE4RzdMLFNBQTlHLEVBQXlIcUMsU0FBekgsRUFBb0lMLDRCQUFwSSxFQUErSnRCLFdBQS9KLEVBQTRLSyxNQUE1Szs7QUFDQSxnQ0FBSSxxREFBNEJwQixzQkFBVWdFLHFCQUF0QyxDQUFKLEVBQWtFO0FBQ2hFO0FBQ0Q7O0FBQ0RwQiw0QkFBQUEsTUFBTSxlQUFOOztBQWpCZTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQkFBWjs7QUFBQTtBQUFBO0FBQUE7QUFBQSxvQkE1Q1Q7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTzs7Ozs7Ozs7QUFrRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OzJHQUNFLG1CQUE2QnZDLFNBQTdCLEVBQWdEa0wsS0FBaEQsRUFBK0RZLGdCQUEvRDtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUF5RkMsZ0JBQUFBLDZCQUF6RixpRUFBeUosRUFBeko7QUFDUTdMLGdCQUFBQSxLQURSLEdBQ2dCQyxhQUFNQyxLQUFOLEVBRGhCO0FBRUUscUJBQUtDLGFBQUwsQ0FBbUJDLG1CQUFTQyxJQUE1QixFQUFrQ0MsMkJBQW9Cd0wsc0JBQXRELEVBQThFLDBCQUE5RSxFQUEwR2hNLFNBQTFHO0FBRUlVLGdCQUFBQSxXQUpOLGNBSXdCQyxpQ0FBcUJzTCxrQ0FKN0MsY0FJbUZqTSxTQUpuRix3QkFJMEcsS0FBSzFCLHdCQUFMLENBQThCZSxTQUp4STtBQUtRNkIsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBT0UsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJ5QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzdELG1DQUF1QkYsYUFBeEIsQ0FETTtBQUV4QnlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFGSjtBQUd4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEMEs7QUFIcEQsaUJBQTFCO0FBTVFySixnQkFBQUEsc0JBYlYsR0FhcUNrSiw2QkFickMsQ0FhVWxKLHNCQWJWO0FBY1FuRSxnQkFBQUEsT0FkUixHQWM2QmlCLHNCQUFVb0QsY0FkdkM7QUFlRXJFLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QnlNLGNBQXhCLENBQVAsR0FBaUQsS0FBS2pOLHdCQUFMLENBQThCdUMsS0FBL0U7QUFDQW5DLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QmlNLFdBQXhCLENBQVAsR0FBOEMsS0FBS3pNLHdCQUFMLENBQThCd0MsUUFBNUU7QUFDQXBDLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QjBNLGFBQXhCLENBQVAsR0FBZ0ROLEtBQWhEOztBQUVBLG9CQUFJckksc0JBQUosRUFBNEI7QUFDMUJuRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUIrRCxzQkFBeEIsQ0FBUCxHQUF5REEsc0JBQXpEO0FBQ0FuRSxrQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJGLGFBQXhCLENBQVAsR0FBZ0QsS0FBS0wsYUFBTCxDQUFtQkssYUFBbkU7QUFDQThCLGtCQUFBQSxXQUFXLGNBQU9DLGlDQUFxQndMLHNDQUE1QixjQUFzRW5NLFNBQXRFLHdCQUE2RixLQUFLMUIsd0JBQUwsQ0FBOEJlLFNBQTNILENBQVg7QUFDRDs7QUFFRCxxQkFBSzRELGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7QUFFTXNDLGdCQUFBQSxHQTNCUixhQTJCaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUEzQi9DLFNBMkJ3RFAsV0EzQnhEO0FBNEJRSyxnQkFBQUEsTUE1QlIsR0E0QmlCLE1BNUJqQjtBQTZCUXNDLGdCQUFBQSxPQTdCUixHQTZCc0M7QUFDbENuQixrQkFBQUEsSUFBSSxFQUFFeUUsSUFBSSxDQUFDQyxTQUFMLENBQWVrRixnQkFBZixDQUQ0QjtBQUVsQ3BOLGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFIa0M7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSmtDO0FBS2xDWSxrQkFBQUEsT0FBTyw2QkFBRSxLQUFLckQsYUFBTCxDQUFtQnNELHFCQUFyQiw2RUFBOEMsS0FBS3RELGFBQUwsQ0FBbUJ1RCxvQkFBbkIsQ0FBd0NvSztBQUwzRCxpQkE3QnRDO0FBQUEsbURBcUNTLElBQUk1SixPQUFKO0FBQUEsNkdBQVksbUJBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRckIsYUFBYSxDQUFDbUMsT0FBRCxDQUZyQjs7QUFBQTtBQUVUdEIsNEJBQUFBLFFBRlM7QUFHUHJELDRCQUFBQSxVQUhPLEdBR0txRCxRQUhMLENBR1ByRCxPQUhPOztBQUlmLDRCQUFBLE9BQUksQ0FBQzZFLGdCQUFMLENBQXNCN0UsVUFBdEI7O0FBRU1zRCw0QkFBQUEseUJBTlMsR0FNbUI5QixLQUFLLENBQUMrQixtQkFOekI7O0FBT2YsNEJBQUEsT0FBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I0TCx3QkFBdEQsRUFBZ0YsNEJBQWhGLEVBQThHcE0sU0FBOUcsRUFBeUgrQixRQUF6SCxFQUFtSUMseUJBQW5JLEVBQThKdEIsV0FBOUosRUFBMktLLE1BQTNLOztBQUVBdUMsNEJBQUFBLE9BQU87QUFUUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVlUdEIsNEJBQUFBLDRCQVpTLEdBWW1COUIsS0FBSyxDQUFDK0IsbUJBWnpCOztBQWFmLDRCQUFBLE9BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0I2TCxxQkFBdkQsRUFBOEUseUJBQTlFLEVBQXlHck0sU0FBekcsRUFBb0hxQyxTQUFwSCxFQUErSEwsNEJBQS9ILEVBQTBKdEIsV0FBMUosRUFBdUtLLE1BQXZLOztBQUNBLGdDQUFJLHFEQUE0QnBCLHNCQUFVZ0UscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBakJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXJDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTJEQTtBQUNGO0FBQ0E7QUFDQTs7Ozs7Z0hBQ0UsbUJBQWtDdkMsU0FBbEM7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDUUUsZ0JBQUFBLEtBRFIsR0FDZ0JDLGFBQU1DLEtBQU4sRUFEaEI7QUFFRSxxQkFBS0MsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0I4TCx1QkFBdEQsRUFBK0UsNEJBQS9FLEVBQTZHdE0sU0FBN0c7O0FBQ0Esb0JBQUksQ0FBQ0EsU0FBTCxFQUFnQjtBQUNkQSxrQkFBQUEsU0FBUyxHQUFHLG1CQUFaO0FBQ0Q7O0FBRUtVLGdCQUFBQSxXQVBSLGNBTzBCQyxpQ0FBcUI0TCxnQ0FQL0MsY0FPbUYsS0FBS2pPLHdCQUFMLENBQThCdUMsS0FQakg7QUFRUUssZ0JBQUFBLGFBUlIsR0FRd0JDLGtCQUFNQyxNQUFOLEVBUnhCO0FBVUUsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJHLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFESjtBQUV4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEZ0w7QUFGcEQsaUJBQTFCO0FBS005TixnQkFBQUEsT0FmUixHQWU2QmlCLHNCQUFVb0QsY0FmdkM7QUFnQkVyRSxnQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJ5TSxjQUF4QixDQUFQLEdBQWlELEtBQUtqTix3QkFBTCxDQUE4QnVDLEtBQS9FO0FBQ0FuQyxnQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJrQixTQUF4QixDQUFQLEdBQTRDQSxTQUE1QztBQUVBLHFCQUFLaUQsa0JBQUwsQ0FBd0IsS0FBS3BFLFNBQTdCLEVBQXdDSCxPQUF4QztBQUVNc0MsZ0JBQUFBLEdBckJSLGFBcUJpQixLQUFLMUMsd0JBQUwsQ0FBOEIyQyxNQXJCL0MsU0FxQndEUCxXQXJCeEQ7QUFzQlFLLGdCQUFBQSxNQXRCUixHQXNCaUIsS0F0QmpCO0FBdUJRc0MsZ0JBQUFBLE9BdkJSLEdBdUJzQztBQUNsQzNFLGtCQUFBQSxPQUFPLEVBQVBBLE9BRGtDO0FBRWxDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFGa0M7QUFHbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSGtDO0FBSWxDWSxrQkFBQUEsT0FBTyw2QkFBRSxLQUFLckQsYUFBTCxDQUFtQnNELHFCQUFyQiw2RUFBOEMsS0FBS3RELGFBQUwsQ0FBbUJ1RCxvQkFBbkIsQ0FBd0MwSztBQUozRCxpQkF2QnRDO0FBQUEsbURBOEJTLElBQUlsSyxPQUFKO0FBQUEsNkdBQVksbUJBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRckIsYUFBYSxDQUFDbUMsT0FBRCxDQUZyQjs7QUFBQTtBQUVUdEIsNEJBQUFBLFFBRlM7QUFHVEMsNEJBQUFBLHlCQUhTLEdBR21COUIsS0FBSyxDQUFDK0IsbUJBSHpCO0FBSVBDLDRCQUFBQSxJQUpPLEdBSUVILFFBSkYsQ0FJUEcsSUFKTzs7QUFLZiw0QkFBQSxPQUFJLENBQUM3QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQmlNLHlCQUF0RCxFQUFpRiw4QkFBakYsRUFBaUh6TSxTQUFqSCxFQUE0SCtCLFFBQTVILEVBQXNJQyx5QkFBdEksRUFBaUt0QixXQUFqSyxFQUE4S0ssTUFBOUs7O0FBRUF1Qyw0QkFBQUEsT0FBTyxDQUFDcEIsSUFBRCxDQUFQO0FBUGU7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFVVEYsNEJBQUFBLDRCQVZTLEdBVW1COUIsS0FBSyxDQUFDK0IsbUJBVnpCOztBQVdmLDRCQUFBLE9BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0JrTSxzQkFBdkQsRUFBK0UsMkJBQS9FLEVBQTRHMU0sU0FBNUcsRUFBdUhxQyxTQUF2SCxFQUFrSUwsNEJBQWxJLEVBQTZKdEIsV0FBN0osRUFBMEtLLE1BQTFLOztBQUNBLGdDQUFJLHFEQUE0QnBCLHNCQUFVZ0UscUJBQXRDLENBQUosRUFBa0U7QUFDaEU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBZmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBOUJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBa0RBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7NEhBQ0UsbUJBQThDdkMsU0FBOUMsRUFBaUUyTSxnQ0FBakU7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBMkdDLGdCQUFBQSxtQ0FBM0csaUVBQXVMLEVBQXZMO0FBQ1ExTSxnQkFBQUEsS0FEUixHQUNnQkMsYUFBTUMsS0FBTixFQURoQjtBQUVFLHFCQUFLQyxhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQnFNLG1DQUF0RCxFQUEyRix5Q0FBM0YsRUFBc0k3TSxTQUF0STtBQUVJVSxnQkFBQUEsV0FKTixjQUl3QkMsaUNBQXFCbU0saUNBSjdDLGNBSWtGLEtBQUt4Tyx3QkFBTCxDQUE4QnVDLEtBSmhILGNBSXlILEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBSnZKLGNBSW1LZCxTQUpuSztBQUtRa0IsZ0JBQUFBLGFBTFIsR0FLd0JDLGtCQUFNQyxNQUFOLEVBTHhCO0FBT0UsNENBQVdGLGFBQVgsRUFBMEI7QUFDeEJ5QixrQkFBQUEsZ0JBQWdCLEVBQUUsQ0FBQzdELG1DQUF1QkYsYUFBeEIsQ0FETTtBQUV4QnlDLGtCQUFBQSxPQUFPLEVBQUUsS0FBSzlDLGFBQUwsQ0FBbUIrQywwQkFGSjtBQUd4QkMsa0JBQUFBLDBCQUEwQixFQUFFLEtBQUtoRCxhQUFMLENBQW1CaUQsNEJBQW5CLENBQWdEdUw7QUFIcEQsaUJBQTFCO0FBTVFsSyxnQkFBQUEsc0JBYlYsR0FhcUMrSixtQ0FickMsQ0FhVS9KLHNCQWJWO0FBY1FuRSxnQkFBQUEsT0FkUixHQWM2QmlCLHNCQUFVb0QsY0FkdkM7QUFlRXJFLGdCQUFBQSxPQUFPLENBQUNJLG1DQUF1QnlNLGNBQXhCLENBQVAsR0FBaUQsS0FBS2pOLHdCQUFMLENBQThCdUMsS0FBL0U7O0FBRUEsb0JBQUlnQyxzQkFBSixFQUE0QjtBQUMxQm5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QitELHNCQUF4QixDQUFQLEdBQXlEQSxzQkFBekQ7QUFDQW5FLGtCQUFBQSxPQUFPLENBQUNJLG1DQUF1QkYsYUFBeEIsQ0FBUCxHQUFnRCxLQUFLTCxhQUFMLENBQW1CSyxhQUFuRTtBQUNBOEIsa0JBQUFBLFdBQVcsY0FBT0MsaUNBQXFCcU0scUNBQTVCLGNBQXFFLEtBQUsxTyx3QkFBTCxDQUE4QnVDLEtBQW5HLGNBQTRHLEtBQUt2Qyx3QkFBTCxDQUE4QndDLFFBQTFJLGNBQXNKZCxTQUF0SixDQUFYO0FBQ0Q7O0FBRUQscUJBQUtpRCxrQkFBTCxDQUF3QixLQUFLcEUsU0FBN0IsRUFBd0NILE9BQXhDO0FBRUFnQyxnQkFBQUEsV0FBVyxJQUFJLGdCQUFnQmYsc0JBQVVzTixnQkFBekM7QUFFTWpNLGdCQUFBQSxHQTNCUixhQTJCaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUEzQi9DLFNBMkJ3RFAsV0EzQnhEO0FBNEJRSyxnQkFBQUEsTUE1QlIsR0E0QmlCLE1BNUJqQjtBQTZCUXNDLGdCQUFBQSxPQTdCUixHQTZCc0M7QUFDbENuQixrQkFBQUEsSUFBSSxFQUFFeUUsSUFBSSxDQUFDQyxTQUFMLENBQWUrRixnQ0FBZixDQUQ0QjtBQUVsQ2pPLGtCQUFBQSxPQUFPLEVBQVBBLE9BRmtDO0FBR2xDcUMsa0JBQUFBLE1BQU0sRUFBTkEsTUFIa0M7QUFJbENDLGtCQUFBQSxHQUFHLEVBQUhBLEdBSmtDO0FBS2xDWSxrQkFBQUEsT0FBTyw2QkFBRSxLQUFLckQsYUFBTCxDQUFtQnNELHFCQUFyQiw2RUFBOEMsS0FBS3RELGFBQUwsQ0FBbUJ1RCxvQkFBbkIsQ0FBd0NpTDtBQUwzRCxpQkE3QnRDO0FBQUEsbURBcUNTLElBQUl6SyxPQUFKO0FBQUEsNkdBQVksbUJBQU9nQixPQUFQLEVBQWdCZixNQUFoQjtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1DQUVRckIsYUFBYSxDQUFDbUMsT0FBRCxDQUZyQjs7QUFBQTtBQUVUdEIsNEJBQUFBLFFBRlM7QUFHUHJELDRCQUFBQSxVQUhPLEdBR0txRCxRQUhMLENBR1ByRCxPQUhPOztBQUlmLDRCQUFBLE9BQUksQ0FBQzZFLGdCQUFMLENBQXNCN0UsVUFBdEI7O0FBRU1zRCw0QkFBQUEseUJBTlMsR0FNbUI5QixLQUFLLENBQUMrQixtQkFOekI7O0FBT2YsNEJBQUEsT0FBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNDLElBQTVCLEVBQWtDQywyQkFBb0IwTSxxQ0FBdEQsRUFBNkYsMkNBQTdGLEVBQTBJbE4sU0FBMUksRUFBcUorQixRQUFySixFQUErSkMseUJBQS9KLEVBQTBMdEIsV0FBMUwsRUFBdU1LLE1BQXZNOztBQUNBdUMsNEJBQUFBLE9BQU87QUFSUTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQVdUdEIsNEJBQUFBLDRCQVhTLEdBV21COUIsS0FBSyxDQUFDK0IsbUJBWHpCOztBQVlmLDRCQUFBLE9BQUksQ0FBQzVCLGFBQUwsQ0FBbUJDLG1CQUFTbUQsS0FBNUIsRUFBbUNqRCwyQkFBb0IyTSxrQ0FBdkQsRUFBMkYsd0NBQTNGLEVBQXFJbk4sU0FBckksRUFBZ0pxQyxTQUFoSixFQUEySkwsNEJBQTNKLEVBQXNMdEIsV0FBdEwsRUFBbU1LLE1BQW5NOztBQUNBLGdDQUFJLHFEQUE2QnBCLHNCQUFVZ0UscUJBQXZDLENBQUosRUFBbUU7QUFDakU7QUFDRDs7QUFDRHBCLDRCQUFBQSxNQUFNLGVBQU47O0FBaEJlO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG1CQUFaOztBQUFBO0FBQUE7QUFBQTtBQUFBLG9CQXJDVDs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxPOzs7Ozs7OztBQTBEQTtBQUNGO0FBQ0E7Ozs7OytHQUNFLG1CQUFpQ3ZDLFNBQWpDLEVBQW9EOEQsc0JBQXBEO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQW9Gc0osZ0JBQUFBLGlDQUFwRixpRUFBNEosRUFBNUo7O0FBQUEsc0JBRU0sQ0FBQ3RKLHNCQUFELElBQTJCQSxzQkFBc0IsS0FBS2hFLHVCQUFnQkMsRUFGNUU7QUFBQTtBQUFBO0FBQUE7O0FBQUEsbURBR1d1QyxPQUFPLENBQUNnQixPQUFSLEVBSFg7O0FBQUE7QUFLUXBELGdCQUFBQSxLQUxSLEdBS2dCQyxhQUFNQyxLQUFOLEVBTGhCO0FBTVVpTixnQkFBQUEsbUJBTlYsR0FNa0NELGlDQU5sQyxDQU1VQyxtQkFOVjs7QUFBQSxzQkFPTSxDQUFDdkosc0JBQUQsSUFBMkJBLHNCQUFzQixLQUFLaEUsdUJBQWdCQyxFQVA1RTtBQUFBO0FBQUE7QUFBQTs7QUFBQSxzQkFPd0YsSUFBSU4sS0FBSixDQUFVLDBDQUFWLENBUHhGOztBQUFBO0FBUVFpQixnQkFBQUEsV0FSUixjQVEwQkMsaUNBQXFCMk0sdUJBUi9DLGNBUTBFdE4sU0FSMUU7QUFTUWtCLGdCQUFBQSxhQVRSLEdBU3dCQyxrQkFBTUMsTUFBTixFQVR4QjtBQVdRMUMsZ0JBQUFBLE9BWFIsR0FXNkJpQixzQkFBVW9ELGNBWHZDO0FBWUVyRSxnQkFBQUEsT0FBTyxDQUFDSSxtQ0FBdUJ5TSxjQUF4QixDQUFQLEdBQWlELEtBQUtqTix3QkFBTCxDQUE4QnVDLEtBQS9FOztBQUNBLG9CQUFJd00sbUJBQUosRUFBeUI7QUFDdkIzTyxrQkFBQUEsT0FBTyxDQUFDaUIsc0JBQVUwTixtQkFBWCxDQUFQLEdBQXlDQSxtQkFBekM7QUFDRDs7QUFFRCxxQkFBS3BLLGtCQUFMLENBQXdCLEtBQUtwRSxTQUE3QixFQUF3Q0gsT0FBeEM7QUFFTXNDLGdCQUFBQSxHQW5CUixhQW1CaUIsS0FBSzFDLHdCQUFMLENBQThCMkMsTUFuQi9DLFNBbUJ3RFAsV0FuQnhEO0FBb0JRSyxnQkFBQUEsTUFwQlIsR0FvQmlCLE1BcEJqQjtBQXFCUXNDLGdCQUFBQSxPQXJCUixHQXFCc0M7QUFDbEMzRSxrQkFBQUEsT0FBTyxFQUFQQSxPQURrQztBQUVsQ3FDLGtCQUFBQSxNQUFNLEVBQU5BLE1BRmtDO0FBR2xDQyxrQkFBQUEsR0FBRyxFQUFIQSxHQUhrQztBQUlsQ1ksa0JBQUFBLE9BQU8sNkJBQUUsS0FBS3JELGFBQUwsQ0FBbUJzRCxxQkFBckIsNkVBQThDLEtBQUt0RCxhQUFMLENBQW1CdUQsb0JBQW5CLENBQXdDeUw7QUFKM0QsaUJBckJ0QztBQUFBLG1EQTRCUyxJQUFJakwsT0FBSjtBQUFBLDZHQUFZLG1CQUFPZ0IsT0FBUCxFQUFnQmYsTUFBaEI7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxtQ0FFUXJCLGFBQWEsQ0FBQ21DLE9BQUQsQ0FGckI7O0FBQUE7QUFFVHRCLDRCQUFBQSxRQUZTO0FBR1RDLDRCQUFBQSx5QkFIUyxHQUdtQjlCLEtBQUssQ0FBQytCLG1CQUh6Qjs7QUFJZiw0QkFBQSxPQUFJLENBQUM1QixhQUFMLENBQW1CQyxtQkFBU0MsSUFBNUIsRUFBa0NDLDJCQUFvQmdOLDRCQUF0RCxFQUFvRixpQ0FBcEYsRUFBdUh4TixTQUF2SCxFQUFrSStCLFFBQWxJLEVBQTRJQyx5QkFBNUksRUFBdUt0QixXQUF2SyxFQUFvTEssTUFBcEw7O0FBRUF1Qyw0QkFBQUEsT0FBTztBQU5RO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBU1R0Qiw0QkFBQUEsNEJBVFMsR0FTbUI5QixLQUFLLENBQUMrQixtQkFUekI7O0FBV2YsNEJBQUEsT0FBSSxDQUFDNUIsYUFBTCxDQUFtQkMsbUJBQVNtRCxLQUE1QixFQUFtQ2pELDJCQUFvQmlOLHlCQUF2RCxFQUFrRiw4QkFBbEYsRUFBa0h6TixTQUFsSCxFQUE2SHFDLFNBQTdILEVBQXdJTCw0QkFBeEksRUFBbUt0QixXQUFuSyxFQUFnTEssTUFBaEw7O0FBRUEsZ0NBQUkscURBQTRCcEIsc0JBQVVnRSxxQkFBdEMsQ0FBSixFQUFrRTtBQUNoRTtBQUNEOztBQUNEcEIsNEJBQUFBLE1BQU0sZUFBTjs7QUFoQmU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQVo7O0FBQUE7QUFBQTtBQUFBO0FBQUEsb0JBNUJUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE87Ozs7Ozs7O0FBaURBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7V0FDRSx1QkFBc0JtTCxRQUF0QixFQUEwQ0Msa0JBQTFDLEVBQW1GQyxXQUFuRixFQUF3RzVOLFNBQXhHLEVBQTRIK0IsUUFBNUgsRUFBMkpDLHlCQUEzSixFQUErTHRCLFdBQS9MLEVBQXFOSyxNQUFyTixFQUFzT2lFLEtBQXRPLEVBQXVQNkksY0FBdlAsRUFBbVI7QUFBQTs7QUFBRTtBQUNuUixVQUFJLENBQUMsS0FBS3BQLE1BQVYsRUFBa0I7QUFDaEI7QUFDRDs7QUFDRCxVQUFJdUcsS0FBSixFQUFXO0FBQ1Q4SSwyQ0FBaUJDLDZCQUFqQixDQUErQy9JLEtBQS9DO0FBQ0Q7O0FBRUQsVUFBSWdKLHVCQUF1QixHQUFHM0wsU0FBOUI7O0FBQ0EsVUFBSXdMLGNBQUosRUFBb0I7QUFDbEJHLFFBQUFBLHVCQUF1QixxQkFBUUgsY0FBUixDQUF2Qjs7QUFDQSxZQUFJRyx1QkFBdUIsQ0FBQy9ILGlCQUE1QixFQUErQztBQUM3QzZILDZDQUFpQkcsNEJBQWpCLENBQThDRCx1QkFBdUIsQ0FBQy9ILGlCQUF0RTtBQUNEOztBQUNELFlBQUkrSCx1QkFBdUIsQ0FBQ0UsZUFBNUIsRUFBNkM7QUFDM0NKLDZDQUFpQkssb0JBQWpCLENBQXNDSCx1QkFBdUIsQ0FBQ0UsZUFBOUQ7QUFDRDs7QUFDREosMkNBQWlCTSxnQkFBakIsQ0FBa0NKLHVCQUFsQztBQUNEOztBQUVELFVBQU1LLFVBQVUsR0FBRztBQUNqQkMsUUFBQUEsU0FBUyxFQUFFdE8sU0FETTtBQUVqQnVPLFFBQUFBLE1BQU0sRUFBRXhNLFFBQUYsYUFBRUEsUUFBRix1QkFBRUEsUUFBUSxDQUFFRyxJQUFWLENBQWVxTSxNQUZOO0FBR2pCQyxRQUFBQSx5QkFBeUIsRUFBRXhNLHlCQUhWO0FBSWpCeU0sUUFBQUEsYUFBYSxFQUFFMU0sUUFBRixhQUFFQSxRQUFGLHVCQUFFQSxRQUFRLENBQUVyRCxPQUFWLENBQWtCaUIsc0JBQVUrTyxhQUE1QixDQUpFO0FBS2pCQyxRQUFBQSxXQUFXLEVBQUVqTyxXQUxJO0FBTWpCa08sUUFBQUEsYUFBYSxFQUFFN04sTUFORTtBQU9qQjhOLFFBQUFBLGtCQUFrQixFQUFFOU0sUUFBUSxHQUFHQSxRQUFRLENBQUN5QyxNQUFaLEdBQXFCUSxLQUFLLGlCQUFJQSxLQUFELENBQWVqRCxRQUFsQiwrQ0FBRyxXQUF5QnlDLE1BQTVCLEdBQXFDbkMsU0FQMUU7QUFPcUY7QUFDdEd5TSxRQUFBQSxnQkFBZ0IsRUFBRTlKLEtBUkQ7QUFTakIrSixRQUFBQSxjQUFjLEVBQUVmO0FBVEMsT0FBbkI7QUFXQSxXQUFLdlAsTUFBTCxDQUFZZ00sR0FBWixDQUFnQmlELFFBQWhCLEVBQTBCQyxrQkFBMUIsRUFBOENVLFVBQTlDLEVBQTBEVCxXQUExRDtBQUNELEssQ0FFRDs7Ozs7OztpQ0F6dkNtQnZQLEcsaUNBQ2dEO0FBQ2pFb0QsRUFBQUEsYUFBYSxFQUFFLEtBRGtEO0FBRWpFbUIsRUFBQUEsYUFBYSxFQUFFLEtBRmtEO0FBR2pFc0IsRUFBQUEsWUFBWSxFQUFFLEtBSG1EO0FBSWpFbUUsRUFBQUEsV0FBVyxFQUFFLEtBSm9EO0FBS2pFVSxFQUFBQSxZQUFZLEVBQUUsS0FMbUQ7QUFNakUxRCxFQUFBQSxxQkFBcUIsRUFBRSxLQU4wQztBQU9qRUcsRUFBQUEsd0JBQXdCLEVBQUUsS0FQdUM7QUFRakUwRSxFQUFBQSxzQkFBc0IsRUFBRSxLQVJ5QztBQVNqRVcsRUFBQUEsbUJBQW1CLEVBQUUsS0FUNEM7QUFVakVTLEVBQUFBLGtCQUFrQixFQUFFLEtBVjZDO0FBV2pFWSxFQUFBQSxlQUFlLEVBQUUsSUFYZ0Q7QUFZakVNLEVBQUFBLG9CQUFvQixFQUFFLElBWjJDO0FBYWpFTyxFQUFBQSxnQ0FBZ0MsRUFBRSxLQWIrQjtBQWNqRWxILEVBQUFBLG9CQUFvQixFQUFFLEtBZDJDO0FBZWpFMEgsRUFBQUEsbUJBQW1CLEVBQUUsSUFmNEM7QUFnQmpFN0QsRUFBQUEsNkJBQTZCLEVBQUU7QUFoQmtDLEM7aUNBRGhEckwsRywwQkFvQnNDO0FBQ3ZETyxFQUFBQSxhQUFhLEVBQUUsb0JBQVNvUSxTQUFULENBQW1CLENBQW5CLEVBQXNCLENBQXRCLENBRHdDO0FBRXZEcEssRUFBQUEsc0JBQXNCLEVBQUUsRUFGK0I7QUFHdkRLLEVBQUFBLHVDQUF1QyxFQUFFLEtBSGM7QUFJdkRiLEVBQUFBLHNCQUFzQixFQUFFLEtBSitCO0FBS3ZEOUMsRUFBQUEsMEJBQTBCLEVBQUUsQ0FMMkI7QUFNdkRPLEVBQUFBLHFCQUFxQixFQUFFUSxTQU5nQztBQU92RFAsRUFBQUEsb0JBQW9CLEVBQUV6RCxHQUFHLENBQUM0USwyQkFQNkI7QUFRdkQvTCxFQUFBQSxpQ0FBaUMsRUFBRSxLQVJvQjtBQVN2RDFCLEVBQUFBLDRCQUE0QixFQUFFME47QUFUeUIsQyIsInNvdXJjZVJvb3QiOiJvY3NkazovLy8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBoYXNoIGZyb20gXCJjcnlwdG9cIjtcblxuaW1wb3J0IHsgQ2hhbm5lbElkLCBMaXZlQ2hhdFZlcnNpb24sIE9DU0RLVGVsZW1ldHJ5RXZlbnQgfSBmcm9tIFwiLi9Db21tb24vRW51bXNcIjtcbmltcG9ydCBheGlvcywgeyBBeGlvc1JlcXVlc3RDb25maWcsIEF4aW9zUmVzcG9uc2UgfSBmcm9tIFwiYXhpb3NcIjtcblxuaW1wb3J0IHsgQnJvd3NlckluZm8gfSBmcm9tIFwiLi9VdGlscy9Ccm93c2VySW5mb1wiO1xuaW1wb3J0IENvbnN0YW50cyBmcm9tIFwiLi9Db21tb24vQ29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDdXN0b21Db250ZXh0RGF0YSB9IGZyb20gXCIuL1V0aWxzL0N1c3RvbUNvbnRleHREYXRhXCI7XG5pbXBvcnQgeyBEZXZpY2VJbmZvIH0gZnJvbSBcIi4vVXRpbHMvRGV2aWNlSW5mb1wiO1xuaW1wb3J0IEZldGNoQ2hhdFRva2VuUmVzcG9uc2UgZnJvbSBcIi4vTW9kZWwvRmV0Y2hDaGF0VG9rZW5SZXNwb25zZVwiO1xuaW1wb3J0IElEYXRhTWFza2luZ0luZm8gZnJvbSBcIi4vSW50ZXJmYWNlcy9JRGF0YU1hc2tpbmdJbmZvXCI7XG5pbXBvcnQgSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRRdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJT21uaWNoYW5uZWxDb25maWd1cmF0aW9uIGZyb20gXCIuL0ludGVyZmFjZXMvSU9tbmljaGFubmVsQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zXCI7XG5pbXBvcnQgSVNESyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtcIjtcbmltcG9ydCBJU0RLQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTREtDb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXNcIlxuaW1wb3J0IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElWYWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSW5pdENvbnRleHQgZnJvbSBcIi4vTW9kZWwvSW5pdENvbnRleHRcIjtcbmltcG9ydCBMb2NhbGVzIGZyb20gXCIuL0NvbW1vbi9Mb2NhbGVzXCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL01vZGVsL0xvZ0xldmVsXCI7XG5pbXBvcnQgeyBMb2dnaW5nU2FuaXRpemVyIH0gZnJvbSBcIi4vVXRpbHMvTG9nZ2luZ1Nhbml0aXplclwiO1xuaW1wb3J0IE9DU0RLTG9nZ2VyIGZyb20gXCIuL0NvbW1vbi9PQ1NES0xvZ2dlclwiO1xuaW1wb3J0IHsgT1NJbmZvIH0gZnJvbSBcIi4vVXRpbHMvT1NJbmZvXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxFbmRwb2ludHMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsRW5kcG9pbnRzXCI7XG5pbXBvcnQgT21uaWNoYW5uZWxIVFRQSGVhZGVycyBmcm9tIFwiLi9Db21tb24vT21uaWNoYW5uZWxIVFRQSGVhZGVyc1wiO1xuaW1wb3J0IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgZnJvbSBcIi4vSW50ZXJmYWNlcy9PbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyXCI7XG5pbXBvcnQgUXVldWVBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUXVldWVBdmFpbGFiaWxpdHlcIjtcbmltcG9ydCBSZWNvbm5lY3RBdmFpbGFiaWxpdHkgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0QXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0TWFwcGluZ1JlY29yZCBmcm9tIFwiLi9Nb2RlbC9SZWNvbm5lY3RNYXBwaW5nUmVjb3JkXCI7XG5pbXBvcnQgeyBSZXF1ZXN0VGltZW91dENvbmZpZyB9IGZyb20gXCIuL0NvbW1vbi9SZXF1ZXN0VGltZW91dENvbmZpZ1wiO1xuaW1wb3J0IHsgU3RyaW5nTWFwIH0gZnJvbSBcIi4vQ29tbW9uL01hcHBpbmdzXCI7XG5pbXBvcnQgeyBUaW1lciB9IGZyb20gXCIuL1V0aWxzL1RpbWVyXCI7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tIFwiLi9VdGlscy9heGlvc1JldHJ5XCI7XG5pbXBvcnQgeyBjcmVhdGVHZXRDaGF0VG9rZW5FbmRwb2ludCB9IGZyb20gXCIuL1V0aWxzL2VuZHBvaW50c0NyZWF0b3JzXCI7XG5pbXBvcnQgaXNFeHBlY3RlZEF4aW9zRXJyb3IgZnJvbSBcIi4vVXRpbHMvaXNFeHBlY3RlZEF4aW9zRXJyb3JcIjtcbmltcG9ydCBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlciBmcm9tIFwiLi9VdGlscy9TZXNzaW9uSW5pdFJldHJ5SGFuZGxlclwiO1xuaW1wb3J0IHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvciBmcm9tIFwiLi9VdGlscy90aHJvd0NsaWVudEhUVFBFcnJvclwiO1xuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4vVXRpbHMvdXVpZFwiO1xuaW1wb3J0IHsgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3MgfSBmcm9tIFwiLi9VdGlscy93YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnc1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTREsgaW1wbGVtZW50cyBJU0RLIHtcbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnOiBSZXF1ZXN0VGltZW91dENvbmZpZyA9IHtcbiAgICBnZXRDaGF0Q29uZmlnOiAzMDAwMCxcbiAgICBnZXRMV0lEZXRhaWxzOiAxNTAwMCxcbiAgICBnZXRDaGF0VG9rZW46IDE1MDAwLFxuICAgIHNlc3Npb25Jbml0OiAxNTAwMCxcbiAgICBzZXNzaW9uQ2xvc2U6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdGFibGVDaGF0czogMTUwMDAsXG4gICAgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlOiAxNTAwMCxcbiAgICBnZXRTdXJ2ZXlJbnZpdGVMaW5rOiAxNTAwMCxcbiAgICBnZXRDaGF0VHJhbnNjcmlwdHM6IDMwMDAwLFxuICAgIGVtYWlsVHJhbnNjcmlwdDogNTAwMCxcbiAgICBmZXRjaERhdGFNYXNraW5nSW5mbzogNTAwMCxcbiAgICBtYWtlU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdDogMTUwMDAsXG4gICAgZ2V0QWdlbnRBdmFpbGFiaWxpdHk6IDE1MDAwLFxuICAgIHNlbmRUeXBpbmdJbmRpY2F0b3I6IDUwMDAsXG4gICAgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXQ6IDE1MDAwXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGVmYXVsdENvbmZpZ3VyYXRpb246IElTREtDb25maWd1cmF0aW9uID0ge1xuICAgIGF1dGhDb2RlTm9uY2U6IHV1aWR2NCgpLnN1YnN0cmluZygwLCA4KSxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeUNvdW50OiAxMCxcbiAgICBnZXRDaGF0VG9rZW5UaW1lQmV0d2VlblJldHJpZXNPbkZhaWx1cmU6IDEwMDAwLFxuICAgIGdldENoYXRUb2tlblJldHJ5T240Mjk6IGZhbHNlLFxuICAgIG1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlOiAzLFxuICAgIGRlZmF1bHRSZXF1ZXN0VGltZW91dDogdW5kZWZpbmVkLFxuICAgIHJlcXVlc3RUaW1lb3V0Q29uZmlnOiBTREsuZGVmYXVsdFJlcXVlc3RUaW1lb3V0Q29uZmlnLFxuICAgIHVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbTogZmFsc2UsXG4gICAgd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZzogd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcbiAgfTtcblxuICBsaXZlQ2hhdFZlcnNpb246IG51bWJlcjtcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjogSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiwgcHJpdmF0ZSBjb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbiwgcHJpdmF0ZSBsb2dnZXI/OiBPQ1NES0xvZ2dlcikge1xuICAgIC8vIFNldHMgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIGlmIHBhc3NlZCBjb25maWd1cmF0aW9uIGlzIGVtcHR5IG9yIGlzIG5vdCBhbiBvYmplY3RcbiAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29uZmlndXJhdGlvbikubGVuZ3RoIHx8IHR5cGVvZiAoY29uZmlndXJhdGlvbikgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBTREsgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW2Ake2tleX1gXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBpbmRpdmlkdWFsIGVuZHBvaW50VGltZW91dCBjb25maWdcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXSkpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0uaGFzT3duUHJvcGVydHkoa2V5KSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF0gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb25bXCJyZXF1ZXN0VGltZW91dENvbmZpZ1wiXVtgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgY2hhbm5lbElkXG4gICAgY29uc3QgeyBjaGFubmVsSWQgfSA9IG9tbmljaGFubmVsQ29uZmlndXJhdGlvbjtcbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoQ2hhbm5lbElkKS5pbmNsdWRlcyhjaGFubmVsSWQgYXMgQ2hhbm5lbElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNoYW5uZWxJZGApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIE9DIGNvbmZpZ1xuICAgIGNvbnN0IGN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzID0gT2JqZWN0LmtleXMob21uaWNoYW5uZWxDb25maWd1cmF0aW9uKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBDb25zdGFudHMucmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzKSB7XG4gICAgICBpZiAoIWN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nICcke2tleX0nIGluIE9tbmljaGFubmVsQ29uZmlndXJhdGlvbmApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gTGl2ZUNoYXRWZXJzaW9uLlYyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgY2hhdCBjb25maWcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgdG8gZ2V0IGNoYXQgY29uZmlnIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdENvbmZpZyhyZXF1ZXN0SWQ6IHN0cmluZywgYnlwYXNzQ2FjaGUgPSBmYWxzZSk6IFByb21pc2U8b2JqZWN0IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUQ09ORklHRlNUQVJURUQsIFwiR2V0IENoYXQgY29uZmlnIHN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRDb25maWdQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfT9yZXF1ZXN0SWQ9JHtyZXF1ZXN0SWR9JmNoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICAgfSk7XG5cbiAgICBsZXQgaGVhZGVycyA9IHt9O1xuICAgIGlmIChieXBhc3NDYWNoZSkge1xuICAgICAgaGVhZGVycyA9IHsgLi4uQ29uc3RhbnRzLmJ5cGFzc0NhY2hlSGVhZGVycywgLi4uaGVhZGVycyB9O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcblxuICAgICAgaWYgKGRhdGEuTGl2ZUNoYXRWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMubGl2ZUNoYXRWZXJzaW9uID0gZGF0YS5MaXZlQ2hhdFZlcnNpb247XG4gICAgICB9XG5cbiAgICAgIGRhdGEuaGVhZGVycyA9IHt9O1xuICAgICAgaWYgKHJlc3BvbnNlLmhlYWRlcnMgJiYgcmVzcG9uc2UuaGVhZGVyc1tcImRhdGVcIl0pIHtcbiAgICAgICAgZGF0YS5oZWFkZXJzW1wiZGF0ZVwiXSA9IHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdO1xuICAgICAgfVxuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR1NVQ0NFREVELCBcIkdldCBDaGF0IGNvbmZpZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdGQUlMRUQsIFwiR2V0IENoYXQgY29uZmlnIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgICAgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBMV0kgZGV0YWlscy5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSB0byBnZXQgY2hhdCBjb25maWcgKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IExXSSBEZXRhaWxzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExXSURldGFpbHMocmVxdWVzdElkOiBzdHJpbmcsIGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtczogSUdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1RBUlRFRCwgXCJHZXQgTFdJIERldGFpbHMgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIC8vIGNvbnN0cnVjdCBhIGVuZHBvaW50IGZvciBhbm9ueW1vdXMgY2hhdHMgdG8gZ2V0IExXSSBEZXRhaWxzXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0TGl2ZVdvcmtJdGVtRGV0YWlsc1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0TFdJRGV0YWlsc1xuICAgIH0pO1xuXG4gICAgLy8gRXh0cmFjdCBhdXRoIHRva2VuIGFuZCByZWNvbm5lY3QgaWQgZnJvbSBvcHRpb25hbCBwYXJhbVxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVjb25uZWN0SWQgfSA9IGdldExXSURldGFpbHNPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAvLyB1cGRhdGVkIGF1dGggZW5kcG9pbnQgZm9yIGF1dGhlbnRpY2F0ZWQgY2hhdHMgYW5kIGFkZCBhdXRoIHRva2VuIGluIGhlYWRlclxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIC8vIEFwcGVuZCByZWNvbm5lY3QgaWQgb24gdGhlIGVuZHBvaW50IGlmIHZhaWxhYmxlXG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTU1VDQ0VFREVELCBcIkdldCBMV0kgRGV0YWlscyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTFdJU1RBVFVTRkFJTEVELCBcIkdldCBMV0kgRGV0YWlscyBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGNoYXQgdG9rZW4gZnJvbSBPbW5pY2hhbm5lbCB0byBqb2luIFQxIHRocmVhZC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3IgZ2V0Y2hhdHRva2VuIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgZ2V0IGNoYXQgdG9rZW4uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZDogc3RyaW5nLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtczogSUdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zID0ge30sIGN1cnJlbnRSZXRyeUNvdW50OiBudW1iZXIgPSAwKTogUHJvbWlzZTxGZXRjaENoYXRUb2tlblJlc3BvbnNlPiB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWluZmVycmFibGUtdHlwZXNcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiwgcmVmcmVzaFRva2VuIH0gPSBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5TVEFSVEVELCBcIkdldCBDaGF0IFRva2VuIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjdXJyZW50UmV0cnlDb3VudGApO1xuICAgIH1cblxuICAgIGlmICghcmVxdWVzdElkKSB7XG4gICAgICByZXF1ZXN0SWQgPSB1dWlkdjQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBjb25zdCBlbmRwb2ludCA9IGNyZWF0ZUdldENoYXRUb2tlbkVuZHBvaW50KGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gYXMgTGl2ZUNoYXRWZXJzaW9uIHx8IHRoaXMubGl2ZUNoYXRWZXJzaW9uLCBhdXRoZW50aWNhdGVkVXNlclRva2VuID8gdHJ1ZSA6IGZhbHNlKTtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke2VuZHBvaW50fS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAocmVmcmVzaFRva2VuKSB7XG4gICAgICBwYXJhbXMucmVmcmVzaFRva2VuID0gJ3RydWUnXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICBwYXJhbXMsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSwgXG4gICAgICByZXRyeU9uNDI5OiB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VG9rZW5cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgbGV0IGdldENoYXRUb2tlbkVycm9yOmFueSA9IHVuZGVmaW5lZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoaGVhZGVycykge1xuICAgICAgICAgIGlmIChoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbklkID0gaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgY2hhdCB0b2tlbiByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEucmVxdWVzdElkID0gcmVxdWVzdElkO1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUb2tlbiBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBjb250ZW50IGZvciByZWNvbm5lY3QgY2hhdCBjYXNlIHNob3VsZG4ndCBiZSByZXRyaWVkLlxuICAgICAgICBpZiAocmVjb25uZWN0SWQgJiYgcmVzcG9uc2Uuc3RhdHVzID09PSBDb25zdGFudHMubm9Db250ZW50U3RhdHVzQ29kZSkge1xuICAgICAgICAgIHJlamVjdChyZXNwb25zZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VORkFJTEVELCBcIkdldCBDaGF0IFRva2VuIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBnZXRDaGF0VG9rZW5FcnJvciA9IGVycm9yO1xuXG4gICAgICAgIC8vIFN0b3AgcmV0cnkgb24gNDI5XG4gICAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzID09PSBDb25zdGFudHMudG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSAmJiAhdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5T240MjkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyByZXR1cm4vcmVqZWN0IHRvIHJlY3Vyc2l2ZWx5IHJldHJ5IG9uIGZhaWx1cmVzIHVwIHRvIGNoYXQgdG9rZW4gcmV0cnkgY291bnQgbGltaXRcbiAgICAgIH1cblxuICAgICAgLy8gQmFzZSBjYXNlXG4gICAgICBpZiAoY3VycmVudFJldHJ5Q291bnQgKyAxID49IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeUNvdW50KSB7XG4gICAgICAgIGlmIChnZXRDaGF0VG9rZW5FcnJvciAmJiBnZXRDaGF0VG9rZW5FcnJvci5jb2RlID09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZ2V0Q2hhdFRva2VuRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmV0cmllcyB1bnRpbCBpdCByZWFjaGVzIGl0cyBsaW1pdFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZ2V0Q2hhdFRva2VuKHJlcXVlc3RJZCwgZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMsIGN1cnJlbnRSZXRyeUNvdW50ICsgMSkudGhlbigocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpKS5jYXRjaCgoZXJyb3IpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgfSwgdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgcmVjb25uZWN0YWJsZSBjaGF0cyBmcm9tIG9tbmljaGFubmVsIGZyb20gdGhlIGdpdmVuIHVzZXIgaW5mb3JtYXRpb24gaW4gSldUIHRva2VuKGNsYWltIG5hbWU6IHN1YikuXG4gICAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RhYmxlQ2hhdHMocmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zOiBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zKTogUHJvbWlzZTxSZWNvbm5lY3RNYXBwaW5nUmVjb3JkIHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcztcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgY2hhdCBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRSZWNvbm5lY3RhYmxlQ2hhdHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0UmVjb25uZWN0YWJsZUNoYXRzXG4gICAgfTtcblxuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICAvLyBSZXNvbHZlcyBvbmx5IGlmIGl0IGNvbnRhaW5zIHJlY29ubmVjdGFibGUgY2hhdHMgcmVzcG9uc2Ugd2hpY2ggb25seSBoYXBwZW5zIG9uIHN0YXR1cyAyMDBcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgU3VjY2VlZGVkIGFuZCBvbGQgc2Vzc2lvbiByZXR1cm5lZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgaW4gdGhlIG9sZCBzZXNzaW9ucyBzbyByZXR1cm5pbmcgbnVsbFxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQUJMRUNIQVRTLCBcIkdldCBSZWNvbm5lY3RhYmxlIENoYXRzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAqIEBwYXJhbSByZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMgTWFuZGF0ZSBwYXJhbWV0ZXJzIGZvciBnZXQgcmVjb25uZWN0YWJsZSBjaGF0cy5cbiAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmVjb25uZWN0QXZhaWxhYmlsaXR5KHJlY29ubmVjdElkOiBzdHJpbmcpOiBQcm9taXNlPFJlY29ubmVjdEF2YWlsYWJpbGl0eSB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3RhYmxlIGF2YWlsYWJpbGl0eSBTdGFydGVkXCIpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlY29ubmVjdElkfWA7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgdW5kZWZpbmVkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBkYXRhIGZvdW5kIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5XQVJOLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSwgXCJHZXQgUmVjb25uZWN0IGF2YWlsYWJpbGl0eSBkaWRuJ3Qgc2VuZCBhbnkgdmFsaWQgZGF0YVwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgQXZhaWxhYmlsaXR5IGZhaWxlZFwiLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRBZ2VudEF2YWlsYWJpbGl0eShyZXF1ZXN0SWQ6IHN0cmluZywgcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8UXVldWVBdmFpbGFiaWxpdHk+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPWxjd2A7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBjb25zdCBjYWNoT2JqID0ge1xuICAgICAgXCJvcmdJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZCxcbiAgICAgIFwid2lkZ2V0SWRcIjogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWRcbiAgICB9XG5cbiAgICBpZiAoZGF0YSAmJiBkYXRhLmN1c3RvbUNvbnRleHREYXRhKSB7XG4gICAgICBjb25zdCB0ZW1wQXJyID0gQ3VzdG9tQ29udGV4dERhdGEuc29ydChkYXRhLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcImN1c3RvbUNvbnRleHRcIjogdGVtcEFyciB9KTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wb3J0YWxjb250YWN0aWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY2FjaE9iaiwgeyBcInBvcnRhbGNvbnRhY3RpZFwiOiBkYXRhLnBvcnRhbGNvbnRhY3RpZCB9KTtcbiAgICB9XG5cbiAgICBkYXRhLmNhY2hlS2V5ID0gaGFzaC5jcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoSlNPTi5zdHJpbmdpZnkoY2FjaE9iaikpLmRpZ2VzdCgnaGV4JykudG9TdHJpbmcoKTtcblxuICAgIGlmIChnZXRDb250ZXh0ICYmICF3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYGdldENvbnRleHQgaXMgb25seSBzdXBwb3J0ZWQgb24gd2ViIGJyb3dzZXJzYCkpO1xuICAgIH1cblxuICAgIGlmIChnZXRDb250ZXh0KSB7XG4gICAgICBkYXRhLmJyb3dzZXIgPSBCcm93c2VySW5mby5nZXRCcm93c2VyTmFtZSgpO1xuICAgICAgZGF0YS5kZXZpY2UgPSBEZXZpY2VJbmZvLmdldERldmljZVR5cGUoKTtcbiAgICAgIGRhdGEub3JpZ2ludXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBkYXRhLm9zID0gT1NJbmZvLmdldE9zVHlwZSgpO1xuICAgIH1cblxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcblxuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0QWdlbnRBdmFpbGFiaWxpdHlcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZU1VDQ0VFREVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCwgXCJHZXQgYWdlbnQgYXZhaWxhYmlsaXR5IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHRvIG9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGluaXQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGluaXQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2Vzc2lvbkluaXQocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVEFSVEVELCBcIlNlc3Npb24gSW5pdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkluaXQsXG4gICAgICBzaG91bGRSZXRyeTogc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIsXG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWNvbm5lY3RJZCwgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgaW5pdENvbnRleHQsIGdldENvbnRleHQgfSA9IHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlc3Npb25Jbml0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHJlcXVlc3RQYXRoICs9IGAvJHtyZWNvbm5lY3RJZH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtczogT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlciA9IHtcbiAgICAgIGNoYW5uZWxJZDogdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICBwYXJhbXMuc2lnID0gcmVjb25uZWN0SWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhOiBJbml0Q29udGV4dCA9IGluaXRDb250ZXh0IHx8IHt9O1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGRlZmF1bHQgbG9jYWxlIGlmIGxvY2FsZSBpcyBlbXB0eVxuICAgIGlmICghZGF0YS5sb2NhbGUpIHtcbiAgICAgIGRhdGEubG9jYWxlID0gQ29uc3RhbnRzLmRlZmF1bHRMb2NhbGU7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbG9jYWxlXG4gICAgaWYgKGRhdGEubG9jYWxlICYmICFMb2NhbGVzLnN1cHBvcnRlZExvY2FsZXMuaW5jbHVkZXMoZGF0YS5sb2NhbGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbnN1cHBvcnRlZCBsb2NhbGU6ICcke2RhdGEubG9jYWxlfSdgKSk7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25Jbml0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRTVUNDRUVERUQsIFwiU2Vzc2lvbiBJbml0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCB1bmRlZmluZWQsIGRhdGEpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05JTklURkFJTEVELCBcIlNlc3Npb24gSW5pdCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yLCBkYXRhKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBzZXNzaW9uIGNsb3NlIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBjbG9zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uQ2xvc2UocmVxdWVzdElkOiBzdHJpbmcsIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVEFSVEVELCBcIlNlc3Npb24gQ2xvc2UgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpc1JlY29ubmVjdENoYXQsIGlzUGVyc2lzdGVudENoYXQsIGNoYXRJZCB9ID0gc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgY29uc3QgZGF0YTogYW55ID0ge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGRhdGEuY2hhdElkID0gY2hhdElkO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFNlc3Npb25DbG9zZVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBpZiAoaXNSZWNvbm5lY3RDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUmVjb25uZWN0Q2hhdD10cnVlYDtcbiAgICB9XG5cbiAgICBpZiAoaXNQZXJzaXN0ZW50Q2hhdCkge1xuICAgICAgcmVxdWVzdFBhdGggKz0gYCZpc1BlcnNpc3RlbnRDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5zZXNzaW9uQ2xvc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VTVUNDRUVERUQsIFwiU2Vzc2lvbiBDbG9zZSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIH0gY2F0Y2ggKGVycm9yIDogYW55KSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTkNMT1NFRkFJTEVELCBcIlNlc3Npb24gY2xvc2UgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgYXV0aCBjaGF0IHJlY29yZCBleGlzdHMgaW4gZGF0YWJhc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCBmb3IgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZCAoc2FtZSByZXF1ZXN0IGlkIGZvciBzZXNzaW9uIGluaXQpLlxuICAgKiBAcGFyYW0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQocmVxdWVzdElkOiBzdHJpbmcsIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtczogSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVELCBcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjaGF0SWQgfSA9IHZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFZhbGlkYXRlQXV0aENoYXRNYXBSZWNvcmRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLnZhbGlkYXRlQXV0aENoYXRSZWNvcmRcbiAgICB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFRpbWVvdXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBpZiAocmVzcG9uc2UuZGF0YT8uYXV0aENoYXRFeGlzdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVUNDRUVERUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBGYWlsZWQuIFJlY29yZCBpcyBub3QgZm91bmQgb3IgcmVxdWVzdCBpcyBub3QgYXV0aG9yaXplZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3IgOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlZBTElEQVRFQVVUSENIQVRSRUNPUkRGQUlMRUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXJyb3IudG9TdHJpbmcoKSA9PT0gXCJFcnJvcjogUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSA0MDRcIikgeyAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdHMgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHBvc3RDaGF0UmVzcG9uc2UgUG9zdCBjaGF0IHJlc3BvbnNlIHRvIHN1Ym1pdC5cbiAgICogQHBhcmFtIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc3VibWl0IHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlKHJlcXVlc3RJZDogc3RyaW5nLCBwb3N0Q2hhdFJlc3BvbnNlOiBvYmplY3QsIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtczogSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1RBUlRFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHBvc3RDaGF0UmVzcG9uc2UpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRGQUlMRUQsIFwiU3VibWl0IFBvc3QgQ2hhdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFN1cnZleUludml0ZUxpbmsoc3VydmV5T3duZXJJZDogc3RyaW5nLCBzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keTogb2JqZWN0LCBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM6IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8b2JqZWN0PiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGlmICh0aGlzLmxvZ2dlcikge1xuICAgICAgdGhpcy5sb2dnZXIubG9nKExvZ0xldmVsLklORk8sXG4gICAgICAgIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQsXG4gICAgICAgIHsgU3VydmV5T3duZXJJZDogc3VydmV5T3duZXJJZCB9LFxuICAgICAgICBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3RhcnRlZFwiKTtcbiAgICB9XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0R2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHsgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sIFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgcmVxdWVzdElkIH0gPSBnZXRzdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXM7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0U3VydmV5SW52aXRlTGlua1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7c3VydmV5T3duZXJJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmIChyZXF1ZXN0SWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc3VydmV5SW52aXRlQVBJUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFN1cnZleUludml0ZUxpbmtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1VDQ0VFREVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUU1VSVkVZSU5WSVRFTElOS0ZBSUxFRCwgXCJHZXQgU3VydmV5IEludml0ZSBMaW5rIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY2hhdCB0cmFuc2NyaXB0cyBmb3IgY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gY2hhdElkIENoYXQgdGhyZWFkIElkLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0cmFuc2NyaXB0cy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VHJhbnNjcmlwdHMocmVxdWVzdElkOiBzdHJpbmcsIGNoYXRJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBnZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtczogSUdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNUQVJURUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfSA9IGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKHRoaXMubGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIgfHwgKGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gJiYgY3VycmVudExpdmVDaGF0VmVyc2lvbiA9PT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSkge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXR2MkdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyQXV0aEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdFRyYW5zY3JpcHRzXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiR2V0IENoYXQgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVEZBSUxFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWFpbCB0cmFuc2NyaXB0IHRvIGN1c3RvbWVyLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICogQHBhcmFtIHRva2VuIFNreXBlIHRva2VuLlxuICAgKiBAcGFyYW0gZW1haWxSZXF1ZXN0Qm9keSBFbWFpbCByZXF1ZXN0IGJvZHkuXG4gICAqIEBwYXJhbSBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBlbWFpbCB0cmFuc2NyaXB0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGVtYWlsVHJhbnNjcmlwdChyZXF1ZXN0SWQ6IHN0cmluZywgdG9rZW46IHN0cmluZywgZW1haWxSZXF1ZXN0Qm9keTogb2JqZWN0LCBlbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtczogSUVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZW1haWxUcmFuc2NyaXB0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLndpZGdldEFwcElkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRob3JpemF0aW9uXSA9IHRva2VuO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFRyYW5zY3JpcHRFbWFpbFJlcXVlc3RQYXRofS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShlbWFpbFJlcXVlc3RCb2R5KSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVUNDRUVERUQsIFwiRW1haWwgVHJhbnNjcmlwdCBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVEZBSUxFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBkYXRhIG1hc2tpbmcgaW5mbyBvZiB0aGUgb3JnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbiAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGZldGNoRGF0YU1hc2tpbmdJbmZvKHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxJRGF0YU1hc2tpbmdJbmZvPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkZFVENIREFUQU1BU0tJTkdTVEFSVEVELCBcIkZldGNoIERhdGEgTWFza2luZyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0RmV0Y2hEYXRhTWFza2luZ0luZm9QYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfSk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5yZXF1ZXN0SWRdID0gcmVxdWVzdElkO1xuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5mZXRjaERhdGFNYXNraW5nSW5mb1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NVQ0NFRURFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoZGF0YSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR0ZBSUxFRCwgXCJGZXRjaCBEYXRhIE1hc2tpbmcgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGEgc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnQgbmV0d29yayBjYWxsIHRvIE9tbmljaGFubmVsLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlY29uZGFyeSBjaGFubmVsIGV2ZW50XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSBzZWNvbmRhcnlDaGFubmVsIGV2ZW50IHJlcXVlc3QgYm9keVxuICAgKiBAcGFyYW0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nLCBzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keTogb2JqZWN0LCBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtczogSVNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNUQVJURUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcbiAgICBcbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gfSA9IHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICByZXF1ZXN0UGF0aCArPSBcIj9jaGFubmVsSWQ9XCIgKyBDb25zdGFudHMuZGVmYXVsdENoYW5uZWxJZDtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLm1ha2VTZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVFNVQ0NFRURFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RGQUlMRUQsIFwiU2Vjb25kYXJ5IENoYW5uZWwgRXZlbnQgUmVxdWVzdCBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCAgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFNlbmQgdHlwaW5nIGluZGljYXRvclxuICAgKiBAcGFyYW0gcmVxdWVzdElkIFJlcXVlc3RJZCBvZiB0aGUgb21uaWNoYW5uZWwgc2Vzc2lvbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZW5kVHlwaW5nSW5kaWNhdG9yKHJlcXVlc3RJZDogc3RyaW5nLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uOiBudW1iZXIsIHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtczogSVNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gYXZvaWRpbmcgbG9nZ2luZyBJbmZvIGZvciB0eXBpbmdpbmRpY2F0b3IgdG8gcmVkdWNlIGxvZyB0cmFmZmljXG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgY29uc3QgeyBjdXN0b21lckRpc3BsYXlOYW1lIH0gPSBzZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXM7XG4gICAgaWYgKCFjdXJyZW50TGl2ZUNoYXRWZXJzaW9uIHx8IGN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gIT09IExpdmVDaGF0VmVyc2lvbi5WMikgeyB0aHJvdyBuZXcgRXJyb3IoJ1R5cGluZyBpbmRpY2F0b3IgaXMgb25seSBzdXBwb3J0ZWQgb24gdjInKSB9XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuU2VuZFR5cGluZ0luZGljYXRvclBhdGh9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBpZiAoY3VzdG9tZXJEaXNwbGF5TmFtZSkge1xuICAgICAgaGVhZGVyc1tDb25zdGFudHMuY3VzdG9tZXJEaXNwbGF5TmFtZV0gPSBjdXN0b21lckRpc3BsYXlOYW1lO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlbmRUeXBpbmdJbmRpY2F0b3JcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIFN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuXG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVELCBcIlNlbmQgVHlwaW5nIEluZGljYXRvciBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcblxuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGxvZ2dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2dMZXZlbCBMb2cgbGV2ZWwgZm9yIGxvZ2dpbmcuXG4gICAqIEBwYXJhbSB0ZWxlbWV0cnlFdmVudFR5cGUgVGVsZW1ldHJ5IGV2ZW50IHR5cGUgaW4gd2hpY2ggZXZlbnQgd2lsbCBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBEZXNjcmlwdGlvbiBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2VcbiAgICogQHBhcmFtIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgRWxhcHNlZCB0aW1lIGluIG1zXG4gICAqIEBwYXJhbSByZXF1ZXN0UGF0aCBSZXF1ZXN0IHBhdGhcbiAgICogQHBhcmFtIG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIGVycm9yIEVycm9yXG4gICAqIEBwYXJhbSBkYXRhIERhdGFcbiAgICovXG4gIHByaXZhdGUgbG9nV2l0aExvZ2dlcihsb2dMZXZlbDogTG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZTogT0NTREtUZWxlbWV0cnlFdmVudCwgZGVzY3JpcHRpb246IHN0cmluZywgcmVxdWVzdElkPzogc3RyaW5nLCByZXNwb25zZT86IEF4aW9zUmVzcG9uc2U8YW55PiwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcz86IG51bWJlciwgcmVxdWVzdFBhdGg/OiBzdHJpbmcsIG1ldGhvZD86IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCByZXF1ZXN0UGF5bG9hZD86IGFueSk6IHZvaWQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBpZiAoIXRoaXMubG9nZ2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChlcnJvcikge1xuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEVycm9yU2Vuc2l0aXZlUHJvcGVydGllcyhlcnJvcik7XG4gICAgfVxuXG4gICAgbGV0IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkID0gdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1ZXN0UGF5bG9hZCkge1xuICAgICAgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB7IC4uLnJlcXVlc3RQYXlsb2FkIH07XG4gICAgICBpZiAoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLmN1c3RvbUNvbnRleHREYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpIHtcbiAgICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcFByZUNoYXRSZXNwb25zZShzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5wcmVDaGF0UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgTG9nZ2luZ1Nhbml0aXplci5zdHJpcEdlb2xvY2F0aW9uKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkKTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXN0b21EYXRhID0ge1xuICAgICAgUmVxdWVzdElkOiByZXF1ZXN0SWQsXG4gICAgICBSZWdpb246IHJlc3BvbnNlPy5kYXRhLlJlZ2lvbixcbiAgICAgIEVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHM6IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsXG4gICAgICBUcmFuc2FjdGlvbklkOiByZXNwb25zZT8uaGVhZGVyc1tDb25zdGFudHMudHJhbnNhY3Rpb25pZF0sXG4gICAgICBSZXF1ZXN0UGF0aDogcmVxdWVzdFBhdGgsXG4gICAgICBSZXF1ZXN0TWV0aG9kOiBtZXRob2QsXG4gICAgICBSZXNwb25zZVN0YXR1c0NvZGU6IHJlc3BvbnNlID8gcmVzcG9uc2Uuc3RhdHVzIDogZXJyb3IgPyAoZXJyb3IgYXMgYW55KS5yZXNwb25zZT8uc3RhdHVzIDogdW5kZWZpbmVkLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIEV4Y2VwdGlvbkRldGFpbHM6IGVycm9yLFxuICAgICAgUmVxdWVzdFBheWxvYWQ6IHNhbml0aXplZFJlcXVlc3RQYXlsb2FkXG4gICAgfTtcbiAgICB0aGlzLmxvZ2dlci5sb2cobG9nTGV2ZWwsIHRlbGVtZXRyeUV2ZW50VHlwZSwgY3VzdG9tRGF0YSwgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRBdXRoQ29kZU5vbmNlID0gKGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChoZWFkZXJzPy5hdXRoY29kZW5vbmNlKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZSA9IGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2U7XG4gICAgfVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBzZXRTZXNzaW9uSWRIZWFkZXIgPSAoc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsIGhlYWRlcnM6IGFueSkgPT4ge1xuICAgIGlmIChzZXNzaW9uSWQpIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZF0gPSBzZXNzaW9uSWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
2480
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9TREsudHMiXSwibmFtZXMiOlsiU0RLIiwib21uaWNoYW5uZWxDb25maWd1cmF0aW9uIiwiY29uZmlndXJhdGlvbiIsImRlZmF1bHRDb25maWd1cmF0aW9uIiwibG9nZ2VyIiwiaGVhZGVycyIsImF1dGhjb2Rlbm9uY2UiLCJhdXRoQ29kZU5vbmNlIiwic2Vzc2lvbklkIiwiT21uaWNoYW5uZWxIVFRQSGVhZGVycyIsIm9jU2Vzc2lvbklkIiwiT2JqZWN0Iiwia2V5cyIsImxlbmd0aCIsImtleSIsImhhc093blByb3BlcnR5IiwiY2hhbm5lbElkIiwidmFsdWVzIiwiQ2hhbm5lbElkIiwiaW5jbHVkZXMiLCJFcnJvciIsImN1cnJlbnRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwiQ29uc3RhbnRzIiwicmVxdWlyZWRPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25QYXJhbWV0ZXJzIiwibGl2ZUNoYXRWZXJzaW9uIiwiTGl2ZUNoYXRWZXJzaW9uIiwiVjIiLCJ0aW1lciIsIlRpbWVyIiwiVElNRVIiLCJsb2dXaXRoTG9nZ2VyIiwiTG9nTGV2ZWwiLCJJTkZPIiwiT0NTREtUZWxlbWV0cnlFdmVudCIsIkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVEIiwicmVxdWVzdFBhdGgiLCJPbW5pY2hhbm5lbEVuZHBvaW50cyIsIkxjd0Zjc0RldGFpbHNQYXRoIiwib3JnSWQiLCJtZXRob2QiLCJ1cmwiLCJvcmdVcmwiLCJheGlvc0luc3RhbmNlIiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyaWVzIiwibWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUiLCJ3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllcyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWciLCJnZXRDaGF0Q29uZmlnIiwiZ2V0IiwidGltZW91dCIsImRlZmF1bHRSZXF1ZXN0VGltZW91dCIsInJlcXVlc3RUaW1lb3V0Q29uZmlnIiwicmVzcG9uc2UiLCJlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzIiwibWlsbGlTZWNvbmRzRWxhcHNlZCIsImRhdGEiLCJHRVRMQ1dGQ1NERVRBSUxTU1VDQ0VFREVEIiwiR0VUTENXRkNTREVUQUlMU0ZBSUxFRCIsInVuZGVmaW5lZCIsInJlcXVlc3RJZCIsImJ5cGFzc0NhY2hlIiwiR0VUQ0hBVENPTkZJR0ZTVEFSVEVEIiwiTGl2ZUNoYXRDb25maWdQYXRoIiwid2lkZ2V0SWQiLCJieXBhc3NDYWNoZUhlYWRlcnMiLCJHRVRDSEFUQ09ORklHU1VDQ0VFREVEIiwiR0VUQ0hBVENPTkZJR0ZBSUxFRCIsIlByb21pc2UiLCJyZWplY3QiLCJnZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMiLCJHRVRMV0lTVEFUVVNTVEFSVEVEIiwiTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsImhlYWRlck92ZXJ3cml0ZXMiLCJnZXRMV0lEZXRhaWxzIiwiYXV0aGVudGljYXRlZFVzZXJUb2tlbiIsInJlY29ubmVjdElkIiwiZGVmYXVsdEhlYWRlcnMiLCJMaXZlQ2hhdEF1dGhMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aCIsInNldFNlc3Npb25JZEhlYWRlciIsInVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSIsInBhcmFtcyIsInNpZyIsIm9wdGlvbnMiLCJyZXNvbHZlIiwic2V0QXV0aENvZGVOb25jZSIsIkdFVExXSVNUQVRVU1NVQ0NFRURFRCIsIkVSUk9SIiwiR0VUTFdJU1RBVFVTRkFJTEVEIiwiYXhpb3NUaW1lb3V0RXJyb3JDb2RlIiwiZ2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMiLCJjdXJyZW50UmV0cnlDb3VudCIsImN1cnJlbnRMaXZlQ2hhdFZlcnNpb24iLCJyZWZyZXNoVG9rZW4iLCJHRVRDSEFUVE9LRU5TVEFSVEVEIiwiZW5kcG9pbnQiLCJnZXRDaGF0VG9rZW4iLCJyZXRyeU9uNDI5IiwiZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSIsImdldENoYXRUb2tlbkVycm9yIiwidG9Mb3dlckNhc2UiLCJHRVRDSEFUVE9LRU5TVUNDRUVERUQiLCJzdGF0dXMiLCJub0NvbnRlbnRTdGF0dXNDb2RlIiwiR0VUQ0hBVFRPS0VORkFJTEVEIiwidG9vTWFueVJlcXVlc3RzU3RhdHVzQ29kZSIsImdldENoYXRUb2tlblJldHJ5Q291bnQiLCJjb2RlIiwic2V0VGltZW91dCIsInRoZW4iLCJlcnJvciIsImdldENoYXRUb2tlblRpbWVCZXR3ZWVuUmV0cmllc09uRmFpbHVyZSIsInJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyIsIkdFVFJFQ09OTkVDVEFCTEVDSEFUUyIsIkxpdmVDaGF0R2V0UmVjb25uZWN0YWJsZUNoYXRzUGF0aCIsImdldFJlY29ubmVjdGFibGVDaGF0cyIsIkdFVFJFQ09OTkVDVEFWQUlMQUJJTElUWSIsIkxpdmVDaGF0UmVjb25uZWN0QXZhaWxhYmlsaXR5UGF0aCIsImdldFJlY29ubmVjdEF2YWlsYWJpbGl0eSIsIldBUk4iLCJxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVEFSVEVEIiwiR2V0QWdlbnRBdmFpbGFiaWxpdHlQYXRoIiwiZ2V0QWdlbnRBdmFpbGFiaWxpdHkiLCJpbml0Q29udGV4dCIsImdldENvbnRleHQiLCJjYWNoT2JqIiwiY3VzdG9tQ29udGV4dERhdGEiLCJ0ZW1wQXJyIiwiQ3VzdG9tQ29udGV4dERhdGEiLCJzb3J0IiwiYXNzaWduIiwicG9ydGFsY29udGFjdGlkIiwiY2FjaGVLZXkiLCJoYXNoIiwiY3JlYXRlSGFzaCIsInVwZGF0ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJkaWdlc3QiLCJ0b1N0cmluZyIsIndpbmRvdyIsImRvY3VtZW50IiwiYnJvd3NlciIsIkJyb3dzZXJJbmZvIiwiZ2V0QnJvd3Nlck5hbWUiLCJkZXZpY2UiLCJEZXZpY2VJbmZvIiwiZ2V0RGV2aWNlVHlwZSIsIm9yaWdpbnVybCIsImxvY2F0aW9uIiwiaHJlZiIsIm9zIiwiT1NJbmZvIiwiZ2V0T3NUeXBlIiwibG9jYWxlIiwiZGVmYXVsdExvY2FsZSIsIkxvY2FsZXMiLCJzdXBwb3J0ZWRMb2NhbGVzIiwiR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQiLCJHRVRBR0VOVEFWQUlMQUJJTElUWUZBSUxFRCIsInNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMiLCJTRVNTSU9OSU5JVFNUQVJURUQiLCJzZXNzaW9uSW5pdCIsInNob3VsZFJldHJ5Iiwic2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIiLCJMaXZlQ2hhdFNlc3Npb25Jbml0UGF0aCIsIkxpdmVDaGF0QXV0aFNlc3Npb25Jbml0UGF0aCIsIlNFU1NJT05JTklUU1VDQ0VFREVEIiwiU0VTU0lPTklOSVRGQUlMRUQiLCJzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyIsIlNFU1NJT05DTE9TRVNUQVJURUQiLCJMaXZlQ2hhdFNlc3Npb25DbG9zZVBhdGgiLCJzZXNzaW9uQ2xvc2UiLCJpc1JlY29ubmVjdENoYXQiLCJpc1BlcnNpc3RlbnRDaGF0IiwiY2hhdElkIiwiTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aCIsIlNFU1NJT05DTE9TRVNVQ0NFRURFRCIsIlNFU1NJT05DTE9TRUZBSUxFRCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtcyIsIlZBTElEQVRFQVVUSENIQVRSRUNPUkRTVEFSVEVEIiwiTGl2ZUNoYXRWYWxpZGF0ZUF1dGhDaGF0TWFwUmVjb3JkUGF0aCIsInZhbGlkYXRlQXV0aENoYXRSZWNvcmQiLCJ2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dCIsImF1dGhDaGF0RXhpc3QiLCJWQUxJREFURUFVVEhDSEFUUkVDT1JEU1VDQ0VFREVEIiwiVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCIsInBvc3RDaGF0UmVzcG9uc2UiLCJzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXMiLCJTVUJNSVRQT1NUQ0hBVFNUQVJURUQiLCJMaXZlQ2hhdFN1Ym1pdFBvc3RDaGF0UGF0aCIsInN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UiLCJMaXZlQ2hhdEF1dGhTdWJtaXRQb3N0Q2hhdFBhdGgiLCJTVUJNSVRQT1NUQ0hBVFNVQ0NFRURFRCIsIlNVQk1JVFBPU1RDSEFURkFJTEVEIiwic3VydmV5T3duZXJJZCIsInN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5IiwiZ2V0c3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zIiwibG9nIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NUQVJURUQiLCJTdXJ2ZXlPd25lcklkIiwiTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsImdldFN1cnZleUludml0ZUxpbmsiLCJMaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aCIsIndpZGdldEFwcElkIiwiR0VUU1VSVkVZSU5WSVRFTElOS1NVQ0NFRURFRCIsIkdFVFNVUlZFWUlOVklURUxJTktGQUlMRUQiLCJ0b2tlbiIsImdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIiwiR0VUQ0hBVFRSQU5TQ1JJUFRTVEFSVEVEIiwiTGl2ZUNoYXRHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJnZXRDaGF0VHJhbnNjcmlwdHMiLCJvcmdhbml6YXRpb25JZCIsImF1dGhvcml6YXRpb24iLCJMaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRoIiwiTGl2ZUNoYXR2MkF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJMaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGgiLCJHRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCIsIkdFVENIQVRUUkFOU0NSSVBURkFJTEVEIiwiZW1haWxSZXF1ZXN0Qm9keSIsImVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIiwiRU1BSUxUUkFOU0NSSVBUU1RBUlRFRCIsIkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGgiLCJlbWFpbFRyYW5zY3JpcHQiLCJMaXZlQ2hhdEF1dGhUcmFuc2NyaXB0RW1haWxSZXF1ZXN0UGF0aCIsIkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCIsIkVNQUlMVFJBTlNDUklQVEZBSUxFRCIsIkZFVENIREFUQU1BU0tJTkdTVEFSVEVEIiwiTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGgiLCJmZXRjaERhdGFNYXNraW5nSW5mbyIsIkZFVENIREFUQU1BU0tJTkdTVUNDRUVERUQiLCJGRVRDSERBVEFNQVNLSU5HRkFJTEVEIiwic2Vjb25kYXJ5Q2hhbm5lbEV2ZW50UmVxdWVzdEJvZHkiLCJzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVEFSVEVEIiwiTGl2ZUNoYXRTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwibWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QiLCJMaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRoIiwiZGVmYXVsdENoYW5uZWxJZCIsIlNFQ09OREFSWUNIQU5ORUxFVkVOVFJFUVVFU1RTVUNDRUVERUQiLCJTRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNURkFJTEVEIiwic2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zIiwiY3VzdG9tZXJEaXNwbGF5TmFtZSIsIlNlbmRUeXBpbmdJbmRpY2F0b3JQYXRoIiwic2VuZFR5cGluZ0luZGljYXRvciIsIlNFTkRUWVBJTkdJTkRJQ0FUT1JTVUNDRUVERUQiLCJTRU5EVFlQSU5HSU5ESUNBVE9SRkFJTEVEIiwibG9nTGV2ZWwiLCJ0ZWxlbWV0cnlFdmVudFR5cGUiLCJkZXNjcmlwdGlvbiIsInJlcXVlc3RQYXlsb2FkIiwiTG9nZ2luZ1Nhbml0aXplciIsInN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzIiwic2FuaXRpemVkUmVxdWVzdFBheWxvYWQiLCJzdHJpcEN1c3RvbUNvbnRleHREYXRhVmFsdWVzIiwicHJlQ2hhdFJlc3BvbnNlIiwic3RyaXBQcmVDaGF0UmVzcG9uc2UiLCJzdHJpcEdlb2xvY2F0aW9uIiwiY3VzdG9tRGF0YSIsIlJlcXVlc3RJZCIsIlJlZ2lvbiIsIkVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMiLCJUcmFuc2FjdGlvbklkIiwidHJhbnNhY3Rpb25pZCIsIlJlcXVlc3RQYXRoIiwiUmVxdWVzdE1ldGhvZCIsIlJlc3BvbnNlU3RhdHVzQ29kZSIsIkV4Y2VwdGlvbkRldGFpbHMiLCJSZXF1ZXN0UGF5bG9hZCIsInN1YnN0cmluZyIsImRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyIsIndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQkEsRztBQW1DbkIsZUFBMkJDLHdCQUEzQixFQUFtTDtBQUFBOztBQUFBLFFBQTNGQyxhQUEyRix1RUFBeERGLEdBQUcsQ0FBQ0csb0JBQW9EO0FBQUEsUUFBdEJDLE1BQXNCO0FBQUE7QUFBQSxTQUF4Skgsd0JBQXdKLEdBQXhKQSx3QkFBd0o7QUFBQSxTQUEzRkMsYUFBMkYsR0FBM0ZBLGFBQTJGO0FBQUEsU0FBdEJFLE1BQXNCLEdBQXRCQSxNQUFzQjtBQUFBO0FBQUE7QUFBQSwrREF1dkN4SixVQUFDQyxPQUFELEVBQWtCO0FBQzNDLFVBQUlBLE9BQUosYUFBSUEsT0FBSixlQUFJQSxPQUFPLENBQUVDLGFBQWIsRUFBNEI7QUFDMUIsUUFBQSxLQUFJLENBQUNKLGFBQUwsQ0FBbUJLLGFBQW5CLEdBQW1DRixPQUFuQyxhQUFtQ0EsT0FBbkMsdUJBQW1DQSxPQUFPLENBQUVDLGFBQTVDO0FBQ0Q7QUFDRixLQTN2Q2tMO0FBQUEsaUVBOHZDdEosVUFBQ0UsU0FBRCxFQUFnQ0gsT0FBaEMsRUFBaUQ7QUFDNUUsVUFBSUcsU0FBSixFQUFlO0FBQ2JILFFBQUFBLE9BQU8sQ0FBQ0ksbUNBQXVCQyxX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QixDQUF0QixDQUR3QztBQUV2RHBLLEVBQUFBLHNCQUFzQixFQUFFLEVBRitCO0FBR3ZESyxFQUFBQSx1Q0FBdUMsRUFBRSxLQUhjO0FBSXZEYixFQUFBQSxzQkFBc0IsRUFBRSxLQUorQjtBQUt2RHJELEVBQUFBLDBCQUEwQixFQUFFLENBTDJCO0FBTXZETSxFQUFBQSxxQkFBcUIsRUFBRVEsU0FOZ0M7QUFPdkRQLEVBQUFBLG9CQUFvQixFQUFFckQsR0FBRyxDQUFDZ1IsMkJBUDZCO0FBUXZEL0wsRUFBQUEsaUNBQWlDLEVBQUUsS0FSb0I7QUFTdkRqQyxFQUFBQSw0QkFBNEIsRUFBRWlPO0FBVHlCLEMiLCJzb3VyY2VSb290Ijoib2NzZGs6Ly8vIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiY3J5cHRvXCI7XG5cbmltcG9ydCB7IENoYW5uZWxJZCwgTGl2ZUNoYXRWZXJzaW9uLCBPQ1NES1RlbGVtZXRyeUV2ZW50IH0gZnJvbSBcIi4vQ29tbW9uL0VudW1zXCI7XG5pbXBvcnQgYXhpb3MsIHsgQXhpb3NSZXF1ZXN0Q29uZmlnLCBBeGlvc1Jlc3BvbnNlIH0gZnJvbSBcImF4aW9zXCI7XG5cbmltcG9ydCB7IEJyb3dzZXJJbmZvIH0gZnJvbSBcIi4vVXRpbHMvQnJvd3NlckluZm9cIjtcbmltcG9ydCBDb25zdGFudHMgZnJvbSBcIi4vQ29tbW9uL0NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ3VzdG9tQ29udGV4dERhdGEgfSBmcm9tIFwiLi9VdGlscy9DdXN0b21Db250ZXh0RGF0YVwiO1xuaW1wb3J0IHsgRGV2aWNlSW5mbyB9IGZyb20gXCIuL1V0aWxzL0RldmljZUluZm9cIjtcbmltcG9ydCBGZXRjaENoYXRUb2tlblJlc3BvbnNlIGZyb20gXCIuL01vZGVsL0ZldGNoQ2hhdFRva2VuUmVzcG9uc2VcIjtcbmltcG9ydCBJRGF0YU1hc2tpbmdJbmZvIGZyb20gXCIuL0ludGVyZmFjZXMvSURhdGFNYXNraW5nSW5mb1wiO1xuaW1wb3J0IElFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lFbWFpbFRyYW5zY3JpcHRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lHZXRDaGF0VHJhbnNjcmlwdHNPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRMV0lEZXRhaWxzT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSUdldFF1ZXVlQXZhaWxhYmlsaXR5T3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElHZXRTdXJ2ZXlJbnZpdGVMaW5rT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JR2V0U3VydmV5SW52aXRlTGlua09wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSU9tbmljaGFubmVsQ29uZmlndXJhdGlvbiBmcm9tIFwiLi9JbnRlcmZhY2VzL0lPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25cIjtcbmltcG9ydCBJUmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVJlY29ubmVjdGFibGVDaGF0c1BhcmFtc1wiO1xuaW1wb3J0IElTREsgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLXCI7XG5pbXBvcnQgSVNES0NvbmZpZ3VyYXRpb24gZnJvbSBcIi4vSW50ZXJmYWNlcy9JU0RLQ29uZmlndXJhdGlvblwiO1xuaW1wb3J0IElTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IElTZW5kVHlwaW5nSW5kaWNhdG9yT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zXCJcbmltcG9ydCBJU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXMgZnJvbSBcIi4vSW50ZXJmYWNlcy9JU2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJU2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTZXNzaW9uSW5pdE9wdGlvbmFsUGFyYW1zXCI7XG5pbXBvcnQgSVN1Ym1pdFBvc3RDaGF0UmVzcG9uc2VPcHRpb25hbFBhcmFtcyBmcm9tIFwiLi9JbnRlcmZhY2VzL0lTdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXNcIjtcbmltcG9ydCBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zIGZyb20gXCIuL0ludGVyZmFjZXMvSVZhbGlkYXRlQXV0aENoYXRSZWNvcmRPcHRpb25hbFBhcmFtc1wiO1xuaW1wb3J0IEluaXRDb250ZXh0IGZyb20gXCIuL01vZGVsL0luaXRDb250ZXh0XCI7XG5pbXBvcnQgTG9jYWxlcyBmcm9tIFwiLi9Db21tb24vTG9jYWxlc1wiO1xuaW1wb3J0IHsgTG9nTGV2ZWwgfSBmcm9tIFwiLi9Nb2RlbC9Mb2dMZXZlbFwiO1xuaW1wb3J0IHsgTG9nZ2luZ1Nhbml0aXplciB9IGZyb20gXCIuL1V0aWxzL0xvZ2dpbmdTYW5pdGl6ZXJcIjtcbmltcG9ydCBPQ1NES0xvZ2dlciBmcm9tIFwiLi9Db21tb24vT0NTREtMb2dnZXJcIjtcbmltcG9ydCB7IE9TSW5mbyB9IGZyb20gXCIuL1V0aWxzL09TSW5mb1wiO1xuaW1wb3J0IE9tbmljaGFubmVsRW5kcG9pbnRzIGZyb20gXCIuL0NvbW1vbi9PbW5pY2hhbm5lbEVuZHBvaW50c1wiO1xuaW1wb3J0IE9tbmljaGFubmVsSFRUUEhlYWRlcnMgZnJvbSBcIi4vQ29tbW9uL09tbmljaGFubmVsSFRUUEhlYWRlcnNcIjtcbmltcG9ydCBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyIGZyb20gXCIuL0ludGVyZmFjZXMvT21uaWNoYW5uZWxRdWVyeVBhcmFtZXRlclwiO1xuaW1wb3J0IFF1ZXVlQXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1F1ZXVlQXZhaWxhYmlsaXR5XCI7XG5pbXBvcnQgUmVjb25uZWN0QXZhaWxhYmlsaXR5IGZyb20gXCIuL01vZGVsL1JlY29ubmVjdEF2YWlsYWJpbGl0eVwiO1xuaW1wb3J0IFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgZnJvbSBcIi4vTW9kZWwvUmVjb25uZWN0TWFwcGluZ1JlY29yZFwiO1xuaW1wb3J0IHsgUmVxdWVzdFRpbWVvdXRDb25maWcgfSBmcm9tIFwiLi9Db21tb24vUmVxdWVzdFRpbWVvdXRDb25maWdcIjtcbmltcG9ydCB7IFN0cmluZ01hcCB9IGZyb20gXCIuL0NvbW1vbi9NYXBwaW5nc1wiO1xuaW1wb3J0IHsgVGltZXIgfSBmcm9tIFwiLi9VdGlscy9UaW1lclwiO1xuaW1wb3J0IGF4aW9zUmV0cnkgZnJvbSBcIi4vVXRpbHMvYXhpb3NSZXRyeVwiO1xuaW1wb3J0IHsgY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQgfSBmcm9tIFwiLi9VdGlscy9lbmRwb2ludHNDcmVhdG9yc1wiO1xuaW1wb3J0IGlzRXhwZWN0ZWRBeGlvc0Vycm9yIGZyb20gXCIuL1V0aWxzL2lzRXhwZWN0ZWRBeGlvc0Vycm9yXCI7XG5pbXBvcnQgc2Vzc2lvbkluaXRSZXRyeUhhbmRsZXIgZnJvbSBcIi4vVXRpbHMvU2Vzc2lvbkluaXRSZXRyeUhhbmRsZXJcIjtcbmltcG9ydCB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IgZnJvbSBcIi4vVXRpbHMvdGhyb3dDbGllbnRIVFRQRXJyb3JcIjtcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL1V0aWxzL3V1aWRcIjtcbmltcG9ydCB7IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzIH0gZnJvbSBcIi4vVXRpbHMvd2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZ3NcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU0RLIGltcGxlbWVudHMgSVNESyB7XG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZzogUmVxdWVzdFRpbWVvdXRDb25maWcgPSB7XG4gICAgZ2V0Q2hhdENvbmZpZzogMzAwMDAsXG4gICAgZ2V0TFdJRGV0YWlsczogMTUwMDAsXG4gICAgZ2V0Q2hhdFRva2VuOiAxNTAwMCxcbiAgICBzZXNzaW9uSW5pdDogMTUwMDAsXG4gICAgc2Vzc2lvbkNsb3NlOiAxNTAwMCxcbiAgICBnZXRSZWNvbm5lY3RhYmxlQ2hhdHM6IDE1MDAwLFxuICAgIGdldFJlY29ubmVjdEF2YWlsYWJpbGl0eTogMTUwMDAsXG4gICAgc3VibWl0UG9zdENoYXRSZXNwb25zZTogMTUwMDAsXG4gICAgZ2V0U3VydmV5SW52aXRlTGluazogMTUwMDAsXG4gICAgZ2V0Q2hhdFRyYW5zY3JpcHRzOiAzMDAwMCxcbiAgICBlbWFpbFRyYW5zY3JpcHQ6IDUwMDAsXG4gICAgZmV0Y2hEYXRhTWFza2luZ0luZm86IDUwMDAsXG4gICAgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3Q6IDE1MDAwLFxuICAgIGdldEFnZW50QXZhaWxhYmlsaXR5OiAxNTAwMCxcbiAgICBzZW5kVHlwaW5nSW5kaWNhdG9yOiA1MDAwLFxuICAgIHZhbGlkYXRlQXV0aENoYXRSZWNvcmRUaW1lb3V0OiAxNTAwMFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIGRlZmF1bHRDb25maWd1cmF0aW9uOiBJU0RLQ29uZmlndXJhdGlvbiA9IHtcbiAgICBhdXRoQ29kZU5vbmNlOiB1dWlkdjQoKS5zdWJzdHJpbmcoMCwgOCksXG4gICAgZ2V0Q2hhdFRva2VuUmV0cnlDb3VudDogMTAsXG4gICAgZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlOiAxMDAwMCxcbiAgICBnZXRDaGF0VG9rZW5SZXRyeU9uNDI5OiBmYWxzZSxcbiAgICBtYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZTogMyxcbiAgICBkZWZhdWx0UmVxdWVzdFRpbWVvdXQ6IHVuZGVmaW5lZCxcbiAgICByZXF1ZXN0VGltZW91dENvbmZpZzogU0RLLmRlZmF1bHRSZXF1ZXN0VGltZW91dENvbmZpZyxcbiAgICB1c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW06IGZhbHNlLFxuICAgIHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWc6IHdhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWdzXG4gIH07XG5cbiAgbGl2ZUNoYXRWZXJzaW9uOiBudW1iZXI7XG4gIHNlc3Npb25JZD86IHN0cmluZztcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb246IElPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24sIHByaXZhdGUgY29uZmlndXJhdGlvbjogSVNES0NvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb24sIHByaXZhdGUgbG9nZ2VyPzogT0NTREtMb2dnZXIpIHtcbiAgICAvLyBTZXRzIHRvIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpZiBwYXNzZWQgY29uZmlndXJhdGlvbiBpcyBlbXB0eSBvciBpcyBub3QgYW4gb2JqZWN0XG4gICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmNvbmZpZ3VyYXRpb24pLmxlbmd0aCB8fCB0eXBlb2YgKGNvbmZpZ3VyYXRpb24pICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBTREsuZGVmYXVsdENvbmZpZ3VyYXRpb247XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgU0RLIGNvbmZpZ1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbikpIHtcbiAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW2Ake2tleX1gXSA9IFNESy5kZWZhdWx0Q29uZmlndXJhdGlvbltgJHtrZXl9YF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5kaXZpZHVhbCBlbmRwb2ludFRpbWVvdXQgY29uZmlnXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl0pKSB7XG4gICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbltcInJlcXVlc3RUaW1lb3V0Q29uZmlnXCJdLmhhc093blByb3BlcnR5KGtleSkpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdID0gU0RLLmRlZmF1bHRDb25maWd1cmF0aW9uW1wicmVxdWVzdFRpbWVvdXRDb25maWdcIl1bYCR7a2V5fWBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNoYW5uZWxJZFxuICAgIGNvbnN0IHsgY2hhbm5lbElkIH0gPSBvbW5pY2hhbm5lbENvbmZpZ3VyYXRpb247XG4gICAgaWYgKCFPYmplY3QudmFsdWVzKENoYW5uZWxJZCkuaW5jbHVkZXMoY2hhbm5lbElkIGFzIENoYW5uZWxJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjaGFubmVsSWRgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBPQyBjb25maWdcbiAgICBjb25zdCBjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycyA9IE9iamVjdC5rZXlzKG9tbmljaGFubmVsQ29uZmlndXJhdGlvbik7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgQ29uc3RhbnRzLnJlcXVpcmVkT21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycykge1xuICAgICAgaWYgKCFjdXJyZW50T21uaWNoYW5uZWxDb25maWd1cmF0aW9uUGFyYW1ldGVycy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyAnJHtrZXl9JyBpbiBPbW5pY2hhbm5lbENvbmZpZ3VyYXRpb25gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IExpdmVDaGF0VmVyc2lvbi5WMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExDVyBGQ1MgRGV0YWlscyBvZiB0aGUgT3JnLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExjd0Zjc0RldGFpbHMoKTogUHJvbWlzZTxvYmplY3QgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVEFSVEVELCBcIkdldCBMQ1cgRkNTIGRldGFpbHMgc3RhcnRlZFwiLCBcIlwiKTtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxjd0Zjc0RldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJHRVRcIjtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IGF4aW9zSW5zdGFuY2UgPSBheGlvcy5jcmVhdGUoKTtcblxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRDb25maWdcbiAgICB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2UuZ2V0KHVybCwge1xuICAgICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSByZXNwb25zZTtcbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVExDV0ZDU0RFVEFJTFNTVUNDRUVERUQsIFwiR2V0IExDVyBGQ1MgZGV0YWlscyBzdWNjZWVkZWRcIiwgXCJcIiwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUTENXRkNTREVUQUlMU0ZBSUxFRCwgXCJHZXQgTENXIEZDUyBkZXRhaWxzIGZhaWxlZFwiLCBcIlwiLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNoYXQgY29uZmlnLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRDb25maWcocmVxdWVzdElkOiBzdHJpbmcsIGJ5cGFzc0NhY2hlID0gZmFsc2UpOiBQcm9taXNlPG9iamVjdCB8IHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZTVEFSVEVELCBcIkdldCBDaGF0IGNvbmZpZyBzdGFydGVkXCIsIHJlcXVlc3RJZCk7XG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0Q29uZmlnUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0/cmVxdWVzdElkPSR7cmVxdWVzdElkfSZjaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0Q29uZmlnXG4gICAgIH0pO1xuXG4gICAgbGV0IGhlYWRlcnMgPSB7fTtcbiAgICBpZiAoYnlwYXNzQ2FjaGUpIHtcbiAgICAgIGhlYWRlcnMgPSB7IC4uLkNvbnN0YW50cy5ieXBhc3NDYWNoZUhlYWRlcnMsIC4uLmhlYWRlcnMgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlLmdldCh1cmwsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0Q2hhdENvbmZpZ1xuICAgICAgfSk7XG4gICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG5cbiAgICAgIGlmIChkYXRhLkxpdmVDaGF0VmVyc2lvbikge1xuICAgICAgICB0aGlzLmxpdmVDaGF0VmVyc2lvbiA9IGRhdGEuTGl2ZUNoYXRWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBkYXRhLmhlYWRlcnMgPSB7fTtcbiAgICAgIGlmIChyZXNwb25zZS5oZWFkZXJzICYmIHJlc3BvbnNlLmhlYWRlcnNbXCJkYXRlXCJdKSB7XG4gICAgICAgIGRhdGEuaGVhZGVyc1tcImRhdGVcIl0gPSByZXNwb25zZS5oZWFkZXJzW1wiZGF0ZVwiXTtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRDT05GSUdTVUNDRUVERUQsIFwiR2V0IENoYXQgY29uZmlnIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVENPTkZJR0ZBSUxFRCwgXCJHZXQgQ2hhdCBjb25maWcgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLFxuICAgICAgICByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIExXSSBkZXRhaWxzLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIHRvIGdldCBjaGF0IGNvbmZpZyAoT3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgTFdJIERldGFpbHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TFdJRGV0YWlscyhyZXF1ZXN0SWQ6IHN0cmluZywgZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zOiBJR2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPG9iamVjdD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVEFSVEVELCBcIkdldCBMV0kgRGV0YWlscyBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgLy8gY29uc3RydWN0IGEgZW5kcG9pbnQgZm9yIGFub255bW91cyBjaGF0cyB0byBnZXQgTFdJIERldGFpbHNcbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRMaXZlV29ya0l0ZW1EZXRhaWxzUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRMV0lEZXRhaWxzXG4gICAgfSk7XG5cbiAgICAvLyBFeHRyYWN0IGF1dGggdG9rZW4gYW5kIHJlY29ubmVjdCBpZCBmcm9tIG9wdGlvbmFsIHBhcmFtXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZWNvbm5lY3RJZCB9ID0gZ2V0TFdJRGV0YWlsc09wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIC8vIHVwZGF0ZWQgYXV0aCBlbmRwb2ludCBmb3IgYXV0aGVudGljYXRlZCBjaGF0cyBhbmQgYWRkIGF1dGggdG9rZW4gaW4gaGVhZGVyXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aExpdmVXb3JrSXRlbURldGFpbHNQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgLy8gQXBwZW5kIHJlY29ubmVjdCBpZCBvbiB0aGUgZW5kcG9pbnQgaWYgdmFpbGFibGVcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldExXSURldGFpbHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNTVUNDRUVERUQsIFwiR2V0IExXSSBEZXRhaWxzIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRMV0lTVEFUVVNGQUlMRUQsIFwiR2V0IExXSSBEZXRhaWxzIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgY2hhdCB0b2tlbiBmcm9tIE9tbmljaGFubmVsIHRvIGpvaW4gVDEgdGhyZWFkLlxuICAgKiBAcGFyYW0gcmVxdWVzdElkOiBSZXF1ZXN0SWQgdG8gdXNlIGZvciBnZXRjaGF0dG9rZW4gKE9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBnZXQgY2hhdCB0b2tlbi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDaGF0VG9rZW4ocmVxdWVzdElkOiBzdHJpbmcsIGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRva2VuT3B0aW9uYWxQYXJhbXMgPSB7fSwgY3VycmVudFJldHJ5Q291bnQ6IG51bWJlciA9IDApOiBQcm9taXNlPEZldGNoQ2hhdFRva2VuUmVzcG9uc2U+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW5mZXJyYWJsZS10eXBlc1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uLCByZWZyZXNoVG9rZW4gfSA9IGdldENoYXRUb2tlbk9wdGlvbmFsUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUT0tFTlNUQVJURUQsIFwiR2V0IENoYXQgVG9rZW4gU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgaWYgKGN1cnJlbnRSZXRyeUNvdW50IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGN1cnJlbnRSZXRyeUNvdW50YCk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXF1ZXN0SWQpIHtcbiAgICAgIHJlcXVlc3RJZCA9IHV1aWR2NCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGNvbnN0IGVuZHBvaW50ID0gY3JlYXRlR2V0Q2hhdFRva2VuRW5kcG9pbnQoY3VycmVudExpdmVDaGF0VmVyc2lvbiBhcyBMaXZlQ2hhdFZlcnNpb24gfHwgdGhpcy5saXZlQ2hhdFZlcnNpb24sIGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4gPyB0cnVlIDogZmFsc2UpO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoZW50aWNhdGVkVXNlclRva2VuXSA9IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW47XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0gPSB0aGlzLmNvbmZpZ3VyYXRpb24uYXV0aENvZGVOb25jZTtcbiAgICB9XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7ZW5kcG9pbnR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG5cbiAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvbi51c2VVbmF1dGhSZWNvbm5lY3RJZFNpZ1F1ZXJ5UGFyYW0pIHtcbiAgICAgIGlmIChyZWNvbm5lY3RJZCkge1xuICAgICAgICByZXF1ZXN0UGF0aCArPSBgLyR7cmVjb25uZWN0SWR9YDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbXM6IE9tbmljaGFubmVsUXVlcnlQYXJhbWV0ZXIgPSB7XG4gICAgICBjaGFubmVsSWQ6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZFxuICAgIH1cblxuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIHBhcmFtcy5yZWZyZXNoVG9rZW4gPSAndHJ1ZSdcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldENoYXRUb2tlblxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLFxuICAgICAgcmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLm1heFJlcXVlc3RSZXRyaWVzT25GYWlsdXJlLCBcbiAgICAgIHJldHJ5T240Mjk6IHRoaXMuY29uZmlndXJhdGlvbi5nZXRDaGF0VG9rZW5SZXRyeU9uNDI5LFxuICAgICAgd2FpdFRpbWVJbk1zQmV0d2VlblJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi53YWl0VGltZUJldHdlZW5SZXRyaWVzQ29uZmlnLmdldENoYXRUb2tlblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBsZXQgZ2V0Q2hhdFRva2VuRXJyb3I6YW55ID0gdW5kZWZpbmVkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAgICAgaWYgKGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vY1Nlc3Npb25JZC50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uSWQgPSBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub2NTZXNzaW9uSWQudG9Mb3dlckNhc2UoKV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZXMgb25seSBpZiBpdCBjb250YWlucyBjaGF0IHRva2VuIHJlc3BvbnNlIHdoaWNoIG9ubHkgaGFwcGVucyBvbiBzdGF0dXMgMjAwXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgZGF0YS5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQ0hBVFRPS0VOU1VDQ0VFREVELCBcIkdldCBDaGF0IFRva2VuIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIGNvbnRlbnQgZm9yIHJlY29ubmVjdCBjaGF0IGNhc2Ugc2hvdWxkbid0IGJlIHJldHJpZWQuXG4gICAgICAgIGlmIChyZWNvbm5lY3RJZCAmJiByZXNwb25zZS5zdGF0dXMgPT09IENvbnN0YW50cy5ub0NvbnRlbnRTdGF0dXNDb2RlKSB7XG4gICAgICAgICAgcmVqZWN0KHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVE9LRU5GQUlMRUQsIFwiR2V0IENoYXQgVG9rZW4gZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGdldENoYXRUb2tlbkVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgLy8gU3RvcCByZXRyeSBvbiA0MjlcbiAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgPT09IENvbnN0YW50cy50b29NYW55UmVxdWVzdHNTdGF0dXNDb2RlICYmICF0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuUmV0cnlPbjQyOSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJldHVybi9yZWplY3QgdG8gcmVjdXJzaXZlbHkgcmV0cnkgb24gZmFpbHVyZXMgdXAgdG8gY2hhdCB0b2tlbiByZXRyeSBjb3VudCBsaW1pdFxuICAgICAgfVxuXG4gICAgICAvLyBCYXNlIGNhc2VcbiAgICAgIGlmIChjdXJyZW50UmV0cnlDb3VudCArIDEgPj0gdGhpcy5jb25maWd1cmF0aW9uLmdldENoYXRUb2tlblJldHJ5Q291bnQpIHtcbiAgICAgICAgaWYgKGdldENoYXRUb2tlbkVycm9yICYmIGdldENoYXRUb2tlbkVycm9yLmNvZGUgPT0gQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdChnZXRDaGF0VG9rZW5FcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXRyaWVzIHVudGlsIGl0IHJlYWNoZXMgaXRzIGxpbWl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5nZXRDaGF0VG9rZW4ocmVxdWVzdElkLCBnZXRDaGF0VG9rZW5PcHRpb25hbFBhcmFtcywgY3VycmVudFJldHJ5Q291bnQgKyAxKS50aGVuKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpLmNhdGNoKChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSk7XG4gICAgICB9LCB0aGlzLmNvbmZpZ3VyYXRpb24uZ2V0Q2hhdFRva2VuVGltZUJldHdlZW5SZXRyaWVzT25GYWlsdXJlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSByZWNvbm5lY3RhYmxlIGNoYXRzIGZyb20gb21uaWNoYW5uZWwgZnJvbSB0aGUgZ2l2ZW4gdXNlciBpbmZvcm1hdGlvbiBpbiBKV1QgdG9rZW4oY2xhaW0gbmFtZTogc3ViKS5cbiAgICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJlY29ubmVjdGFibGVDaGF0cyhyZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXM6IElSZWNvbm5lY3RhYmxlQ2hhdHNQYXJhbXMpOiBQcm9taXNlPFJlY29ubmVjdE1hcHBpbmdSZWNvcmQgfCB2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gcmVjb25uZWN0YWJsZUNoYXRzUGFyYW1zO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBjaGF0IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldFJlY29ubmVjdGFibGVDaGF0c1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRSZWNvbm5lY3RhYmxlQ2hhdHNcbiAgICB9O1xuXG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIC8vIFJlc29sdmVzIG9ubHkgaWYgaXQgY29udGFpbnMgcmVjb25uZWN0YWJsZSBjaGF0cyByZXNwb25zZSB3aGljaCBvbmx5IGhhcHBlbnMgb24gc3RhdHVzIDIwMFxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFJFQ09OTkVDVEFCTEVDSEFUUywgXCJHZXQgUmVjb25uZWN0YWJsZSBDaGF0cyBTdWNjZWVkZWQgYW5kIG9sZCBzZXNzaW9uIHJldHVybmVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gTm8gZGF0YSBmb3VuZCBpbiB0aGUgb2xkIHNlc3Npb25zIHNvIHJldHVybmluZyBudWxsXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBQkxFQ0hBVFMsIFwiR2V0IFJlY29ubmVjdGFibGUgQ2hhdHMgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAqIEZldGNoZXMgdGhlIHJlY29ubmVjdGFibGUgY2hhdHMgZnJvbSBvbW5pY2hhbm5lbCBmcm9tIHRoZSBnaXZlbiB1c2VyIGluZm9ybWF0aW9uIGluIEpXVCB0b2tlbihjbGFpbSBuYW1lOiBzdWIpLlxuICogQHBhcmFtIHJlY29ubmVjdGFibGVDaGF0c1BhcmFtcyBNYW5kYXRlIHBhcmFtZXRlcnMgZm9yIGdldCByZWNvbm5lY3RhYmxlIGNoYXRzLlxuICovXG4gIHB1YmxpYyBhc3luYyBnZXRSZWNvbm5lY3RBdmFpbGFiaWxpdHkocmVjb25uZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UmVjb25uZWN0QXZhaWxhYmlsaXR5IHwgdm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdGFibGUgYXZhaWxhYmlsaXR5IFN0YXJ0ZWRcIik7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFJlY29ubmVjdEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVjb25uZWN0SWR9YDtcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmdldFJlY29ubmVjdEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzcG9uc2U7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IHN1Y2NlZWRlZFwiLCB1bmRlZmluZWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vIGRhdGEgZm91bmQgc28gcmV0dXJuaW5nIG51bGxcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLldBUk4sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUUkVDT05ORUNUQVZBSUxBQklMSVRZLCBcIkdldCBSZWNvbm5lY3QgYXZhaWxhYmlsaXR5IGRpZG4ndCBzZW5kIGFueSB2YWxpZCBkYXRhXCIsIHVuZGVmaW5lZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRSRUNPTk5FQ1RBVkFJTEFCSUxJVFksIFwiR2V0IFJlY29ubmVjdCBBdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKiBAcGFyYW0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtczogT3B0aW9uYWwgcGFyYW1ldGVycyBmb3Igc2Vzc2lvbiBpbml0LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEFnZW50QXZhaWxhYmlsaXR5KHJlcXVlc3RJZDogc3RyaW5nLCBxdWV1ZUF2YWlsYWJpbGl0eU9wdGlvbmFsUGFyYW1zOiBJR2V0UXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxRdWV1ZUF2YWlsYWJpbGl0eT4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRBR0VOVEFWQUlMQUJJTElUWVNUQVJURUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5HZXRBZ2VudEF2YWlsYWJpbGl0eVBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9bGN3YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gcXVldWVBdmFpbGFiaWxpdHlPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgZGF0YTogSW5pdENvbnRleHQgPSBpbml0Q29udGV4dCB8fCB7fTtcblxuICAgIGNvbnN0IGNhY2hPYmogPSB7XG4gICAgICBcIm9yZ0lkXCI6IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkLFxuICAgICAgXCJ3aWRnZXRJZFwiOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZFxuICAgIH1cblxuICAgIGlmIChkYXRhICYmIGRhdGEuY3VzdG9tQ29udGV4dERhdGEpIHtcbiAgICAgIGNvbnN0IHRlbXBBcnIgPSBDdXN0b21Db250ZXh0RGF0YS5zb3J0KGRhdGEuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwiY3VzdG9tQ29udGV4dFwiOiB0ZW1wQXJyIH0pO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnBvcnRhbGNvbnRhY3RpZCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihjYWNoT2JqLCB7IFwicG9ydGFsY29udGFjdGlkXCI6IGRhdGEucG9ydGFsY29udGFjdGlkIH0pO1xuICAgIH1cblxuICAgIGRhdGEuY2FjaGVLZXkgPSBoYXNoLmNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShKU09OLnN0cmluZ2lmeShjYWNoT2JqKSkuZGlnZXN0KCdoZXgnKS50b1N0cmluZygpO1xuXG4gICAgaWYgKGdldENvbnRleHQgJiYgIXdpbmRvdy5kb2N1bWVudCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZ2V0Q29udGV4dCBpcyBvbmx5IHN1cHBvcnRlZCBvbiB3ZWIgYnJvd3NlcnNgKSk7XG4gICAgfVxuXG4gICAgaWYgKGdldENvbnRleHQpIHtcbiAgICAgIGRhdGEuYnJvd3NlciA9IEJyb3dzZXJJbmZvLmdldEJyb3dzZXJOYW1lKCk7XG4gICAgICBkYXRhLmRldmljZSA9IERldmljZUluZm8uZ2V0RGV2aWNlVHlwZSgpO1xuICAgICAgZGF0YS5vcmlnaW51cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgIGRhdGEub3MgPSBPU0luZm8uZ2V0T3NUeXBlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRBZ2VudEF2YWlsYWJpbGl0eVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgY29uc3QgeyBkYXRhLCBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuR0VUQUdFTlRBVkFJTEFCSUxJVFlTVUNDRUVERUQsIFwiR2V0IGFnZW50IGF2YWlsYWJpbGl0eSBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVEFHRU5UQVZBSUxBQklMSVRZRkFJTEVELCBcIkdldCBhZ2VudCBhdmFpbGFiaWxpdHkgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG5cbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCAgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIHNlc3Npb24gdG8gb21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gaW5pdC5cbiAgICogQHBhcmFtIHNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHNlc3Npb24gaW5pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uSW5pdChyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtczogSVNlc3Npb25Jbml0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNUQVJURUQsIFwiU2Vzc2lvbiBJbml0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBheGlvc1JldHJ5KGF4aW9zSW5zdGFuY2UsIHtcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zZXNzaW9uSW5pdCxcbiAgICAgIHNob3VsZFJldHJ5OiBzZXNzaW9uSW5pdFJldHJ5SGFuZGxlcixcbiAgICAgIGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHJlY29ubmVjdElkLCBhdXRoZW50aWNhdGVkVXNlclRva2VuLCBpbml0Q29udGV4dCwgZ2V0Q29udGV4dCB9ID0gc2Vzc2lvbkluaXRPcHRpb25hbFBhcmFtcztcbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U2Vzc2lvbkluaXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZXNzaW9uSW5pdFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZ3VyYXRpb24udXNlVW5hdXRoUmVjb25uZWN0SWRTaWdRdWVyeVBhcmFtKSB7XG4gICAgICBpZiAocmVjb25uZWN0SWQpIHtcbiAgICAgICAgcmVxdWVzdFBhdGggKz0gYC8ke3JlY29ubmVjdElkfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBPbW5pY2hhbm5lbFF1ZXJ5UGFyYW1ldGVyID0ge1xuICAgICAgY2hhbm5lbElkOiB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWRcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uLnVzZVVuYXV0aFJlY29ubmVjdElkU2lnUXVlcnlQYXJhbSkge1xuICAgICAgaWYgKHJlY29ubmVjdElkKSB7XG4gICAgICAgIHBhcmFtcy5zaWcgPSByZWNvbm5lY3RJZFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGE6IEluaXRDb250ZXh0ID0gaW5pdENvbnRleHQgfHwge307XG5cbiAgICBpZiAoZ2V0Q29udGV4dCAmJiAhd2luZG93LmRvY3VtZW50KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBnZXRDb250ZXh0IGlzIG9ubHkgc3VwcG9ydGVkIG9uIHdlYiBicm93c2Vyc2ApKTtcbiAgICB9XG5cbiAgICBpZiAoZ2V0Q29udGV4dCkge1xuICAgICAgZGF0YS5icm93c2VyID0gQnJvd3NlckluZm8uZ2V0QnJvd3Nlck5hbWUoKTtcbiAgICAgIGRhdGEuZGV2aWNlID0gRGV2aWNlSW5mby5nZXREZXZpY2VUeXBlKCk7XG4gICAgICBkYXRhLm9yaWdpbnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgICAgZGF0YS5vcyA9IE9TSW5mby5nZXRPc1R5cGUoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBsb2NhbGUgaWYgbG9jYWxlIGlzIGVtcHR5XG4gICAgaWYgKCFkYXRhLmxvY2FsZSkge1xuICAgICAgZGF0YS5sb2NhbGUgPSBDb25zdGFudHMuZGVmYXVsdExvY2FsZTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBsb2NhbGVcbiAgICBpZiAoZGF0YS5sb2NhbGUgJiYgIUxvY2FsZXMuc3VwcG9ydGVkTG9jYWxlcy5pbmNsdWRlcyhkYXRhLmxvY2FsZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGxvY2FsZTogJyR7ZGF0YS5sb2NhbGV9J2ApKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGEsXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgcGFyYW1zLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2Vzc2lvbkluaXRcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OSU5JVFNVQ0NFRURFRCwgXCJTZXNzaW9uIEluaXQgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIHVuZGVmaW5lZCwgZGF0YSk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VTU0lPTklOSVRGQUlMRUQsIFwiU2Vzc2lvbiBJbml0IGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IsIGRhdGEpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQ6IFJlcXVlc3RJZCB0byB1c2UgZm9yIHNlc3Npb24gY2xvc2UgKHNhbWUgcmVxdWVzdCBpZCBmb3Igc2Vzc2lvbiBpbml0KS5cbiAgICogQHBhcmFtIHNlc3Npb25DbG9zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZXNzaW9uIGNsb3NlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25DbG9zZShyZXF1ZXN0SWQ6IHN0cmluZywgc2Vzc2lvbkNsb3NlT3B0aW9uYWxQYXJhbXM6IElTZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNUQVJURUQsIFwiU2Vzc2lvbiBDbG9zZSBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRTZXNzaW9uQ2xvc2VQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuc2Vzc2lvbkNsb3NlXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGlzUmVjb25uZWN0Q2hhdCwgaXNQZXJzaXN0ZW50Q2hhdCwgY2hhdElkIH0gPSBzZXNzaW9uQ2xvc2VPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBjb25zdCBkYXRhOiBhbnkgPSB7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YS5jaGF0SWQgPSBjaGF0SWQ7XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoU2Vzc2lvbkNsb3NlUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIGlmIChpc1JlY29ubmVjdENoYXQpIHtcbiAgICAgIHJlcXVlc3RQYXRoICs9IGAmaXNSZWNvbm5lY3RDaGF0PXRydWVgO1xuICAgIH1cblxuICAgIGlmIChpc1BlcnNpc3RlbnRDaGF0KSB7XG4gICAgICByZXF1ZXN0UGF0aCArPSBgJmlzUGVyc2lzdGVudENoYXQ9dHJ1ZWA7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLnNlc3Npb25DbG9zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFU1NJT05DTE9TRVNVQ0NFRURFRCwgXCJTZXNzaW9uIENsb3NlIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgfSBjYXRjaCAoZXJyb3IgOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TRVNTSU9OQ0xPU0VGQUlMRUQsIFwiU2Vzc2lvbiBjbG9zZSBmYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBhdXRoIGNoYXQgcmVjb3JkIGV4aXN0cyBpbiBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZDogUmVxdWVzdElkIGZvciB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkIChzYW1lIHJlcXVlc3QgaWQgZm9yIHNlc3Npb24gaW5pdCkuXG4gICAqIEBwYXJhbSB2YWxpZGF0ZUF1dGhDaGF0UmVjb3JkT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHZhbGlkYXRlQXV0aENoYXRSZWNvcmQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZChyZXF1ZXN0SWQ6IHN0cmluZywgdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zOiBJVmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNUQVJURUQsIFwiVmFsaWRhdGUgQXV0aCBDaGF0IFJlY29yZCBTdGFydGVkXCIsIHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB7IGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4sIGNoYXRJZCB9ID0gdmFsaWRhdGVBdXRoQ2hhdFJlY29yZE9wdGlvbmFsUGFyYW1zO1xuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VmFsaWRhdGVBdXRoQ2hhdE1hcFJlY29yZFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcudmFsaWRhdGVBdXRoQ2hhdFJlY29yZFxuICAgIH0pO1xuXG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy52YWxpZGF0ZUF1dGhDaGF0UmVjb3JkVGltZW91dFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGlmIChyZXNwb25zZS5kYXRhPy5hdXRoQ2hhdEV4aXN0ID09PSB0cnVlKSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SRFNVQ0NFRURFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIEZhaWxlZC4gUmVjb3JkIGlzIG5vdCBmb3VuZCBvciByZXF1ZXN0IGlzIG5vdCBhdXRob3JpemVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlZhbGlkYXRlIEF1dGggQ2hhdCBSZWNvcmQgRmFpbGVkLiBSZWNvcmQgaXMgbm90IGZvdW5kIG9yIHJlcXVlc3QgaXMgbm90IGF1dGhvcml6ZWRcIikpO1xuICAgICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICB9IGNhdGNoIChlcnJvciA6IGFueSkge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuVkFMSURBVEVBVVRIQ0hBVFJFQ09SREZBSUxFRCwgXCJWYWxpZGF0ZSBBdXRoIENoYXQgUmVjb3JkIGZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlcnJvci50b1N0cmluZygpID09PSBcIkVycm9yOiBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDQwNFwiKSB7IC8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3VibWl0cyBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gcG9zdENoYXRSZXNwb25zZSBQb3N0IGNoYXQgcmVzcG9uc2UgdG8gc3VibWl0LlxuICAgKiBAcGFyYW0gc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzdWJtaXQgcG9zdCBjaGF0IHJlc3BvbnNlLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1Ym1pdFBvc3RDaGF0UmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIHBvc3RDaGF0UmVzcG9uc2U6IG9iamVjdCwgc3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zOiBJU3VibWl0UG9zdENoYXRSZXNwb25zZU9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU1VCTUlUUE9TVENIQVRTVEFSVEVELCBcIlN1Ym1pdCBQb3N0IENoYXQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0U3VibWl0UG9zdENoYXRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7IGhlYWRlck92ZXJ3cml0ZXM6IFtPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdLCBcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5zdWJtaXRQb3N0Q2hhdFJlc3BvbnNlXG4gICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuIH0gPSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0QXV0aFN1Ym1pdFBvc3RDaGF0UGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi53aWRnZXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ1VybH0ke3JlcXVlc3RQYXRofWA7XG4gICAgY29uc3QgbWV0aG9kID0gXCJQT1NUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkocG9zdENoYXRSZXNwb25zZSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc3VibWl0UG9zdENoYXRSZXNwb25zZVxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNVQk1JVFBPU1RDSEFUU1VDQ0VFREVELCBcIlN1Ym1pdCBQb3N0IENoYXQgc3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5TVUJNSVRQT1NUQ0hBVEZBSUxFRCwgXCJTdWJtaXQgUG9zdCBDaGF0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsIENvbnN0YW50cy5heGlvc1RpbWVvdXRFcnJvckNvZGUpKSB7XG4gICAgICAgICAgdGhyb3dDbGllbnRIVFRQVGltZW91dEVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJtaXRzIHBvc3QgY2hhdCByZXNwb25zZS5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBwb3N0Q2hhdFJlc3BvbnNlIFBvc3QgY2hhdCByZXNwb25zZSB0byBzdWJtaXQuXG4gICAqIEBwYXJhbSBzdWJtaXRQb3N0Q2hhdFJlc3BvbnNlT3B0aW9uYWxQYXJhbXM6IE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHN1Ym1pdCBwb3N0IGNoYXQgcmVzcG9uc2UuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U3VydmV5SW52aXRlTGluayhzdXJ2ZXlPd25lcklkOiBzdHJpbmcsIHN1cnZleUludml0ZUFQSVJlcXVlc3RCb2R5OiBvYmplY3QsIGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtczogSUdldFN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcyA9IHt9KTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgaWYgKHRoaXMubG9nZ2VyKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coTG9nTGV2ZWwuSU5GTyxcbiAgICAgICAgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LU1RBUlRFRCxcbiAgICAgICAgeyBTdXJ2ZXlPd25lcklkOiBzdXJ2ZXlPd25lcklkIH0sXG4gICAgICAgIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdGFydGVkXCIpO1xuICAgIH1cbiAgICBsZXQgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwgeyBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSwgXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGVkVXNlclRva2VuLCByZXF1ZXN0SWQgfSA9IGdldHN1cnZleUludml0ZUxpbmtPcHRpb25hbFBhcmFtcztcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRTdXJ2ZXlJbnZpdGVMaW5rUGF0aH0vJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZH0vJHtzdXJ2ZXlPd25lcklkfWA7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG4gICAgfVxuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzdXJ2ZXlJbnZpdGVBUElSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuZ2V0U3VydmV5SW52aXRlTGlua1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGRhdGEsIGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVFNVUlZFWUlOVklURUxJTktTVUNDRUVERUQsIFwiR2V0IFN1cnZleSBJbnZpdGUgTGluayBTdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRTVVJWRVlJTlZJVEVMSU5LRkFJTEVELCBcIkdldCBTdXJ2ZXkgSW52aXRlIExpbmsgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjaGF0IHRyYW5zY3JpcHRzIGZvciBjdXN0b21lci5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0SWQgb2YgdGhlIG9tbmljaGFubmVsIHNlc3Npb24uXG4gICAqIEBwYXJhbSBjaGF0SWQgQ2hhdCB0aHJlYWQgSWQuXG4gICAqIEBwYXJhbSB0b2tlbiBTa3lwZSB0b2tlbi5cbiAgICogQHBhcmFtIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGdldCBjaGF0IHRyYW5zY3JpcHRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENoYXRUcmFuc2NyaXB0cyhyZXF1ZXN0SWQ6IHN0cmluZywgY2hhdElkOiBzdHJpbmcsIHRva2VuOiBzdHJpbmcsIGdldENoYXRUcmFuc2NyaXB0c09wdGlvbmFsUGFyYW1zOiBJR2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdGltZXIgPSBUaW1lci5USU1FUigpO1xuICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBUU1RBUlRFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEdldENoYXRUcmFuc2NyaXB0UGF0aH0vJHtjaGF0SWR9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiwgY3VycmVudExpdmVDaGF0VmVyc2lvbiB9ID0gZ2V0Q2hhdFRyYW5zY3JpcHRzT3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAodGhpcy5saXZlQ2hhdFZlcnNpb24gPT09IExpdmVDaGF0VmVyc2lvbi5WMiB8fCAoY3VycmVudExpdmVDaGF0VmVyc2lvbiAmJiBjdXJyZW50TGl2ZUNoYXRWZXJzaW9uID09PSBMaXZlQ2hhdFZlcnNpb24uVjIpKSB7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdHYyR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgaWYgKGF1dGhlbnRpY2F0ZWRVc2VyVG9rZW4pIHtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICAgIHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0djJBdXRoR2V0Q2hhdFRyYW5zY3JpcHRQYXRofS8ke2NoYXRJZH0vJHtyZXF1ZXN0SWR9P2NoYW5uZWxJZD0ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLmNoYW5uZWxJZH1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhHZXRDaGF0VHJhbnNjcmlwdFBhdGh9LyR7Y2hhdElkfS8ke3JlcXVlc3RJZH0/Y2hhbm5lbElkPSR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24uY2hhbm5lbElkfWA7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIkdFVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBtZXRob2QsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiB0aGlzLmNvbmZpZ3VyYXRpb24uZGVmYXVsdFJlcXVlc3RUaW1lb3V0ID8/IHRoaXMuY29uZmlndXJhdGlvbi5yZXF1ZXN0VGltZW91dENvbmZpZy5nZXRDaGF0VHJhbnNjcmlwdHNcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIGNvbnN0IHsgZGF0YSwgaGVhZGVycyB9ID0gcmVzcG9uc2U7XG4gICAgICAgIHRoaXMuc2V0QXV0aENvZGVOb25jZShoZWFkZXJzKTtcblxuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5HRVRDSEFUVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJHZXQgQ2hhdCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKGRhdGEpO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkdFVENIQVRUUkFOU0NSSVBURkFJTEVELCBcIkdldCBDaGF0IFRyYW5zY3JpcHQgZmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtYWlsIHRyYW5zY3JpcHQgdG8gY3VzdG9tZXIuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKiBAcGFyYW0gdG9rZW4gU2t5cGUgdG9rZW4uXG4gICAqIEBwYXJhbSBlbWFpbFJlcXVlc3RCb2R5IEVtYWlsIHJlcXVlc3QgYm9keS5cbiAgICogQHBhcmFtIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zIE9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGVtYWlsIHRyYW5zY3JpcHQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZW1haWxUcmFuc2NyaXB0KHJlcXVlc3RJZDogc3RyaW5nLCB0b2tlbjogc3RyaW5nLCBlbWFpbFJlcXVlc3RCb2R5OiBvYmplY3QsIGVtYWlsVHJhbnNjcmlwdE9wdGlvbmFsUGFyYW1zOiBJRW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5FTUFJTFRSQU5TQ1JJUFRTVEFSVEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgU3RhcnRlZFwiLCByZXF1ZXN0SWQpO1xuXG4gICAgbGV0IHJlcXVlc3RQYXRoID0gYC8ke09tbmljaGFubmVsRW5kcG9pbnRzLkxpdmVDaGF0VHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICBoZWFkZXJPdmVyd3JpdGVzOiBbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSxcbiAgICAgIHJldHJpZXM6IHRoaXMuY29uZmlndXJhdGlvbi5tYXhSZXF1ZXN0UmV0cmllc09uRmFpbHVyZSxcbiAgICAgIHdhaXRUaW1lSW5Nc0JldHdlZW5SZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2FpdFRpbWVCZXR3ZWVuUmV0cmllc0NvbmZpZy5lbWFpbFRyYW5zY3JpcHRcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gZW1haWxUcmFuc2NyaXB0T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMud2lkZ2V0QXBwSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhvcml6YXRpb25dID0gdG9rZW47XG5cbiAgICBpZiAoYXV0aGVudGljYXRlZFVzZXJUb2tlbikge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhlbnRpY2F0ZWRVc2VyVG9rZW5dID0gYXV0aGVudGljYXRlZFVzZXJUb2tlbjtcbiAgICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5hdXRoQ29kZU5vbmNlXSA9IHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlO1xuICAgICAgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRBdXRoVHJhbnNjcmlwdEVtYWlsUmVxdWVzdFBhdGh9LyR7cmVxdWVzdElkfT9jaGFubmVsSWQ9JHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5jaGFubmVsSWR9YDtcbiAgICB9XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiUE9TVFwiO1xuICAgIGNvbnN0IG9wdGlvbnM6IEF4aW9zUmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGVtYWlsUmVxdWVzdEJvZHkpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmVtYWlsVHJhbnNjcmlwdFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCB7IGhlYWRlcnMgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLnNldEF1dGhDb2RlTm9uY2UoaGVhZGVycyk7XG5cbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5JTkZPLCBPQ1NES1RlbGVtZXRyeUV2ZW50LkVNQUlMVFJBTlNDUklQVFNVQ0NFRURFRCwgXCJFbWFpbCBUcmFuc2NyaXB0IHN1Y2NlZWRlZFwiLCByZXF1ZXN0SWQsIHJlc3BvbnNlLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kKTtcblxuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRU1BSUxUUkFOU0NSSVBURkFJTEVELCBcIkVtYWlsIFRyYW5zY3JpcHQgRmFpbGVkXCIsIHJlcXVlc3RJZCwgdW5kZWZpbmVkLCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzLCByZXF1ZXN0UGF0aCwgbWV0aG9kLCBlcnJvcik7XG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGRhdGEgbWFza2luZyBpbmZvIG9mIHRoZSBvcmcuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uIChPcHRpb25hbCkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZmV0Y2hEYXRhTWFza2luZ0luZm8ocmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPElEYXRhTWFza2luZ0luZm8+IHtcbiAgICBjb25zdCB0aW1lciA9IFRpbWVyLlRJTUVSKCk7XG4gICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuRkVUQ0hEQVRBTUFTS0lOR1NUQVJURUQsIFwiRmV0Y2ggRGF0YSBNYXNraW5nIFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcbiAgICBpZiAoIXJlcXVlc3RJZCkge1xuICAgICAgcmVxdWVzdElkID0gdXVpZHY0KCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSBgLyR7T21uaWNoYW5uZWxFbmRwb2ludHMuTGl2ZUNoYXRGZXRjaERhdGFNYXNraW5nSW5mb1BhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG4gICAgXG4gICAgYXhpb3NSZXRyeShheGlvc0luc3RhbmNlLCB7XG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcuZmV0Y2hEYXRhTWFza2luZ0luZm9cbiAgICB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFN0cmluZ01hcCA9IENvbnN0YW50cy5kZWZhdWx0SGVhZGVycztcbiAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMub3JnYW5pemF0aW9uSWRdID0gdGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWQ7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLnJlcXVlc3RJZF0gPSByZXF1ZXN0SWQ7XG5cbiAgICB0aGlzLnNldFNlc3Npb25JZEhlYWRlcih0aGlzLnNlc3Npb25JZCwgaGVhZGVycyk7XG5cbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdVcmx9JHtyZXF1ZXN0UGF0aH1gO1xuICAgIGNvbnN0IG1ldGhvZCA9IFwiR0VUXCI7XG4gICAgY29uc3Qgb3B0aW9uczogQXhpb3NSZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgaGVhZGVycyxcbiAgICAgIG1ldGhvZCxcbiAgICAgIHVybCxcbiAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlndXJhdGlvbi5kZWZhdWx0UmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5jb25maWd1cmF0aW9uLnJlcXVlc3RUaW1lb3V0Q29uZmlnLmZldGNoRGF0YU1hc2tpbmdJbmZvXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zSW5zdGFuY2Uob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IHJlc3BvbnNlO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HU1VDQ0VFREVELCBcIkZldGNoIERhdGEgTWFza2luZyBzdWNjZWVkZWRcIiwgcmVxdWVzdElkLCByZXNwb25zZSwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCk7XG5cbiAgICAgICAgcmVzb2x2ZShkYXRhKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG4gICAgICAgIHRoaXMubG9nV2l0aExvZ2dlcihMb2dMZXZlbC5FUlJPUiwgT0NTREtUZWxlbWV0cnlFdmVudC5GRVRDSERBVEFNQVNLSU5HRkFJTEVELCBcIkZldGNoIERhdGEgTWFza2luZyBGYWlsZWRcIiwgcmVxdWVzdElkLCB1bmRlZmluZWQsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QsIGVycm9yKTtcbiAgICAgICAgaWYgKGlzRXhwZWN0ZWRBeGlvc0Vycm9yKGVycm9yLCBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgYSBzZWNvbmRhcnkgY2hhbm5lbCBldmVudCBuZXR3b3JrIGNhbGwgdG8gT21uaWNoYW5uZWwuXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIHRvIHVzZSBmb3Igc2Vjb25kYXJ5IGNoYW5uZWwgZXZlbnRcbiAgICogQHBhcmFtIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5IHNlY29uZGFyeUNoYW5uZWwgZXZlbnQgcmVxdWVzdCBib2R5XG4gICAqIEBwYXJhbSBzZWNvbmRhcnlDaGFubmVsRXZlbnRPcHRpb25hbFBhcmFtcyBPcHRpb25hbCBwYXJhbWV0ZXJzIGZvciBzZWNvbmRhcnkgY2hhbm5lbCBldmVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcsIHNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RCb2R5OiBvYmplY3QsIHNlY29uZGFyeUNoYW5uZWxFdmVudE9wdGlvbmFsUGFyYW1zOiBJU2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1RBUlRFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IFN0YXJ0ZWRcIiwgcmVxdWVzdElkKTtcblxuICAgIGxldCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdFNlY29uZGFyeUNoYW5uZWxFdmVudFBhdGh9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnSWR9LyR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ud2lkZ2V0SWR9LyR7cmVxdWVzdElkfWA7XG4gICAgY29uc3QgYXhpb3NJbnN0YW5jZSA9IGF4aW9zLmNyZWF0ZSgpO1xuICAgIFxuICAgIGF4aW9zUmV0cnkoYXhpb3NJbnN0YW5jZSwge1xuICAgICAgaGVhZGVyT3ZlcndyaXRlczogW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aENvZGVOb25jZV0sXG4gICAgICByZXRyaWVzOiB0aGlzLmNvbmZpZ3VyYXRpb24ubWF4UmVxdWVzdFJldHJpZXNPbkZhaWx1cmUsXG4gICAgICB3YWl0VGltZUluTXNCZXR3ZWVuUmV0cmllczogdGhpcy5jb25maWd1cmF0aW9uLndhaXRUaW1lQmV0d2VlblJldHJpZXNDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgYXV0aGVudGljYXRlZFVzZXJUb2tlbiB9ID0gc2Vjb25kYXJ5Q2hhbm5lbEV2ZW50T3B0aW9uYWxQYXJhbXM7XG4gICAgY29uc3QgaGVhZGVyczogU3RyaW5nTWFwID0gQ29uc3RhbnRzLmRlZmF1bHRIZWFkZXJzO1xuICAgIGhlYWRlcnNbT21uaWNoYW5uZWxIVFRQSGVhZGVycy5vcmdhbml6YXRpb25JZF0gPSB0aGlzLm9tbmljaGFubmVsQ29uZmlndXJhdGlvbi5vcmdJZDtcblxuICAgIGlmIChhdXRoZW50aWNhdGVkVXNlclRva2VuKSB7XG4gICAgICBoZWFkZXJzW09tbmljaGFubmVsSFRUUEhlYWRlcnMuYXV0aGVudGljYXRlZFVzZXJUb2tlbl0gPSBhdXRoZW50aWNhdGVkVXNlclRva2VuO1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLmF1dGhDb2RlTm9uY2VdID0gdGhpcy5jb25maWd1cmF0aW9uLmF1dGhDb2RlTm9uY2U7XG4gICAgICByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5MaXZlQ2hhdEF1dGhTZWNvbmRhcnlDaGFubmVsRXZlbnRQYXRofS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkfS8ke3RoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLndpZGdldElkfS8ke3JlcXVlc3RJZH1gO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U2Vzc2lvbklkSGVhZGVyKHRoaXMuc2Vzc2lvbklkLCBoZWFkZXJzKTtcblxuICAgIHJlcXVlc3RQYXRoICs9IFwiP2NoYW5uZWxJZD1cIiArIENvbnN0YW50cy5kZWZhdWx0Q2hhbm5lbElkO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShzZWNvbmRhcnlDaGFubmVsRXZlbnRSZXF1ZXN0Qm9keSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcubWFrZVNlY29uZGFyeUNoYW5uZWxFdmVudFJlcXVlc3RcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXhpb3NJbnN0YW5jZShvcHRpb25zKTtcbiAgICAgICAgY29uc3QgeyBoZWFkZXJzIH0gPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5zZXRBdXRoQ29kZU5vbmNlKGhlYWRlcnMpO1xuXG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuSU5GTywgT0NTREtUZWxlbWV0cnlFdmVudC5TRUNPTkRBUllDSEFOTkVMRVZFTlRSRVFVRVNUU1VDQ0VFREVELCBcIlNlY29uZGFyeSBDaGFubmVsIEV2ZW50IFJlcXVlc3QgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuICAgICAgICByZXNvbHZlKCk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMgPSB0aW1lci5taWxsaVNlY29uZHNFbGFwc2VkO1xuICAgICAgICB0aGlzLmxvZ1dpdGhMb2dnZXIoTG9nTGV2ZWwuRVJST1IsIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VDT05EQVJZQ0hBTk5FTEVWRU5UUkVRVUVTVEZBSUxFRCwgXCJTZWNvbmRhcnkgQ2hhbm5lbCBFdmVudCBSZXF1ZXN0IEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuICAgICAgICBpZiAoaXNFeHBlY3RlZEF4aW9zRXJyb3IoZXJyb3IsICBDb25zdGFudHMuYXhpb3NUaW1lb3V0RXJyb3JDb2RlKSkge1xuICAgICAgICAgIHRocm93Q2xpZW50SFRUUFRpbWVvdXRFcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogU2VuZCB0eXBpbmcgaW5kaWNhdG9yXG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgUmVxdWVzdElkIG9mIHRoZSBvbW5pY2hhbm5lbCBzZXNzaW9uLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlbmRUeXBpbmdJbmRpY2F0b3IocmVxdWVzdElkOiBzdHJpbmcsIGN1cnJlbnRMaXZlQ2hhdFZlcnNpb246IG51bWJlciwgc2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zOiBJU2VuZFR5cGluZ0luZGljYXRvck9wdGlvbmFsUGFyYW1zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBhdm9pZGluZyBsb2dnaW5nIEluZm8gZm9yIHR5cGluZ2luZGljYXRvciB0byByZWR1Y2UgbG9nIHRyYWZmaWNcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyID0gVGltZXIuVElNRVIoKTtcbiAgICBjb25zdCB7IGN1c3RvbWVyRGlzcGxheU5hbWUgfSA9IHNlbmRUeXBpbmdJbmRpY2F0b3JPcHRpb25hbFBhcmFtcztcbiAgICBpZiAoIWN1cnJlbnRMaXZlQ2hhdFZlcnNpb24gfHwgY3VycmVudExpdmVDaGF0VmVyc2lvbiAhPT0gTGl2ZUNoYXRWZXJzaW9uLlYyKSB7IHRocm93IG5ldyBFcnJvcignVHlwaW5nIGluZGljYXRvciBpcyBvbmx5IHN1cHBvcnRlZCBvbiB2MicpIH1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IGAvJHtPbW5pY2hhbm5lbEVuZHBvaW50cy5TZW5kVHlwaW5nSW5kaWNhdG9yUGF0aH0vJHtyZXF1ZXN0SWR9YDtcbiAgICBjb25zdCBheGlvc0luc3RhbmNlID0gYXhpb3MuY3JlYXRlKCk7XG5cbiAgICBjb25zdCBoZWFkZXJzOiBTdHJpbmdNYXAgPSBDb25zdGFudHMuZGVmYXVsdEhlYWRlcnM7XG4gICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9yZ2FuaXphdGlvbklkXSA9IHRoaXMub21uaWNoYW5uZWxDb25maWd1cmF0aW9uLm9yZ0lkO1xuICAgIGlmIChjdXN0b21lckRpc3BsYXlOYW1lKSB7XG4gICAgICBoZWFkZXJzW0NvbnN0YW50cy5jdXN0b21lckRpc3BsYXlOYW1lXSA9IGN1c3RvbWVyRGlzcGxheU5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTZXNzaW9uSWRIZWFkZXIodGhpcy5zZXNzaW9uSWQsIGhlYWRlcnMpO1xuXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5vbW5pY2hhbm5lbENvbmZpZ3VyYXRpb24ub3JnVXJsfSR7cmVxdWVzdFBhdGh9YDtcbiAgICBjb25zdCBtZXRob2QgPSBcIlBPU1RcIjtcbiAgICBjb25zdCBvcHRpb25zOiBBeGlvc1JlcXVlc3RDb25maWcgPSB7XG4gICAgICBoZWFkZXJzLFxuICAgICAgbWV0aG9kLFxuICAgICAgdXJsLFxuICAgICAgdGltZW91dDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHRSZXF1ZXN0VGltZW91dCA/PyB0aGlzLmNvbmZpZ3VyYXRpb24ucmVxdWVzdFRpbWVvdXRDb25maWcuc2VuZFR5cGluZ0luZGljYXRvclxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvc0luc3RhbmNlKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzID0gdGltZXIubWlsbGlTZWNvbmRzRWxhcHNlZDtcbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLklORk8sIE9DU0RLVGVsZW1ldHJ5RXZlbnQuU0VORFRZUElOR0lORElDQVRPUlNVQ0NFRURFRCwgXCJTZW5kIFR5cGluZyBJbmRpY2F0b3IgU3VjY2VlZGVkXCIsIHJlcXVlc3RJZCwgcmVzcG9uc2UsIGVsYXBzZWRUaW1lSW5NaWxsaXNlY29uZHMsIHJlcXVlc3RQYXRoLCBtZXRob2QpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyA9IHRpbWVyLm1pbGxpU2Vjb25kc0VsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5sb2dXaXRoTG9nZ2VyKExvZ0xldmVsLkVSUk9SLCBPQ1NES1RlbGVtZXRyeUV2ZW50LlNFTkRUWVBJTkdJTkRJQ0FUT1JGQUlMRUQsIFwiU2VuZCBUeXBpbmcgSW5kaWNhdG9yIEZhaWxlZFwiLCByZXF1ZXN0SWQsIHVuZGVmaW5lZCwgZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcywgcmVxdWVzdFBhdGgsIG1ldGhvZCwgZXJyb3IpO1xuXG4gICAgICAgIGlmIChpc0V4cGVjdGVkQXhpb3NFcnJvcihlcnJvciwgQ29uc3RhbnRzLmF4aW9zVGltZW91dEVycm9yQ29kZSkpIHtcbiAgICAgICAgICB0aHJvd0NsaWVudEhUVFBUaW1lb3V0RXJyb3IoKTtcbiAgICAgICAgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQHBhcmFtIGxvZ0xldmVsIExvZyBsZXZlbCBmb3IgbG9nZ2luZy5cbiAgICogQHBhcmFtIHRlbGVtZXRyeUV2ZW50VHlwZSBUZWxlbWV0cnkgZXZlbnQgdHlwZSBpbiB3aGljaCBldmVudCB3aWxsIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIHJlcXVlc3RJZCBSZXF1ZXN0IElEXG4gICAqIEBwYXJhbSByZXNwb25zZSBSZXNwb25zZVxuICAgKiBAcGFyYW0gZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyBFbGFwc2VkIHRpbWUgaW4gbXNcbiAgICogQHBhcmFtIHJlcXVlc3RQYXRoIFJlcXVlc3QgcGF0aFxuICAgKiBAcGFyYW0gbWV0aG9kIE1ldGhvZFxuICAgKiBAcGFyYW0gZXJyb3IgRXJyb3JcbiAgICogQHBhcmFtIGRhdGEgRGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBsb2dXaXRoTG9nZ2VyKGxvZ0xldmVsOiBMb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlOiBPQ1NES1RlbGVtZXRyeUV2ZW50LCBkZXNjcmlwdGlvbjogc3RyaW5nLCByZXF1ZXN0SWQ/OiBzdHJpbmcsIHJlc3BvbnNlPzogQXhpb3NSZXNwb25zZTxhbnk+LCBlbGFwc2VkVGltZUluTWlsbGlzZWNvbmRzPzogbnVtYmVyLCByZXF1ZXN0UGF0aD86IHN0cmluZywgbWV0aG9kPzogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIHJlcXVlc3RQYXlsb2FkPzogYW55KTogdm9pZCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGlmICghdGhpcy5sb2dnZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwRXJyb3JTZW5zaXRpdmVQcm9wZXJ0aWVzKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgc2FuaXRpemVkUmVxdWVzdFBheWxvYWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcXVlc3RQYXlsb2FkKSB7XG4gICAgICBzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZCA9IHsgLi4ucmVxdWVzdFBheWxvYWQgfTtcbiAgICAgIGlmIChzYW5pdGl6ZWRSZXF1ZXN0UGF5bG9hZC5jdXN0b21Db250ZXh0RGF0YSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwQ3VzdG9tQ29udGV4dERhdGFWYWx1ZXMoc2FuaXRpemVkUmVxdWVzdFBheWxvYWQuY3VzdG9tQ29udGV4dERhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSkge1xuICAgICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwUHJlQ2hhdFJlc3BvbnNlKHNhbml0aXplZFJlcXVlc3RQYXlsb2FkLnByZUNoYXRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBMb2dnaW5nU2FuaXRpemVyLnN0cmlwR2VvbG9jYXRpb24oc2FuaXRpemVkUmVxdWVzdFBheWxvYWQpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1c3RvbURhdGEgPSB7XG4gICAgICBSZXF1ZXN0SWQ6IHJlcXVlc3RJZCxcbiAgICAgIFJlZ2lvbjogcmVzcG9uc2U/LmRhdGEuUmVnaW9uLFxuICAgICAgRWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kczogZWxhcHNlZFRpbWVJbk1pbGxpc2Vjb25kcyxcbiAgICAgIFRyYW5zYWN0aW9uSWQ6IHJlc3BvbnNlPy5oZWFkZXJzW0NvbnN0YW50cy50cmFuc2FjdGlvbmlkXSxcbiAgICAgIFJlcXVlc3RQYXRoOiByZXF1ZXN0UGF0aCxcbiAgICAgIFJlcXVlc3RNZXRob2Q6IG1ldGhvZCxcbiAgICAgIFJlc3BvbnNlU3RhdHVzQ29kZTogcmVzcG9uc2UgPyByZXNwb25zZS5zdGF0dXMgOiBlcnJvciA/IChlcnJvciBhcyBhbnkpLnJlc3BvbnNlPy5zdGF0dXMgOiB1bmRlZmluZWQsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgRXhjZXB0aW9uRGV0YWlsczogZXJyb3IsXG4gICAgICBSZXF1ZXN0UGF5bG9hZDogc2FuaXRpemVkUmVxdWVzdFBheWxvYWRcbiAgICB9O1xuICAgIHRoaXMubG9nZ2VyLmxvZyhsb2dMZXZlbCwgdGVsZW1ldHJ5RXZlbnRUeXBlLCBjdXN0b21EYXRhLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldEF1dGhDb2RlTm9uY2UgPSAoaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKGhlYWRlcnM/LmF1dGhjb2Rlbm9uY2UpIHtcbiAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5hdXRoQ29kZU5vbmNlID0gaGVhZGVycz8uYXV0aGNvZGVub25jZTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHNldFNlc3Npb25JZEhlYWRlciA9IChzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgaGVhZGVyczogYW55KSA9PiB7XG4gICAgaWYgKHNlc3Npb25JZCkge1xuICAgICAgaGVhZGVyc1tPbW5pY2hhbm5lbEhUVFBIZWFkZXJzLm9jU2Vzc2lvbklkXSA9IHNlc3Npb25JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==