@sabstravtech/obtservices 0.0.22050309 → 0.0.26051001

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.
Files changed (170) hide show
  1. package/angular/components/basket-panel.d.ts +1 -0
  2. package/angular/fetchers.d.ts +7 -0
  3. package/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +7 -0
  4. package/angular/lib/vendor/fetchers/get-companies.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/get-company.fetcher.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +7 -0
  7. package/angular/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +7 -0
  8. package/angular/lib/vendor/services/enterprise-basket.service.d.ts +5 -3
  9. package/angular/lib/vendor/services/logon.service.d.ts +2 -1
  10. package/angular/lib/vendor/services/search.service.d.ts +4 -3
  11. package/angular/lib/vendor/services/ticket-queue.service.d.ts +6 -0
  12. package/angular/lib/vendor/services/user.service.d.ts +7 -3
  13. package/angular/lib/vendor/types/graphql.angular.types.d.ts +354 -90
  14. package/angular/lib/vendor/updaters/create-guest-updater.d.ts +6 -0
  15. package/angular/sabstravtech-obtservices-angular.d.ts +0 -1
  16. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  17. package/angular/services.d.ts +1 -0
  18. package/angular/updaters.d.ts +1 -0
  19. package/base/fetchers.d.ts +7 -0
  20. package/base/interfaces.d.ts +2 -0
  21. package/base/lib/vendor/classes/base-enterprise.d.ts +5 -1
  22. package/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +2 -0
  23. package/base/lib/vendor/classes/bookable-basket.d.ts +2 -0
  24. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +6 -4
  25. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +5 -3
  26. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +5 -4
  27. package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +18 -13
  28. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +6 -5
  29. package/base/lib/vendor/classes/helpers.d.ts +6 -1
  30. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +8 -4
  31. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +23 -9
  32. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +4 -3
  33. package/base/lib/vendor/classes/management-info-and-valid.d.ts +7 -2
  34. package/base/lib/vendor/classes/modal-types.enum.d.ts +2 -0
  35. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +4 -3
  36. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +10 -7
  37. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +5 -3
  38. package/base/lib/vendor/fetchers/fast-track-quote.fetcher.d.ts +1 -1
  39. package/base/lib/vendor/fetchers/get-cancellation-info.fetcher.d.ts +20 -0
  40. package/base/lib/vendor/fetchers/get-companies.fetcher.d.ts +21 -0
  41. package/base/lib/vendor/fetchers/get-company.fetcher.d.ts +20 -0
  42. package/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.d.ts +21 -0
  43. package/base/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +20 -0
  44. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +2 -0
  45. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +4 -2
  46. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +10 -6
  47. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +2 -0
  48. package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +11 -5
  49. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +3 -1
  50. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +7 -2
  51. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +11 -5
  52. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +2 -0
  53. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +2 -0
  54. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +6 -2
  55. package/base/lib/vendor/interfaces/Isearch.service.d.ts +4 -2
  56. package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +3 -2
  57. package/base/lib/vendor/interfaces/Iuser.service.d.ts +3 -1
  58. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +2 -3
  59. package/base/lib/vendor/interfaces/fast-track-filters.interface.d.ts +4 -0
  60. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
  61. package/base/lib/vendor/interfaces/summary-interface.d.ts +4 -0
  62. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  63. package/base/lib/vendor/models/traveller.object.d.ts +1 -1
  64. package/base/lib/vendor/services/enterprise-basket.service.d.ts +28 -10
  65. package/base/lib/vendor/services/logon.service.d.ts +5 -1
  66. package/base/lib/vendor/services/requires-reason.service.d.ts +20 -0
  67. package/base/lib/vendor/services/search.service.d.ts +30 -25
  68. package/base/lib/vendor/services/url.service.d.ts +2 -0
  69. package/base/lib/vendor/services/user.service.d.ts +21 -5
  70. package/base/lib/vendor/services/webtoken.service.d.ts +5 -0
  71. package/base/lib/vendor/types/graphql.types.d.ts +326 -89
  72. package/base/lib/vendor/types/types.d.ts +44 -17
  73. package/base/lib/vendor/updaters/create-guest-updater.d.ts +19 -0
  74. package/base/sabstravtech-obtservices-base.d.ts +1 -1
  75. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  76. package/base/services.d.ts +1 -0
  77. package/base/updaters.d.ts +1 -0
  78. package/bundles/sabstravtech-obtservices-angular.umd.js +466 -180
  79. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  80. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  81. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  82. package/bundles/sabstravtech-obtservices-base.umd.js +4435 -1004
  83. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  84. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  85. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  86. package/esm2015/angular/components/basket-panel.js +16 -7
  87. package/esm2015/angular/fetchers.js +8 -1
  88. package/esm2015/angular/lib/vendor/fetchers/get-cancellation-info.fetcher.js +25 -0
  89. package/esm2015/angular/lib/vendor/fetchers/get-companies.fetcher.js +25 -0
  90. package/esm2015/angular/lib/vendor/fetchers/get-company.fetcher.js +25 -0
  91. package/esm2015/angular/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +25 -0
  92. package/esm2015/angular/lib/vendor/fetchers/get-user-guests.fetcher.js +25 -0
  93. package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +11 -5
  94. package/esm2015/angular/lib/vendor/services/http-call.service.js +6 -2
  95. package/esm2015/angular/lib/vendor/services/logon.service.js +8 -5
  96. package/esm2015/angular/lib/vendor/services/search.service.js +28 -25
  97. package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +23 -0
  98. package/esm2015/angular/lib/vendor/services/user.service.js +21 -9
  99. package/esm2015/angular/lib/vendor/services/webtoken.service.js +6 -2
  100. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +353 -72
  101. package/esm2015/angular/lib/vendor/updaters/create-guest-updater.js +22 -0
  102. package/esm2015/angular/obtservices.module.js +3 -1
  103. package/esm2015/angular/sabstravtech-obtservices-angular.js +1 -2
  104. package/esm2015/angular/services.js +2 -1
  105. package/esm2015/angular/updaters.js +2 -1
  106. package/esm2015/base/fetchers.js +8 -1
  107. package/esm2015/base/interfaces.js +3 -1
  108. package/esm2015/base/lib/vendor/classes/base-enterprise.js +8 -2
  109. package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +17 -1
  110. package/esm2015/base/lib/vendor/classes/bookable-basket.js +27 -6
  111. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +98 -11
  112. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +146 -68
  113. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +140 -37
  114. package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +111 -23
  115. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +218 -40
  116. package/esm2015/base/lib/vendor/classes/helpers.js +24 -4
  117. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +191 -48
  118. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +271 -27
  119. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +59 -11
  120. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +13 -9
  121. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +3 -1
  122. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +63 -11
  123. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +183 -23
  124. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +42 -4
  125. package/esm2015/base/lib/vendor/fetchers/fast-track-quote.fetcher.js +2 -2
  126. package/esm2015/base/lib/vendor/fetchers/get-cancellation-info.fetcher.js +10 -0
  127. package/esm2015/base/lib/vendor/fetchers/get-companies.fetcher.js +11 -0
  128. package/esm2015/base/lib/vendor/fetchers/get-company.fetcher.js +11 -0
  129. package/esm2015/base/lib/vendor/fetchers/get-irl-supplier-station.fetcher.js +11 -0
  130. package/esm2015/base/lib/vendor/fetchers/get-user-guests.fetcher.js +11 -0
  131. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  132. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  133. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  134. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  135. package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +1 -1
  136. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
  137. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +2 -1
  138. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  139. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  140. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  141. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  142. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  143. package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
  144. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  145. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +1 -1
  146. package/esm2015/base/lib/vendor/interfaces/fast-track-filters.interface.js +2 -0
  147. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  148. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
  149. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  150. package/esm2015/base/lib/vendor/models/traveller.object.js +1 -1
  151. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +154 -45
  152. package/esm2015/base/lib/vendor/services/hotel-avallibility.service.js +16 -12
  153. package/esm2015/base/lib/vendor/services/http-call.service.js +1 -1
  154. package/esm2015/base/lib/vendor/services/logon.service.js +37 -3
  155. package/esm2015/base/lib/vendor/services/requires-reason.service.js +53 -0
  156. package/esm2015/base/lib/vendor/services/search.service.js +82 -101
  157. package/esm2015/base/lib/vendor/services/url.service.js +3 -1
  158. package/esm2015/base/lib/vendor/services/user.service.js +64 -9
  159. package/esm2015/base/lib/vendor/services/webtoken.service.js +16 -5
  160. package/esm2015/base/lib/vendor/types/graphql.types.js +15 -2
  161. package/esm2015/base/lib/vendor/types/types.js +1679 -21
  162. package/esm2015/base/lib/vendor/updaters/create-guest-updater.js +11 -0
  163. package/esm2015/base/sabstravtech-obtservices-base.js +1 -1
  164. package/esm2015/base/services.js +2 -1
  165. package/esm2015/base/updaters.js +2 -1
  166. package/fesm2015/sabstravtech-obtservices-angular.js +570 -148
  167. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  168. package/fesm2015/sabstravtech-obtservices-base.js +3725 -466
  169. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  170. package/package.json +1 -1
@@ -2,6 +2,7 @@ import { __awaiter } from "tslib";
2
2
  import { BehaviorSubject } from 'rxjs';
3
3
  import moment from 'moment';
4
4
  import { BaseEnterpriseSearch } from './base-enterprise';
5
+ import { DifferentInvokdedUserReasons } from '../types/types';
5
6
  import { ServiceType } from '../types/graphql.types';
6
7
  export const defaultValidations = {
7
8
  AirportFirst: `You must select airport first.`,
@@ -11,10 +12,9 @@ export const defaultValidations = {
11
12
  };
12
13
  export class ParkingEnterpriseSearch extends BaseEnterpriseSearch {
13
14
  constructor(parkingfetcher, helpers, basketService, storageService, searchService) {
14
- super(storageService, helpers);
15
+ super(storageService, helpers, searchService);
15
16
  this.parkingfetcher = parkingfetcher;
16
17
  this.basketService = basketService;
17
- this.searchService = searchService;
18
18
  this.type = ServiceType.Parking;
19
19
  this.terminals = new BehaviorSubject([]);
20
20
  this.listViewToggle = new BehaviorSubject(null);
@@ -348,20 +348,57 @@ export class ParkingEnterpriseSearch extends BaseEnterpriseSearch {
348
348
  }
349
349
  this.results.next(results);
350
350
  }
351
+ updateSearchFromExpiredBasketItem(basketItem) {
352
+ const searchParkingQuery = basketItem.searchQuery;
353
+ this.arrivalDatetime = moment(searchParkingQuery.arrivalDatetime);
354
+ this.departDatetime = moment(searchParkingQuery.departDatetime);
355
+ this.outFlightNumber = searchParkingQuery.outFlightNumber;
356
+ this.terminal = searchParkingQuery.terminal;
357
+ this.searchService
358
+ .getAirportByCode(searchParkingQuery.locationCode)
359
+ .subscribe((airport) => {
360
+ var _a, _b, _c, _d, _e, _f;
361
+ if (airport) {
362
+ this.locationCode = {
363
+ country: (_b = (_a = airport.iataMatch) === null || _a === void 0 ? void 0 : _a.locationDetails) === null || _b === void 0 ? void 0 : _b.country,
364
+ countryCode: (_d = (_c = airport.iataMatch) === null || _c === void 0 ? void 0 : _c.locationDetails) === null || _d === void 0 ? void 0 : _d.countryCode,
365
+ destination: airport.iataMatch.name,
366
+ gateway: airport.iataMatch.iata,
367
+ postcode: (_f = (_e = airport.iataMatch) === null || _e === void 0 ? void 0 : _e.locationDetails) === null || _f === void 0 ? void 0 : _f.postcode,
368
+ terminals: this.searchService.processTerminals(airport.iataMatch.terminals)
369
+ };
370
+ }
371
+ });
372
+ // add Travellers
373
+ if (basketItem.users) {
374
+ basketItem.users.forEach((user) => {
375
+ this.searchService.addTraveller(user);
376
+ });
377
+ }
378
+ }
351
379
  updateFromPreviousSearches(previousItems) {
352
380
  var _a;
353
- console.log("PREPOPULATING PARKING FORM");
381
+ console.log('PREPOPULATING PARKING FORM');
354
382
  const flightItem = (_a = previousItems[ServiceType.Flight]) === null || _a === void 0 ? void 0 : _a.searchQuery;
355
383
  if (flightItem) {
356
384
  try {
357
385
  let startDate = this.searchService.searches[ServiceType.Flight].outBoundDate.toDate();
358
386
  let endDate = this.searchService.searches[ServiceType.Flight].inboundDate.toDate();
359
- this.outdate = { day: startDate.getUTCDate(), month: startDate.getUTCMonth() + 1, year: startDate.getUTCFullYear() };
360
- this.indate = { day: endDate.getUTCDate(), month: endDate.getUTCMonth() + 1, year: endDate.getUTCFullYear() };
361
- this.locationCode = this.searchService.searches[ServiceType.Flight].arriveLocation;
387
+ this.outdate = {
388
+ day: startDate.getUTCDate(),
389
+ month: startDate.getUTCMonth() + 1,
390
+ year: startDate.getUTCFullYear()
391
+ };
392
+ this.indate = {
393
+ day: endDate.getUTCDate(),
394
+ month: endDate.getUTCMonth() + 1,
395
+ year: endDate.getUTCFullYear()
396
+ };
397
+ this.locationCode = this.searchService.searches[ServiceType.Flight]
398
+ .arriveLocation;
362
399
  }
363
400
  catch (_b) {
364
- console.error("Error trying to prepopulate parking from flight item");
401
+ console.error('Error trying to prepopulate parking from flight item');
365
402
  }
366
403
  }
367
404
  }
@@ -371,7 +408,7 @@ export class ParkingEnterpriseSearch extends BaseEnterpriseSearch {
371
408
  const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
372
409
  const termsAndConditions = this.getTermsAndCond(parkingQuote);
373
410
  if (basket) {
374
- return this.basketService.addToBasket({
411
+ const whatHappened = yield this.basketService.addToBasket({
375
412
  adults: 1,
376
413
  basket: basket.id,
377
414
  service: parkingQuote.sourceId.toString(),
@@ -389,9 +426,13 @@ export class ParkingEnterpriseSearch extends BaseEnterpriseSearch {
389
426
  searchQuery: parkingQuery,
390
427
  outboundDate: parkingQuery.arrivalDatetime.format(),
391
428
  inboundDate: parkingQuery.departDatetime.format()
392
- }, intBasket, this.searchService, this.travellers);
429
+ }, intBasket, this.searchService, this.travellers, parkingQuote.requiresReason);
430
+ if (whatHappened === DifferentInvokdedUserReasons.research) {
431
+ this.performSearch();
432
+ }
433
+ return whatHappened;
393
434
  }
394
- return Promise.resolve(false);
435
+ return DifferentInvokdedUserReasons.cancel;
395
436
  });
396
437
  }
397
438
  getTermsAndCond(parkingQuote) {
@@ -460,7 +501,18 @@ export class ParkingEnterpriseSearch extends BaseEnterpriseSearch {
460
501
  return this.searchService.saveFavouriteSearch(searchInfo);
461
502
  }
462
503
  }
504
+ applyFavourite(fav) {
505
+ return __awaiter(this, void 0, void 0, function* () {
506
+ this.searchService.getAirportsList(fav.locationCode).subscribe((a) => {
507
+ this.locationCode = a.find((a) => a.gateway == fav.locationCode);
508
+ this.terminal = fav.terminal;
509
+ });
510
+ // this.arrivalDatetime = moment((fav.arrivalDatetime as string).split("T")[0], "YYYY-MM-DD")
511
+ // this.departDatetime = moment((fav.departDatetime as string).split("T")[0], "YYYY-MM-DD")
512
+ // this.locationCode = fav.locationCode
513
+ });
514
+ }
463
515
  }
464
516
  ParkingEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_parking';
465
517
  ParkingEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_parking';
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFya2luZy1lbnRlcnByaXNlLXNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9wYXJraW5nLWVudGVycHJpc2Utc2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQWF6RCxPQUFPLEVBT0wsV0FBVyxFQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFlaEMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUc7SUFDaEMsWUFBWSxFQUFFLGdDQUFnQztJQUM5QyxhQUFhLEVBQUUsdUNBQXVDO0lBQ3RELGNBQWMsRUFBRSx3Q0FBd0M7SUFDeEQsY0FBYyxFQUFFLGtEQUFrRDtDQUNuRSxDQUFDO0FBRUYsTUFBTSxPQUFPLHVCQUNYLFNBQVEsb0JBSVA7SUFzUUQsWUFDVSxjQUEwQyxFQUNsRCxPQUEyQixFQUNuQixhQUErQyxFQUN2RCxjQUFrQyxFQUMxQixhQUErQztRQUV2RCxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBTnZCLG1CQUFjLEdBQWQsY0FBYyxDQUE0QjtRQUUxQyxrQkFBYSxHQUFiLGFBQWEsQ0FBa0M7UUFFL0Msa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBdFFsRCxTQUFJLEdBQWdCLFdBQVcsQ0FBQyxPQUFPLENBQUM7UUFDeEMsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFrQixFQUFFLENBQUMsQ0FBQztRQUVyRCxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFlLElBQUksQ0FBQyxDQUFDO1FBRXpELHVCQUFrQixHQUE0QjtZQUNuRCxTQUFTLEVBQUUsWUFBWTtZQUN2QixZ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QUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUMvRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDLEVBQ0QsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FDNUQsQ0FBQztJQUNKLENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUN0QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsTUFBTSxVQUFVLEdBQUc7Z0JBQ2pCLElBQUksRUFBRSxHQUFHLE1BQU0sRUFBRSxFQUFFO2dCQUNuQixXQUFXLEVBQUUsV0FBVyxDQUFDLE9BQU87Z0JBQ2hDLFVBQVUsRUFBRSxNQUFNO2FBQ25CLENBQUE7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDOztBQWxqQmUsOENBQXNCLEdBQUcsZ0JBQWdCLENBQUM7QUFDMUMsK0NBQXVCLEdBQUcsaUJBQWlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCYXNlRW50ZXJwcmlzZVNlYXJjaCB9IGZyb20gJy4vYmFzZS1lbnRlcnByaXNlJztcclxuaW1wb3J0IHsgQmFzZVN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZUhlbHBlclJvdXRpbmVzIH0gZnJvbSAnLi9oZWxwZXJzJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQge1xyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgT0JUQWlycG9ydERldGFpbHMsXHJcbiAgUGFya2luZ1F1b3RlUmVzdWx0QXJyYXksXHJcbiAgVGVybWluYWxzVHlwZSxcclxuICBQYXJraW5nRmlsdGVyc0ludGVyZmFjZSxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgU2F2ZUZhdm91cml0ZVNlYXJjaFJlc3VsdFxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBBaXJwb3J0UmVzdWx0cyxcclxuICBCYXNrZXRJdGVtLFxyXG4gIFBhcmtpbmdRdW90ZSxcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVBhcmtpbmdRdW90ZUZldGNoZXIsXHJcbiAgUGFya2luZ1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9wYXJraW5nLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIFBhcmtpbmdUZW1wUGFyYW1zXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JcGFya2luZy1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0VmFsaWRhdGlvbnMgPSB7XHJcbiAgQWlycG9ydEZpcnN0OiBgWW91IG11c3Qgc2VsZWN0IGFpcnBvcnQgZmlyc3QuYCxcclxuICBJbnZhcmRKb3VybmV5OiBgSW53YXJkIGpvdXJuZXkgY2Fubm90IGJlIGluIHRoZSBwYXN0LmAsXHJcbiAgT3V0d2FyZEpvdXJuZXk6IGBPdXR3YXJkIGpvdXJuZXkgY2Fubm90IGJlIGluIHRoZSBwYXN0LmAsXHJcbiAgRGF0ZU92ZXJsYXBwZWQ6IGBJbndhcmQgSm91cm5leSBjYW4gbm90IGJlIGJlZm9yZSBvdXR3YXJkIGpvdXJuZXlgXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgUGFya2luZ0VudGVycHJpc2VTZWFyY2g8USBleHRlbmRzIFBhcmtpbmdRdW90ZUZldGNoZXJUeXBlPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgUGFya2luZ1RlbXBQYXJhbXMsXHJcbiAgUGFya2luZ1F1b3RlUmVzdWx0QXJyYXksXHJcbiAgUGFya2luZ1F1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBQYXJraW5nRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZSB7XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX3BhcmtpbmcnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUkVTVUxUUyA9ICdyZXN1bHRzX3BhcmtpbmcnO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5QYXJraW5nO1xyXG4gIHB1YmxpYyB0ZXJtaW5hbHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRlcm1pbmFsc1R5cGVbXT4oW10pO1xyXG5cclxuICBwdWJsaWMgbGlzdFZpZXdUb2dnbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmtpbmdRdW90ZT4obnVsbCk7XHJcblxyXG4gIHB1YmxpYyBwYXJraW5nRmlsdGVyc1RleHQ6IFBhcmtpbmdGaWx0ZXJzSW50ZXJmYWNlID0ge1xyXG4gICAgb25BaXJwb3J0OiAnT24gQWlycG9ydCcsXHJcbiAgICBtZWV0QW5kR3JlZXQ6ICdNZWV0IGFuZCBncmVldCcsXHJcbiAgICBwYXJrQW5kUmlkZTogJ1BhcmsgYW5kIHJpZGUnLFxyXG4gICAgcGFya0FuZFN0cm9sbDogJ1BhcmsgYW5kIHN0cm9sbCcsXHJcbiAgICBjYXJQYXJrZWRGb3JZb3U6ICdDYXIgcGFya2VkIGZvciB5b3UnXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfbG9jYXRpb25Db2RlOiBzdHJpbmc7XHJcblxyXG4gIGdldCBvdXRkYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dGRhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgb3V0ZGF0ZSh2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fb3V0ZGF0ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX291dGRhdGUgJiYgdGhpcy5fb3V0ZGF0ZSkge1xyXG4gICAgICB0aGlzLmFycml2YWxEYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRkYXRlLFxyXG4gICAgICAgIHRoaXMuX291dHRpbWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBvdXR0aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0dGltZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXR0aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX291dHRpbWUgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9vdXRkYXRlICYmIHRoaXMuX291dHRpbWUpIHtcclxuICAgICAgdGhpcy5hcnJpdmFsRGF0ZXRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fb3V0ZGF0ZSxcclxuICAgICAgICB0aGlzLl9vdXR0aW1lXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGF0ZSB5b3UgbmVlZCB0aGUgcGFya2luZyB0aWxsXHJcbiAgICovXHJcbiAgZ2V0IGRlcGFydERhdGV0aW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkYXRlIHlvdSBuZWVkIHRoZSBwYXJraW5nIHRpbGxcclxuICAgKi9cclxuICBzZXQgZGVwYXJ0RGF0ZXRpbWUodmFsdWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZSA9IHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlIDogbnVsbDtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5faW5kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKHZhbHVlKTtcclxuICAgICAgdGhpcy5faW50aW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5kYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBpbmRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2luZGF0ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX2luZGF0ZSAmJiB0aGlzLl9pbnRpbWUpIHtcclxuICAgICAgdGhpcy5kZXBhcnREYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9pbmRhdGUsXHJcbiAgICAgICAgdGhpcy5faW50aW1lXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBpbnRpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaW50aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2ludGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5kZXBhcnREYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgdGhpcy5faW5kYXRlLFxyXG4gICAgICB0aGlzLl9pbnRpbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGF0ZSB5b3UgbmVlZCB0aGUgcGFya2luZyBmcm9tXHJcbiAgICovXHJcbiAgZ2V0IGFycml2YWxEYXRldGltZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXM/LmFycml2YWxEYXRldGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkYXRlIHlvdSBuZWVkIHRoZSBwYXJraW5nIGZyb21cclxuICAgKi9cclxuICBzZXQgYXJyaXZhbERhdGV0aW1lKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gdmFsdWUuaXNWYWxpZCA/IHZhbHVlIDogbnVsbDtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5fb3V0ZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX291dHRpbWUgPSB0aGlzLmhlbHBlcnMuZm9ybWF0VGltZUNvbG9uKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLmRlcGFydERhdGV0aW1lICYmXHJcbiAgICAgICAgdGhpcy5kZXBhcnREYXRldGltZS5pc1NhbWVPckJlZm9yZSh0aGlzLmFycml2YWxEYXRldGltZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGF5QWZ0ZXJBcnJpdmFsRGF0ZVRpbWUgPSB0aGlzLmFycml2YWxEYXRldGltZS5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuZGVwYXJ0RGF0ZXRpbWUgPSBkYXlBZnRlckFycml2YWxEYXRlVGltZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dEZsaWdodE51bWJlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcz8ub3V0RmxpZ2h0TnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dEZsaWdodE51bWJlcih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMub3V0RmxpZ2h0TnVtYmVyID0gdmFsdWUgfHwgbnVsbDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCByZWNvbW1lbmRlZCgpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnJlY29tbWVuZGVkO1xyXG4gIH1cclxuICBzZXQgcmVjb21tZW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5yZWNvbW1lbmRlZCA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIGdldCBvbkFpcnBvcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/Lm9uQWlycG9ydDtcclxuICB9XHJcblxyXG4gIHNldCBvbkFpcnBvcnQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vbkFpcnBvcnQgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1lZXRBbmRHcmVldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudGVtcFBhcmFtcz8ubWVldEFuZEdyZWV0O1xyXG4gIH1cclxuXHJcbiAgc2V0IG1lZXRBbmRHcmVldCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm1lZXRBbmRHcmVldCA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFya0FuZFJpZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnBhcmtBbmRSaWRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBhcmtBbmRSaWRlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucGFya0FuZFJpZGUgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmtBbmRTdHJvbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnBhcmtBbmRTdHJvbGw7XHJcbiAgfVxyXG5cclxuICBzZXQgcGFya0FuZFN0cm9sbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnBhcmtBbmRTdHJvbGwgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhclBhcmtlZEZvcllvdSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudGVtcFBhcmFtcz8uY2FyUGFya2VkRm9yWW91O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNhclBhcmtlZEZvcllvdSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNhclBhcmtlZEZvcllvdSA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGVybWluYWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudGVybWluYWxcclxuICAgICAgPyB0aGlzLnRlbXBQYXJhbXMudGVybWluYWwudG9TdHJpbmcoKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXQgdGVybWluYWwoaW5wdXQ6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRlcm1pbmFsID0gaW5wdXQ7XHJcbiAgICBjb25zdCBmb3VuZDogVGVybWluYWxzVHlwZSA9IHRoaXMudGVybWluYWxzLnZhbHVlLmZpbmQoXHJcbiAgICAgICh0ZXJtaW5hbDogVGVybWluYWxzVHlwZSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmICh0ZXJtaW5hbC52YWx1ZSA9PT0gaW5wdXQpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoZm91bmQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gZm91bmQua2V5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudGVybWluYWxzLnZhbHVlICYmIHRoaXMudGVybWluYWxzLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybWluYWwgPSB0aGlzLnRlcm1pbmFscy52YWx1ZVswXS5rZXk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gJ0FueSBUZXJtaW5hbCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbkNvZGUoKTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbkNvZGU7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25Db2RlKHZhbHVlOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uQ29kZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IG51bGw7XHJcbiAgICAgIHRoaXMudGVybWluYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFscy5uZXh0KFtdKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICAgIHRoaXMudGVybWluYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFscy5uZXh0KHZhbHVlLnRlcm1pbmFscyk7XHJcbiAgICAgIGlmICh2YWx1ZS50ZXJtaW5hbHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gdmFsdWUudGVybWluYWxzWzBdLmtleTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy50ZXJtaW5hbHMubmV4dChbXSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtaW5hbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGVkVGVybWluYWw6IHN0cmluZyA9ICcnO1xyXG4gIHNldCBzZWxlY3RlZFRlcm1pbmFsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGVybWluYWwgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFRlcm1pbmFsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRUZXJtaW5hbDtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyB2YXJpYWJsZXNcclxuICBwdWJsaWMgbWluX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5fcmV0dXJuX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKSArIDEgLy8gbWluIDEgbmlnaHQgc3RheVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwYXJraW5nZmV0Y2hlcjogQmFzZVBhcmtpbmdRdW90ZUZldGNoZXI8UT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2VcclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzKTtcclxuXHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IFBhcmtpbmdUZW1wUGFyYW1zO1xyXG4gICAgfSA9IHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtKFxyXG4gICAgICBQYXJraW5nRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB7fSBhcyBQYXJraW5nVGVtcFBhcmFtc1xyXG4gICAgICB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyhzZWFyY2hTZXJ2aWNlLm1ha2VQYXJraW5nUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PFBhcmtpbmdRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM/LnNsaWNlKDAsIDEpIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgUGFya2luZ0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIF9vdXRkYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfb3V0dGltZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW5kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW50aW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVzZXRRdWVyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyh0aGlzLnNlYXJjaFNlcnZpY2UubWFrZVBhcmtpbmdRdWVyeSgpKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZG9DaGVja3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgUGFya2luZ0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgdHJhdmVsbGVyczogdGhpcy50cmF2ZWxsZXJzLFxyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcbiAgICBpZiAoIXRoaXMuX2xvY2F0aW9uQ29kZSB8fCB0aGlzLl9sb2NhdGlvbkNvZGUgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goZGVmYXVsdFZhbGlkYXRpb25zLkFpcnBvcnRGaXJzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKCF0aGlzLnF1ZXJ5Py50ZXJtaW5hbCkge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdUZXJtaW5hbCBjYW4gbm90IGJlIGVtcHR5LicpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmFycml2YWxEYXRldGltZS51bml4KCkgPCBtb21lbnQoKS51bml4KCkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChkZWZhdWx0VmFsaWRhdGlvbnMuSW52YXJkSm91cm5leSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudGVtcFBhcmFtcz8uZGVwYXJ0RGF0ZXRpbWUudW5peCgpIDwgbW9tZW50KCkudW5peCgpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goZGVmYXVsdFZhbGlkYXRpb25zLk91dHdhcmRKb3VybmV5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZT8uaXNCZWZvcmUodGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKGRlZmF1bHRWYWxpZGF0aW9ucy5EYXRlT3ZlcmxhcHBlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoW10pO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0U2VhcmNoUXVlcnkoKTtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVSZWNlbnRTZWFyY2godGhpcy5nZXRSZWNlbnRTZWFyY2hRdWVyeShxdWVyeSkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5wYXJraW5nZmV0Y2hlci5mZXRjaExpc3QoXHJcbiAgICAgICAgICB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzPihxdWVyeSlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuUGFya2luZyxcclxuICAgICAgc2VhcmNoQXJnczogcXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLmRlcGFydERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmRlcGFydERhdGV0aW1lKTtcclxuICAgIHRoaXMub3V0RmxpZ2h0TnVtYmVyID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0RmxpZ2h0TnVtYmVyO1xyXG4gICAgdGhpcy50ZXJtaW5hbCA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRlcm1pbmFsO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoU2VydmljZVxyXG4gICAgICAuZ2V0QWlycG9ydEJ5Q29kZShyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb2NhdGlvbkNvZGUpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGFpcnBvcnQ6IEFpcnBvcnRSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgaWYgKGFpcnBvcnQpIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb25Db2RlID0ge1xyXG4gICAgICAgICAgICBjb3VudHJ5OiBhaXJwb3J0LmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5LFxyXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBhaXJwb3J0LmlhdGFNYXRjaC5uYW1lLFxyXG4gICAgICAgICAgICBnYXRld2F5OiBhaXJwb3J0LmlhdGFNYXRjaC5pYXRhLFxyXG4gICAgICAgICAgICBwb3N0Y29kZTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8ucG9zdGNvZGUsXHJcbiAgICAgICAgICAgIHRlcm1pbmFsczogdGhpcy5zZWFyY2hTZXJ2aWNlLnByb2Nlc3NUZXJtaW5hbHMoXHJcbiAgICAgICAgICAgICAgYWlycG9ydC5pYXRhTWF0Y2gudGVybWluYWxzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBhcnJpdmFsRGF0ZXRpbWU6IHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWUsXHJcbiAgICAgIGRlcGFydERhdGV0aW1lOiB0aGlzLnRlbXBQYXJhbXMuZGVwYXJ0RGF0ZXRpbWUsXHJcbiAgICAgIGxvY2F0aW9uQ29kZTogdGhpcy5fbG9jYXRpb25Db2RlLFxyXG4gICAgICBvdXRGbGlnaHROdW1iZXI6IHRoaXMudGVtcFBhcmFtcy5vdXRGbGlnaHROdW1iZXIsXHJcbiAgICAgIHJlY29tbWVuZGVkOiB0aGlzLnRlbXBQYXJhbXMucmVjb21tZW5kZWQsXHJcbiAgICAgIG9uQWlycG9ydDogdGhpcy50ZW1wUGFyYW1zLm9uQWlycG9ydCxcclxuICAgICAgbWVldEFuZEdyZWV0OiB0aGlzLnRlbXBQYXJhbXMubWVldEFuZEdyZWV0LFxyXG4gICAgICBwYXJrQW5kUmlkZTogdGhpcy50ZW1wUGFyYW1zLnBhcmtBbmRSaWRlLFxyXG4gICAgICBwYXJrQW5kU3Ryb2xsOiB0aGlzLnRlbXBQYXJhbXMucGFya0FuZFN0cm9sbCxcclxuICAgICAgY2FyUGFya2VkRm9yWW91OiB0aGlzLnRlbXBQYXJhbXMuY2FyUGFya2VkRm9yWW91LFxyXG4gICAgICB0ZXJtaW5hbDpcclxuICAgICAgICB0aGlzLnRlbXBQYXJhbXMudGVybWluYWwgPT09ICdBbnknID8gbnVsbCA6IHRoaXMudGVtcFBhcmFtcy50ZXJtaW5hbFxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlQcmljZShhc2M/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLnJlc3VsdHMudmFsdWUpIHx8IFtdO1xyXG4gICAgaWYgKGFzYykge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KFxyXG4gICAgICAgIChhOiBQYXJraW5nUXVvdGUsIGI6IFBhcmtpbmdRdW90ZSkgPT4gYi5wcmljZSAtIGEucHJpY2VcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoXHJcbiAgICAgICAgKGE6IFBhcmtpbmdRdW90ZSwgYjogUGFya2luZ1F1b3RlKSA9PiBhLnByaWNlIC0gYi5wcmljZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKFwiUFJFUE9QVUxBVElORyBQQVJLSU5HIEZPUk1cIilcclxuICAgIGNvbnN0IGZsaWdodEl0ZW06IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5GbGlnaHRdPy5zZWFyY2hRdWVyeTtcclxuICAgIGlmIChmbGlnaHRJdGVtKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLm91dEJvdW5kRGF0ZS50b0RhdGUoKTtcclxuICAgICAgICBsZXQgZW5kRGF0ZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLmluYm91bmREYXRlLnRvRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub3V0ZGF0ZSA9IHsgZGF5OiBzdGFydERhdGUuZ2V0VVRDRGF0ZSgpLCBtb250aDogc3RhcnREYXRlLmdldFVUQ01vbnRoKCkgKyAxLCB5ZWFyOiBzdGFydERhdGUuZ2V0VVRDRnVsbFllYXIoKSB9O1xyXG4gICAgICAgIHRoaXMuaW5kYXRlID0geyBkYXk6IGVuZERhdGUuZ2V0VVRDRGF0ZSgpLCBtb250aDogZW5kRGF0ZS5nZXRVVENNb250aCgpICsgMSwgeWVhcjogZW5kRGF0ZS5nZXRVVENGdWxsWWVhcigpIH07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbkNvZGUgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5hcnJpdmVMb2NhdGlvbiBhcyBPQlRBaXJwb3J0RGV0YWlsc1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIHByZXBvcHVsYXRlIHBhcmtpbmcgZnJvbSBmbGlnaHQgaXRlbVwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUGFya2luZ1RvQmFza2V0KFxyXG4gICAgcGFya2luZ1F1b3RlOiBQYXJraW5nUXVvdGUsXHJcbiAgICBwYXJraW5nUXVlcnk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChwYXJraW5nUXVvdGUpO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5iYXNrZXRTZXJ2aWNlLmFkZFRvQmFza2V0KFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGFkdWx0czogMSxcclxuICAgICAgICAgIGJhc2tldDogYmFza2V0LmlkLFxyXG4gICAgICAgICAgc2VydmljZTogcGFya2luZ1F1b3RlLnNvdXJjZUlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgYXJyaXZhbERhdGV0aW1lOiBwYXJraW5nUXVlcnkuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICAgICAgICBkZXBhcnREYXRldGltZTogcGFya2luZ1F1ZXJ5LmRlcGFydERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICAgICAgICBsb2NhdGlvbkNvZGU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLmNvZGUsXHJcbiAgICAgICAgICAgIG5hbWU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLm5hbWUsXHJcbiAgICAgICAgICAgIHJlcXVpcmVkSW5mbzogcGFya2luZ1F1b3RlLnJlcXVpcmVkSW5mbyxcclxuICAgICAgICAgICAgYWlycG9ydElhdGE6IHBhcmtpbmdRdWVyeS5sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgICAgIHRlcm1zQW5kQ29uZDogdGVybXNBbmRDb25kaXRpb25zXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcHJpY2U6IHBhcmtpbmdRdW90ZS5wcmljZSxcclxuICAgICAgICAgIGN1cnJlbmN5OiBwYXJraW5nUXVvdGUuY3VycmVuY3ksXHJcbiAgICAgICAgICBzZWFyY2hRdWVyeTogcGFya2luZ1F1ZXJ5LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiBwYXJraW5nUXVlcnkuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICAgICAgaW5ib3VuZERhdGU6IHBhcmtpbmdRdWVyeS5kZXBhcnREYXRldGltZS5mb3JtYXQoKVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnNcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKHBhcmtpbmdRdW90ZTogUGFya2luZ1F1b3RlKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ05hbWUnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5uYW1lXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnVGVsZXBob25lJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsudGVsZXBob25lXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnSW1wb3J0YW50IEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsubWlzYy5pbXBvcnRhbnRJbmZvcm1hdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0dlby1Qb3NpdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGBMYXRpdHVkZSAke3BhcmtpbmdRdW90ZS5jYXJQYXJrLmxhdGl0dWRlfTsgTG9uZ2l0dWRlICR7cGFya2luZ1F1b3RlLmNhclBhcmsubGF0aXR1ZGV9YFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0ludHJvZHVjdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLmludHJvZHVjdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0Fycml2YWwgUHJvY2VkdXJlcycsXHJcbiAgICAgICAgdmFsdWU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLmFycml2YWxQcm9jZWR1cmVcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEZXBhcnR1cmUgUHJvY2VkdXJlJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsuZGVwYXJ0dXJlUHJvY2VkdXJlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnSW5mb3JtYXRpb24nLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5pbmZvcm1hdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ01heGltdW0gQ2FyIFNpemUnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5tYXhpbXVtQ2FyU2l6ZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0RpcmVjdGlvbnMnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5kaXJlY3Rpb25zXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBQYXJraW5nUXVvdGVbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSByZXN1bHRzWzBdLmN1cnJlbmN5O1xyXG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxyXG4gICAgICAoY2hlYXBlc3RQcmljZTogSUNoZWFwZXN0UHJpY2UsIHJlc3VsdDogUGFya2luZ1F1b3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJpY2UgPSByZXN1bHQucHJpY2U7XHJcbiAgICAgICAgaWYgKGNoZWFwZXN0UHJpY2UuYW1vdW50ID4gcHJpY2UpIGNoZWFwZXN0UHJpY2UuYW1vdW50ID0gcHJpY2U7XHJcbiAgICAgICAgcmV0dXJuIGNoZWFwZXN0UHJpY2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYW1vdW50OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgY3VycmVuY3lDb2RlOiBjdXJyZW5jeSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaCgpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+IHtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICBjb25zdCBzZWFyY2hJbmZvID0ge1xyXG4gICAgICAgIG5hbWU6IGAke21vbWVudCgpfWAsXHJcbiAgICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLlBhcmtpbmcsXHJcbiAgICAgICAgc2VhcmNoQXJnczogc2VhcmNoXHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHRoaXMuc2VhcmNoU2VydmljZS5zYXZlRmF2b3VyaXRlU2VhcmNoKHNlYXJjaEluZm8pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
518
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFya2luZy1lbnRlcnByaXNlLXNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9wYXJraW5nLWVudGVycHJpc2Utc2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUl6RCxPQUFPLEVBUUwsNEJBQTRCLEVBQzdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQU9MLFdBQVcsRUFDWixNQUFNLHdCQUF3QixDQUFDO0FBZWhDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLFlBQVksRUFBRSxnQ0FBZ0M7SUFDOUMsYUFBYSxFQUFFLHVDQUF1QztJQUN0RCxjQUFjLEVBQUUsd0NBQXdDO0lBQ3hELGNBQWMsRUFBRSxrREFBa0Q7Q0FDbkUsQ0FBQztBQUVGLE1BQU0sT0FBTyx1QkFDWCxTQUFRLG9CQUlQO0lBdVFELFlBQ1UsY0FBMEMsRUFDbEQsT0FBMkIsRUFDbkIsYUFBK0MsRUFDdkQsY0FBa0MsRUFDbEMsYUFBK0M7UUFFL0MsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFOdEMsbUJBQWMsR0FBZCxjQUFjLENBQTRCO1FBRTFDLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQXBRbEQsU0FBSSxHQUFnQixXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ3hDLGNBQVMsR0FBRyxJQUFJLGVBQWUsQ0FBa0IsRUFBRSxDQUFDLENBQUM7UUFFckQsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBZSxJQUFJLENBQUMsQ0FBQztRQUV6RCx1QkFBa0IsR0FBNEI7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WSxDQUNyQyxDQUFDO2dCQUNGLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQztZQUNILDZGQUE2RjtZQUM3RiwyRkFBMkY7WUFDM0YsdUNBQXVDO1FBQ3pDLENBQUM7S0FBQTs7QUEvbUJlLDhDQUFzQixHQUFHLGdCQUFnQixDQUFDO0FBQzFDLCtDQUF1QixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcbmltcG9ydCB7IFRyYXZlbGxlciB9IGZyb20gJy4uL21vZGVscy90cmF2ZWxsZXIub2JqZWN0JztcclxuaW1wb3J0IHtcclxuICBOZ2JEYXRlU3RydWN0LFxyXG4gIE9CVEFpcnBvcnREZXRhaWxzLFxyXG4gIFBhcmtpbmdRdW90ZVJlc3VsdEFycmF5LFxyXG4gIFRlcm1pbmFsc1R5cGUsXHJcbiAgUGFya2luZ0ZpbHRlcnNJbnRlcmZhY2UsXHJcbiAgUmVjZW50U2VhcmNoLFxyXG4gIFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQsXHJcbiAgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29uc1xyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHtcclxuICBBaXJwb3J0UmVzdWx0cyxcclxuICBCYXNrZXRJdGVtLFxyXG4gIFBhcmtpbmdRdW90ZSxcclxuICBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMsXHJcbiAgU2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgQmFzZVBhcmtpbmdRdW90ZUZldGNoZXIsXHJcbiAgUGFya2luZ1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9wYXJraW5nLXF1b3RlLWZldGNoZXInO1xyXG5pbXBvcnQge1xyXG4gIEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gIEludGVybmFsQmFza2V0SW50ZXJmYWNlXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JZW50ZXJwcmlzZS1iYXNrZXQuc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9Jc2VhcmNoLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlLFxyXG4gIFBhcmtpbmdUZW1wUGFyYW1zXHJcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9JcGFya2luZy1lbnRlcnByaXNlLXNlYXJjaCc7XHJcbmltcG9ydCB7IElDaGVhcGVzdFByaWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9jaGVhcGVzdC1wcmljZSc7XHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0VmFsaWRhdGlvbnMgPSB7XHJcbiAgQWlycG9ydEZpcnN0OiBgWW91IG11c3Qgc2VsZWN0IGFpcnBvcnQgZmlyc3QuYCxcclxuICBJbnZhcmRKb3VybmV5OiBgSW53YXJkIGpvdXJuZXkgY2Fubm90IGJlIGluIHRoZSBwYXN0LmAsXHJcbiAgT3V0d2FyZEpvdXJuZXk6IGBPdXR3YXJkIGpvdXJuZXkgY2Fubm90IGJlIGluIHRoZSBwYXN0LmAsXHJcbiAgRGF0ZU92ZXJsYXBwZWQ6IGBJbndhcmQgSm91cm5leSBjYW4gbm90IGJlIGJlZm9yZSBvdXR3YXJkIGpvdXJuZXlgXHJcbn07XHJcblxyXG5leHBvcnQgY2xhc3MgUGFya2luZ0VudGVycHJpc2VTZWFyY2g8USBleHRlbmRzIFBhcmtpbmdRdW90ZUZldGNoZXJUeXBlPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBQYXJraW5nVGVtcFBhcmFtcyxcclxuICAgIFBhcmtpbmdRdW90ZVJlc3VsdEFycmF5LFxyXG4gICAgUGFya2luZ1F1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBQYXJraW5nRW50ZXJwcmlzZVNlYXJjaEludGVyZmFjZVxyXG57XHJcbiAgc3RhdGljIHJlYWRvbmx5IFNUT1JBR0VfU0VTU0lPTl9QQVJBTVMgPSAnc2VhcmNoX3BhcmtpbmcnO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUkVTVUxUUyA9ICdyZXN1bHRzX3BhcmtpbmcnO1xyXG5cclxuICBwdWJsaWMgdHlwZTogU2VydmljZVR5cGUgPSBTZXJ2aWNlVHlwZS5QYXJraW5nO1xyXG4gIHB1YmxpYyB0ZXJtaW5hbHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFRlcm1pbmFsc1R5cGVbXT4oW10pO1xyXG5cclxuICBwdWJsaWMgbGlzdFZpZXdUb2dnbGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFBhcmtpbmdRdW90ZT4obnVsbCk7XHJcblxyXG4gIHB1YmxpYyBwYXJraW5nRmlsdGVyc1RleHQ6IFBhcmtpbmdGaWx0ZXJzSW50ZXJmYWNlID0ge1xyXG4gICAgb25BaXJwb3J0OiAnT24gQWlycG9ydCcsXHJcbiAgICBtZWV0QW5kR3JlZXQ6ICdNZWV0IGFuZCBncmVldCcsXHJcbiAgICBwYXJrQW5kUmlkZTogJ1BhcmsgYW5kIHJpZGUnLFxyXG4gICAgcGFya0FuZFN0cm9sbDogJ1BhcmsgYW5kIHN0cm9sbCcsXHJcbiAgICBjYXJQYXJrZWRGb3JZb3U6ICdDYXIgcGFya2VkIGZvciB5b3UnXHJcbiAgfTtcclxuXHJcbiAgcHJpdmF0ZSBfbG9jYXRpb25Db2RlOiBzdHJpbmc7XHJcblxyXG4gIGdldCBvdXRkYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX291dGRhdGU7XHJcbiAgfVxyXG5cclxuICBzZXQgb3V0ZGF0ZSh2YWx1ZTogTmdiRGF0ZVN0cnVjdCkge1xyXG4gICAgdGhpcy5fb3V0ZGF0ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX291dGRhdGUgJiYgdGhpcy5fb3V0ZGF0ZSkge1xyXG4gICAgICB0aGlzLmFycml2YWxEYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9vdXRkYXRlLFxyXG4gICAgICAgIHRoaXMuX291dHRpbWVcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBvdXR0aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3V0dGltZTtcclxuICB9XHJcblxyXG4gIHNldCBvdXR0aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX291dHRpbWUgPSB2YWx1ZTtcclxuICAgIGlmICh0aGlzLl9vdXRkYXRlICYmIHRoaXMuX291dHRpbWUpIHtcclxuICAgICAgdGhpcy5hcnJpdmFsRGF0ZXRpbWUgPSB0aGlzLmhlbHBlcnMubmdEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgdGhpcy5fb3V0ZGF0ZSxcclxuICAgICAgICB0aGlzLl9vdXR0aW1lXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGF0ZSB5b3UgbmVlZCB0aGUgcGFya2luZyB0aWxsXHJcbiAgICovXHJcbiAgZ2V0IGRlcGFydERhdGV0aW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkYXRlIHlvdSBuZWVkIHRoZSBwYXJraW5nIHRpbGxcclxuICAgKi9cclxuICBzZXQgZGVwYXJ0RGF0ZXRpbWUodmFsdWU6IG1vbWVudC5Nb21lbnQpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZSA9IHZhbHVlLmlzVmFsaWQoKSA/IHZhbHVlIDogbnVsbDtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5faW5kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKHZhbHVlKTtcclxuICAgICAgdGhpcy5faW50aW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaW5kYXRlKCk6IE5nYkRhdGVTdHJ1Y3Qge1xyXG4gICAgcmV0dXJuIHRoaXMuX2luZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBpbmRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2luZGF0ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMuX2luZGF0ZSAmJiB0aGlzLl9pbnRpbWUpIHtcclxuICAgICAgdGhpcy5kZXBhcnREYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgICB0aGlzLl9pbmRhdGUsXHJcbiAgICAgICAgdGhpcy5faW50aW1lXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldCBpbnRpbWUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgaW50aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX2ludGltZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5kZXBhcnREYXRldGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudChcclxuICAgICAgdGhpcy5faW5kYXRlLFxyXG4gICAgICB0aGlzLl9pbnRpbWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgZGF0ZSB5b3UgbmVlZCB0aGUgcGFya2luZyBmcm9tXHJcbiAgICovXHJcbiAgZ2V0IGFycml2YWxEYXRldGltZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXM/LmFycml2YWxEYXRldGltZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBkYXRlIHlvdSBuZWVkIHRoZSBwYXJraW5nIGZyb21cclxuICAgKi9cclxuICBzZXQgYXJyaXZhbERhdGV0aW1lKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gdmFsdWUuaXNWYWxpZCA/IHZhbHVlIDogbnVsbDtcclxuICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5pc1ZhbGlkKCkpIHtcclxuICAgICAgdGhpcy5fb3V0ZGF0ZSA9IHRoaXMuaGVscGVycy5tb21lbnRUb05nRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX291dHRpbWUgPSB0aGlzLmhlbHBlcnMuZm9ybWF0VGltZUNvbG9uKHZhbHVlKTtcclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLmRlcGFydERhdGV0aW1lICYmXHJcbiAgICAgICAgdGhpcy5kZXBhcnREYXRldGltZS5pc1NhbWVPckJlZm9yZSh0aGlzLmFycml2YWxEYXRldGltZSlcclxuICAgICAgKSB7XHJcbiAgICAgICAgY29uc3QgZGF5QWZ0ZXJBcnJpdmFsRGF0ZVRpbWUgPSB0aGlzLmFycml2YWxEYXRldGltZS5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuZGVwYXJ0RGF0ZXRpbWUgPSBkYXlBZnRlckFycml2YWxEYXRlVGltZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG91dEZsaWdodE51bWJlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcz8ub3V0RmxpZ2h0TnVtYmVyO1xyXG4gIH1cclxuXHJcbiAgc2V0IG91dEZsaWdodE51bWJlcih2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMub3V0RmxpZ2h0TnVtYmVyID0gdmFsdWUgfHwgbnVsbDtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCByZWNvbW1lbmRlZCgpOiBib29sZWFuIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnJlY29tbWVuZGVkO1xyXG4gIH1cclxuICBzZXQgcmVjb21tZW5kZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5yZWNvbW1lbmRlZCA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG4gIGdldCBvbkFpcnBvcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/Lm9uQWlycG9ydDtcclxuICB9XHJcblxyXG4gIHNldCBvbkFpcnBvcnQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5vbkFpcnBvcnQgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1lZXRBbmRHcmVldCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudGVtcFBhcmFtcz8ubWVldEFuZEdyZWV0O1xyXG4gIH1cclxuXHJcbiAgc2V0IG1lZXRBbmRHcmVldCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLm1lZXRBbmRHcmVldCA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgcGFya0FuZFJpZGUoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnBhcmtBbmRSaWRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBhcmtBbmRSaWRlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMucGFya0FuZFJpZGUgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhcmtBbmRTdHJvbGwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnRlbXBQYXJhbXM/LnBhcmtBbmRTdHJvbGw7XHJcbiAgfVxyXG5cclxuICBzZXQgcGFya0FuZFN0cm9sbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnBhcmtBbmRTdHJvbGwgPSB2YWx1ZSB8fCBudWxsO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhclBhcmtlZEZvcllvdSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhIXRoaXMudGVtcFBhcmFtcz8uY2FyUGFya2VkRm9yWW91O1xyXG4gIH1cclxuXHJcbiAgc2V0IGNhclBhcmtlZEZvcllvdSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmNhclBhcmtlZEZvcllvdSA9IHZhbHVlIHx8IG51bGw7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdGVybWluYWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMudGVybWluYWxcclxuICAgICAgPyB0aGlzLnRlbXBQYXJhbXMudGVybWluYWwudG9TdHJpbmcoKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXQgdGVybWluYWwoaW5wdXQ6IHN0cmluZykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLnRlcm1pbmFsID0gaW5wdXQ7XHJcbiAgICBjb25zdCBmb3VuZDogVGVybWluYWxzVHlwZSA9IHRoaXMudGVybWluYWxzLnZhbHVlLmZpbmQoXHJcbiAgICAgICh0ZXJtaW5hbDogVGVybWluYWxzVHlwZSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgIGlmICh0ZXJtaW5hbC52YWx1ZSA9PT0gaW5wdXQpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoZm91bmQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gZm91bmQua2V5O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMudGVybWluYWxzLnZhbHVlICYmIHRoaXMudGVybWluYWxzLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGVybWluYWwgPSB0aGlzLnRlcm1pbmFscy52YWx1ZVswXS5rZXk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gJ0FueSBUZXJtaW5hbCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbkNvZGUoKTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbkNvZGU7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25Db2RlKHZhbHVlOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uQ29kZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IG51bGw7XHJcbiAgICAgIHRoaXMudGVybWluYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFscy5uZXh0KFtdKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICAgIHRoaXMudGVybWluYWwgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFscy5uZXh0KHZhbHVlLnRlcm1pbmFscyk7XHJcbiAgICAgIGlmICh2YWx1ZS50ZXJtaW5hbHMubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRlcm1pbmFsID0gdmFsdWUudGVybWluYWxzWzBdLmtleTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSBudWxsO1xyXG4gICAgICB0aGlzLnRlcm1pbmFsID0gbnVsbDtcclxuICAgICAgdGhpcy50ZXJtaW5hbHMubmV4dChbXSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUZXJtaW5hbCA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3NlbGVjdGVkVGVybWluYWw6IHN0cmluZyA9ICcnO1xyXG4gIHNldCBzZWxlY3RlZFRlcm1pbmFsKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGVybWluYWwgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZFRlcm1pbmFsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRUZXJtaW5hbDtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyB2YXJpYWJsZXNcclxuICBwdWJsaWMgbWluX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBtaW5fcmV0dXJuX2RhdGUgPSB7XHJcbiAgICB5ZWFyOiBtb21lbnQoKS55ZWFyKCksXHJcbiAgICBtb250aDogbW9tZW50KCkubW9udGgoKSArIDEsIC8vIG5nYkRhdGUgbW9udGhzIGFyZSBub3QgMCBpbmRleGVkXHJcbiAgICBkYXk6IG1vbWVudCgpLmRhdGUoKSArIDEgLy8gbWluIDEgbmlnaHQgc3RheVxyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgdHJhdmVsbGVyczogVHJhdmVsbGVyW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwYXJraW5nZmV0Y2hlcjogQmFzZVBhcmtpbmdRdW90ZUZldGNoZXI8UT4sXHJcbiAgICBoZWxwZXJzOiBCYXNlSGVscGVyUm91dGluZXMsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U6IEVudGVycHJpc2VCYXNrZXRTZXJ2aWNlSW50ZXJmYWNlLFxyXG4gICAgc3RvcmFnZVNlcnZpY2U6IEJhc2VTdG9yYWdlU2VydmljZSxcclxuICAgIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihzdG9yYWdlU2VydmljZSwgaGVscGVycywgc2VhcmNoU2VydmljZSk7XHJcblxyXG4gICAgY29uc3QgZGF0YToge1xyXG4gICAgICB0ZW1wUGFyYW1zOiBQYXJraW5nVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgUGFya2luZ0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNU1xyXG4gICAgKSB8fCB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IHt9IGFzIFBhcmtpbmdUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyhzZWFyY2hTZXJ2aWNlLm1ha2VQYXJraW5nUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgY29uc3QgcmVzdWx0cyA9XHJcbiAgICAgIHN0b3JhZ2VTZXJ2aWNlLmdldFNlc3Npb25JdGVtQXNMaXN0PFBhcmtpbmdRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KHJlc3VsdHMpO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICBpZiAoc2VhcmNoU2VydmljZS5zaG91bGRBZGRUcmF2ZWxsZXJTdWJzY3JpcHRpb24oKSkge1xyXG4gICAgICBzZWFyY2hTZXJ2aWNlLnRyYXZlbGxlckluZm9ybWF0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAodHJhdmVsbGVyczogVHJhdmVsbGVyW10pID0+IHtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM/LnNsaWNlKDAsIDEpIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgUGFya2luZ0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIFBhcmtpbmdFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9SRVNVTFRTO1xyXG5cclxuICBwcml2YXRlIF9vdXRkYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfb3V0dGltZTogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW5kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBfaW50aW1lOiBzdHJpbmcgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgcmVzZXRRdWVyeSgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlVGVtcFBhcmFtcyh0aGlzLnNlYXJjaFNlcnZpY2UubWFrZVBhcmtpbmdRdWVyeSgpKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZG9DaGVja3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgUGFya2luZ0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIGxvY2F0aW9uOiB0aGlzLl9sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgdHJhdmVsbGVyczogdGhpcy50cmF2ZWxsZXJzLFxyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtc1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcbiAgICBpZiAoIXRoaXMuX2xvY2F0aW9uQ29kZSB8fCB0aGlzLl9sb2NhdGlvbkNvZGUgPT09ICcnKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goZGVmYXVsdFZhbGlkYXRpb25zLkFpcnBvcnRGaXJzdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gaWYgKCF0aGlzLnF1ZXJ5Py50ZXJtaW5hbCkge1xyXG4gICAgLy8gICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdUZXJtaW5hbCBjYW4gbm90IGJlIGVtcHR5LicpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGlmICh0aGlzLnRlbXBQYXJhbXM/LmFycml2YWxEYXRldGltZS51bml4KCkgPCBtb21lbnQoKS51bml4KCkpIHtcclxuICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMucHVzaChkZWZhdWx0VmFsaWRhdGlvbnMuSW52YXJkSm91cm5leSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudGVtcFBhcmFtcz8uZGVwYXJ0RGF0ZXRpbWUudW5peCgpIDwgbW9tZW50KCkudW5peCgpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goZGVmYXVsdFZhbGlkYXRpb25zLk91dHdhcmRKb3VybmV5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5kZXBhcnREYXRldGltZT8uaXNCZWZvcmUodGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZSlcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKGRlZmF1bHRWYWxpZGF0aW9ucy5EYXRlT3ZlcmxhcHBlZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0U2VhcmNoKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoW10pO1xyXG4gICAgaWYgKHRoaXMuaXNWYWxpZC52YWx1ZSkge1xyXG4gICAgICBjb25zdCBxdWVyeSA9IHRoaXMuZ2V0U2VhcmNoUXVlcnkoKTtcclxuICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNhdmVSZWNlbnRTZWFyY2godGhpcy5nZXRSZWNlbnRTZWFyY2hRdWVyeShxdWVyeSkpO1xyXG4gICAgICByZXR1cm4gdGhpcy5fc3RhcnRTZWFyY2goXHJcbiAgICAgICAgdGhpcy5wYXJraW5nZmV0Y2hlci5mZXRjaExpc3QoXHJcbiAgICAgICAgICB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzPihxdWVyeSlcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzZXJ2aWNlVHlwZTogU2VydmljZVR5cGUuUGFya2luZyxcclxuICAgICAgc2VhcmNoQXJnczogcXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLmRlcGFydERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmRlcGFydERhdGV0aW1lKTtcclxuICAgIHRoaXMub3V0RmxpZ2h0TnVtYmVyID0gcmVjZW50U2VhcmNoLnNlYXJjaEFyZ3Mub3V0RmxpZ2h0TnVtYmVyO1xyXG4gICAgdGhpcy50ZXJtaW5hbCA9IHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLnRlcm1pbmFsO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoU2VydmljZVxyXG4gICAgICAuZ2V0QWlycG9ydEJ5Q29kZShyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5sb2NhdGlvbkNvZGUpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGFpcnBvcnQ6IEFpcnBvcnRSZXN1bHRzKSA9PiB7XHJcbiAgICAgICAgaWYgKGFpcnBvcnQpIHtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb25Db2RlID0ge1xyXG4gICAgICAgICAgICBjb3VudHJ5OiBhaXJwb3J0LmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5LFxyXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeUNvZGUsXHJcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBhaXJwb3J0LmlhdGFNYXRjaC5uYW1lLFxyXG4gICAgICAgICAgICBnYXRld2F5OiBhaXJwb3J0LmlhdGFNYXRjaC5pYXRhLFxyXG4gICAgICAgICAgICBwb3N0Y29kZTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8ucG9zdGNvZGUsXHJcbiAgICAgICAgICAgIHRlcm1pbmFsczogdGhpcy5zZWFyY2hTZXJ2aWNlLnByb2Nlc3NUZXJtaW5hbHMoXHJcbiAgICAgICAgICAgICAgYWlycG9ydC5pYXRhTWF0Y2gudGVybWluYWxzXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc3RhcnRTZWFyY2hlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlcyB7XHJcbiAgICBjb25zdCBxdWVyeTogU2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzID0ge1xyXG4gICAgICBhcnJpdmFsRGF0ZXRpbWU6IHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWUsXHJcbiAgICAgIGRlcGFydERhdGV0aW1lOiB0aGlzLnRlbXBQYXJhbXMuZGVwYXJ0RGF0ZXRpbWUsXHJcbiAgICAgIGxvY2F0aW9uQ29kZTogdGhpcy5fbG9jYXRpb25Db2RlLFxyXG4gICAgICBvdXRGbGlnaHROdW1iZXI6IHRoaXMudGVtcFBhcmFtcy5vdXRGbGlnaHROdW1iZXIsXHJcbiAgICAgIHJlY29tbWVuZGVkOiB0aGlzLnRlbXBQYXJhbXMucmVjb21tZW5kZWQsXHJcbiAgICAgIG9uQWlycG9ydDogdGhpcy50ZW1wUGFyYW1zLm9uQWlycG9ydCxcclxuICAgICAgbWVldEFuZEdyZWV0OiB0aGlzLnRlbXBQYXJhbXMubWVldEFuZEdyZWV0LFxyXG4gICAgICBwYXJrQW5kUmlkZTogdGhpcy50ZW1wUGFyYW1zLnBhcmtBbmRSaWRlLFxyXG4gICAgICBwYXJrQW5kU3Ryb2xsOiB0aGlzLnRlbXBQYXJhbXMucGFya0FuZFN0cm9sbCxcclxuICAgICAgY2FyUGFya2VkRm9yWW91OiB0aGlzLnRlbXBQYXJhbXMuY2FyUGFya2VkRm9yWW91LFxyXG4gICAgICB0ZXJtaW5hbDpcclxuICAgICAgICB0aGlzLnRlbXBQYXJhbXMudGVybWluYWwgPT09ICdBbnknID8gbnVsbCA6IHRoaXMudGVtcFBhcmFtcy50ZXJtaW5hbFxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoUGFya2luZ1F1ZXJ5VmFyaWFibGVzPihxdWVyeSk7XHJcbiAgfVxyXG5cclxuICBzb3J0QnlQcmljZShhc2M/OiBib29sZWFuKSB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IHRoaXMuaGVscGVycy5jbG9uZSh0aGlzLnJlc3VsdHMudmFsdWUpIHx8IFtdO1xyXG4gICAgaWYgKGFzYykge1xyXG4gICAgICByZXN1bHRzID0gcmVzdWx0cy5zb3J0KFxyXG4gICAgICAgIChhOiBQYXJraW5nUXVvdGUsIGI6IFBhcmtpbmdRdW90ZSkgPT4gYi5wcmljZSAtIGEucHJpY2VcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLnNvcnQoXHJcbiAgICAgICAgKGE6IFBhcmtpbmdRdW90ZSwgYjogUGFya2luZ1F1b3RlKSA9PiBhLnByaWNlIC0gYi5wcmljZVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQocmVzdWx0cyk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGcm9tRXhwaXJlZEJhc2tldEl0ZW0oYmFza2V0SXRlbTogQmFza2V0SXRlbSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VhcmNoUGFya2luZ1F1ZXJ5OiBTZWFyY2hQYXJraW5nUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBiYXNrZXRJdGVtLnNlYXJjaFF1ZXJ5O1xyXG4gICAgdGhpcy5hcnJpdmFsRGF0ZXRpbWUgPSBtb21lbnQoc2VhcmNoUGFya2luZ1F1ZXJ5LmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLmRlcGFydERhdGV0aW1lID0gbW9tZW50KHNlYXJjaFBhcmtpbmdRdWVyeS5kZXBhcnREYXRldGltZSk7XHJcbiAgICB0aGlzLm91dEZsaWdodE51bWJlciA9IHNlYXJjaFBhcmtpbmdRdWVyeS5vdXRGbGlnaHROdW1iZXI7XHJcbiAgICB0aGlzLnRlcm1pbmFsID0gc2VhcmNoUGFya2luZ1F1ZXJ5LnRlcm1pbmFsO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoU2VydmljZVxyXG4gICAgICAuZ2V0QWlycG9ydEJ5Q29kZShzZWFyY2hQYXJraW5nUXVlcnkubG9jYXRpb25Db2RlKVxyXG4gICAgICAuc3Vic2NyaWJlKChhaXJwb3J0OiBBaXJwb3J0UmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGlmIChhaXJwb3J0KSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHtcclxuICAgICAgICAgICAgY291bnRyeTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5pYXRhTWF0Y2gubmFtZSxcclxuICAgICAgICAgICAgZ2F0ZXdheTogYWlycG9ydC5pYXRhTWF0Y2guaWF0YSxcclxuICAgICAgICAgICAgcG9zdGNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMuc2VhcmNoU2VydmljZS5wcm9jZXNzVGVybWluYWxzKFxyXG4gICAgICAgICAgICAgIGFpcnBvcnQuaWF0YU1hdGNoLnRlcm1pbmFsc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gYWRkIFRyYXZlbGxlcnNcclxuICAgIGlmIChiYXNrZXRJdGVtLnVzZXJzKSB7XHJcbiAgICAgIGJhc2tldEl0ZW0udXNlcnMuZm9yRWFjaCgodXNlcjogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLmFkZFRyYXZlbGxlcih1c2VyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdQUkVQT1BVTEFUSU5HIFBBUktJTkcgRk9STScpO1xyXG4gICAgY29uc3QgZmxpZ2h0SXRlbTogU2VhcmNoRmxpZ2h0c1YyUXVlcnlWYXJpYWJsZXMgPVxyXG4gICAgICBwcmV2aW91c0l0ZW1zW1NlcnZpY2VUeXBlLkZsaWdodF0/LnNlYXJjaFF1ZXJ5O1xyXG4gICAgaWYgKGZsaWdodEl0ZW0pIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBsZXQgc3RhcnREYXRlID1cclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdLm91dEJvdW5kRGF0ZS50b0RhdGUoKTtcclxuICAgICAgICBsZXQgZW5kRGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5pbmJvdW5kRGF0ZS50b0RhdGUoKTtcclxuICAgICAgICB0aGlzLm91dGRhdGUgPSB7XHJcbiAgICAgICAgICBkYXk6IHN0YXJ0RGF0ZS5nZXRVVENEYXRlKCksXHJcbiAgICAgICAgICBtb250aDogc3RhcnREYXRlLmdldFVUQ01vbnRoKCkgKyAxLFxyXG4gICAgICAgICAgeWVhcjogc3RhcnREYXRlLmdldFVUQ0Z1bGxZZWFyKClcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5kYXRlID0ge1xyXG4gICAgICAgICAgZGF5OiBlbmREYXRlLmdldFVUQ0RhdGUoKSxcclxuICAgICAgICAgIG1vbnRoOiBlbmREYXRlLmdldFVUQ01vbnRoKCkgKyAxLFxyXG4gICAgICAgICAgeWVhcjogZW5kRGF0ZS5nZXRVVENGdWxsWWVhcigpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdXHJcbiAgICAgICAgICAuYXJyaXZlTG9jYXRpb24gYXMgT0JUQWlycG9ydERldGFpbHM7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBwYXJraW5nIGZyb20gZmxpZ2h0IGl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUGFya2luZ1RvQmFza2V0KFxyXG4gICAgcGFya2luZ1F1b3RlOiBQYXJraW5nUXVvdGUsXHJcbiAgICBwYXJraW5nUXVlcnk6IFNlYXJjaFBhcmtpbmdRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8RGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucz4ge1xyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChwYXJraW5nUXVvdGUpO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG4gICAgICBjb25zdCB3aGF0SGFwcGVuZWQgPSBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWR1bHRzOiAxLFxyXG4gICAgICAgICAgYmFza2V0OiBiYXNrZXQuaWQsXHJcbiAgICAgICAgICBzZXJ2aWNlOiBwYXJraW5nUXVvdGUuc291cmNlSWQudG9TdHJpbmcoKSxcclxuICAgICAgICAgIGRldGFpbDoge1xyXG4gICAgICAgICAgICBhcnJpdmFsRGF0ZXRpbWU6IHBhcmtpbmdRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGRlcGFydERhdGV0aW1lOiBwYXJraW5nUXVlcnkuZGVwYXJ0RGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGxvY2F0aW9uQ29kZTogcGFya2luZ1F1b3RlLmNhclBhcmsuY29kZSxcclxuICAgICAgICAgICAgbmFtZTogcGFya2luZ1F1b3RlLmNhclBhcmsubmFtZSxcclxuICAgICAgICAgICAgcmVxdWlyZWRJbmZvOiBwYXJraW5nUXVvdGUucmVxdWlyZWRJbmZvLFxyXG4gICAgICAgICAgICBhaXJwb3J0SWF0YTogcGFya2luZ1F1ZXJ5LmxvY2F0aW9uQ29kZSxcclxuICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcmljZTogcGFya2luZ1F1b3RlLnByaWNlLFxyXG4gICAgICAgICAgY3VycmVuY3k6IHBhcmtpbmdRdW90ZS5jdXJyZW5jeSxcclxuICAgICAgICAgIHNlYXJjaFF1ZXJ5OiBwYXJraW5nUXVlcnksXHJcbiAgICAgICAgICBvdXRib3VuZERhdGU6IHBhcmtpbmdRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICBpbmJvdW5kRGF0ZTogcGFya2luZ1F1ZXJ5LmRlcGFydERhdGV0aW1lLmZvcm1hdCgpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBpbnRCYXNrZXQsXHJcbiAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLFxyXG4gICAgICAgIHRoaXMudHJhdmVsbGVycyxcclxuICAgICAgICBwYXJraW5nUXVvdGUucmVxdWlyZXNSZWFzb25cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGlmICh3aGF0SGFwcGVuZWQgPT09IERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMucmVzZWFyY2gpIHtcclxuICAgICAgICB0aGlzLnBlcmZvcm1TZWFyY2goKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gd2hhdEhhcHBlbmVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsO1xyXG4gIH1cclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKHBhcmtpbmdRdW90ZTogUGFya2luZ1F1b3RlKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ05hbWUnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5uYW1lXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnVGVsZXBob25lJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsudGVsZXBob25lXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnSW1wb3J0YW50IEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsubWlzYy5pbXBvcnRhbnRJbmZvcm1hdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0dlby1Qb3NpdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGBMYXRpdHVkZSAke3BhcmtpbmdRdW90ZS5jYXJQYXJrLmxhdGl0dWRlfTsgTG9uZ2l0dWRlICR7cGFya2luZ1F1b3RlLmNhclBhcmsubGF0aXR1ZGV9YFxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0ludHJvZHVjdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLmludHJvZHVjdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0Fycml2YWwgUHJvY2VkdXJlcycsXHJcbiAgICAgICAgdmFsdWU6IHBhcmtpbmdRdW90ZS5jYXJQYXJrLmFycml2YWxQcm9jZWR1cmVcclxuICAgICAgfSxcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEZXBhcnR1cmUgUHJvY2VkdXJlJyxcclxuICAgICAgICB2YWx1ZTogcGFya2luZ1F1b3RlLmNhclBhcmsuZGVwYXJ0dXJlUHJvY2VkdXJlXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnSW5mb3JtYXRpb24nLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5pbmZvcm1hdGlvblxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ01heGltdW0gQ2FyIFNpemUnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5tYXhpbXVtQ2FyU2l6ZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0RpcmVjdGlvbnMnLFxyXG4gICAgICAgIHZhbHVlOiBwYXJraW5nUXVvdGUuY2FyUGFyay5kaXJlY3Rpb25zXHJcbiAgICAgIH1cclxuICAgIF07XHJcbiAgfVxyXG5cclxuICB1cGRhdGVMb3dlc3RQcmljZShyZXN1bHRzOiBQYXJraW5nUXVvdGVbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSByZXN1bHRzWzBdLmN1cnJlbmN5O1xyXG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxyXG4gICAgICAoY2hlYXBlc3RQcmljZTogSUNoZWFwZXN0UHJpY2UsIHJlc3VsdDogUGFya2luZ1F1b3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJpY2UgPSByZXN1bHQucHJpY2U7XHJcbiAgICAgICAgaWYgKGNoZWFwZXN0UHJpY2UuYW1vdW50ID4gcHJpY2UpIGNoZWFwZXN0UHJpY2UuYW1vdW50ID0gcHJpY2U7XHJcbiAgICAgICAgcmV0dXJuIGNoZWFwZXN0UHJpY2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYW1vdW50OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgY3VycmVuY3lDb2RlOiBjdXJyZW5jeSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgc2F2ZVNlYXJjaCgpOiBPYnNlcnZhYmxlPFNhdmVGYXZvdXJpdGVTZWFyY2hSZXN1bHQ+IHtcclxuICAgIGlmICh0aGlzLmlzVmFsaWQudmFsdWUpIHtcclxuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICBjb25zdCBzZWFyY2hJbmZvID0ge1xyXG4gICAgICAgIG5hbWU6IGAke21vbWVudCgpfWAsXHJcbiAgICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLlBhcmtpbmcsXHJcbiAgICAgICAgc2VhcmNoQXJnczogc2VhcmNoXHJcbiAgICAgIH07XHJcbiAgICAgIHJldHVybiB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZUZhdm91cml0ZVNlYXJjaChzZWFyY2hJbmZvKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgYXBwbHlGYXZvdXJpdGUoZmF2OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2VhcmNoU2VydmljZS5nZXRBaXJwb3J0c0xpc3QoZmF2LmxvY2F0aW9uQ29kZSkuc3Vic2NyaWJlKChhKSA9PiB7XHJcbiAgICAgIHRoaXMubG9jYXRpb25Db2RlID0gKGEgYXMgYW55W10pLmZpbmQoXHJcbiAgICAgICAgKGEpID0+IGEuZ2F0ZXdheSA9PSBmYXYubG9jYXRpb25Db2RlXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMudGVybWluYWwgPSBmYXYudGVybWluYWw7XHJcbiAgICB9KTtcclxuICAgIC8vIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KChmYXYuYXJyaXZhbERhdGV0aW1lIGFzIHN0cmluZykuc3BsaXQoXCJUXCIpWzBdLCBcIllZWVktTU0tRERcIilcclxuICAgIC8vIHRoaXMuZGVwYXJ0RGF0ZXRpbWUgPSBtb21lbnQoKGZhdi5kZXBhcnREYXRldGltZSBhcyBzdHJpbmcpLnNwbGl0KFwiVFwiKVswXSwgXCJZWVlZLU1NLUREXCIpXHJcbiAgICAvLyB0aGlzLmxvY2F0aW9uQ29kZSA9IGZhdi5sb2NhdGlvbkNvZGVcclxuICB9XHJcbn1cclxuIl19