@pmcretail/mapper-library 0.0.44 → 0.0.45

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.
@@ -2,6 +2,7 @@ import { DELIVERY_METHODS } from "./mapper-library.model";
2
2
  import { TRANSACTION_TYPE } from "./mapper-library.model";
3
3
  import { BasketService } from "./basket.service";
4
4
  import { NumberUtilService } from "./number-util.service";
5
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
5
6
  /**
6
7
  * Transaction document builder
7
8
  */
@@ -9,6 +10,7 @@ export class TransactionDocumentBuilder {
9
10
  constructor(transactionDoc, currencyPipe, basketService) {
10
11
  this.currencyPipe = currencyPipe;
11
12
  this.basketService = basketService;
13
+ this.className = "TransactionDocumentBuilder";
12
14
  this.numberUtilService = new NumberUtilService(currencyPipe);
13
15
  this.basketService = new BasketService(this.numberUtilService);
14
16
  this.storeInfo = JSON.parse(localStorage.getItem('storeInfo') || '{}');
@@ -55,7 +57,7 @@ export class TransactionDocumentBuilder {
55
57
  .substring(1);
56
58
  this.transactionDocument.transactionRef =
57
59
  storeDetails.orgCode + storeDetails.storeId + date.toISOString() + random;
58
- console.log("ebasket: transaction ref created", this.transactionDocument.transactionRef);
60
+ AppLoggerService.logDebug(this.className, "transactionRef", "transaction ref created", this.transactionDocument.transactionRef);
59
61
  return this;
60
62
  }
61
63
  /**
@@ -163,7 +165,7 @@ export class TransactionDocumentBuilder {
163
165
  * @returns basket
164
166
  */
165
167
  basket(basketDetails) {
166
- console.log("ebasket: basket details update in transaction document", JSON.stringify(basketDetails));
168
+ AppLoggerService.logDebug(this.className, "basket", "basket details update in transaction document", basketDetails);
167
169
  this.transactionDocument.subsidiaryId = basketDetails.subsidiaryId || (localStorage.getItem('subsidiaryId') || '');
168
170
  this.transactionDocument.basket.products = [];
169
171
  this.transactionDocument.basket.lineDiscount = [];
@@ -216,7 +218,7 @@ export class TransactionDocumentBuilder {
216
218
  this.transactionDocument.basket.products.push(p);
217
219
  this.lineDiscount(basketDetails);
218
220
  });
219
- console.info("ebasket: transactiondocument basket details updated", JSON.stringify(this.transactionDocument.basket));
221
+ AppLoggerService.logInfo(this.className, "basket", "transactiondocument basket details updated", this.transactionDocument.basket);
220
222
  return this;
221
223
  }
222
224
  /**
@@ -224,7 +226,7 @@ export class TransactionDocumentBuilder {
224
226
  * @returns currentTransactionDetails
225
227
  */
226
228
  currentTransactionDetails(basket) {
227
- console.log("ebasket: current transaction details for exchanges", basket);
229
+ AppLoggerService.logDebug(this.className, "currentTransactionDetails", "current transaction details for exchanges", basket);
228
230
  this.transactionDocument.currentTransactionDetails.products = [];
229
231
  this.transactionDocument.currentTransactionDetails.linePromotion = [];
230
232
  this.transactionDocument.currentTransactionDetails.lineDiscount = [];
@@ -249,7 +251,7 @@ export class TransactionDocumentBuilder {
249
251
  this.transactionDocument.currentTransactionDetails.lineDiscount.push(product.lineDiscount);
250
252
  }
251
253
  });
252
- console.log("ebasket: current transaction details after removing old products", this.transactionDocument.currentTransactionDetails.products);
254
+ AppLoggerService.logDebug(this.className, "currentTransactionDetails", "current transaction details after removing old products", this.transactionDocument.currentTransactionDetails.products);
253
255
  if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
254
256
  this.transactionDocument.currentTransactionDetails.transactionDiscount.push(...basket.transactionDiscount);
255
257
  }
@@ -274,7 +276,7 @@ export class TransactionDocumentBuilder {
274
276
  this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = 0;
275
277
  }
276
278
  }
277
- console.log("ebasket:this.transactionDocument.currentTransactionDetails", JSON.stringify(this.transactionDocument.currentTransactionDetails));
279
+ AppLoggerService.logInfo(this.className, "currentTransactionDetails", "currentTransactionDetails", this.transactionDocument.currentTransactionDetails);
278
280
  return this;
279
281
  }
280
282
  /**
@@ -302,7 +304,8 @@ export class TransactionDocumentBuilder {
302
304
  taxableAmount: product.total,
303
305
  PreTax: 0
304
306
  };
305
- console.info("Product contribution : item line ID :current transaction Details", product.itemLineId, "tax line :", JSON.stringify(taxLine), JSON.stringify(basketDetails.basketTotal));
307
+ AppLoggerService.logInfo(this.className, "updateCurrentTransactionDetailsTaxBreakdown", `item line ID :current transaction Details",
308
+ ${product.itemLineId}, tax line : ${taxLine}, basketDetails.basketTotal ${basketDetails.basketTotal}`);
306
309
  //step 1
307
310
  // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
308
311
  //If transaction discount/promotion is applied taxable amount should be deducting transaction promotion and transaction disacount portion
@@ -330,14 +333,13 @@ export class TransactionDocumentBuilder {
330
333
  else {
331
334
  this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = 0.00;
332
335
  }
333
- console.log("eBasket:after calculating tax currenttransactionDetails", this.transactionDocument.currentTransactionDetails);
336
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsTaxBreakdown", "eBasket:after calculating tax currenttransactionDetails", this.transactionDocument.currentTransactionDetails);
334
337
  return this;
335
338
  }
336
339
  updateCurrentTransactionDetailsTotalTaxSummary() {
337
- console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown));
340
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsTotalTaxSummary", "Total Tax Summery Request :", this.transactionDocument.currentTransactionDetails.taxBreakdown);
338
341
  let totalTaxSummaryArray = [];
339
342
  let totalTaxSummaryGroup = [];
340
- console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines));
341
343
  this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.forEach((element) => {
342
344
  let TaxSummary = {
343
345
  VATCode: "",
@@ -353,7 +355,7 @@ export class TransactionDocumentBuilder {
353
355
  TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
354
356
  totalTaxSummaryArray.push(TaxSummary);
355
357
  });
356
- console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
358
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsTotalTaxSummary", "Total Tax Summery Without Grouped : ", totalTaxSummaryArray);
357
359
  totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray, currentObj) => {
358
360
  let ind = preparedArray.findIndex((x) => x.VAT === currentObj.VAT);
359
361
  if (ind === -1) {
@@ -369,7 +371,7 @@ export class TransactionDocumentBuilder {
369
371
  return preparedArray;
370
372
  }, []);
371
373
  // listOfTags.map(x => unique.filter(a => a.label == x.label && a.color == x.color).length > 0 ? null : unique.push(x));
372
- console.log("Total Tax Summer Group :", JSON.stringify(totalTaxSummaryGroup));
374
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsTotalTaxSummary", "Total Tax Summer Group :", totalTaxSummaryGroup);
373
375
  this.transactionDocument.currentTransactionDetails.totalTaxSummary = totalTaxSummaryGroup;
374
376
  return this;
375
377
  }
@@ -379,10 +381,10 @@ export class TransactionDocumentBuilder {
379
381
  */
380
382
  updateCurrentTransactionDetailsDiscountTotal() {
381
383
  let refundTotal = this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal ? this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal : 0;
382
- console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", refundTotal, this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal, this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal);
384
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsDiscountTotal", `refundTotal ${refundTotal}, basketTotal ${this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal},saleTotal ${this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal}`);
383
385
  const discountTotal = Math.abs(Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal) -
384
386
  (Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal) + Math.abs(refundTotal)));
385
- console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", discountTotal);
387
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsDiscountTotal", "discountTotal", discountTotal);
386
388
  return Number(discountTotal.toFixed(2));
387
389
  }
388
390
  /**
@@ -396,7 +398,7 @@ export class TransactionDocumentBuilder {
396
398
  if (product.refundedTotal) {
397
399
  totalRefund = totalRefund + product.refundedTotal;
398
400
  }
399
- console.log("ebasket : transaction Service: totalRefund for Current TransactionDetails" + totalRefund);
401
+ AppLoggerService.logDebug(this.className, "updateCurrentTransactionDetailsRefundTotal", "totalRefund for Current TransactionDetails", totalRefund);
400
402
  }
401
403
  return totalRefund;
402
404
  }
@@ -420,7 +422,7 @@ export class TransactionDocumentBuilder {
420
422
  else {
421
423
  this.transactionDocument.basketSummary.VATTotal = 0.00;
422
424
  }
423
- console.info("ebasket: basketsummary updated in transaction document: ", JSON.stringify(this.transactionDocument.basketSummary));
425
+ AppLoggerService.logInfo(this.className, "basketSummary", "basketsummary updated in transaction document: ", this.transactionDocument.basketSummary);
424
426
  return this;
425
427
  }
426
428
  /**
@@ -441,7 +443,7 @@ export class TransactionDocumentBuilder {
441
443
  return acc;
442
444
  }, []);
443
445
  }
444
- // console.info(
446
+ // AppLoggerService.logInfo(this.className,
445
447
  // "e-basket :line discount updated in transaction document",
446
448
  // this.transactionDocument.basket.lineDiscount
447
449
  // );
@@ -470,7 +472,7 @@ export class TransactionDocumentBuilder {
470
472
  this.transactionDocument.basket.exchange.push(element.exchange);
471
473
  }
472
474
  }
473
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket exchange", JSON.stringify(this.transactionDocument.basket.exchange));
475
+ AppLoggerService.logDebug(this.className, "exchange", "this.transactionDocument.basket exchange", this.transactionDocument.basket.exchange);
474
476
  }
475
477
  return this;
476
478
  }
@@ -522,7 +524,7 @@ export class TransactionDocumentBuilder {
522
524
  // return acc;
523
525
  // }, []);
524
526
  // }
525
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket.transactionPromotion", JSON.stringify(this.transactionDocument.basket.transactionPromotion));
527
+ AppLoggerService.logDebug(this.className, "transactionPromotion", "this.transactionDocument.basket.transactionPromotion", this.transactionDocument.basket.transactionPromotion);
526
528
  }
527
529
  return this;
528
530
  }
@@ -530,7 +532,7 @@ export class TransactionDocumentBuilder {
530
532
  if (basketDetails.transactionDiscount) {
531
533
  this.transactionDocument.basket.transactionDiscount =
532
534
  basketDetails.transactionDiscount;
533
- console.log("e-basket :TransactionDocumentBuilder: transaction Discount", JSON.stringify(this.transactionDocument.basket.transactionDiscount));
535
+ AppLoggerService.logDebug(this.className, "transactionDiscount", "transaction Discount", this.transactionDocument.basket.transactionDiscount);
534
536
  }
535
537
  return this;
536
538
  }
@@ -540,7 +542,7 @@ export class TransactionDocumentBuilder {
540
542
  * @returns
541
543
  */
542
544
  paymentDetails(paymentDetails) {
543
- console.info("ebasket : payment details after transaction completed", JSON.stringify(paymentDetails));
545
+ AppLoggerService.logInfo(this.className, "paymentDetails", "payment details after transaction completed", paymentDetails);
544
546
  this.transactionDocument.paymentDetails = paymentDetails;
545
547
  return this;
546
548
  }
@@ -576,7 +578,7 @@ export class TransactionDocumentBuilder {
576
578
  * @returns at
577
579
  */
578
580
  giftOption(gift) {
579
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.giftoption", gift);
581
+ AppLoggerService.logDebug(this.className, "giftOption", "this.transactionDocument.giftoption", gift);
580
582
  if (gift) {
581
583
  this.transactionDocument.giftedReceipt = gift;
582
584
  }
@@ -668,7 +670,7 @@ export class TransactionDocumentBuilder {
668
670
  * @returns basket details
669
671
  */
670
672
  getBasketDetails() {
671
- console.info("ebasket: Getting Basket for transactionDocument", JSON.stringify(this.transactionDocument));
673
+ AppLoggerService.logInfo(this.className, "getBasketDetails", "Getting Basket for transactionDocument", this.transactionDocument);
672
674
  let basket = {
673
675
  subsidiaryId: this.transactionDocument.subsidiaryId,
674
676
  transactionDiscount: this.transactionDocument.basket.transactionDiscount,
@@ -687,7 +689,7 @@ export class TransactionDocumentBuilder {
687
689
  };
688
690
  basket.products = [];
689
691
  this.transactionDocument.basket.products.forEach((product, index) => {
690
- console.log(JSON.stringify(product), "ebasket: basket detail update in basket");
692
+ AppLoggerService.logDebug(this.className, JSON.stringify(product), "ebasket: basket detail update in basket");
691
693
  const p = {};
692
694
  p.SKU = product.SKU;
693
695
  p.barcode = product.barCode;
@@ -769,7 +771,7 @@ export class TransactionDocumentBuilder {
769
771
  if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
770
772
  basket.quantity = this.getRefundedTotalWithQuantity(basket);
771
773
  }
772
- console.info("ebasket: Basket created successfully", JSON.stringify(basket));
774
+ AppLoggerService.logInfo(this.className, "getBasketDetails", "Basket created successfully", basket);
773
775
  return basket;
774
776
  }
775
777
  /**
@@ -825,7 +827,7 @@ export class TransactionDocumentBuilder {
825
827
  // p.itemDiscounts = product.itemDiscounts as ItemDiscount;
826
828
  // }
827
829
  // // if(!p.itemDiscounts){
828
- // // console.log(p.itemDiscounts);
830
+ // // AppLoggerService.logDebug(this.className, p.itemDiscounts);
829
831
  // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
830
832
  // // }
831
833
  // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
@@ -889,7 +891,7 @@ export class TransactionDocumentBuilder {
889
891
  // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
890
892
  // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
891
893
  // }
892
- // console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
894
+ // AppLoggerService.logDebug(this.className, "ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
893
895
  // basket.quantity = basket.products.reduce(
894
896
  // (n: any, { quantity }: any) => n + quantity,
895
897
  // 0
@@ -897,11 +899,11 @@ export class TransactionDocumentBuilder {
897
899
  // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
898
900
  // basket.basketTotal = basket.total;
899
901
  // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
900
- // console.log(
902
+ // AppLoggerService.logDebug(this.className,
901
903
  // "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
902
904
  // basket.basketTotal
903
905
  // );
904
- // console.log(
906
+ // AppLoggerService.logDebug(this.className,
905
907
  // "e:basket :TransactionDocumentBuilder : basketDetails updated values",
906
908
  // JSON.stringify(basket)
907
909
  // );
@@ -946,19 +948,19 @@ export class TransactionDocumentBuilder {
946
948
  basketDetails.transactionDiscount.length > 0) {
947
949
  discountTotal += basketDetails.transactionDiscount.reduce((n, { discountAmount }) => n + discountAmount, 0);
948
950
  }
949
- console.log("ebasket : TransactionDocumentBuilder : Transaction discount Total:", discountTotal);
951
+ AppLoggerService.logDebug(this.className, "getTotalDiscountWithTransactionDiscountsAndPromotions", "Transaction discount Total:", discountTotal);
950
952
  return discountTotal;
951
953
  }
952
954
  appendCurrencySymbol(currency, value) {
953
955
  // value=this.decimalpipe.transform(value,'1.2');
954
956
  if (value >= 0) {
955
957
  const returnval = currency + value;
956
- console.log(returnval, "ebasket: add currency with value");
958
+ AppLoggerService.logDebug(this.className, "appendCurrencySymbol", "add currency with value", returnval);
957
959
  return returnval;
958
960
  }
959
961
  else {
960
962
  const returnval = "-" + (currency + value * -1);
961
- console.log(returnval, "-(currency+(value*-1))");
963
+ AppLoggerService.logDebug(this.className, "appendCurrencySymbol", "returnVal", returnval);
962
964
  return returnval;
963
965
  }
964
966
  }
@@ -970,7 +972,7 @@ export class TransactionDocumentBuilder {
970
972
  // this.transactionDocument.basket.products.forEach((product) => {
971
973
  // product.refundedQuantity = product.quantity;
972
974
  // product.refundedTotal = product.totalLinePrice * -1;
973
- // console.log(
975
+ // AppLoggerService.logDebug(this.className,
974
976
  // "ebasket: Transaction price override :",
975
977
  // this.transactionDocument.basket.lineDiscount
976
978
  // );
@@ -979,15 +981,15 @@ export class TransactionDocumentBuilder {
979
981
  // this.transactionDocument.basket.linePromotion.length > 0
980
982
  // ) {
981
983
  // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
982
- // console.log(
984
+ // AppLoggerService.logDebug(this.className,
983
985
  // "Promotion: basket linePromotion : ",
984
986
  // this.transactionDocument.basket.linePromotion
985
987
  // );
986
- // console.log(
988
+ // AppLoggerService.logDebug(this.className,
987
989
  // "linePromotion.itemLineId.toString() : ",
988
990
  // linePromotion.itemLineId.toString()
989
991
  // );
990
- // console.log(
992
+ // AppLoggerService.logDebug(this.className,
991
993
  // "condition : " +
992
994
  // (product.itemLineId === linePromotion.itemLineId.toString())
993
995
  // );
@@ -1002,15 +1004,15 @@ export class TransactionDocumentBuilder {
1002
1004
  // this.transactionDocument.basket.lineDiscount.length > 0
1003
1005
  // ) {
1004
1006
  // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
1005
- // console.log(
1007
+ // AppLoggerService.logDebug(this.className,
1006
1008
  // "product.itemLineId : " +
1007
1009
  // this.transactionDocument.basket.lineDiscount
1008
1010
  // );
1009
- // console.log(
1011
+ // AppLoggerService.logDebug(this.className,
1010
1012
  // "lineDiscount.itemLineId.toString() : " +
1011
1013
  // lineDiscount.itemLineId.toString()
1012
1014
  // );
1013
- // console.log(
1015
+ // AppLoggerService.logDebug(this.className,
1014
1016
  // "condition : " +
1015
1017
  // (product.itemLineId === lineDiscount.itemLineId.toString())
1016
1018
  // );
@@ -1019,10 +1021,10 @@ export class TransactionDocumentBuilder {
1019
1021
  // }
1020
1022
  // });
1021
1023
  // }
1022
- // console.log("Product description :" + product.description);
1023
- // console.log("Product total :" + product.refundedTotal);
1024
+ // AppLoggerService.logDebug(this.className, "Product description :" + product.description);
1025
+ // AppLoggerService.logDebug(this.className, "Product total :" + product.refundedTotal);
1024
1026
  // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
1025
- // // console.log(product.displayrefundedamount,"displayrefundedamount");
1027
+ // // AppLoggerService.logDebug(this.className, product.displayrefundedamount,"displayrefundedamount");
1026
1028
  // product.refunded = true;
1027
1029
  // });
1028
1030
  // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
@@ -1057,7 +1059,7 @@ export class TransactionDocumentBuilder {
1057
1059
  // product.quantity * Number(product.selectedPrice.toFixed(2));
1058
1060
  // }
1059
1061
  saletotal += product.total;
1060
- console.log("e-basket:update product Total:" + saletotal, JSON.stringify(product));
1062
+ AppLoggerService.logDebug(this.className, "getTotalWithLineDiscountAndLinePromotionApplied", "e-basket:update product Total:" + saletotal, product);
1061
1063
  }
1062
1064
  return saletotal;
1063
1065
  }
@@ -1081,10 +1083,10 @@ export class TransactionDocumentBuilder {
1081
1083
  */
1082
1084
  updateDiscountTotal() {
1083
1085
  let refundTotal = this.transactionDocument.basketSummary.refundTotal ? this.transactionDocument.basketSummary.refundTotal : 0;
1084
- console.info("e-basket: transaction builder: refundTotal", JSON.stringify(refundTotal), JSON.stringify(this.transactionDocument.basketSummary));
1086
+ AppLoggerService.logInfo(this.className, "updateDiscountTotal", `refundTotal: ${refundTotal} this.transactionDocument.basketSummary: ${this.transactionDocument.basketSummary}`);
1085
1087
  const discountTotal = Math.abs(Math.abs(this.transactionDocument.basketSummary.saleTotal) -
1086
1088
  (Math.abs(this.transactionDocument.basketSummary.basketTotal) + Math.abs(refundTotal)));
1087
- console.log("e-basket: transaction builder: discountTotal", JSON.stringify(discountTotal));
1089
+ AppLoggerService.logDebug(this.className, "updateDiscountTotal", "discountTotal", discountTotal);
1088
1090
  return Number(discountTotal.toFixed(2));
1089
1091
  }
1090
1092
  updateReasonCode(reasonCode) {
@@ -1135,7 +1137,8 @@ export class TransactionDocumentBuilder {
1135
1137
  taxableAmount: product.total,
1136
1138
  PreTax: 0
1137
1139
  };
1138
- console.info("Product contribution : item line ID :", product.itemLineId, "tax line :", JSON.stringify(taxLine));
1140
+ AppLoggerService.logInfo(this.className, "updateTaxBreakdown", `item line ID :, ${product.itemLineId},
1141
+ "tax line :", ${taxLine}`);
1139
1142
  // step 1
1140
1143
  // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
1141
1144
  // if (transactionDiscountTotal > 0) {
@@ -1144,7 +1147,8 @@ export class TransactionDocumentBuilder {
1144
1147
  product.itemDiscounts.trnPromotionsPortion -
1145
1148
  product.itemDiscounts.refundPortion;
1146
1149
  // tp+td-rp;
1147
- console.info("Product contribution : item line ID :", product.itemLineId, "contribution :", JSON.stringify(productContributionInTotal));
1150
+ AppLoggerService.logInfo(this.className, "updateTaxBreakdown", `item line ID , ${product.itemLineId},
1151
+ "contribution :", ${productContributionInTotal}`);
1148
1152
  // calculate net selling price after applying transaction discount as per product contribution
1149
1153
  taxLine.taxableAmount -= productContributionInTotal;
1150
1154
  // }
@@ -1162,10 +1166,10 @@ export class TransactionDocumentBuilder {
1162
1166
  return this;
1163
1167
  }
1164
1168
  updateTotalTaxSummary() {
1165
- console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.basket.taxBreakdown));
1169
+ AppLoggerService.logDebug(this.className, "updateTotalTaxSummary", "Total Tax Summery Request :", this.transactionDocument.basket.taxBreakdown);
1166
1170
  let totalTaxSummaryArray = [];
1167
1171
  let totalTaxSummaryGroup = [];
1168
- console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.basket.taxBreakdown.taxLines));
1172
+ AppLoggerService.logDebug(this.className, "updateTotalTaxSummary", "Tax Lines for Total Tax Summery :", this.transactionDocument.basket.taxBreakdown.taxLines);
1169
1173
  this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element) => {
1170
1174
  let TaxSummary = {
1171
1175
  VATCode: "",
@@ -1181,7 +1185,7 @@ export class TransactionDocumentBuilder {
1181
1185
  TaxSummary.TXrateSum = this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
1182
1186
  totalTaxSummaryArray.push(TaxSummary);
1183
1187
  });
1184
- console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
1188
+ AppLoggerService.logDebug(this.className, "updateTotalTaxSummary", "Total Tax Summery Without Grouped : ", totalTaxSummaryArray);
1185
1189
  totalTaxSummaryGroup = totalTaxSummaryArray.reduce((preparedArray, currentObj) => {
1186
1190
  let ind = preparedArray.findIndex((x) => x.VAT === currentObj.VAT);
1187
1191
  if (ind === -1) {
@@ -1196,7 +1200,7 @@ export class TransactionDocumentBuilder {
1196
1200
  }
1197
1201
  return preparedArray;
1198
1202
  }, []);
1199
- console.log("Total Tax Summer Group :", totalTaxSummaryGroup);
1203
+ AppLoggerService.logDebug(this.className, "updateTotalTaxSummary", "Total Tax Summer Group :", totalTaxSummaryGroup);
1200
1204
  this.transactionDocument.basket.totalTaxSummary = totalTaxSummaryGroup;
1201
1205
  return this;
1202
1206
  }
@@ -1228,7 +1232,7 @@ export class TransactionDocumentBuilder {
1228
1232
  if (product.refundedTotal) {
1229
1233
  totalRefund = totalRefund + product.refundedTotal;
1230
1234
  }
1231
- console.log("ebasket : transaction Service: totalRefund" + totalRefund);
1235
+ AppLoggerService.logDebug(this.className, "getRefundTotal", "totalRefund", totalRefund);
1232
1236
  }
1233
1237
  return totalRefund;
1234
1238
  }
@@ -1237,4 +1241,4 @@ export class TransactionDocumentBuilder {
1237
1241
  return this;
1238
1242
  }
1239
1243
  }
1240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL1RyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBc0QsZ0JBQWdCLEVBQWlHLE1BQU0sd0JBQXdCLENBQUM7QUFDN00sT0FBTyxFQUFFLGdCQUFnQixFQUErRCxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRDs7R0FFRztBQUNILE1BQU0sT0FBTywwQkFBMEI7SUFLckMsWUFDRSxjQUFvQyxFQUM1QixZQUEyQixFQUMzQixhQUFtQztRQURuQyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFFM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN2RSxJQUFJLGNBQWMsRUFBRTtZQUNsQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsY0FBYyxDQUFDO1NBQzNDO2FBQU07WUFDTCxJQUFJLENBQUMsbUJBQW1CLEdBQUc7Z0JBQ3pCLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixvQkFBb0IsRUFBRSxFQUFFO2dCQUN4QixjQUFjLEVBQUUsRUFBRTtnQkFDbEIsUUFBUSxFQUFFLEVBQUU7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T0FBTyxDQUFDLGFBQWEsQ0FBQzthQUNuRDtZQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsNENBQTRDLEdBQUcsV0FBVyxDQUFDLENBQUE7U0FDeEU7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQVU7UUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEJhc2tldFN1bW1hcnksIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsIEN1c3RvbWVyLCBERUxJVkVSWV9NRVRIT0RTLCBJdGVtRGlzY291bnRzLCBUYXhCcmVha2Rvd24sIFRheExpbmUsIFRCYXNrZXQsIFRvdGFsVGF4U3VtbWFyeSwgVFByb2R1Y3QsIFRyYW5zYWN0aW9uRG9jdW1lbnQgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiO1xuaW1wb3J0IHsgVFJBTlNBQ1RJT05fVFlQRSwgQmFza2V0LCBMaW5lRGlzY291bnQsIExpbmVQcm9tb3Rpb25zLCBQcm9kdWN0LCBVc2VyT3ZlcnJpZGUgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiO1xuaW1wb3J0IHsgQmFza2V0U2VydmljZSB9IGZyb20gXCIuL2Jhc2tldC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gXCIuL251bWJlci11dGlsLnNlcnZpY2VcIjtcblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBkb2N1bWVudCBidWlsZGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gIHByaXZhdGUgdHJhbnNhY3Rpb25Eb2N1bWVudDogVHJhbnNhY3Rpb25Eb2N1bWVudDtcbiAgcHJpdmF0ZSBudW1iZXJVdGlsU2VydmljZTogTnVtYmVyVXRpbFNlcnZpY2U7XG4gIHByaXZhdGUgc3RvcmVJbmZvIDogYW55O1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNhY3Rpb25Eb2M/OiBUcmFuc2FjdGlvbkRvY3VtZW50LFxuICAgIHByaXZhdGUgY3VycmVuY3lQaXBlPzogQ3VycmVuY3lQaXBlLFxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZT86IEJhc2tldFNlcnZpY2UgfCBhbnksXG4gICkge1xuICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UgPSBuZXcgTnVtYmVyVXRpbFNlcnZpY2UoY3VycmVuY3lQaXBlKTtcbiAgICB0aGlzLmJhc2tldFNlcnZpY2UgPSBuZXcgQmFza2V0U2VydmljZSh0aGlzLm51bWJlclV0aWxTZXJ2aWNlKTtcbiAgICB0aGlzLnN0b3JlSW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JlSW5mbycpIHx8ICd7fScpO1xuICAgIGlmICh0cmFuc2FjdGlvbkRvYykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0gdHJhbnNhY3Rpb25Eb2M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogXCJcIixcbiAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXG4gICAgICAgIHRyYW5zYWN0aW9uUmVmOiBcIlwiLFxuICAgICAgICBkYXRlVGltZTogXCJcIixcbiAgICAgICAgb3JnQ29kZTogXCJcIixcbiAgICAgICAgc3RvcmVJZDogXCJcIixcbiAgICAgICAgc3RvcmVOb2RlSWQ6IFwiXCIsXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcbiAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXG4gICAgICAgIHRlcm1pbmFsSWQ6IFwiXCIsXG4gICAgICAgIHVzZXJJZDogXCJcIixcbiAgICAgICAgaW5pdGlhdGluZ01vZHVsZSA6IFwiZUJhc2tldFwiLFxuICAgICAgICBleHBvcnQ6IGZhbHNlLFxuICAgICAgICBiYXNrZXQ6IHt9IGFzIFRCYXNrZXQsXG4gICAgICAgIGJhc2tldFN1bW1hcnk6IHt9IGFzIEJhc2tldFN1bW1hcnksXG4gICAgICAgIGJhc2VDdXJyZW5jeTogXCJcIixcbiAgICAgICAgdHlwZTogXCJcIixcbiAgICAgICAgb3BlcmF0aW9uU3RhdHVzOiBcIlwiLFxuICAgICAgICBjcmVhdGVkQXQ6IFwiXCIsXG4gICAgICAgIHVwZGF0ZWRBdDogXCJcIixcbiAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsXG4gICAgICAgIHNhbGVUb3RhbDogMCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zYWN0aW9ucyByZWZcbiAgICogQHJldHVybnMgcmVmXG4gICAqL1xuICB0cmFuc2FjdGlvblJlZigpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc3Qgc3RvcmVEZXRhaWxzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RvcmVJbmZvJykgfHwgJ3t9Jyk7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmFuZG9tID0gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnN1YnN0cmluZygxKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYgPVxuICAgICAgc3RvcmVEZXRhaWxzLm9yZ0NvZGUgKyBzdG9yZURldGFpbHMuc3RvcmVJZCArIGRhdGUudG9JU09TdHJpbmcoKSArIHJhbmRvbTtcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IHRyYW5zYWN0aW9uIHJlZiBjcmVhdGVkXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvblJlZilcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2FjdGlvbnMgaWRcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSURcbiAgICogQHJldHVybnMgaWRcbiAgICovXG4gIHRyYW5zYWN0aW9uSWQodHJhbnNhY3Rpb25JRDogc3RyaW5nLCBpc09ubGluZTogYm9vbGVhbiA9IHRydWUpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgaWYgKGlzT25saW5lKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSUQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zYWN0aW9ucyBpZFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JRFxuICAgKiBAcmV0dXJucyBpZFxuICAgKi9cbiAgb2ZmbGluZVRyYW5zYWN0aW9uSWQodHJhbnNhY3Rpb25JRDogc3RyaW5nLCBpc09ubGluZTogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGlmICghaXNPbmxpbmUpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vZmZsaW5lVHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSUQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICogc3RvcmVOb2RlIElkXG4gICogQHBhcmFtIHN0b3JlTm9kZUlkXG4gICogQHJldHVybnMgaWRcbiAgKi9cbiAgc3RvcmVOb2RlSWQoc3RvcmVOb2RlSWQ6IHN0cmluZyk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuKiBzdG9yZU5vZGUgc3RydWN0dXJlXG4qIEBwYXJhbSBzdG9yZU5vZGVTdHJ1Y3R1cmVcbiogQHJldHVybnMgaWRcbiovXG4gIHN0b3JlTm9kZVN0cnVjdHVyZShzdG9yZU5vZGVTdHJ1Y3R1cmU6IHN0cmluZyk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVOb2RlU3RydWN0dXJlID0gc3RvcmVOb2RlU3RydWN0dXJlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9yZ3MgY29kZVxuICAgKiBAcGFyYW0gb3JnQ29kZVxuICAgKiBAcmV0dXJucyBjb2RlXG4gICAqL1xuICBvcmdDb2RlKG9yZ0NvZGU6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3JnQ29kZSA9IG9yZ0NvZGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFN0b3JlcyBpZFxuICAgKiBAcGFyYW0gc3RvcmVJZFxuICAgKiBAcmV0dXJucyBpZFxuICAgKi9cbiAgc3RvcmVJZChzdG9yZUlkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQgPSBzdG9yZUlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBEYXRlcyB0aW1lXG4gICAqIEByZXR1cm5zIHRpbWVcbiAgICovXG4gIGRhdGVUaW1lKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuZGF0ZVRpbWUgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIERldmljZXMgaWRcbiAgICogQHBhcmFtIGRldmljZUlkXG4gICAqIEByZXR1cm5zIGlkXG4gICAqL1xuICBkZXZpY2VJZChkZXZpY2VJZDogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5kZXZpY2VJZCA9IGRldmljZUlkO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICAgKiB0ZXJtaW5hbCBpZFxuICAgICAqIEBwYXJhbSB0ZXJtaW5hbElkXG4gICAgICogQHJldHVybnMgaWRcbiAgICAgKi9cbiAgdGVybWluYWxJZCh0ZXJtaW5hbElkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRlcm1pbmFsSWQgPSB0ZXJtaW5hbElkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cblxuXG5cblxuICAvKipcbiAgICAqIHNhbGVFeHBvcnRcbiAgICAqIEBwYXJhbSBzYWxlRXhwb3J0XG4gICAgKiBAcmV0dXJucyBpZFxuICAgICovXG4gIGV4cG9ydChzYWxlRXhwb3J0OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmV4cG9ydCA9IHNhbGVFeHBvcnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG5cbiAgLyogIGN1c3RvbWVyKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zdCB1c2VyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlckRldGFpbHMnKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1c3RvbWVyID0gdXNlcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfSAqL1xuICAvKipcbiAgICogQmFza2V0cyB0cmFuc2FjdGlvbiBkb2N1bWVudCBidWlsZGVyXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXG4gICAqIEByZXR1cm5zIGJhc2tldFxuICAgKi9cbiAgYmFza2V0KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IGJhc2tldCBkZXRhaWxzIHVwZGF0ZSBpbiB0cmFuc2FjdGlvbiBkb2N1bWVudFwiLCBKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzKSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3Vic2lkaWFyeUlkID0gYmFza2V0RGV0YWlscy5zdWJzaWRpYXJ5SWQgfHwgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdWJzaWRpYXJ5SWQnKSB8fCAnJyk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFRQcm9kdWN0W107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQgPSBbXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSBbXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBwID0ge30gYXMgVFByb2R1Y3Q7XG4gICAgICBwLml0ZW1EaXNjb3VudHMgPSB7fSBhcyBJdGVtRGlzY291bnRzO1xuICAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcbiAgICAgIHAuZXhjbHVkZVByb21vdGlvbiA9IHByb2R1Y3QuZXhjbHVkZVByb21vdGlvbjtcbiAgICAgIHAuYmFyQ29kZSA9IHByb2R1Y3QuYmFyY29kZTtcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xuICAgICAgcC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb247XG4gICAgICBwLml0ZW1MaW5lSWQgPSBwcm9kdWN0Lml0ZW1MaW5lSWQgPyBwcm9kdWN0Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSA6IFwiXCIgKyAoaW5kZXggKyAxKTtcbiAgICAgIHAucHJpY2UgPSBwcm9kdWN0LnNlbGVjdGVkUHJpY2U7XG4gICAgICBwLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgIHAudG90YWxMaW5lUHJpY2UgPSBwcm9kdWN0LnF1YW50aXR5ICogcHJvZHVjdC5zZWxlY3RlZFByaWNlO1xuICAgICAgcC5pbWFnZVVybHMgPSBwcm9kdWN0LmltYWdlVXJscztcbiAgICAgIHAuc2VsZWN0ZWRSUlBQcmljZSA9IHByb2R1Y3Quc2VsZWN0ZWRSUlBQcmljZTtcblxuICAgICAgLy9pbnZlbnRvcnkgZmllbGRzXG4gICAgICBcbiAgICAgIHAuZnVsbGZpbG1lbnRJZCA9IHByb2R1Y3QuZnVsbGZpbG1lbnRJZD8gcHJvZHVjdC5mdWxsZmlsbWVudElkOiB0aGlzLnN0b3JlSW5mby5zdG9yZUlkO1xuXG4gICAgICBwLmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lID0gcHJvZHVjdC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZTtcbiAgICAgIHAuZGVsaXZlcnlHcm91cCA9IHByb2R1Y3QuZGVsaXZlcnlHcm91cDtcbiAgICAgIHAubGVhZFRpbWUgPSBwcm9kdWN0LmxlYWRUaW1lO1xuICAgICAgcC5kZWxpdmVyeU1ldGhvZCA9IHByb2R1Y3QuZGVsaXZlcnlNZXRob2Q7XG5cbiAgICAgIHAuZ2lmdENhcmQgPSBwcm9kdWN0LmdpZnRDYXJkO1xuICAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcbiAgICAgIHAuZ2lmdENhcmROdW1iZXJJc3N1ZWQgPSBwcm9kdWN0LmdpZnRDYXJkTnVtYmVySXNzdWVkO1xuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsO1xuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcblxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcbiAgICAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xuICAgICAgICBwLnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kUHJvbW90aW9uYWxRdWFudGl0eTtcbiAgICAgICAgcC5yZWZ1bmRlZCA9IHByb2R1Y3QucmVmdW5kZWQ7XG4gICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHByb2R1Y3QucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcbiAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbiA9IHByb2R1Y3QucmVmdW5kZWRSZWFzb247XG4gICAgICAgIGlmICghcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gcC5yZWZ1bmRlZFJlYXNvbjtcbiAgICAgICAgfVxuICAgICAgICBwLnJlZnVuZGVkVG90YWwgPSBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XG4gICAgICAgIHAuaXNMYXN0RXhjaGFuZ2VkID0gcHJvZHVjdC5pc0xhc3RFeGNoYW5nZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9kdWN0LmV4Y2hhbmdlKSB7XG4gICAgICAgIHAuZXhjaGFuZ2UgPSBwcm9kdWN0LmV4Y2hhbmdlO1xuICAgICAgfVxuICAgICAgaWYgKHByb2R1Y3QubGluZURpc2NvdW50KSB7XG4gICAgICAgIHAubGluZURpc2NvdW50ID0gcHJvZHVjdC5saW5lRGlzY291bnQ7XG4gICAgICB9XG4gICAgICBwLml0ZW1EaXNjb3VudHMgPSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMgYXMgSXRlbURpc2NvdW50cztcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMucHVzaChwKTtcbiAgICAgIHRoaXMubGluZURpc2NvdW50KGJhc2tldERldGFpbHMpO1xuICAgIH0pO1xuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQ6IHRyYW5zYWN0aW9uZG9jdW1lbnQgYmFza2V0IGRldGFpbHMgdXBkYXRlZFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0KSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgICAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gRGV0YWlscyBUb3RhbChOZXcgUHJvZHVjdHMpXG4gICAgICogQHJldHVybnMgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1xuICAgICAqL1xuXG4gIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMoYmFza2V0OiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OiBjdXJyZW50IHRyYW5zYWN0aW9uIGRldGFpbHMgZm9yIGV4Y2hhbmdlc1wiLCBiYXNrZXQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzID0gW10gYXMgUHJvZHVjdFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVQcm9tb3Rpb24gPSBbXSBhcyBMaW5lUHJvbW90aW9uc1tdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVEaXNjb3VudCA9IFtdIGFzIExpbmVEaXNjb3VudFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgPSBbXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IGJhc2tldC5wcm9kdWN0cztcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmZpbHRlcihcbiAgICAgICggICAgICBwcm9qOiB7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgfSkgPT4gcHJvai5yZWZ1bmRlZFF1YW50aXR5ICE9IDBcbiAgICApO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogeyByZWZ1bmRlZFF1YW50aXR5OiBhbnk7IHF1YW50aXR5OiBhbnk7IHRvdGFsTGluZVByaWNlOiBudW1iZXI7IHJlZnVuZGVkVG90YWw6IG51bWJlcjsgdG90YWw6IGFueTsgcmVmdW5kZWQ6IGJvb2xlYW47IGxpbmVQcm9tb3Rpb25zOiBhbnk7IGxpbmVEaXNjb3VudDogYW55OyB9KSA9PiB7XG4gICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XG4gICAgICAgIHByb2R1Y3QucXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHk7XG4gICAgICAgIC8vIHVwZGF0aW5nIHRvdGFsIGxpbmUgcHJpY2Ugd2l0aCBhY3R1YWwgcHJpY2UgdG8gYmUgcmVmdW5kZWQgaW5jbHVkaW5nIHRoZSByZWZ1bmRpbmcgcXR5XG4gICAgICAgIHByb2R1Y3QudG90YWxMaW5lUHJpY2UgPSBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwpO1xuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgICAgICAgaWYgKHByb2R1Y3QucXVhbnRpdHkgPT09IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xuICAgICAgICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL1VwZGF0aW5nIGxpbmUgcHJvbW90aW9ucyBhbmQgbGluZSBkaXNjb3VudHMgICAgICBcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zICYmICFwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZVByb21vdGlvbi5wdXNoKHByb2R1Y3QubGluZVByb21vdGlvbnMpXG4gICAgICB9XG4gICAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5saW5lRGlzY291bnQucHVzaChwcm9kdWN0LmxpbmVEaXNjb3VudClcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogY3VycmVudCB0cmFuc2FjdGlvbiBkZXRhaWxzIGFmdGVyIHJlbW92aW5nIG9sZCBwcm9kdWN0c1wiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyk7XG5cbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5wdXNoKC4uLmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeSA9IHt9IGFzIEJhc2tldFN1bW1hcnk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlU2FsZVRvdGFsKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zID0gYmFza2V0LnF1YW50aXR5O1xuXG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsID0gYmFza2V0LmJhc2tldFRvdGFsO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLnVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNSZWZ1bmRUb3RhbCgpO1xuICAgIC8vIEZvciBwYXJ0aWFsIHJlZnVuZCBkaXNjb3VudCBpcyB1cGRhdGllZCBpbiB0b3RhbCBsaW5lIHByaWNlIHNvIGRpc2NvdW50VG90YWwgd2lsbCBhbHdheXMgYmUgemVybyAmIGluIGNhc2Ugb2YgZXhjaGFuZ2UgZGlzY291bnQgdG90YWwgaXMgY2FsY3VsYXRlZFxuXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWwoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZGlzY291bnRUb3RhbCA9IDA7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgZGlzY291bnRBbW91bnQ6IG51bWJlcjsgfSkgPT4ge1xuICAgICAgICAgIGRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWwgPSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OnRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzXCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG4gIC8qKlxuICogY3VycmVudCB0cmFuc2FjdGlvbiBUYXggVG90YWxcbiAqIEByZXR1cm5zIFRheCBUb3RhbFxuICovXG5cbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1RheEJyZWFrZG93bihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgbGV0IHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCA9IDA7XG4gICAgbGV0IHRheEJyZWFrZG93bjogVGF4QnJlYWtkb3duID0ge1xuICAgICAgdGF4TGluZXM6IFtdLFxuICAgICAgdG90YWxUYXhhYmxlQW1vdW50OiAwLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudCAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgZGlzY291bnRBbW91bnQ6IG51bWJlcjsgfSkgPT4ge1xuICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IHNlbGVjdGVkVkFUOiBhbnk7IHNlbGVjdGVkVkFUQ29kZTogYW55OyB0b3RhbDogYW55OyByZWZ1bmRlZFF1YW50aXR5OiBudW1iZXI7IGl0ZW1EaXNjb3VudHM6IHsgY3VycmVudFJlZnVuZFBvcnRpb246IG51bWJlcjsgdHJuRGlzY291bnRzUG9ydGlvbjogbnVtYmVyOyB0cm5Qcm9tb3Rpb25zUG9ydGlvbjogbnVtYmVyOyB9OyB9KSA9PiB7XG4gICAgICAgIGxldCB0YXhMaW5lOiBUYXhMaW5lID0ge1xuICAgICAgICAgIGl0ZW1MaW5lSWQ6IHByb2R1Y3QuaXRlbUxpbmVJZCxcbiAgICAgICAgICBWQVQ6IHByb2R1Y3Quc2VsZWN0ZWRWQVQgPyBwcm9kdWN0LnNlbGVjdGVkVkFUIDogMCxcbiAgICAgICAgICBWQVRDb2RlOiBwcm9kdWN0LnNlbGVjdGVkVkFUQ29kZSxcbiAgICAgICAgICB0YXhMaW5lVG90YWw6IDAsXG4gICAgICAgICAgdGF4YWJsZUFtb3VudDogcHJvZHVjdC50b3RhbCxcbiAgICAgICAgICBQcmVUYXg6IDBcblxuICAgICAgICB9O1xuICAgICAgICBjb25zb2xlLmluZm8oXCJQcm9kdWN0IGNvbnRyaWJ1dGlvbiA6IGl0ZW0gbGluZSBJRCA6Y3VycmVudCB0cmFuc2FjdGlvbiBEZXRhaWxzXCIsXG4gICAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkLCBcInRheCBsaW5lIDpcIiwgSlNPTi5zdHJpbmdpZnkodGF4TGluZSksIEpTT04uc3RyaW5naWZ5KGJhc2tldERldGFpbHMuYmFza2V0VG90YWwpKTtcblxuICAgICAgICAvL3N0ZXAgMVxuICAgICAgICAvLyBpZiBUcmFuc2FjdGlvbiBEaXNjb3VudCBhbmQvb3IgcHJvbW90aW9uIGFwcGxpZWQsIGZpbmQgbmV0IHNlbGxpbmcgcHJpY2Ugb2YgZWFjaCBwcm9kdWN0IGFzIHRheGFibGVhbW91bnRcblxuICAgICAgICAvL0lmIHRyYW5zYWN0aW9uIGRpc2NvdW50L3Byb21vdGlvbiBpcyBhcHBsaWVkIHRheGFibGUgYW1vdW50IHNob3VsZCBiZSBkZWR1Y3RpbmcgdHJhbnNhY3Rpb24gcHJvbW90aW9uIGFuZCB0cmFuc2FjdGlvbiBkaXNhY291bnQgcG9ydGlvblxuICAgICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICYmIHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcblxuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IC1NYXRoLmFicyh0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMuY3VycmVudFJlZnVuZFBvcnRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IHRheExpbmUudGF4YWJsZUFtb3VudCAtIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uIC0gcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9zdGVwIDIgLSBmaW5kIHByZSB0YXhcbiAgICAgICAgdGF4TGluZS5QcmVUYXggPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMigodGF4TGluZS50YXhhYmxlQW1vdW50ICogMTAwKSAvICgxMDAgKyB0YXhMaW5lLlZBVCkpO1xuXG4gICAgICAgIC8vc3RlcCAzIC0gVXBkYXRlIHRheGJyZWFrZG93blxuICAgICAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ICs9IHRheExpbmUudGF4YWJsZUFtb3VudDtcbiAgICAgICAgdGF4TGluZS50YXhhYmxlQW1vdW50ID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4TGluZS50YXhhYmxlQW1vdW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0ZXAgNCAtIHVwZGF0ZSB0YXggTGluZSB0b3RhbFxuICAgICAgICB0YXhMaW5lLnRheExpbmVUb3RhbCA9ICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhMaW5lLnRheGFibGVBbW91bnQgLSB0YXhMaW5lLlByZVRheCk7XG4gICAgICAgIHRheEJyZWFrZG93bi50YXhMaW5lcy5wdXNoKHRheExpbmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93biA9IHRheEJyZWFrZG93bjtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcy5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgdGF4TGluZVRvdGFsIH06IGFueSkgPT4gbiArIHRheExpbmVUb3RhbCxcbiAgICAgICAgMFxuICAgICAgKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IDAuMDA7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJlQmFza2V0OmFmdGVyIGNhbGN1bGF0aW5nIHRheCBjdXJyZW50dHJhbnNhY3Rpb25EZXRhaWxzXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1RvdGFsVGF4U3VtbWFyeSgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gIFxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bikpO1xuXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUFycmF5OiBUb3RhbFRheFN1bW1hcnlbXSA9IFtdXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cblxuICAgIGNvbnNvbGUubG9nKFwiVGF4IExpbmVzIGZvciBUb3RhbCBUYXggU3VtbWVyeSA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcykpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKGVsZW1lbnQ6IHsgVkFUQ29kZTogYW55OyBWQVQ6IGFueTsgUHJlVGF4OiBhbnk7IHRheExpbmVUb3RhbDogYW55OyB9KSA9PiB7XG4gICAgICBsZXQgVGF4U3VtbWFyeTogVG90YWxUYXhTdW1tYXJ5ID0ge1xuICAgICAgICBWQVRDb2RlOlwiXCIsXG4gICAgICAgIFZBVDogLTEyMzQ1LFxuICAgICAgICBQcmVUYXhTdW06IDAsXG4gICAgICAgIFRheFN1bTogMCxcbiAgICAgICAgVFhyYXRlU3VtOiAwXG4gICAgICB9O1xuICAgICAgICBUYXhTdW1tYXJ5LlZBVENvZGU9ZWxlbWVudC5WQVRDb2RlO1xuICAgICAgICBUYXhTdW1tYXJ5LlZBVCA9IGVsZW1lbnQuVkFUOyAgICAgICAgXG4gICAgICAgXG4gICAgICAgIFRheFN1bW1hcnkuUHJlVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC5QcmVUYXgpOyAgICAgICAgXG4gICAgICAgIFRheFN1bW1hcnkuVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC50YXhMaW5lVG90YWwpO1xuICAgICAgICBUYXhTdW1tYXJ5LlRYcmF0ZVN1bSA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKFRheFN1bW1hcnkuUHJlVGF4U3VtICsgVGF4U3VtbWFyeS5UYXhTdW0pOyAgICAgXG4gICAgICAgIHRvdGFsVGF4U3VtbWFyeUFycmF5LnB1c2goVGF4U3VtbWFyeSk7XG4gICAgfSlcblxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgIFdpdGhvdXQgR3JvdXBlZCA6IFwiLCBKU09OLnN0cmluZ2lmeSh0b3RhbFRheFN1bW1hcnlBcnJheSkpO1xuICAgIFxuICAgIHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gdG90YWxUYXhTdW1tYXJ5QXJyYXkucmVkdWNlKChwcmVwYXJlZEFycmF5OmFueSxjdXJyZW50T2JqOmFueSkgPT4ge1xuICAgICAgbGV0IGluZCA9IHByZXBhcmVkQXJyYXkuZmluZEluZGV4KCh4OiB7IFZBVDogYW55OyB9KSA9PiB4LlZBVCA9PT0gY3VycmVudE9iai5WQVQpO1xuICAgICAgaWYoaW5kID09PSAtMSl7XG4gICAgICAgIHByZXBhcmVkQXJyYXkucHVzaChjdXJyZW50T2JqKVxuICAgICAgfWVsc2Uge1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUQ29kZSA9IGN1cnJlbnRPYmouVkFUQ29kZTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlZBVCA9IGN1cnJlbnRPYmouVkFUO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uUHJlVGF4U3VtICs9IGN1cnJlbnRPYmouUHJlVGF4U3VtO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVGF4U3VtICs9IGN1cnJlbnRPYmouVGF4U3VtO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVFhyYXRlU3VtICs9IGN1cnJlbnRPYmouVFhyYXRlU3VtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXBhcmVkQXJyYXk7XG4gICAgfSxbXSlcbiAgICAvLyBsaXN0T2ZUYWdzLm1hcCh4ID0+IHVuaXF1ZS5maWx0ZXIoYSA9PiBhLmxhYmVsID09IHgubGFiZWwgJiYgYS5jb2xvciA9PSB4LmNvbG9yKS5sZW5ndGggPiAwID8gbnVsbCA6IHVuaXF1ZS5wdXNoKHgpKTtcblxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgIFRheCBTdW1tZXIgR3JvdXAgOlwiLCBKU09OLnN0cmluZ2lmeSh0b3RhbFRheFN1bW1hcnlHcm91cCkpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudG90YWxUYXhTdW1tYXJ5ID0gdG90YWxUYXhTdW1tYXJ5R3JvdXA7XG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uIERpc29jdW50IFRvdGFsXG4gICAqIEByZXR1cm5zIERpc2NvdW50IFRvdGFsXG4gICAqL1xuICB1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzRGlzY291bnRUb3RhbCgpIHtcbiAgICBsZXQgcmVmdW5kVG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5yZWZ1bmRUb3RhbCA6IDA7XG5cbiAgICBjb25zb2xlLmxvZyhcImUtYmFza2V0OiB0cmFuc2FjdGlvbiBidWlsZGVyIHVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNEaXNjb3VudFRvdGFsOiBkaXNjb3VudFRvdGFsXCIsIHJlZnVuZFRvdGFsLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCk7XG4gICAgY29uc3QgZGlzY291bnRUb3RhbCA9XG4gICAgICBNYXRoLmFicyhcbiAgICAgICAgTWF0aC5hYnModGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpIC1cbiAgICAgICAgKE1hdGguYWJzKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwpICsgTWF0aC5hYnMocmVmdW5kVG90YWwpKVxuICAgICAgKTtcbiAgICBjb25zb2xlLmxvZyhcImUtYmFza2V0OiB0cmFuc2FjdGlvbiBidWlsZGVyIHVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNEaXNjb3VudFRvdGFsOiBkaXNjb3VudFRvdGFsXCIsIGRpc2NvdW50VG90YWwpXG4gICAgcmV0dXJuIE51bWJlcihkaXNjb3VudFRvdGFsLnRvRml4ZWQoMikpO1xuICB9XG5cbiAgLyoqXG4gICogY3VycmVudCB0cmFuc2FjdGlvbiBSZWZ1bmQgVG90YWxcbiAgKiBAcmV0dXJucyBSZWZ1bmQgVG90YWxcbiAgKi9cbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1JlZnVuZFRvdGFsKCkge1xuICAgIGxldCB0b3RhbFJlZnVuZCA9IDA7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcHJvZHVjdDogUHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcbiAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkVG90YWwpIHtcbiAgICAgICAgdG90YWxSZWZ1bmQgPSB0b3RhbFJlZnVuZCArIHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldCA6IHRyYW5zYWN0aW9uIFNlcnZpY2U6IHRvdGFsUmVmdW5kIGZvciBDdXJyZW50IFRyYW5zYWN0aW9uRGV0YWlsc1wiICsgdG90YWxSZWZ1bmQpXG4gICAgfVxuICAgIHJldHVybiB0b3RhbFJlZnVuZDtcbiAgfVxuXG5cblxuICAvKipcbiAgICogQmFza2V0cyBzdW1tYXJ5XG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXG4gICAqIEByZXR1cm5zIHN1bW1hcnlcbiAgICovXG4gIGJhc2tldFN1bW1hcnkoYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlU2FsZVRvdGFsKFxuICAgICAgYmFza2V0RGV0YWlsc1xuICAgICkpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID0gdGhpcy5nZXRSZWZ1bmRUb3RhbCgpO1xuICAgIGlmIChcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50IHx8XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb25cbiAgICApIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWwgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0aGlzLnVwZGF0ZURpc2NvdW50VG90YWwoKSk7XG4gICAgfVxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnRvdGFsSXRlbXMgPSBiYXNrZXREZXRhaWxzLnF1YW50aXR5O1xuXG5cbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24pIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IHRheExpbmVUb3RhbCB9OiBhbnkpID0+IG4gKyB0YXhMaW5lVG90YWwsXG4gICAgICAgIDBcbiAgICAgICkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gMC4wMDtcbiAgICB9XG5cbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiBiYXNrZXRzdW1tYXJ5IHVwZGF0ZWQgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnQ6IFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeSkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmUgRGlzY291bnRcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgbGluZSBEaXNjb3VudFxuICAgKi9cbiAgbGluZURpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xuICAgICAgaWYgKGVsZW1lbnQubGluZURpc2NvdW50KSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnB1c2goZWxlbWVudC5saW5lRGlzY291bnQpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnJlZHVjZShcbiAgICAgICAgICAoYWNjOiBhbnlbXSwgdmFsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2MuZmluZCgoZWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmluZm8oXG4gICAgICAvLyAgIFwiZS1iYXNrZXQgOmxpbmUgZGlzY291bnQgdXBkYXRlZCBpbiB0cmFuc2FjdGlvbiBkb2N1bWVudFwiLFxuICAgICAgLy8gICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudFxuICAgICAgLy8gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogZXhjaGFuZ2VcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgZXhjaGFuZ2UgXG4gICAqL1xuICBleGNoYW5nZShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZSA9IGJhc2tldERldGFpbHMuZXhjaGFuZ2UgJiYgYmFza2V0RGV0YWlscy5leGNoYW5nZS5sZW5ndGggPiAwID8gWy4uLmJhc2tldERldGFpbHMuZXhjaGFuZ2VdIDogW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJhc2tldERldGFpbHMucHJvZHVjdHMubGVuZ3RoOyBpbmRleCsrKSB7XG5cbiAgICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xuICAgICAgaWYgKGVsZW1lbnQuZXhjaGFuZ2UgIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGlzUHJlc2VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2Uuc29tZSgoZWw6IHsgZXhjaGFuZ2VJZDogYW55OyB9KSA9PiBlbC5leGNoYW5nZUlkID09PSBlbGVtZW50LmV4Y2hhbmdlLmV4Y2hhbmdlSWQpO1xuICAgICAgICBpZiAoIWlzUHJlc2VudCkge1xuICAgICAgICAgIGxldCBleGNoYW5nZUl0ZW1zID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpdGVtID0gZWxlbWVudC5leGNoYW5nZS5uZXdJdGVtc1tqXTtcbiAgICAgICAgICAgIGxldCBuZXdJdGVtczogYW55ID0geyBsaW5lSXRlbUlkOiBpdGVtLml0ZW1MaW5lSWQsIFF1YW50aXR5OiBpdGVtLnF1YW50aXR5IH1cbiAgICAgICAgICAgIGV4Y2hhbmdlSXRlbXMucHVzaChuZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsZW1lbnQuZXhjaGFuZ2UubmV3SXRlbXMgPSBbLi4uZXhjaGFuZ2VJdGVtc107XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZS5wdXNoKGVsZW1lbnQuZXhjaGFuZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgXCJlLWJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXI6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQgZXhjaGFuZ2VcIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgKiBhZGQgcHJldmlvdXMgZXhjaGFuZ2UgZGF0YVxuICAqIEBwYXJhbSBvcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnRcbiAgKiBAcmV0dXJucyBsaW5lIFByb21vdGlvbnNcbiAgKi9cbiAgYWRkRXhjaGFuZ2VEYXRhKG9yaWdpbmFsVHJhbnNhY3Rpb25Eb2N1bWVudDogVHJhbnNhY3Rpb25Eb2N1bWVudCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID0gb3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZSA/IFsuLi5vcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlXSA6IG51bGw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogbGluZSBQcm9tb3Rpb25zXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXG4gICAqIEByZXR1cm5zIGxpbmUgUHJvbW90aW9uc1xuICAgKi9cbiAgbGluZVByb21vdGlvbihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJhc2tldERldGFpbHMucHJvZHVjdHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gYmFza2V0RGV0YWlscy5wcm9kdWN0c1tpbmRleF07XG4gICAgICBpZiAoZWxlbWVudC5saW5lUHJvbW90aW9ucykge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ucHVzaChcbiAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbiA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5yZWR1Y2UoXG4gICAgICAgICAgKGFjYzogYW55W10sIHZhbDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICAgIGlmICghYWNjLmZpbmQoKGVsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4gZWwuaXRlbUxpbmVJZCA9PT0gdmFsLml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgICAgIGFjYy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgW11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogdHJhbnNhY3Rpb24gUHJvbW90aW9uXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIFByb21vdGlvblxuICAgKi9cbiAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGlmIChiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uID1cbiAgICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbjtcbiAgICAgIC8vICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGJhc2tldERldGFpbHMuVHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKGVsZW1lbnQubGluZVByb21vdGlvbnMpXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9ucy5yZWR1Y2UoKGFjYywgdmFsKSA9PiB7XG4gICAgICAvLyAgICAgaWYgKCFhY2MuZmluZChlbCA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcbiAgICAgIC8vICAgICAgIGFjYy5wdXNoKHZhbCk7XG4gICAgICAvLyAgICAgfVxuICAgICAgLy8gICAgIHJldHVybiBhY2M7XG4gICAgICAvLyAgIH0sIFtdKTtcbiAgICAgIC8vIH1cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvblwiLFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBpZiAoYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50KSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgPVxuICAgICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQ7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdHJhbnNhY3Rpb24gRGlzY291bnRcIixcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGF5bWVudHMgZGV0YWlsc1xuICAgKiBAcGFyYW0gcGF5bWVudERldGFpbHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHBheW1lbnREZXRhaWxzKHBheW1lbnREZXRhaWxzOiBhbnkpIHtcbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0IDogcGF5bWVudCBkZXRhaWxzIGFmdGVyIHRyYW5zYWN0aW9uIGNvbXBsZXRlZFwiLEpTT04uc3RyaW5naWZ5KHBheW1lbnREZXRhaWxzKSk7XG4gICAgXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzID0gcGF5bWVudERldGFpbHM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBQYXltZW50cyBkZXRhaWxzXG4gICAqIEBwYXJhbSBwYXltZW50RGV0YWlsc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgIHNwbGl0UGF5bWVudChzcGxpdFBheW1lbnQ6IGJvb2xlYW4pIHsgICAgXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnNwbGl0UGF5bWVudCA9IHNwbGl0UGF5bWVudDtcbiAgICByZXR1cm4gdGhpcztcbiAgfSBcblxuICAgLyoqXG4gICAqIFBheW1lbnRzIGRldGFpbHNcbiAgICogQHBhcmFtIHBheW1lbnREZXRhaWxzXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICAgIGlzUGF5bWVudENvbXBsZXRlZChpc1BheW1lbnRDb21wbGV0ZWQ6IGJvb2xlYW4pIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5pc1BheW1lbnRDb21wbGV0ZWQgPSBpc1BheW1lbnRDb21wbGV0ZWQ7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IFxuICBcblxuXG5cbiAgLyoqXG4gICAqIEJhc2VzIGN1cnJlbmN5XG4gICAqIEBwYXJhbSBjdXJyZW5jeVxuICAgKiBAcmV0dXJucyBjdXJyZW5jeVxuICAgKi9cbiAgYmFzZUN1cnJlbmN5KGN1cnJlbmN5OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSA9IGN1cnJlbmN5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICogZ2lmdCBvcHRpb24gYXRcbiAgKiBAcmV0dXJucyBhdFxuICAqL1xuICBnaWZ0T3B0aW9uKGdpZnQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIFwiZS1iYXNrZXQgOlRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuZ2lmdG9wdGlvblwiLFxuICAgICAgZ2lmdFxuICAgICk7XG4gICAgaWYgKGdpZnQpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5naWZ0ZWRSZWNlaXB0ID0gZ2lmdDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG5cbi8qKlxuICogbWFudWFsIERpc2NvdW50XG4gKiBAcGFyYW0gZGlzY291bnREYXRhXG4gKiBAcmV0dXJuc1xuICovXG5cbiAgLy8gbWFudWFsRGlzY291bnQoZGlzY291bnREYXRhIDogYmFza2V0RGlzY291bnQpOlRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgLy8gICBsZXQgc2FsZVRvdGFsID0gIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsO1xuICAvLyAgIGlmKGRpc2NvdW50RGF0YS5kaXNjb3VudFR5cGUgPT0nUGVyY2VudCcpe1xuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSBzYWxlVG90YWwtKHNhbGVUb3RhbCooZGlzY291bnREYXRhLmRpc2NvdW50QW1vdW50LzEwMCkpO1xuICAvLyAgICAgZGlzY291bnREYXRhLmRpc2NvdW50QW1vdW50ID0gLTEqKHNhbGVUb3RhbC10aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCk7XG4gIC8vICAgfWVsc2Uge1xuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPXNhbGVUb3RhbC1kaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQ7XG4gIC8vICAgICBkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQgPSAtMSpkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQ7XG4gIC8vICAgfVxuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbkRpc2NvdW50LnB1c2goZGlzY291bnREYXRhKTtcbiAgLy8gICByZXR1cm4gdGhpcztcblxuICAvLyB9XG5cbiAgLyoqXG4gICAqIFR5cGVzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcbiAgICogQHBhcmFtIHRcbiAgICogQHJldHVybnMgdHlwZVxuICAgKi9cbiAgdHlwZSh0OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPSB0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBPcGVyYXRpb25zIHN0YXR1c1xuICAgKiBAcGFyYW0gb1xuICAgKiBAcmV0dXJucyBzdGF0dXNcbiAgICovXG4gIG9wZXJhdGlvblN0YXR1cyhvOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9wZXJhdGlvblN0YXR1cyA9IG87XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZWQgYXRcbiAgICogQHJldHVybnMgYXRcbiAgICovXG4gIGNyZWF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXBkYXRlZEF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBVcGRhdGVkIGF0XG4gICAqIEByZXR1cm5zIGF0XG4gICAqL1xuICB1cGRhdGVkQXQoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIHRyYW5zc2FjdGlvbiBjb21wbGV0aW9uIGF0XG4gICAqIEByZXR1cm5zIHRyYW5zYWN0aW9uIGNvbXBsZXRpb24gZGF0ZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25Db21wbGV0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zQ29tcGxldGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEJ1aWxkcyB0cmFuc2FjdGlvbiBkb2N1bWVudCBidWlsZGVyXG4gICAqIEByZXR1cm5zIGJ1aWxkXG4gICAqL1xuICBidWlsZCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFNhbGVzIHRvdGFsIGluIHJlZnVuZFxuICAgKiBAcGFyYW0gc2FsZVRvdGFsXG4gICAqIEByZXR1cm5zIHRvdGFsIGluIHJlZnVuZFxuICAgKi9cbiAgc2FsZVRvdGFsSW5SZWZ1bmQoc2FsZVRvdGFsOiBudW1iZXIpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnNhbGVUb3RhbCA9IHNhbGVUb3RhbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJhc2tldCBkZXRhaWxzXG4gICAqIEByZXR1cm5zIGJhc2tldCBkZXRhaWxzXG4gICAqL1xuICBnZXRCYXNrZXREZXRhaWxzKCk6IEJhc2tldCB7XG4gICAgY29uc29sZS5pbmZvKFwiZWJhc2tldDogR2V0dGluZyBCYXNrZXQgZm9yIHRyYW5zYWN0aW9uRG9jdW1lbnRcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50KSk7XG5cbiAgICBsZXQgYmFza2V0OiBCYXNrZXQgPSB7XG4gICAgICBzdWJzaWRpYXJ5SWQgOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3Vic2lkaWFyeUlkLFxuICAgICAgdHJhbnNhY3Rpb25EaXNjb3VudDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LFxuICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24sXG4gICAgICB0cmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25JZCxcbiAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub2ZmbGluZVRyYW5zYWN0aW9uSWQsXG4gICAgICB0b3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gICAgICBiYXNrZXRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gICAgICBkaXNjb3VudFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsLFxuICAgICAgc2FsZVRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwsXG4gICAgICByZWZ1bmRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwsXG4gICAgICBxdWFudGl0eTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyxcbiAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgIGJhc2VDdXJyZW5jeTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcbiAgICAgIGN1c3RvbWVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIsXG4gICAgfTtcblxuICAgIGJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgU0tVOiBhbnk7IGJhckNvZGU6IGFueTsgYmFyY29kZXM6IGFueTsgZGVzY3JpcHRpb246IGFueTsgaW1hZ2VVcmxzOiBhbnk7IHRvdGFsTGluZVByaWNlOiBhbnk7IGl0ZW1MaW5lSWQ6IGFueTsgZXhjbHVkZVByb21vdGlvbjogYW55OyBwcmljZTogYW55OyBxdWFudGl0eTogYW55OyBzZWxlY3RlZFJSUFByaWNlOiBhbnk7IGZ1bGxmaWxtZW50SWQ6IGFueTsgZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU6IGFueTsgZGVsaXZlcnlHcm91cDogc3RyaW5nOyBsZWFkVGltZTogYW55OyBkZWxpdmVyeU1ldGhvZDogYW55OyBnaWZ0Q2FyZDogYW55OyBnaWZ0Q2FyZEV4cGlyeURhdGU6IGFueTsgZ2lmdENhcmROdW1iZXJJc3N1ZWQ6IGFueTsgZ2lmdENhcmRSZWNpcGllbnRFbWFpbDogYW55OyBnaWZ0Q2FyZFJlY2lwaWVudE5hbWU6IGFueTsgcmVmdW5kZWRUb3RhbDogYW55OyByZWZ1bmRlZFF1YW50aXR5OiBudW1iZXI7IHJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb246IGFueTsgcmVmdW5kZWRSZWFzb246IGFueTsgcmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5OiBhbnk7IGlzTGFzdEV4Y2hhbmdlZDogYW55OyB9LCBpbmRleDogYW55KSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShwcm9kdWN0KSwgXCJlYmFza2V0OiBiYXNrZXQgZGV0YWlsIHVwZGF0ZSBpbiBiYXNrZXRcIik7XG4gICAgICBjb25zdCBwID0ge30gYXMgYW55O1xuICAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcbiAgICAgIHAuYmFyY29kZSA9IHByb2R1Y3QuYmFyQ29kZTtcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xuXG4gICAgICBwLmRlc2NyaXB0aW9uID0gcHJvZHVjdC5kZXNjcmlwdGlvbjtcbiAgICAgIHAuaW1hZ2VVcmxzID0gcHJvZHVjdC5pbWFnZVVybHM7XG4gICAgICBwLmN1cnJlbmN5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcbiAgICAgIHAudG90YWxMaW5lUHJpY2UgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgcC5pdGVtTGluZUlkID0gTnVtYmVyKHByb2R1Y3QuaXRlbUxpbmVJZCk7XG4gICAgICBwLmV4Y2x1ZGVQcm9tb3Rpb24gPSBwcm9kdWN0LmV4Y2x1ZGVQcm9tb3Rpb247XG5cbiAgICAgIHAuc2VsZWN0ZWRQcmljZSA9IHByb2R1Y3QucHJpY2U7XG4gICAgICBwLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgIHAudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xuXG4gICAgICBwLmZ1bGxmaWxtZW50SWQgPSBwcm9kdWN0LmZ1bGxmaWxtZW50SWQ7XG4gICAgICBwLmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lID0gcHJvZHVjdC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZTtcbiAgICAgIHAuZGVsaXZlcnlHcm91cCA9IHByb2R1Y3QuZGVsaXZlcnlHcm91cCB8fCBcIjFcIjtcbiAgICAgIHAubGVhZFRpbWUgPSBwcm9kdWN0LmxlYWRUaW1lO1xuICAgICAgcC5kZWxpdmVyeU1ldGhvZCA9IHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgfHwgREVMSVZFUllfTUVUSE9EUy5DT0xMRUNUX0ZST01fU1RPUkUudG9TdHJpbmcoKTtcblxuICAgICAgaWYocC5mdWxsZmlsbWVudElkICE9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkKVxuICAgICAge1xuICAgICAgICBwLmlzV2ViT3JkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIFxuICAgICAgcC5naWZ0Q2FyZCA9IHByb2R1Y3QuZ2lmdENhcmQ7XG4gICAgICBwLmdpZnRDYXJkRXhwaXJ5RGF0ZSA9IHByb2R1Y3QuZ2lmdENhcmRFeHBpcnlEYXRlO1xuICAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50RW1haWwgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50RW1haWw7XG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50TmFtZSA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnROYW1lO1xuICAgICAgXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQ6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBkaXNjb3VudGVkTGluZVByaWNlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IGxpbmVEaXNjb3VudDtcbiAgICAgICAgICAgIHAudG90YWwgPSBsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbiAmJlxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5mb3JFYWNoKChsaW5lUHJvbW90aW9uOiB7IGl0ZW1MaW5lSWQ6IHsgdG9TdHJpbmc6ICgpID0+IGFueTsgfTsgcHJvbW90aW9uTGluZVByaWNlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgcC5saW5lUHJvbW90aW9ucyA9IGxpbmVQcm9tb3Rpb247XG4gICAgICAgICAgICBwLnRvdGFsID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93biAmJlxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgodGF4TGluZTogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IFZBVDogYW55OyBWQVRDb2RlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkICYmIHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gdGF4TGluZS5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHAuc2VsZWN0ZWRWQVQgPSB0YXhMaW5lLlZBVDtcbiAgICAgICAgICAgIHAuc2VsZWN0ZWRWQVRDb2RlID0gdGF4TGluZS5WQVRDb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQpIHtcbiAgICAgICAgcC50b3RhbCA9IHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EIHx8IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xuICAgICAgICBwLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb247XG4gICAgICAgIHAucmVmdW5kZWRSZWFzb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uO1xuICAgICAgICBpZiAoIXAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xuICAgICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHAucmVmdW5kZWRSZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xuICAgICAgICBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eTtcbiAgICAgICAgcC5yZWZ1bmRlZFRvdGFsID0gcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuICAgICAgICBwLnRvdGFsIC09IE1hdGguYWJzKHAucmVmdW5kZWRUb3RhbCk7XG4gICAgICAgIHAuaXNMYXN0RXhjaGFuZ2VkID0gcHJvZHVjdC5pc0xhc3RFeGNoYW5nZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQpIHtcbiAgICAgICAgaWYgKHAudG90YWwgPiAwKSB7XG4gICAgICAgICAgcC50b3RhbCAqPSAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBiYXNrZXQucHJvZHVjdHMucHVzaChwKTtcblxuICAgIH0pO1xuXG4gICAgYmFza2V0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkRpc2NvdW50QW5kVHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uKGJhc2tldCk7XG4gICAgYmFza2V0LnRvdGFsID0gKGJhc2tldC5iYXNrZXRUb3RhbCB8fCAwKSArIHRoaXMuZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0KTtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9SRUZVTkQpIHtcbiAgICAgIGJhc2tldC5xdWFudGl0eSA9IHRoaXMuZ2V0UmVmdW5kZWRUb3RhbFdpdGhRdWFudGl0eShiYXNrZXQpO1xuICAgIH1cbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiBCYXNrZXQgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIiwgSlNPTi5zdHJpbmdpZnkoYmFza2V0KSlcbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcbiAgICogQHJldHVybnMgcmVmdW5kIGJhc2tldCBkZXRhaWxzXG4gICAqL1xuICAvLyBnZXRSZWZ1bmRCYXNrZXREZXRhaWxzKCk6IEJhc2tldCB7XG4gIC8vICAgbGV0IGJhc2tldDogQmFza2V0ID0ge1xuICAvLyAgICAgc3Vic2lkaWFyeUlkIDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN1YnNpZGlhcnlJZCxcbiAgLy8gICAgIHRyYW5zYWN0aW9uRGlzY291bnQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCxcbiAgLy8gICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLFxuICAvLyAgICAgdHJhbnNhY3Rpb25JZDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zYWN0aW9uSWQsXG4gIC8vICAgICB0b3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gIC8vICAgICBiYXNrZXRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gIC8vICAgICBkaXNjb3VudFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsLFxuICAvLyAgICAgc2FsZVRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwsXG4gIC8vICAgICBxdWFudGl0eTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyxcbiAgLy8gICAgIHByb2R1Y3RzOiBbXSxcbiAgLy8gICAgIGJhc2VDdXJyZW5jeTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcbiAgLy8gICAgIGN1c3RvbWVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIsXG4gIC8vICAgfTtcblxuICAvLyAgIGJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcbiAgLy8gICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgU0tVOiBhbnk7IGJhckNvZGU6IGFueTsgYmFyY29kZXM6IGFueTsgZGVzY3JpcHRpb246IGFueTsgaW1hZ2VVcmxzOiBhbnk7IHRvdGFsTGluZVByaWNlOiBhbnk7IGl0ZW1MaW5lSWQ6IGFueTsgZXhjbHVkZVByb21vdGlvbjogYW55OyBwcmljZTogbnVtYmVyOyBxdWFudGl0eTogYW55OyBzZWxlY3RlZFJSUFByaWNlOiBhbnk7IGZ1bGxmaWxtZW50SWQ6IGFueTsgZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU6IGFueTsgZGVsaXZlcnlHcm91cDogc3RyaW5nOyBsZWFkVGltZTogYW55OyBkZWxpdmVyeU1ldGhvZDogYW55OyBnaWZ0Q2FyZDogYW55OyBnaWZ0Q2FyZEV4cGlyeURhdGU6IGFueTsgZ2lmdENhcmROdW1iZXJJc3N1ZWQ6IGFueTsgZ2lmdENhcmRSZWNpcGllbnRFbWFpbDogYW55OyBnaWZ0Q2FyZFJlY2lwaWVudE5hbWU6IGFueTsgaXRlbURpc2NvdW50czogYW55OyByZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHk6IGFueTsgcmVmdW5kZWRRdWFudGl0eTogbnVtYmVyOyByZWZ1bmRlZDogYW55OyBpc0xhc3RFeGNoYW5nZWQ6IGFueTsgZXhjaGFuZ2U6IGFueTsgcmVmdW5kZWRUb3RhbDogbnVtYmVyOyB9LCBpbmRleDogYW55KSA9PiB7XG4gIC8vICAgICBjb25zdCBwID0ge30gYXMgUHJvZHVjdDtcbiAgLy8gICAgIHAuU0tVID0gcHJvZHVjdC5TS1U7XG4gIC8vICAgICBwLmJhcmNvZGUgPSBwcm9kdWN0LmJhckNvZGU7XG4gIC8vICAgICBwLmJhcmNvZGVzID0gcHJvZHVjdC5iYXJjb2RlcztcblxuICAvLyAgICAgcC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb247XG4gIC8vICAgICBwLmltYWdlVXJscyA9IHByb2R1Y3QuaW1hZ2VVcmxzO1xuICAvLyAgICAgcC5jdXJyZW5jeSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3k7XG4gIC8vICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgLy8gICAgIHAuaXRlbUxpbmVJZCA9IE51bWJlcihwcm9kdWN0Lml0ZW1MaW5lSWQpO1xuICAvLyAgICAgcC5leGNsdWRlUHJvbW90aW9uID0gcHJvZHVjdC5leGNsdWRlUHJvbW90aW9uO1xuXG4gIC8vICAgICBwLnNlbGVjdGVkUHJpY2UgPSBwcm9kdWN0LnByaWNlO1xuICAvLyAgICAgcC5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XG4gIC8vICAgICBwLnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcbiAgLy8gICAgIHAuc2VsZWN0ZWRSUlBQcmljZSA9IHByb2R1Y3Quc2VsZWN0ZWRSUlBQcmljZTtcblxuICAvLyAgICAgcC5mdWxsZmlsbWVudElkID0gcHJvZHVjdC5mdWxsZmlsbWVudElkO1xuICAvLyAgICAgcC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZSA9IHByb2R1Y3QuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU7XG4gIC8vICAgICBwLmRlbGl2ZXJ5R3JvdXAgPSBwcm9kdWN0LmRlbGl2ZXJ5R3JvdXAgfHwgXCIxXCI7XG4gIC8vICAgICBwLmxlYWRUaW1lID0gcHJvZHVjdC5sZWFkVGltZTtcbiAgLy8gICAgIHAuZGVsaXZlcnlNZXRob2QgPSBwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kIHx8IERFTElWRVJZX01FVEhPRFMuQ09MTEVDVF9GUk9NX1NUT1JFLnRvU3RyaW5nKCk7XG5cbiAgLy8gICAgIHAuZ2lmdENhcmQgPSBwcm9kdWN0LmdpZnRDYXJkO1xuICAvLyAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcbiAgLy8gICAgIHAuZ2lmdENhcmROdW1iZXJJc3N1ZWQgPSBwcm9kdWN0LmdpZnRDYXJkTnVtYmVySXNzdWVkO1xuICAvLyAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsO1xuICAvLyAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcbiAgICAgIFxuICAgICAgXG4gIC8vICAgICBpZihwLmZ1bGxmaWxtZW50SWQgIT0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQpXG4gIC8vICAgICB7XG4gIC8vICAgICAgIHAuaXNXZWJPcmRlciA9IHRydWU7XG4gIC8vICAgICB9XG4gICAgICBcbiAgLy8gICAgIGlmIChwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcbiAgLy8gICAgICAgcC5pdGVtRGlzY291bnRzID0gcHJvZHVjdC5pdGVtRGlzY291bnRzIGFzIEl0ZW1EaXNjb3VudDtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gaWYoIXAuaXRlbURpc2NvdW50cyl7XG4gIC8vICAgICAvLyAgIGNvbnNvbGUubG9nKHAuaXRlbURpc2NvdW50cyk7XG5cbiAgLy8gICAgIC8vICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb24oYmFza2V0KTtcbiAgLy8gICAgIC8vIH1cbiAgLy8gICAgIHAucmVmdW5kUHJvbW90aW9uYWxRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHkgOiAwO1xuXG4gIC8vICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XG4gIC8vICAgICAgIHAucXVhbnRpdHkgPSBwLnF1YW50aXR5IC0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xuICAvLyAgICAgICBwLnRvdGFsTGluZVByaWNlID0gKHAucXVhbnRpdHkgKiBwcm9kdWN0LnByaWNlKTtcbiAgLy8gICAgICAgcC50b3RhbCA9IHAudG90YWxMaW5lUHJpY2U7XG4gIC8vICAgICAgIC8vIHAucmVmdW5kUHJvbW90aW9uYWxRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5O1xuICAvLyAgICAgICBwLnJlZnVuZGVkID0gcHJvZHVjdC5yZWZ1bmRlZDtcbiAgLy8gICAgICAgcC5pc0xhc3RFeGNoYW5nZWQgPSBwcm9kdWN0LmlzTGFzdEV4Y2hhbmdlZDtcbiAgLy8gICAgIH1cbiAgLy8gICAgIGlmIChwcm9kdWN0LmV4Y2hhbmdlKSB7XG4gIC8vICAgICAgIHAuZXhjaGFuZ2UgPSBwcm9kdWN0LmV4Y2hhbmdlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcbiAgLy8gICAgICkge1xuXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZvckVhY2goKGxpbmVEaXNjb3VudDogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IGRpc2NvdW50ZWRMaW5lUHJpY2U6IGFueTsgfSkgPT4ge1xuXG4gIC8vICAgICAgICAgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSAmJiBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPiAwKSB7XG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IE9iamVjdC5hc3NpZ24oe30sIGxpbmVEaXNjb3VudCk7XG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlID0gcC5saW5lRGlzY291bnQudW5pdFByaWNlICogcC5xdWFudGl0eVxuICAvLyAgICAgICAgICAgcC5saW5lRGlzY291bnQuZGlzY291bnRBbW91bnQgPSBwLnRvdGFsIC0gcC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZVxuICAvLyAgICAgICAgICAgcC50b3RhbCA9IHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XG4gIC8vICAgICAgICAgfSBlbHNlIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50ID0gbGluZURpc2NvdW50O1xuICAvLyAgICAgICAgICAgcC50b3RhbCA9IGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlXG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9KTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgaWYgKFxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gJiZcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgLy8gICAgICkge1xuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IHJlZnVuZGVkOiBhbnk7IH0pID0+IHtcbiAgLy8gICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSAmJiAhbGluZVByb21vdGlvbi5yZWZ1bmRlZCkge1xuICAvLyAgICAgICAgICAgcC5saW5lUHJvbW90aW9ucyA9IGxpbmVQcm9tb3Rpb247XG4gIC8vICAgICAgICAgICBwLnRvdGFsID0gcC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gIC8vICAgICAgICAgICBwLnRvdGFsID0gcC50b3RhbCAtIChwcm9kdWN0LnJlZnVuZGVkVG90YWwgPyBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwpIDogMCk7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9KTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gMDtcbiAgLy8gICAgIHAucmVmdW5kZWRUb3RhbCA9IDA7XG5cbiAgLy8gICAgIGlmIChcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24gJiZcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMubGVuZ3RoID4gMFxuICAvLyAgICAgKSB7XG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKHRheExpbmU6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBWQVQ6IGFueTsgVkFUQ29kZTogYW55OyB9KSA9PiB7XG4gIC8vICAgICAgICAgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gdGF4TGluZS5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcbiAgLy8gICAgICAgICAgIHAuc2VsZWN0ZWRWQVQgPSB0YXhMaW5lLlZBVDtcbiAgLy8gICAgICAgICAgIHAuc2VsZWN0ZWRWQVRDb2RlID0gdGF4TGluZS5WQVRDb2RlO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmIChwLnF1YW50aXR5ID4gMCkge1xuICAvLyAgICAgICBiYXNrZXQucHJvZHVjdHMucHVzaChwKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KTtcbiAgLy8gICAvLyBwcm9kdWN0Lml0ZW1EaXNjb3VudHNcbiAgLy8gICBpZiAoIWJhc2tldC5wcm9kdWN0c1swXS5oYXNPd25Qcm9wZXJ0eSgnaXRlbURpc2NvdW50cycpKSB7XG4gIC8vICAgICBiYXNrZXQgPSB0aGlzLmdldFRyYW5zYWN0aW9uRGlzY291bnRBbmRUcmFuc2FjdGlvblByb21vdGlvblBvcnRpb24oYmFza2V0KTtcblxuICAvLyAgIH1cblxuICAvLyAgIGNvbnNvbGUubG9nKFwiZWJhc2tldCA6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyICA6bmV3IGNyZWF0ZWQgcmVmdW5kZWQgYmFza2V0XCIsIEpTT04uc3RyaW5naWZ5KGJhc2tldCkpXG4gIC8vICAgYmFza2V0LnF1YW50aXR5ID0gYmFza2V0LnByb2R1Y3RzLnJlZHVjZShcbiAgLy8gICAgIChuOiBhbnksIHsgcXVhbnRpdHkgfTogYW55KSA9PiBuICsgcXVhbnRpdHksXG4gIC8vICAgICAwXG4gIC8vICAgKTtcbiAgLy8gICBiYXNrZXQudG90YWwgPSB0aGlzLmdldFRvdGFsV2l0aExpbmVEaXNjb3VudEFuZExpbmVQcm9tb3Rpb25BcHBsaWVkKGJhc2tldCk7XG4gIC8vICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xuICAvLyAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIHRoaXMuZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0KTtcbiAgLy8gICBjb25zb2xlLmxvZyhcbiAgLy8gICAgIFwiZWJhc2tldCA6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIDogdXBkYXRlIEJhc2tldCBUb3RhbDogYWZ0ZXIgcHJvbW90aW9uIDpiYXNrZXRUb3RhbFwiLFxuICAvLyAgICAgYmFza2V0LmJhc2tldFRvdGFsXG4gIC8vICAgKTtcblxuICAvLyAgIGNvbnNvbGUubG9nKFxuICAvLyAgICAgXCJlOmJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgOiBiYXNrZXREZXRhaWxzIHVwZGF0ZWQgdmFsdWVzXCIsXG4gIC8vICAgICBKU09OLnN0cmluZ2lmeShiYXNrZXQpXG4gIC8vICAgKTtcbiAgLy8gICByZXR1cm4gYmFza2V0O1xuICAvLyB9XG5cblxuICBnZXRUcmFuc2FjdGlvbkRpc2NvdW50QW5kVHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uKGJhc2tldDphbnkpIHtcbiAgICBpZiAoXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMFxuICAgICkge1xuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgaXRlbUxpbmVJZHM6IGFueTsgfSkgPT4ge1xuICAgICAgICBpZiAoIWRpc2NvdW50Lml0ZW1MaW5lSWRzKSB7XG4gICAgICAgICAgZGlzY291bnQuaXRlbUxpbmVJZHMgPSBiYXNrZXQucHJvZHVjdHMubWFwKChwcm9kdWN0OiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJhc2tldCA9IHRoaXMuYmFza2V0U2VydmljZS50cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgZGlzY291bnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJlxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiB7IGl0ZW1MaW5lSWRzOiBhbnk7IH0pID0+IHtcbiAgICAgICAgaWYgKCF0UHJvbW90aW9uLml0ZW1MaW5lSWRzKSB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gYmFza2V0LnByb2R1Y3RzLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtOiB7IGV4Y2x1ZGVQcm9tb3Rpb246IGJvb2xlYW47IH0pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZXhjbHVkZVByb21vdGlvbiA9PT0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRQcm9tb3Rpb24uaXRlbUxpbmVJZHMgPVxuICAgICAgICAgICAgZmlsdGVyZWREYXRhLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYmFza2V0ID0gdGhpcy5iYXNrZXRTZXJ2aWNlLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgdFByb21vdGlvbik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmFza2V0O1xuICB9XG5cblxuICBnZXRUb3RhbERpc2NvdW50V2l0aFRyYW5zYWN0aW9uRGlzY291bnRzQW5kUHJvbW90aW9ucyhiYXNrZXREZXRhaWxzOiBhbnkpIHtcblxuICAgIGxldCBkaXNjb3VudFRvdGFsID0gMDtcbiAgICBpZiAoXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGRpc2NvdW50VG90YWwgKz0gYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgMFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMFxuICAgICkge1xuXG4gICAgICBkaXNjb3VudFRvdGFsICs9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgZGlzY291bnRBbW91bnQgfTogYW55KSA9PiBuICsgZGlzY291bnRBbW91bnQsXG4gICAgICAgIDBcbiAgICAgICk7XG5cblxuICAgIH1cbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciA6IFRyYW5zYWN0aW9uIGRpc2NvdW50IFRvdGFsOlwiLCBkaXNjb3VudFRvdGFsKTtcblxuICAgIHJldHVybiBkaXNjb3VudFRvdGFsO1xuICB9XG5cblxuICBhcHBlbmRDdXJyZW5jeVN5bWJvbChjdXJyZW5jeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgLy8gIHZhbHVlPXRoaXMuZGVjaW1hbHBpcGUudHJhbnNmb3JtKHZhbHVlLCcxLjInKTtcbiAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgY29uc3QgcmV0dXJudmFsID0gY3VycmVuY3kgKyB2YWx1ZTtcbiAgICAgIGNvbnNvbGUubG9nKHJldHVybnZhbCwgXCJlYmFza2V0OiBhZGQgY3VycmVuY3kgd2l0aCB2YWx1ZVwiKTtcbiAgICAgIHJldHVybiByZXR1cm52YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJldHVybnZhbCA9IFwiLVwiICsgKGN1cnJlbmN5ICsgdmFsdWUgKiAtMSk7XG4gICAgICBjb25zb2xlLmxvZyhyZXR1cm52YWwsIFwiLShjdXJyZW5jeSsodmFsdWUqLTEpKVwiKTtcbiAgICAgIHJldHVybiByZXR1cm52YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gLyoqXG4gIC8vICAqIFVwZGF0ZXMgdG90YWwgcmVmdW5kXG4gIC8vICAqIEByZXR1cm5zIHRvdGFsIHJlZnVuZFxuICAvLyAgKi9cbiAgLy8gdXBkYXRlVG90YWxSZWZ1bmQoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAvLyAgICAgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWRUb3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2UgKiAtMTtcbiAgLy8gICAgIGNvbnNvbGUubG9nKFxuICAvLyAgICAgICBcImViYXNrZXQ6IFRyYW5zYWN0aW9uIHByaWNlIG92ZXJyaWRlIDpcIixcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcbiAgLy8gICAgICk7XG5cbiAgLy8gICAgIGlmIChcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uICYmXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwXG4gIC8vICAgICApIHtcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb24pID0+IHtcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcbiAgLy8gICAgICAgICAgIFwiUHJvbW90aW9uOiBiYXNrZXQgbGluZVByb21vdGlvbiA6IFwiLFxuICAvLyAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcbiAgLy8gICAgICAgICAgIFwibGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIixcbiAgLy8gICAgICAgICAgIGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcbiAgLy8gICAgICAgICAgIFwiY29uZGl0aW9uIDogXCIgK1xuICAvLyAgICAgICAgICAgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkpXG4gIC8vICAgICAgICAgKTtcblxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gIC8vICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPVxuICAvLyAgICAgICAgICAgICBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZSAqIC0xO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICB9IGVsc2VcbiAgLy8gICAgICAgaWYgKFxuICAvLyAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXG4gIC8vICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQubGVuZ3RoID4gMFxuICAvLyAgICAgICApIHtcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQpID0+IHtcbiAgLy8gICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAvLyAgICAgICAgICAgICBcInByb2R1Y3QuaXRlbUxpbmVJZCA6IFwiICtcbiAgLy8gICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcbiAgLy8gICAgICAgICAgICk7XG4gIC8vICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgLy8gICAgICAgICAgICAgXCJsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpIDogXCIgK1xuICAvLyAgICAgICAgICAgICBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpXG4gIC8vICAgICAgICAgICApO1xuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXG4gIC8vICAgICAgICAgICAgIFwiY29uZGl0aW9uIDogXCIgK1xuICAvLyAgICAgICAgICAgICAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKVxuICAvLyAgICAgICAgICAgKTtcblxuICAvLyAgICAgICAgICAgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xuICAvLyAgICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBsaW5lRGlzY291bnQudW5pdFByaWNlICogcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICogLTE7XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSk7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgY29uc29sZS5sb2coXCJQcm9kdWN0IGRlc2NyaXB0aW9uIDpcIiArIHByb2R1Y3QuZGVzY3JpcHRpb24pO1xuICAvLyAgICAgY29uc29sZS5sb2coXCJQcm9kdWN0IHRvdGFsIDpcIiArIHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XG4gIC8vICAgICAvLyBwcm9kdWN0LmRpc3BsYXlyZWZ1bmRlZGFtb3VudD10aGlzLmFwcGVuZEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZW3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ldLHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XG4gIC8vICAgICAvLyBjb25zb2xlLmxvZyhwcm9kdWN0LmRpc3BsYXlyZWZ1bmRlZGFtb3VudCxcImRpc3BsYXlyZWZ1bmRlZGFtb3VudFwiKTtcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xuICAvLyAgIH0pO1xuICAvLyAgIGNvbnN0IGJhc2tldHRvdGFsID0gKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsICo9IC0xKTtcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5YmFza2V0dG90YWw9dGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgYmFza2V0dG90YWwpO1xuICAvLyAgIGNvbnN0IHNhbGV0b3RhbCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwgKj0gLTEpO1xuICAvLyAgIC8vIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc3BsYXlzYWxldG90YWwgPSB0aGlzLmFwcGVuZEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZW3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ldLCBzYWxldG90YWwpO1xuICAvLyAgICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCAqPSAtMSk7XG4gIC8vICAgcmV0dXJuIHRoaXM7XG4gIC8vIH1cblxuICAvKipcbiAgICogU2FsZSBUb3RhbFxuICAgKiBAcGFyYW0gYmFza2V0RGV0YWlsc1xuICAgKiBAcmV0dXJucyBTYWxlIFRvdGFsXG4gICAqL1xuICB1cGRhdGVTYWxlVG90YWwoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55W107IH0pIHtcbiAgICBjb25zdCBzYWxlVG90YWwgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLnJlZHVjZShcbiAgICAgIChuOiBhbnksIHsgdG90YWxMaW5lUHJpY2UgfTogYW55KSA9PiBuICsgdG90YWxMaW5lUHJpY2UsXG4gICAgICAwXG4gICAgKTtcbiAgICByZXR1cm4gc2FsZVRvdGFsXG4gIH1cblxuICBnZXRUb3RhbFdpdGhMaW5lRGlzY291bnRBbmRMaW5lUHJvbW90aW9uQXBwbGllZChiYXNrZXREZXRhaWxzOiB7IHByb2R1Y3RzOiBhbnk7IH0pOiBudW1iZXIge1xuICAgIGxldCBzYWxldG90YWw6IG51bWJlciA9IDAuMDtcbiAgICBmb3IgKGxldCBwcm9kdWN0IG9mIGJhc2tldERldGFpbHMucHJvZHVjdHMpIHtcbiAgICAgIC8vIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAvLyAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgIC8vIH0gZWxzZSBpZiAoXG4gICAgICAvLyAgIHByb2R1Y3QubGluZURpc2NvdW50ICYmXG4gICAgICAvLyAgICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zXG4gICAgICAvLyApIHtcbiAgICAgIC8vICAgc2FsZXRvdGFsICs9XG4gICAgICAvLyAgICAgcHJvZHVjdC5xdWFudGl0eSAqIE51bWJlcihwcm9kdWN0LmxpbmVEaXNjb3VudC51bml0UHJpY2UudG9GaXhlZCgyKSk7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBzYWxldG90YWwgKz1cbiAgICAgIC8vICAgICBwcm9kdWN0LnF1YW50aXR5ICogTnVtYmVyKHByb2R1Y3Quc2VsZWN0ZWRQcmljZS50b0ZpeGVkKDIpKTtcbiAgICAgIC8vIH1cbiAgICAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LnRvdGFsO1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIFwiZS1iYXNrZXQ6dXBkYXRlIHByb2R1Y3QgVG90YWw6XCIgKyBzYWxldG90YWwsXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHByb2R1Y3QpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2FsZXRvdGFsO1xuICB9XG5cbiAgZ2V0UmVmdW5kZWRUb3RhbFdpdGhRdWFudGl0eShiYXNrZXREZXRhaWxzOiB7IHByb2R1Y3RzOiBzdHJpbmcgfCBhbnlbXTsgfSk6IG51bWJlciB7XG4gICAgbGV0IHF1YW50aXR5ID0gMDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHByb2R1Y3Q6IGFueSA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xuXG4gICAgICBpZiAoIXByb2R1Y3QucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xuXG4gICAgICAgIHF1YW50aXR5ID0gcXVhbnRpdHkgKyBwcm9kdWN0LnF1YW50aXR5O1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWFudGl0eSA9IHF1YW50aXR5ICsgKHByb2R1Y3QucXVhbnRpdHkgLSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpO1xuXG4gICAgICAgIC8vIGJhc2tldERldGFpbHMudG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsICsgcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWFudGl0eTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdW50IFRvdGFsXG4gICAqIEByZXR1cm5zIERpc2NvdW50IFRvdGFsXG4gICAqL1xuICB1cGRhdGVEaXNjb3VudFRvdGFsKCkge1xuICAgIGxldCByZWZ1bmRUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xuICAgIGNvbnNvbGUuaW5mbyhcImUtYmFza2V0OiB0cmFuc2FjdGlvbiBidWlsZGVyOiByZWZ1bmRUb3RhbFwiLCBKU09OLnN0cmluZ2lmeShyZWZ1bmRUb3RhbCksXG4gICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeSkpO1xuICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPVxuICAgICAgTWF0aC5hYnMoXG4gICAgICAgIE1hdGguYWJzKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCkgLVxuICAgICAgICAoXG4gICAgICAgICAgTWF0aC5hYnModGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwpICsgTWF0aC5hYnMocmVmdW5kVG90YWwpXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgY29uc29sZS5sb2coXCJlLWJhc2tldDogdHJhbnNhY3Rpb24gYnVpbGRlcjogZGlzY291bnRUb3RhbFwiLCBKU09OLnN0cmluZ2lmeShkaXNjb3VudFRvdGFsKSlcbiAgICByZXR1cm4gTnVtYmVyKGRpc2NvdW50VG90YWwudG9GaXhlZCgyKSk7XG4gIH1cblxuICB1cGRhdGVSZWFzb25Db2RlKHJlYXNvbkNvZGU6IHtcbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICB9KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5yZWFzb25Db2RlID0gcmVhc29uQ29kZS5jb2RlO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5yZWFzb25EZXNjcmlwdGlvbiA9IHJlYXNvbkNvZGUubmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZU1hbmFnZXJPdmVycmlkZShcbiAgICB1c2Vyb3ZlcnJpZGU6IFVzZXJPdmVycmlkZVxuICApOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm92ZXJyaWRlID0gdXNlcm92ZXJyaWRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlVXNlcklEKFxuICAgIHVzZXJJRDogc3RyaW5nXG4gICk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlcklkID0gdXNlcklEO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlVXNlck5hbWUobmFtZTogYW55KSA6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUgPSBuYW1lO1xuICAgIHJldHVybiB0aGlzO1xuXG4gIH1cbiAgXG4gIGFkZEN1c3RvbWVyRGV0YWlscyhjdXN0b21lckRldGFpbDogQ3VzdG9tZXIpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1c3RvbWVyID0gY3VzdG9tZXJEZXRhaWw7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVUYXhCcmVha2Rvd24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIC8vIGxldCB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgPSAwO1xuICAgIGxldCB0YXhCcmVha2Rvd246IFRheEJyZWFrZG93biA9IHtcbiAgICAgIHRheExpbmVzOiBbXSxcbiAgICAgIHRvdGFsVGF4YWJsZUFtb3VudDogMCxcbiAgICB9O1xuXG5cblxuICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChkaXNjb3VudCkgPT4ge1xuICAgIC8vICAgICB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XG4gICAgLy8gICB9KTtcbiAgICAvLyB9XG5cbiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaChcbiAgICAvLyAgICAgKHByb21vdGlvbikgPT4ge1xuICAgIC8vICAgICAgIHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCArPSBwcm9tb3Rpb24ucHJvbW90aW9uQW1vdW50O1xuICAgIC8vICAgICB9XG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIGJhc2tldERldGFpbHMucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XG4gICAgICBsZXQgdGF4TGluZTogVGF4TGluZSA9IHtcbiAgICAgICAgaXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtTGluZUlkLFxuICAgICAgICBWQVQ6IHByb2R1Y3Quc2VsZWN0ZWRWQVQgPyBwcm9kdWN0LnNlbGVjdGVkVkFUIDogMCxcbiAgICAgICAgVkFUQ29kZTogcHJvZHVjdC5zZWxlY3RlZFZBVENvZGUsXG4gICAgICAgIHRheExpbmVUb3RhbDogMCxcbiAgICAgICAgdGF4YWJsZUFtb3VudDogcHJvZHVjdC50b3RhbCxcbiAgICAgICAgUHJlVGF4OiAwXG4gICAgICB9O1xuICAgICAgY29uc29sZS5pbmZvKFwiUHJvZHVjdCBjb250cmlidXRpb24gOiBpdGVtIGxpbmUgSUQgOlwiLCBwcm9kdWN0Lml0ZW1MaW5lSWQsXG4gICAgICAgIFwidGF4IGxpbmUgOlwiLCBKU09OLnN0cmluZ2lmeSh0YXhMaW5lKSk7XG5cbiAgICAgIC8vIHN0ZXAgMVxuICAgICAgLy8gaWYgVHJhbnNhY3Rpb24gRGlzY291bnQgYW5kL29yIHByb21vdGlvbiBhcHBsaWVkLCBmaW5kIG5ldCBzZWxsaW5nIHByaWNlIG9mIGVhY2ggcHJvZHVjdCBhcyB0YXhhYmxlYW1vdW50XG4gICAgICAvLyBpZiAodHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID4gMCkge1xuICAgICAgcHJvZHVjdCA9IHRoaXMuYmFza2V0U2VydmljZS52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdCk7XG5cbiAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gK1xuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gLVxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbjtcbiAgICAgIC8vICB0cCt0ZC1ycDtcblxuICAgICAgY29uc29sZS5pbmZvKFwiUHJvZHVjdCBjb250cmlidXRpb24gOiBpdGVtIGxpbmUgSUQgOlwiLCBwcm9kdWN0Lml0ZW1MaW5lSWQsXG4gICAgICAgIFwiY29udHJpYnV0aW9uIDpcIiwgSlNPTi5zdHJpbmdpZnkocHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwpKTtcbiAgICAgIC8vIGNhbGN1bGF0ZSBuZXQgc2VsbGluZyBwcmljZSBhZnRlciBhcHBseWluZyB0cmFuc2FjdGlvbiBkaXNjb3VudCBhcyBwZXIgcHJvZHVjdCBjb250cmlidXRpb25cbiAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCAtPSBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbDtcbiAgICAgIC8vIH1cblxuICAgICAgLy9zdGVwIDIgLSBmaW5kIHByZSB0YXhcbiAgICAgIHRheExpbmUuUHJlVGF4ID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoKHRheExpbmUudGF4YWJsZUFtb3VudCAqIDEwMCkgLyAoMTAwICsgdGF4TGluZS5WQVQpKTtcblxuICAgICAgLy9zdGVwIDMgLSBVcGRhdGUgdGF4YnJlYWtkb3duXG4gICAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ICs9IHRheExpbmUudGF4YWJsZUFtb3VudDtcbiAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCk7XG4gICAgICBcbiAgICAgIC8vIHN0ZXAgNCAtIHVwZGF0ZSB0YXggTGluZSB0b3RhbFxuICAgICAgdGF4TGluZS50YXhMaW5lVG90YWwgPSAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4TGluZS50YXhhYmxlQW1vdW50IC0gdGF4TGluZS5QcmVUYXgpO1xuICAgICAgdGF4QnJlYWtkb3duLnRheExpbmVzLnB1c2godGF4TGluZSk7XG4gICAgfSk7XG5cbiAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24gPSB0YXhCcmVha2Rvd247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVUb3RhbFRheFN1bW1hcnkoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuXG4gICAgY29uc29sZS5sb2coXCJUb3RhbCBUYXggU3VtbWVyeSBSZXF1ZXN0IDpcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24pKTtcblxuXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUFycmF5OiBUb3RhbFRheFN1bW1hcnlbXSA9IFtdXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cblxuICAgIGNvbnNvbGUubG9nKFwiVGF4IExpbmVzIGZvciBUb3RhbCBUYXggU3VtbWVyeSA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzKSk7XG5cblxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKGVsZW1lbnQ6IHsgVkFUQ29kZTogYW55OyBWQVQ6IGFueTsgUHJlVGF4OiBhbnk7IHRheExpbmVUb3RhbDogYW55OyB9KSA9PiB7XG4gICAgICBsZXQgVGF4U3VtbWFyeTogVG90YWxUYXhTdW1tYXJ5ID0ge1xuICAgICAgICBWQVRDb2RlOiBcIlwiLFxuICAgICAgICBWQVQ6IC0xMjM0NSxcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxuICAgICAgICBUYXhTdW06IDAsXG4gICAgICAgIFRYcmF0ZVN1bTogMFxuICBcbiAgICAgIH07XG4gICAgICAgVGF4U3VtbWFyeS5WQVRDb2RlID0gZWxlbWVudC5WQVRDb2RlO1xuICAgICAgICBUYXhTdW1tYXJ5LlZBVCA9IGVsZW1lbnQuVkFUOyAgICAgICAgXG4gICAgICAgIFRheFN1bW1hcnkuUHJlVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC5QcmVUYXgpO1xuICAgICAgICBUYXhTdW1tYXJ5LlRheFN1bSA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKGVsZW1lbnQudGF4TGluZVRvdGFsKTtcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgICBcbiAgICAgICAgdG90YWxUYXhTdW1tYXJ5QXJyYXkucHVzaChUYXhTdW1tYXJ5KTtcbiAgICB9KVxuXG4gICAgY29uc29sZS5sb2coXCJUb3RhbCBUYXggU3VtbWVyeSAgV2l0aG91dCBHcm91cGVkIDogXCIsIEpTT04uc3RyaW5naWZ5KHRvdGFsVGF4U3VtbWFyeUFycmF5KSk7XG4gICAgXG4gICAgdG90YWxUYXhTdW1tYXJ5R3JvdXAgPSB0b3RhbFRheFN1bW1hcnlBcnJheS5yZWR1Y2UoKHByZXBhcmVkQXJyYXk6YW55LGN1cnJlbnRPYmopID0+IHtcblxuICAgICAgbGV0IGluZCA9IHByZXBhcmVkQXJyYXkuZmluZEluZGV4KCh4OiB7IFZBVDogYW55OyB9KSA9PiB4LlZBVCA9PT0gY3VycmVudE9iai5WQVQpO1xuICAgICAgaWYoaW5kID09PSAtMSl7XG4gICAgICAgIHByZXBhcmVkQXJyYXkucHVzaChjdXJyZW50T2JqKVxuICAgICAgfWVsc2Uge1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUQ29kZSA9IGN1cnJlbnRPYmouVkFUQ29kZTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlZBVCA9IGN1cnJlbnRPYmouVkFUO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uUHJlVGF4U3VtICs9IGN1cnJlbnRPYmouUHJlVGF4U3VtO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVGF4U3VtICs9IGN1cnJlbnRPYmouVGF4U3VtO1xuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVFhyYXRlU3VtICs9IGN1cnJlbnRPYmouVFhyYXRlU3VtO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXBhcmVkQXJyYXk7XG4gICAgfSxbXSlcbiAgICBcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsICBUYXggU3VtbWVyIEdyb3VwIDpcIix0b3RhbFRheFN1bW1hcnlHcm91cCk7XG5cblxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudG90YWxUYXhTdW1tYXJ5ID0gdG90YWxUYXhTdW1tYXJ5R3JvdXA7XG5cbiAgICByZXR1cm4gdGhpcztcblxuICB9XG5cblxuICAvKipcbiAgICogVHJhbnNhY3Rpb25JZFxuICAgKiBAcmV0dXJucyBPcmlnaW5hbFRyYW5zYWN0aW9uSWRcbiAgICovXG4gIGFkZE9yaWdpbmFsVHJhbnNJZCh0cmFuRG9jOlRyYW5zYWN0aW9uRG9jdW1lbnQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX0VYQ0hBTkdFKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3JpZ2luYWxUcmFuc0lkID0gdHJhbkRvYy50cmFuc2FjdGlvbklkO1xuICAgICAgaWYodHJhbkRvYy5hcGlSZXNwb25zZSAmJiB0cmFuRG9jLmFwaVJlc3BvbnNlLmludGVybmFsSWQpXG4gICAgICB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcmlnaW5hbEV4dGVybmFsSWQgPSB0cmFuRG9jLmFwaVJlc3BvbnNlLmludGVybmFsSWQudG9TdHJpbmcoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogdW5yZWZlcmVuY2VkIFJlZnVuZFxuICAgKiBAcmV0dXJucyBib29sZWFuIHZhbHVlXG4gICAqL1xuICBhZGRVbnJlZmVyZW5jZWRSZWZ1bmQoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0UmVmdW5kVG90YWwoKSB7XG4gICAgbGV0IHRvdGFsUmVmdW5kID0gMDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHByb2R1Y3Q6IFRQcm9kdWN0ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0c1tpbmRleF07XG4gICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFRvdGFsKSB7XG4gICAgICAgIHRvdGFsUmVmdW5kID0gdG90YWxSZWZ1bmQgKyBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmxvZyhcImViYXNrZXQgOiB0cmFuc2FjdGlvbiBTZXJ2aWNlOiB0b3RhbFJlZnVuZFwiICsgdG90YWxSZWZ1bmQpXG4gICAgfVxuICAgIHJldHVybiB0b3RhbFJlZnVuZDtcbiAgfVxuXG4gIGRvY0lkKGRvY0lkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuaWQgPSBkb2NJZDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIl19
1244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tYXBwZXItbGlicmFyeS9zcmMvbGliL1RyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBc0QsZ0JBQWdCLEVBQWlHLE1BQU0sd0JBQXdCLENBQUM7QUFDN00sT0FBTyxFQUFFLGdCQUFnQixFQUErRCxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUV0Rjs7R0FFRztBQUNILE1BQU0sT0FBTywwQkFBMEI7SUFNckMsWUFDRSxjQUFvQyxFQUM1QixZQUEyQixFQUMzQixhQUFtQztRQURuQyxpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFMN0MsY0FBUyxHQUFHLDRCQUE0QixDQUFDO1FBT3ZDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDdkUsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztTQUMzQzthQUFNO1lBQ0wsSUFBSSxDQUFDLG1CQUFtQixHQUFHO2dCQUN6QixhQUFhLEVBQUUsRUFBRTtnQkFDakIsb0JBQW9CLEVBQUUsRUFBRTtnQkFDeEIsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLE9BQU8sRUFBRSxFQUFFO2dCQUNYLE9BQU8sRUFBRSxFQUFFO2dCQUNYLFdBQVcsRUFBRSxFQUFFO2dCQUNmLGtCQUFrQixFQUFFLEVBQUU7Z0JBQ3RCLFFBQVEsRUFBRSxFQUFFO2dCQUNaLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxFQUFFO2dCQUNWLGdCQUFnQixFQUFHLFNBQVM7Z0JBQzVCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxFQUFhO2dCQUNyQixhQUFhLEVBQUUsRUFBbUI7Z0JBQ2xDLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsRUFBRTtnQkFDUixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsRUFBRSxFQUFFLEVBQUU7Z0JBQ04seUJBQXlCLEVBQUUsRUFBK0I7Z0JBQzFELFNBQVMsRUFBRSxDQUFDO2FBQ2IsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWM7UUFDWixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0UsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN4QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ2pELFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWM7WUFDckMsWUFBWSxDQUFDLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxNQUFNLENBQUM7UUFDNUUsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBQy9ILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsYUFBcUIsRUFBRSxXQUFvQixJQUFJO1FBQzNELElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7U0FDeEQ7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsYUFBcUIsRUFBRSxRQUFhO1FBQ3ZELElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDYixJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDO1NBQy9EO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7TUFJRTtJQUNGLFdBQVcsQ0FBQyxXQUFtQjtRQUM3QixJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztJQUlBO0lBQ0Esa0JBQWtCLENBQUMsa0JBQTBCO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsT0FBTyxDQUFDLE9BQVk7UUFDbEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDM0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxPQUFZO1FBQ2xCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzNDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEOzs7T0FHRztJQUNILFFBQVE7UUFDTixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsUUFBYTtRQUNwQixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUU3QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztTQUlLO0lBQ0wsVUFBVSxDQUFDLFVBQWU7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBTUQ7Ozs7UUFJSTtJQUNKLE1BQU0sQ0FBQyxVQUFlO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUlEOzs7O1FBSUk7SUFDSjs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLGFBQXFCO1FBQzFCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSwrQ0FBK0MsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVwSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ25ILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLEVBQWdCLENBQUM7UUFDNUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxRCxhQUFhLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQVksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNyRCxNQUFNLENBQUMsR0FBRyxFQUFjLENBQUM7WUFDekIsQ0FBQyxDQUFDLGFBQWEsR0FBRyxFQUFtQixDQUFDO1lBQ3RDLENBQUMsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUNwQixDQUFDLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzlDLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM1QixDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUIsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNoQyxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUIsQ0FBQyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDNUQsQ0FBQyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7WUFFOUMsa0JBQWtCO1lBRWxCLENBQUMsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQSxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFFdkYsQ0FBQyxDQUFDLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztZQUM1RCxDQUFDLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDeEMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUUxQyxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUIsQ0FBQyxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztZQUNsRCxDQUFDLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO1lBQ3RELENBQUMsQ0FBQyxzQkFBc0IsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDMUQsQ0FBQyxDQUFDLHFCQUFxQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztZQUV4RCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEVBQUU7Z0JBQ2hDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7Z0JBQzlDLENBQUMsQ0FBQywyQkFBMkIsR0FBRyxPQUFPLENBQUMseUJBQXlCLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztnQkFDOUIsQ0FBQyxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztnQkFDaEUsQ0FBQyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxDQUFDLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQztpQkFDaEQ7Z0JBQ0QsQ0FBQyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7YUFDN0M7WUFFRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUU7Z0JBQ3BCLENBQUMsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQzthQUMvQjtZQUNELElBQUksT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDeEIsQ0FBQyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2FBQ3ZDO1lBQ0QsQ0FBQyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBOEIsQ0FBQztZQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSw0Q0FBNEMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbEksT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztTQUdLO0lBRUwseUJBQXlCLENBQUMsTUFBYztRQUN0QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQkFBMkIsRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM1SCxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsUUFBUSxHQUFHLEVBQWUsQ0FBQztRQUM5RSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsYUFBYSxHQUFHLEVBQXNCLENBQUM7UUFDMUYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFlBQVksR0FBRyxFQUFvQixDQUFDO1FBQ3ZGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLENBQUM7UUFDNUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQzlFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQzlILENBQU8sSUFBbUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FDMUUsQ0FBQztRQUVGLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBd0ssRUFBRSxFQUFFO1lBQy9PLElBQUksT0FBTyxDQUFDLGdCQUFnQixFQUFFO2dCQUM1QixPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDNUMseUZBQXlGO2dCQUN6RixPQUFPLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN6RCxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUM7Z0JBQ3ZDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ2pELE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2lCQUN6QjthQUNGO1lBQ0QsbURBQW1EO1lBQ25ELElBQUksT0FBTyxDQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO2FBQzlGO1lBQ0QsSUFBSSxPQUFPLENBQUMsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFO2dCQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUE7YUFDM0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDJCQUEyQixFQUFFLHlEQUF5RCxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUUvTCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDNUc7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsYUFBYSxHQUFHLEVBQW1CLENBQUM7UUFFdkYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7UUFDOUwsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUc5RixJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxDQUFDO1FBQ2pJLHNKQUFzSjtRQUV0SixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsYUFBYSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxFQUFFLENBQUMsQ0FBQztTQUM5SzthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQy9KLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQXFDLEVBQUUsRUFBRTtvQkFDdkgsYUFBYSxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDMUc7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO2FBQ3BGO1NBQ0Y7UUFFRCxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQkFBMkIsRUFBRSwyQkFBMkIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2SixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFHRDs7O0tBR0M7SUFFRCwyQ0FBMkMsQ0FBQyxhQUFxQjtRQUMvRCxJQUFJLHdCQUF3QixHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLFlBQVksR0FBaUI7WUFDL0IsUUFBUSxFQUFFLEVBQUU7WUFDWixrQkFBa0IsRUFBRSxDQUFDO1NBQ3RCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvSixJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBcUMsRUFBRSxFQUFFO2dCQUN2SCx3QkFBd0IsSUFBSSxRQUFRLENBQUMsY0FBYyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBd04sRUFBRSxFQUFFO2dCQUMvUixJQUFJLE9BQU8sR0FBWTtvQkFDckIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVO29CQUM5QixHQUFHLEVBQUUsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbEQsT0FBTyxFQUFFLE9BQU8sQ0FBQyxlQUFlO29CQUNoQyxZQUFZLEVBQUUsQ0FBQztvQkFDZixhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQzVCLE1BQU0sRUFBRSxDQUFDO2lCQUVWLENBQUM7Z0JBQ0YsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLEVBQUU7WUFDcEYsT0FBTyxDQUFDLFVBQVUsZ0JBQWdCLE9BQU8sK0JBQStCLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO2dCQUV6RyxRQUFRO2dCQUNSLDRHQUE0RztnQkFFNUcseUlBQXlJO2dCQUN6SSxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFO29CQUU1RCxPQUFPLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQztpQkFDdkc7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztpQkFDeEk7Z0JBRUQsdUJBQXVCO2dCQUN2QixPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUU3Ryw4QkFBOEI7Z0JBQzlCLFlBQVksQ0FBQyxrQkFBa0IsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDO2dCQUN6RCxPQUFPLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUV0RixpQ0FBaUM7Z0JBQ2pDLE9BQU8sQ0FBQyxZQUFZLEdBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDdkcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEMsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELFlBQVksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3RPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUNoTSxDQUFDLENBQU0sRUFBRSxFQUFFLFlBQVksRUFBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUNuRCxDQUFDLENBQ0YsQ0FBQyxDQUFDO1NBQ0o7YUFDSTtZQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztTQUNsRjtRQUVELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDZDQUE2QyxFQUFFLHlEQUF5RCxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO1FBQ3ZNLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDhDQUE4QztRQUU1QyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnREFBZ0QsRUFBRSw2QkFBNkIsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFNUwsSUFBSSxvQkFBb0IsR0FBc0IsRUFBRSxDQUFBO1FBQ2hELElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFBO1FBRzdCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQW9FLEVBQUUsRUFBRTtZQUN4SixJQUFJLFVBQVUsR0FBb0I7Z0JBQ2hDLE9BQU8sRUFBQyxFQUFFO2dCQUNWLEdBQUcsRUFBRSxDQUFDLEtBQUs7Z0JBQ1gsU0FBUyxFQUFFLENBQUM7Z0JBQ1osTUFBTSxFQUFFLENBQUM7Z0JBQ1QsU0FBUyxFQUFFLENBQUM7YUFDYixDQUFDO1lBQ0EsVUFBVSxDQUFDLE9BQU8sR0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ25DLFVBQVUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUU3QixVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlFLFVBQVUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDakYsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQTtRQUVGLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdEQUFnRCxFQUFFLHVDQUF1QyxFQUFFLG9CQUFvQixDQUFDLENBQUM7UUFFM0osb0JBQW9CLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBaUIsRUFBQyxVQUFjLEVBQUUsRUFBRTtZQUN0RixJQUFJLEdBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEYsSUFBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUM7Z0JBQ1osYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQTthQUMvQjtpQkFBSztnQkFDSixhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7Z0JBQ2hELGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQztnQkFDeEMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDO2dCQUNyRCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQy9DLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQzthQUN0RDtZQUNELE9BQU8sYUFBYSxDQUFDO1FBQ3ZCLENBQUMsRUFBQyxFQUFFLENBQUMsQ0FBQTtRQUNMLHdIQUF3SDtRQUV4SCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnREFBZ0QsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBRS9JLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxlQUFlLEdBQUcsb0JBQW9CLENBQUM7UUFDMUYsT0FBTyxJQUFJLENBQUM7SUFFZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNENBQTRDO1FBQzFDLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWxMLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDhDQUE4QyxFQUFHLGVBQWUsV0FBVyxpQkFBaUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxXQUFXLGVBQWUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQy9TLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsR0FBRyxDQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDcEYsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUNqSCxDQUFDO1FBQ0osZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsOENBQThDLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ3pILE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7OztNQUdFO0lBQ0YsMENBQTBDO1FBQ3hDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztRQUNwQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdkcsTUFBTSxPQUFPLEdBQVksSUFBSSxDQUFDLG1CQUFtQixDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1RixJQUFJLE9BQU8sQ0FBQyxhQUFhLEVBQUU7Z0JBQ3pCLFdBQVcsR0FBRyxXQUFXLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQzthQUNuRDtZQUNELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLDRDQUE0QyxFQUFFLDRDQUE0QyxFQUFHLFdBQVcsQ0FBQyxDQUFBO1NBQ3BKO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUlEOzs7O09BSUc7SUFDSCxhQUFhLENBQUMsYUFBcUI7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFdEgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUM1RyxhQUFhLENBQ2QsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzNFLElBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZO1lBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUM3QztZQUNBLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztTQUMzSDtRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7UUFHM0UsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRTtZQUNoRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQ25KLENBQUMsQ0FBTSxFQUFFLEVBQUUsWUFBWSxFQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxZQUFZLEVBQ25ELENBQUMsQ0FDRixDQUFDLENBQUM7U0FDSjthQUNJO1lBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1NBQ3hEO1FBRUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLGlEQUFpRCxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNySixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLGFBQXFCO1FBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUNsRCxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEUsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDaEcsQ0FBQyxHQUFVLEVBQUUsR0FBeUIsRUFBRSxFQUFFO29CQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQXdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUM3RSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3FCQUNmO29CQUNELE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsRUFDRCxFQUFFLENBQ0gsQ0FBQzthQUNIO1lBRUQsNENBQTRDO1lBQzVDLCtEQUErRDtZQUMvRCxpREFBaUQ7WUFDakQsS0FBSztTQUNOO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxhQUFxQjtRQUM1QixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFJLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUVsRSxNQUFNLE9BQU8sR0FBUSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksT0FBTyxDQUFDLFFBQVEsSUFBSSxTQUFTLEVBQUU7Z0JBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQXdCLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEtBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0ksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDZCxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7b0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7d0JBQ3pELE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMxQyxJQUFJLFFBQVEsR0FBUSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7d0JBQzVFLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzlCO29CQUNELE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDakU7YUFDRjtZQUNELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFDbEQsMENBQTBDLEVBQzFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUN6QyxDQUFDO1NBQ0g7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7OztNQUlFO0lBQ0YsZUFBZSxDQUFDLDJCQUFnRDtRQUM5RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsR0FBRywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDakosT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGFBQWEsQ0FBQyxhQUFxQjtRQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkQsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUMsSUFBSSxPQUFPLENBQUMsY0FBYyxFQUFFO2dCQUMxQixJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ2hELE9BQU8sQ0FBQyxjQUFjLENBQ3ZCLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUNsRyxDQUFDLEdBQVUsRUFBRSxHQUF5QixFQUFFLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBd0IsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQzdFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ2Y7b0JBQ0QsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQyxFQUNELEVBQUUsQ0FDSCxDQUFDO2FBQ0g7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxvQkFBb0IsQ0FBQyxhQUFxQjtRQUN4QyxJQUFJLGFBQWEsQ0FBQyxvQkFBb0IsRUFBRTtZQUN0QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLG9CQUFvQjtnQkFDbEQsYUFBYSxDQUFDLG9CQUFvQixDQUFDO1lBQ3JDLHFGQUFxRjtZQUNyRixzRkFBc0Y7WUFDdEYsa0lBQWtJO1lBQ2xJLCtEQUErRDtZQUMvRCx1QkFBdUI7WUFDdkIsUUFBUTtZQUNSLGtCQUFrQjtZQUNsQixZQUFZO1lBQ1osSUFBSTtZQUNKLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHNCQUFzQixFQUM5RCxzREFBc0QsRUFDdEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDckQsQ0FBQztTQUNIO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsYUFBcUI7UUFDdkMsSUFBSSxhQUFhLENBQUMsbUJBQW1CLEVBQUU7WUFDckMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxtQkFBbUI7Z0JBQ2pELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQztZQUVwQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFDN0Qsc0JBQXNCLEVBQ3RCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQ3BELENBQUM7U0FDSDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxjQUFjLENBQUMsY0FBbUI7UUFDaEMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsNkNBQTZDLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFFekgsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDekQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBR0Q7Ozs7T0FJRztJQUNGLFlBQVksQ0FBQyxZQUFxQjtRQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFQTs7OztNQUlFO0lBQ0Qsa0JBQWtCLENBQUMsa0JBQTJCO1FBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFLSDs7OztPQUlHO0lBQ0gsWUFBWSxDQUFDLFFBQWE7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztNQUdFO0lBQ0YsVUFBVSxDQUFDLElBQVM7UUFDbEIsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxFQUNwRCxxQ0FBcUMsRUFDckMsSUFBSSxDQUNMLENBQUM7UUFDRixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQy9DO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Q7Ozs7OztLQU1DO0lBRUQsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUN6RSwrQ0FBK0M7SUFDL0Msb0hBQW9IO0lBQ3BILHVHQUF1RztJQUN2RyxZQUFZO0lBQ1osaUdBQWlHO0lBQ2pHLG9FQUFvRTtJQUNwRSxNQUFNO0lBQ04scUVBQXFFO0lBQ3JFLGlCQUFpQjtJQUVqQixJQUFJO0lBRUo7Ozs7T0FJRztJQUNILElBQUksQ0FBQyxDQUFNO1FBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDbEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxDQUFNO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEOzs7T0FHRztJQUNILFNBQVM7UUFDUCxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNEOzs7T0FHRztJQUNILHNCQUFzQjtRQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0gsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCLENBQUMsU0FBaUI7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDL0MsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsd0NBQXdDLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFakksSUFBSSxNQUFNLEdBQVc7WUFDbkIsWUFBWSxFQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZO1lBQ3BELG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsbUJBQW1CO1lBQ3hFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsb0JBQW9CO1lBQzFFLGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYTtZQUNyRCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CO1lBQ25FLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFdBQVc7WUFDekQsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVztZQUMvRCxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxhQUFhO1lBQ25FLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFNBQVM7WUFDM0QsV0FBVyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVztZQUMvRCxRQUFRLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxVQUFVO1lBQzNELFFBQVEsRUFBRSxFQUFFO1lBQ1osWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZO1lBQ25ELFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUTtTQUM1QyxDQUFDO1FBRUYsTUFBTSxDQUFDLFFBQVEsR0FBRyxFQUFlLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBd2tCLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDeG9CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUseUNBQXlDLENBQUMsQ0FBQztZQUM5RyxNQUFNLENBQUMsR0FBRyxFQUFTLENBQUM7WUFDcEIsQ0FBQyxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUM1QixDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFFOUIsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztZQUNoQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUM7WUFDbkQsQ0FBQyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1lBQzFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUMxQyxDQUFDLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDO1lBRTlDLENBQUMsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztZQUNoQyxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUIsQ0FBQyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7WUFFOUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3hDLENBQUMsQ0FBQyx1QkFBdUIsR0FBRyxPQUFPLENBQUMsdUJBQXVCLENBQUM7WUFDNUQsQ0FBQyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLEdBQUcsQ0FBQztZQUMvQyxDQUFDLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDOUIsQ0FBQyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBRTVGLElBQUcsQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUN0RDtnQkFDRSxDQUFDLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUNyQjtZQUVELENBQUMsQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUM5QixDQUFDLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1lBQ2xELENBQUMsQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDdEQsQ0FBQyxDQUFDLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUMxRCxDQUFDLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO1lBRXhELElBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxZQUFZO2dCQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN2RDtnQkFDQSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFpRixFQUFFLEVBQUU7b0JBQ3pJLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxZQUFZLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUM3RCxDQUFDLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzt3QkFDOUIsQ0FBQyxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUM7cUJBQzVDO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxJQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsYUFBYTtnQkFDN0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEQ7Z0JBQ0EsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsYUFBaUYsRUFBRSxFQUFFO29CQUMxSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRTt3QkFDOUQsQ0FBQyxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7d0JBQ2pDLENBQUMsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDO3FCQUM1QztnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBRUQsSUFDRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVk7Z0JBQzVDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNoRTtnQkFDQSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBMEUsRUFBRSxFQUFFO29CQUMzSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLFVBQVUsS0FBSyxPQUFPLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO3dCQUM5RSxDQUFDLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7d0JBQzVCLENBQUMsQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztxQkFDckM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDSjtZQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELENBQUMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQzthQUNqQztpQkFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLElBQUksZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksT0FBTyxDQUFDLGdCQUFnQixHQUFHLENBQUMsRUFBRTtnQkFDN0ksQ0FBQyxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQztnQkFDaEUsQ0FBQyxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO2dCQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixFQUFFO29CQUNoQyxDQUFDLENBQUMseUJBQXlCLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQztpQkFDaEQ7Z0JBQ0QsQ0FBQyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztnQkFDOUMsQ0FBQyxDQUFDLHlCQUF5QixHQUFHLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO2dCQUN4QyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNyQyxDQUFDLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7YUFDN0M7WUFFRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsTUFBTSxFQUFFO2dCQUM3RCxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFO29CQUNmLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7aUJBQ2Y7YUFDRjtZQUVELE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxHQUFHLElBQUksQ0FBQyxvREFBb0QsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRSxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMscURBQXFELENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUcsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxLQUFLLGdCQUFnQixDQUFDLFdBQVcsRUFBRTtZQUNsRSxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM3RDtRQUNELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGtCQUFrQixFQUFFLDZCQUE2QixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ25HLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQ0FBcUM7SUFDckMsMkJBQTJCO0lBQzNCLDREQUE0RDtJQUM1RCxnRkFBZ0Y7SUFDaEYsa0ZBQWtGO0lBQ2xGLDZEQUE2RDtJQUM3RCxpRUFBaUU7SUFDakUsdUVBQXVFO0lBQ3ZFLDJFQUEyRTtJQUMzRSxtRUFBbUU7SUFDbkUsbUVBQW1FO0lBQ25FLG9CQUFvQjtJQUNwQiwyREFBMkQ7SUFDM0QsbURBQW1EO0lBQ25ELE9BQU87SUFFUCx1Q0FBdUM7SUFDdkMsb3BCQUFvcEI7SUFDcHBCLCtCQUErQjtJQUMvQiwyQkFBMkI7SUFDM0IsbUNBQW1DO0lBQ25DLHFDQUFxQztJQUVyQywyQ0FBMkM7SUFDM0MsdUNBQXVDO0lBQ3ZDLDBEQUEwRDtJQUMxRCxpREFBaUQ7SUFDakQsaURBQWlEO0lBQ2pELHFEQUFxRDtJQUVyRCx1Q0FBdUM7SUFDdkMscUNBQXFDO0lBQ3JDLHdDQUF3QztJQUN4QyxxREFBcUQ7SUFFckQsK0NBQStDO0lBQy9DLG1FQUFtRTtJQUNuRSxzREFBc0Q7SUFDdEQscUNBQXFDO0lBQ3JDLG1HQUFtRztJQUVuRyxxQ0FBcUM7SUFDckMseURBQXlEO0lBQ3pELDZEQUE2RDtJQUM3RCxpRUFBaUU7SUFDakUsK0RBQStEO0lBRy9ELDhEQUE4RDtJQUM5RCxRQUFRO0lBQ1IsNkJBQTZCO0lBQzdCLFFBQVE7SUFFUixtQ0FBbUM7SUFDbkMsaUVBQWlFO0lBQ2pFLFFBQVE7SUFFUiwrQkFBK0I7SUFDL0IsdUVBQXVFO0lBRXZFLCtGQUErRjtJQUMvRixXQUFXO0lBQ1gsbUhBQW1IO0lBRW5ILHNDQUFzQztJQUN0Qyw0REFBNEQ7SUFDNUQseURBQXlEO0lBQ3pELG9DQUFvQztJQUNwQyw4RUFBOEU7SUFDOUUsdUNBQXVDO0lBQ3ZDLHFEQUFxRDtJQUNyRCxRQUFRO0lBQ1IsOEJBQThCO0lBQzlCLHVDQUF1QztJQUN2QyxRQUFRO0lBRVIsV0FBVztJQUNYLHdEQUF3RDtJQUN4RCxnRUFBZ0U7SUFDaEUsVUFBVTtJQUVWLHNKQUFzSjtJQUV0SiwyR0FBMkc7SUFDM0csOERBQThEO0lBQzlELHVGQUF1RjtJQUN2Rix5RkFBeUY7SUFDekYsMERBQTBEO0lBQzFELGtGQUFrRjtJQUNsRiwyQ0FBMkM7SUFDM0MsdURBQXVEO0lBQ3ZELFlBQVk7SUFDWixZQUFZO0lBQ1osUUFBUTtJQUVSLFdBQVc7SUFDWCx5REFBeUQ7SUFDekQsaUVBQWlFO0lBQ2pFLFVBQVU7SUFDViw2SUFBNkk7SUFDN0ksdUdBQXVHO0lBQ3ZHLDhDQUE4QztJQUM5QywyREFBMkQ7SUFDM0QsK0ZBQStGO0lBQy9GLFlBQVk7SUFDWixZQUFZO0lBQ1osUUFBUTtJQUVSLDhCQUE4QjtJQUM5QiwyQkFBMkI7SUFFM0IsV0FBVztJQUNYLHdEQUF3RDtJQUN4RCx5RUFBeUU7SUFDekUsVUFBVTtJQUNWLHdKQUF3SjtJQUN4SixzRUFBc0U7SUFDdEUseUNBQXlDO0lBQ3pDLGlEQUFpRDtJQUNqRCxZQUFZO0lBQ1osWUFBWTtJQUNaLFFBQVE7SUFFUiw0QkFBNEI7SUFDNUIsaUNBQWlDO0lBQ2pDLFFBQVE7SUFDUixRQUFRO0lBQ1IsNkJBQTZCO0lBQzdCLCtEQUErRDtJQUMvRCxrRkFBa0Y7SUFFbEYsTUFBTTtJQUVOLDRJQUE0STtJQUM1SSw4Q0FBOEM7SUFDOUMsbURBQW1EO0lBQ25ELFFBQVE7SUFDUixPQUFPO0lBQ1AsaUZBQWlGO0lBQ2pGLHVDQUF1QztJQUN2QyxrSEFBa0g7SUFDbEgsK0NBQStDO0lBQy9DLGtHQUFrRztJQUNsRyx5QkFBeUI7SUFDekIsT0FBTztJQUVQLCtDQUErQztJQUMvQyw2RUFBNkU7SUFDN0UsNkJBQTZCO0lBQzdCLE9BQU87SUFDUCxtQkFBbUI7SUFDbkIsSUFBSTtJQUdKLG9EQUFvRCxDQUFDLE1BQVU7UUFDN0QsSUFDRSxNQUFNLENBQUMsbUJBQW1CO1lBQzFCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNyQztZQUNBLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUErQixFQUFFLEVBQUU7Z0JBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFO29CQUN6QixRQUFRLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBNkIsRUFBRSxFQUFFO3dCQUMzRSxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUE7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2dCQUNELE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLHFDQUFxQyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RixDQUFDLENBQUMsQ0FBQztTQUNKO1FBQ0QsSUFDRSxNQUFNLENBQUMsb0JBQW9CO1lBQzNCLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUN0QztZQUNBLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFpQyxFQUFFLEVBQUU7Z0JBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO29CQUMzQixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FDekMsQ0FBQyxJQUFvQyxFQUFFLEVBQUU7d0JBQ3ZDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQztvQkFDekMsQ0FBQyxDQUFDLENBQUM7b0JBRUwsVUFBVSxDQUFDLFdBQVc7d0JBQ3BCLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUE2QixFQUFFLEVBQUU7NEJBQ2pELE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQTt3QkFDM0IsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsc0NBQXNDLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pGLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBR0QscURBQXFELENBQUMsYUFBa0I7UUFFdEUsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQ0UsYUFBYSxDQUFDLG9CQUFvQjtZQUNsQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDN0M7WUFDQSxhQUFhLElBQUksYUFBYSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FDeEQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxlQUFlLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGVBQWUsRUFDekQsQ0FBQyxDQUNGLENBQUM7U0FDSDtRQUNELElBQ0UsYUFBYSxDQUFDLG1CQUFtQjtZQUNqQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDNUM7WUFFQSxhQUFhLElBQUksYUFBYSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxDQUFNLEVBQUUsRUFBRSxjQUFjLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGNBQWMsRUFDdkQsQ0FBQyxDQUNGLENBQUM7U0FHSDtRQUNELGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHVEQUF1RCxFQUFFLDZCQUE2QixFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRWpKLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFHRCxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLEtBQWE7UUFDbEQsa0RBQWtEO1FBQ2xELElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtZQUNkLE1BQU0sU0FBUyxHQUFHLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDbkMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUseUJBQXlCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEcsT0FBTyxTQUFTLENBQUM7U0FDbEI7YUFBTTtZQUNMLE1BQU0sU0FBUyxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDMUYsT0FBTyxTQUFTLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsTUFBTTtJQUNOLDBCQUEwQjtJQUMxQiwyQkFBMkI7SUFDM0IsTUFBTTtJQUNOLG9EQUFvRDtJQUNwRCxvRUFBb0U7SUFDcEUsbURBQW1EO0lBQ25ELDJEQUEyRDtJQUMzRCxpREFBaUQ7SUFDakQsaURBQWlEO0lBQ2pELHFEQUFxRDtJQUNyRCxTQUFTO0lBRVQsV0FBVztJQUNYLHlEQUF5RDtJQUN6RCxpRUFBaUU7SUFDakUsVUFBVTtJQUNWLG1GQUFtRjtJQUNuRixxREFBcUQ7SUFDckQsa0RBQWtEO0lBQ2xELDBEQUEwRDtJQUMxRCxhQUFhO0lBQ2IscURBQXFEO0lBQ3JELHNEQUFzRDtJQUN0RCxnREFBZ0Q7SUFDaEQsYUFBYTtJQUNiLHFEQUFxRDtJQUNyRCw2QkFBNkI7SUFDN0IseUVBQXlFO0lBQ3pFLGFBQWE7SUFFYiw0RUFBNEU7SUFDNUUsb0NBQW9DO0lBQ3BDLHFEQUFxRDtJQUNyRCxZQUFZO0lBQ1osWUFBWTtJQUNaLGFBQWE7SUFDYixhQUFhO0lBQ2IsMERBQTBEO0lBQzFELGtFQUFrRTtJQUNsRSxZQUFZO0lBQ1osbUZBQW1GO0lBQ25GLHVEQUF1RDtJQUN2RCx3Q0FBd0M7SUFDeEMsMkRBQTJEO0lBQzNELGVBQWU7SUFDZix1REFBdUQ7SUFDdkQsd0RBQXdEO0lBQ3hELGlEQUFpRDtJQUNqRCxlQUFlO0lBQ2YsdURBQXVEO0lBQ3ZELCtCQUErQjtJQUMvQiwwRUFBMEU7SUFDMUUsZUFBZTtJQUVmLDZFQUE2RTtJQUM3RSw4RkFBOEY7SUFDOUYsY0FBYztJQUNkLGNBQWM7SUFDZCxVQUFVO0lBRVYsZ0dBQWdHO0lBQ2hHLDRGQUE0RjtJQUM1Rix5SUFBeUk7SUFDekksMkdBQTJHO0lBQzNHLCtCQUErQjtJQUMvQixRQUFRO0lBQ1Isb0ZBQW9GO0lBQ3BGLDBKQUEwSjtJQUMxSixnRkFBZ0Y7SUFDaEYsd0pBQXdKO0lBQ3hKLDZEQUE2RDtJQUM3RCxpQkFBaUI7SUFDakIsSUFBSTtJQUVKOzs7O09BSUc7SUFDSCxlQUFlLENBQUMsYUFBbUM7UUFDakQsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQzdDLENBQUMsQ0FBTSxFQUFFLEVBQUUsY0FBYyxFQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxjQUFjLEVBQ3ZELENBQUMsQ0FDRixDQUFDO1FBQ0YsT0FBTyxTQUFTLENBQUE7SUFDbEIsQ0FBQztJQUVELCtDQUErQyxDQUFDLGFBQWlDO1FBQy9FLElBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztRQUM1QixLQUFLLElBQUksT0FBTyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDMUMsZ0NBQWdDO1lBQ2hDLDREQUE0RDtZQUM1RCxjQUFjO1lBQ2QsNEJBQTRCO1lBQzVCLDRCQUE0QjtZQUM1QixNQUFNO1lBQ04saUJBQWlCO1lBQ2pCLDRFQUE0RTtZQUM1RSxXQUFXO1lBQ1gsaUJBQWlCO1lBQ2pCLG1FQUFtRTtZQUNuRSxJQUFJO1lBQ0osU0FBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDM0IsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaURBQWlELEVBQ3pGLGdDQUFnQyxHQUFHLFNBQVMsRUFDNUMsT0FBTyxDQUNSLENBQUM7U0FDSDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCw0QkFBNEIsQ0FBQyxhQUE0QztRQUN2RSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2xFLE1BQU0sT0FBTyxHQUFRLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsRUFBRTtnQkFFdEMsUUFBUSxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO2FBRXhDO2lCQUFNO2dCQUNMLFFBQVEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUVwRSxxRUFBcUU7YUFFdEU7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBRWxCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUI7UUFDakIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUgsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsZ0JBQWdCLFdBQVcsNENBQTRDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ2pMLE1BQU0sYUFBYSxHQUNqQixJQUFJLENBQUMsR0FBRyxDQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUM7WUFDMUQsQ0FDRSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FDckYsQ0FDRixDQUFDO1FBQ0osZ0JBQWdCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFBO1FBQ2hHLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsVUFHaEI7UUFDQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDdEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFDN0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUJBQXFCLENBQ25CLFlBQTBCO1FBRTFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDO1FBQ2pELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELFlBQVksQ0FDVixNQUFjO1FBRWQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVM7UUFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFFZCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsY0FBd0I7UUFDekMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxjQUFjLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsYUFBcUI7UUFDdEMsb0NBQW9DO1FBQ3BDLElBQUksWUFBWSxHQUFpQjtZQUMvQixRQUFRLEVBQUUsRUFBRTtZQUNaLGtCQUFrQixFQUFFLENBQUM7U0FDdEIsQ0FBQztRQUlGLCtIQUErSDtRQUMvSCxnRkFBZ0Y7UUFDaEYsMkRBQTJEO1FBQzNELFFBQVE7UUFDUixJQUFJO1FBRUosaUlBQWlJO1FBQ2pJLGtFQUFrRTtRQUNsRSx1QkFBdUI7UUFDdkIsK0RBQStEO1FBQy9ELFFBQVE7UUFDUixPQUFPO1FBQ1AsSUFBSTtRQUVKLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxPQUFPLEdBQVk7Z0JBQ3JCLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtnQkFDOUIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELE9BQU8sRUFBRSxPQUFPLENBQUMsZUFBZTtnQkFDaEMsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsYUFBYSxFQUFFLE9BQU8sQ0FBQyxLQUFLO2dCQUM1QixNQUFNLEVBQUUsQ0FBQzthQUNWLENBQUM7WUFDRixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsT0FBTyxDQUFDLFVBQVU7d0JBQ2xGLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFFN0IsU0FBUztZQUNULDRHQUE0RztZQUM1RyxzQ0FBc0M7WUFDdEMsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFbEUsTUFBTSwwQkFBMEIsR0FDOUIsT0FBTyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUI7Z0JBQ3pDLE9BQU8sQ0FBQyxhQUFhLENBQUMsb0JBQW9CO2dCQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztZQUN0QyxhQUFhO1lBRWIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLE9BQU8sQ0FBQyxVQUFVOzRCQUM3RSwwQkFBMEIsRUFBRSxDQUFDLENBQUM7WUFDcEQsOEZBQThGO1lBQzlGLE9BQU8sQ0FBQyxhQUFhLElBQUksMEJBQTBCLENBQUM7WUFDcEQsSUFBSTtZQUVKLHVCQUF1QjtZQUN2QixPQUFPLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRTdHLDhCQUE4QjtZQUM5QixZQUFZLENBQUMsa0JBQWtCLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUN6RCxPQUFPLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXRGLGlDQUFpQztZQUNqQyxPQUFPLENBQUMsWUFBWSxHQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxZQUFZLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7UUFDNUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQscUJBQXFCO1FBRW5CLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLDZCQUE2QixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFHaEosSUFBSSxvQkFBb0IsR0FBc0IsRUFBRSxDQUFBO1FBQ2hELElBQUksb0JBQW9CLEdBQUcsRUFBRSxDQUFBO1FBRTdCLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLHVCQUF1QixFQUFFLG1DQUFtQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRy9KLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFvRSxFQUFFLEVBQUU7WUFDckksSUFBSSxVQUFVLEdBQW9CO2dCQUNoQyxPQUFPLEVBQUUsRUFBRTtnQkFDWCxHQUFHLEVBQUUsQ0FBQyxLQUFLO2dCQUNYLFNBQVMsRUFBRSxDQUFDO2dCQUNaLE1BQU0sRUFBRSxDQUFDO2dCQUNULFNBQVMsRUFBRSxDQUFDO2FBRWIsQ0FBQztZQUNELFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNwQyxVQUFVLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDN0IsVUFBVSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5RSxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ2pGLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4RyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUE7UUFFRixnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSx1Q0FBdUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBRWxJLG9CQUFvQixHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWlCLEVBQUMsVUFBVSxFQUFFLEVBQUU7WUFFbEYsSUFBSSxHQUFHLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xGLElBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFDO2dCQUNaLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7YUFDL0I7aUJBQUs7Z0JBQ0osYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUNoRCxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0JBQ3hDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQztnQkFDckQsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO2dCQUMvQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxTQUFTLENBQUM7YUFDdEQ7WUFDRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDLEVBQUMsRUFBRSxDQUFDLENBQUE7UUFFTCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSx1QkFBdUIsRUFBRSwyQkFBMkIsRUFBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBR3JILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDO1FBRXZFLE9BQU8sSUFBSSxDQUFDO0lBRWQsQ0FBQztJQUdEOzs7T0FHRztJQUNILGtCQUFrQixDQUFDLE9BQTJCO1FBQzVDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUU7WUFDbk0sSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ2pFLElBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFDeEQ7Z0JBQ0UsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3pGO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7O09BR0c7SUFDSCxxQkFBcUI7UUFDbkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDcEYsTUFBTSxPQUFPLEdBQWEsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUUsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUN6QixXQUFXLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDbkQ7WUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUcsV0FBVyxDQUFDLENBQUE7U0FDekY7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQVU7UUFDWixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEJhc2tldFN1bW1hcnksIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsIEN1c3RvbWVyLCBERUxJVkVSWV9NRVRIT0RTLCBJdGVtRGlzY291bnRzLCBUYXhCcmVha2Rvd24sIFRheExpbmUsIFRCYXNrZXQsIFRvdGFsVGF4U3VtbWFyeSwgVFByb2R1Y3QsIFRyYW5zYWN0aW9uRG9jdW1lbnQgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiO1xuaW1wb3J0IHsgVFJBTlNBQ1RJT05fVFlQRSwgQmFza2V0LCBMaW5lRGlzY291bnQsIExpbmVQcm9tb3Rpb25zLCBQcm9kdWN0LCBVc2VyT3ZlcnJpZGUgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiO1xuaW1wb3J0IHsgQmFza2V0U2VydmljZSB9IGZyb20gXCIuL2Jhc2tldC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gXCIuL251bWJlci11dGlsLnNlcnZpY2VcIjtcbmltcG9ydCB7QXBwTG9nZ2VyU2VydmljZX0gZnJvbSAnQHBtY3JldGFpbC9jb21tb24tc2VydmljZXMvY29tbW9uL2FwcC1sb2dnZXIuc2VydmljZSc7XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gZG9jdW1lbnQgYnVpbGRlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICBwcml2YXRlIHRyYW5zYWN0aW9uRG9jdW1lbnQ6IFRyYW5zYWN0aW9uRG9jdW1lbnQ7XG4gIHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlO1xuICBwcml2YXRlIHN0b3JlSW5mbyA6IGFueTtcbiAgY2xhc3NOYW1lID0gXCJUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlclwiO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNhY3Rpb25Eb2M/OiBUcmFuc2FjdGlvbkRvY3VtZW50LFxuICAgIHByaXZhdGUgY3VycmVuY3lQaXBlPzogQ3VycmVuY3lQaXBlLFxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZT86IEJhc2tldFNlcnZpY2UgfCBhbnksXG4gICkge1xuICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UgPSBuZXcgTnVtYmVyVXRpbFNlcnZpY2UoY3VycmVuY3lQaXBlKTtcbiAgICB0aGlzLmJhc2tldFNlcnZpY2UgPSBuZXcgQmFza2V0U2VydmljZSh0aGlzLm51bWJlclV0aWxTZXJ2aWNlKTtcbiAgICB0aGlzLnN0b3JlSW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JlSW5mbycpIHx8ICd7fScpO1xuICAgIGlmICh0cmFuc2FjdGlvbkRvYykge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0gdHJhbnNhY3Rpb25Eb2M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcbiAgICAgICAgdHJhbnNhY3Rpb25JZDogXCJcIixcbiAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXG4gICAgICAgIHRyYW5zYWN0aW9uUmVmOiBcIlwiLFxuICAgICAgICBkYXRlVGltZTogXCJcIixcbiAgICAgICAgb3JnQ29kZTogXCJcIixcbiAgICAgICAgc3RvcmVJZDogXCJcIixcbiAgICAgICAgc3RvcmVOb2RlSWQ6IFwiXCIsXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcbiAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXG4gICAgICAgIHRlcm1pbmFsSWQ6IFwiXCIsXG4gICAgICAgIHVzZXJJZDogXCJcIixcbiAgICAgICAgaW5pdGlhdGluZ01vZHVsZSA6IFwiZUJhc2tldFwiLFxuICAgICAgICBleHBvcnQ6IGZhbHNlLFxuICAgICAgICBiYXNrZXQ6IHt9IGFzIFRCYXNrZXQsXG4gICAgICAgIGJhc2tldFN1bW1hcnk6IHt9IGFzIEJhc2tldFN1bW1hcnksXG4gICAgICAgIGJhc2VDdXJyZW5jeTogXCJcIixcbiAgICAgICAgdHlwZTogXCJcIixcbiAgICAgICAgb3BlcmF0aW9uU3RhdHVzOiBcIlwiLFxuICAgICAgICBjcmVhdGVkQXQ6IFwiXCIsXG4gICAgICAgIHVwZGF0ZWRBdDogXCJcIixcbiAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsXG4gICAgICAgIHNhbGVUb3RhbDogMCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zYWN0aW9ucyByZWZcbiAgICogQHJldHVybnMgcmVmXG4gICAqL1xuICB0cmFuc2FjdGlvblJlZigpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc3Qgc3RvcmVEZXRhaWxzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RvcmVJbmZvJykgfHwgJ3t9Jyk7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgcmFuZG9tID0gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnN1YnN0cmluZygxKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYgPVxuICAgICAgc3RvcmVEZXRhaWxzLm9yZ0NvZGUgKyBzdG9yZURldGFpbHMuc3RvcmVJZCArIGRhdGUudG9JU09TdHJpbmcoKSArIHJhbmRvbTtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInRyYW5zYWN0aW9uUmVmXCIsIFwidHJhbnNhY3Rpb24gcmVmIGNyZWF0ZWRcIiwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zYWN0aW9uUmVmKVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zYWN0aW9ucyBpZFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JRFxuICAgKiBAcmV0dXJucyBpZFxuICAgKi9cbiAgdHJhbnNhY3Rpb25JZCh0cmFuc2FjdGlvbklEOiBzdHJpbmcsIGlzT25saW5lOiBib29sZWFuID0gdHJ1ZSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBpZiAoaXNPbmxpbmUpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNhY3Rpb25zIGlkXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklEXG4gICAqIEByZXR1cm5zIGlkXG4gICAqL1xuICBvZmZsaW5lVHJhbnNhY3Rpb25JZCh0cmFuc2FjdGlvbklEOiBzdHJpbmcsIGlzT25saW5lOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgaWYgKCFpc09ubGluZSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9mZmxpbmVUcmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgKiBzdG9yZU5vZGUgSWRcbiAgKiBAcGFyYW0gc3RvcmVOb2RlSWRcbiAgKiBAcmV0dXJucyBpZFxuICAqL1xuICBzdG9yZU5vZGVJZChzdG9yZU5vZGVJZDogc3RyaW5nKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZU5vZGVJZCA9IHN0b3JlTm9kZUlkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4qIHN0b3JlTm9kZSBzdHJ1Y3R1cmVcbiogQHBhcmFtIHN0b3JlTm9kZVN0cnVjdHVyZVxuKiBAcmV0dXJucyBpZFxuKi9cbiAgc3RvcmVOb2RlU3RydWN0dXJlKHN0b3JlTm9kZVN0cnVjdHVyZTogc3RyaW5nKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZU5vZGVTdHJ1Y3R1cmUgPSBzdG9yZU5vZGVTdHJ1Y3R1cmU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3JncyBjb2RlXG4gICAqIEBwYXJhbSBvcmdDb2RlXG4gICAqIEByZXR1cm5zIGNvZGVcbiAgICovXG4gIG9yZ0NvZGUob3JnQ29kZTogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcmdDb2RlID0gb3JnQ29kZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogU3RvcmVzIGlkXG4gICAqIEBwYXJhbSBzdG9yZUlkXG4gICAqIEByZXR1cm5zIGlkXG4gICAqL1xuICBzdG9yZUlkKHN0b3JlSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZCA9IHN0b3JlSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIERhdGVzIHRpbWVcbiAgICogQHJldHVybnMgdGltZVxuICAgKi9cbiAgZGF0ZVRpbWUoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5kYXRlVGltZSA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogRGV2aWNlcyBpZFxuICAgKiBAcGFyYW0gZGV2aWNlSWRcbiAgICogQHJldHVybnMgaWRcbiAgICovXG4gIGRldmljZUlkKGRldmljZUlkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmRldmljZUlkID0gZGV2aWNlSWQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgICAqIHRlcm1pbmFsIGlkXG4gICAgICogQHBhcmFtIHRlcm1pbmFsSWRcbiAgICAgKiBAcmV0dXJucyBpZFxuICAgICAqL1xuICB0ZXJtaW5hbElkKHRlcm1pbmFsSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudGVybWluYWxJZCA9IHRlcm1pbmFsSWQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuXG5cblxuXG4gIC8qKlxuICAgICogc2FsZUV4cG9ydFxuICAgICogQHBhcmFtIHNhbGVFeHBvcnRcbiAgICAqIEByZXR1cm5zIGlkXG4gICAgKi9cbiAgZXhwb3J0KHNhbGVFeHBvcnQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuZXhwb3J0ID0gc2FsZUV4cG9ydDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG5cblxuICAvKiAgY3VzdG9tZXIoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyRGV0YWlscycpKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIgPSB1c2VyO1xuICAgIHJldHVybiB0aGlzO1xuICB9ICovXG4gIC8qKlxuICAgKiBCYXNrZXRzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgYmFza2V0XG4gICAqL1xuICBiYXNrZXQoYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYmFza2V0XCIsIFwiYmFza2V0IGRldGFpbHMgdXBkYXRlIGluIHRyYW5zYWN0aW9uIGRvY3VtZW50XCIsIGJhc2tldERldGFpbHMpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN1YnNpZGlhcnlJZCA9IGJhc2tldERldGFpbHMuc3Vic2lkaWFyeUlkIHx8IChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3Vic2lkaWFyeUlkJykgfHwgJycpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMgPSBbXSBhcyBUUHJvZHVjdFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ID0gW107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uID0gW107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xuICAgIGJhc2tldERldGFpbHMucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgcCA9IHt9IGFzIFRQcm9kdWN0O1xuICAgICAgcC5pdGVtRGlzY291bnRzID0ge30gYXMgSXRlbURpc2NvdW50cztcbiAgICAgIHAuU0tVID0gcHJvZHVjdC5TS1U7XG4gICAgICBwLmV4Y2x1ZGVQcm9tb3Rpb24gPSBwcm9kdWN0LmV4Y2x1ZGVQcm9tb3Rpb247XG4gICAgICBwLmJhckNvZGUgPSBwcm9kdWN0LmJhcmNvZGU7XG4gICAgICBwLmJhcmNvZGVzID0gcHJvZHVjdC5iYXJjb2RlcztcbiAgICAgIHAuZGVzY3JpcHRpb24gPSBwcm9kdWN0LmRlc2NyaXB0aW9uO1xuICAgICAgcC5pdGVtTGluZUlkID0gcHJvZHVjdC5pdGVtTGluZUlkID8gcHJvZHVjdC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIlwiICsgKGluZGV4ICsgMSk7XG4gICAgICBwLnByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFByaWNlO1xuICAgICAgcC5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XG4gICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC5xdWFudGl0eSAqIHByb2R1Y3Quc2VsZWN0ZWRQcmljZTtcbiAgICAgIHAuaW1hZ2VVcmxzID0gcHJvZHVjdC5pbWFnZVVybHM7XG4gICAgICBwLnNlbGVjdGVkUlJQUHJpY2UgPSBwcm9kdWN0LnNlbGVjdGVkUlJQUHJpY2U7XG5cbiAgICAgIC8vaW52ZW50b3J5IGZpZWxkc1xuICAgICAgXG4gICAgICBwLmZ1bGxmaWxtZW50SWQgPSBwcm9kdWN0LmZ1bGxmaWxtZW50SWQ/IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDogdGhpcy5zdG9yZUluZm8uc3RvcmVJZDtcblxuICAgICAgcC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZSA9IHByb2R1Y3QuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU7XG4gICAgICBwLmRlbGl2ZXJ5R3JvdXAgPSBwcm9kdWN0LmRlbGl2ZXJ5R3JvdXA7XG4gICAgICBwLmxlYWRUaW1lID0gcHJvZHVjdC5sZWFkVGltZTtcbiAgICAgIHAuZGVsaXZlcnlNZXRob2QgPSBwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kO1xuXG4gICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcbiAgICAgIHAuZ2lmdENhcmRFeHBpcnlEYXRlID0gcHJvZHVjdC5naWZ0Q2FyZEV4cGlyeURhdGU7XG4gICAgICBwLmdpZnRDYXJkTnVtYmVySXNzdWVkID0gcHJvZHVjdC5naWZ0Q2FyZE51bWJlcklzc3VlZDtcbiAgICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcbiAgICAgIHAuZ2lmdENhcmRSZWNpcGllbnROYW1lID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudE5hbWU7XG5cbiAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPiAwKSB7XG4gICAgICAgIHAucmVmdW5kZWRRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcbiAgICAgICAgcC5yZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHk7XG4gICAgICAgIHAucmVmdW5kZWQgPSBwcm9kdWN0LnJlZnVuZGVkO1xuICAgICAgICBwLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb247XG4gICAgICAgIHAucmVmdW5kZWRSZWFzb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uO1xuICAgICAgICBpZiAoIXAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xuICAgICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHAucmVmdW5kZWRSZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgcC5yZWZ1bmRlZFRvdGFsID0gcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuICAgICAgICBwLmlzTGFzdEV4Y2hhbmdlZCA9IHByb2R1Y3QuaXNMYXN0RXhjaGFuZ2VkO1xuICAgICAgfVxuXG4gICAgICBpZiAocHJvZHVjdC5leGNoYW5nZSkge1xuICAgICAgICBwLmV4Y2hhbmdlID0gcHJvZHVjdC5leGNoYW5nZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCkge1xuICAgICAgICBwLmxpbmVEaXNjb3VudCA9IHByb2R1Y3QubGluZURpc2NvdW50O1xuICAgICAgfVxuICAgICAgcC5pdGVtRGlzY291bnRzID0gcHJvZHVjdC5pdGVtRGlzY291bnRzIGFzIEl0ZW1EaXNjb3VudHM7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLnB1c2gocCk7XG4gICAgICB0aGlzLmxpbmVEaXNjb3VudChiYXNrZXREZXRhaWxzKTtcbiAgICB9KTtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwiYmFza2V0XCIsIFwidHJhbnNhY3Rpb25kb2N1bWVudCBiYXNrZXQgZGV0YWlscyB1cGRhdGVkXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uIERldGFpbHMgVG90YWwoTmV3IFByb2R1Y3RzKVxuICAgICAqIEByZXR1cm5zIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNcbiAgICAgKi9cblxuICBjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKGJhc2tldDogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBcImN1cnJlbnQgdHJhbnNhY3Rpb24gZGV0YWlscyBmb3IgZXhjaGFuZ2VzXCIsIGJhc2tldCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMgPSBbXSBhcyBQcm9kdWN0W107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZVByb21vdGlvbiA9IFtdIGFzIExpbmVQcm9tb3Rpb25zW107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZURpc2NvdW50ID0gW10gYXMgTGluZURpc2NvdW50W107XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudCA9IFtdO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzID0gYmFza2V0LnByb2R1Y3RzO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMuZmlsdGVyKFxuICAgICAgKCAgICAgIHByb2o6IHsgcmVmdW5kZWRRdWFudGl0eTogbnVtYmVyOyB9KSA9PiBwcm9qLnJlZnVuZGVkUXVhbnRpdHkgIT0gMFxuICAgICk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiB7IHJlZnVuZGVkUXVhbnRpdHk6IGFueTsgcXVhbnRpdHk6IGFueTsgdG90YWxMaW5lUHJpY2U6IG51bWJlcjsgcmVmdW5kZWRUb3RhbDogbnVtYmVyOyB0b3RhbDogYW55OyByZWZ1bmRlZDogYm9vbGVhbjsgbGluZVByb21vdGlvbnM6IGFueTsgbGluZURpc2NvdW50OiBhbnk7IH0pID0+IHtcbiAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcbiAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcbiAgICAgICAgLy8gdXBkYXRpbmcgdG90YWwgbGluZSBwcmljZSB3aXRoIGFjdHVhbCBwcmljZSB0byBiZSByZWZ1bmRlZCBpbmNsdWRpbmcgdGhlIHJlZnVuZGluZyBxdHlcbiAgICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSA9IE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgICBpZiAocHJvZHVjdC5xdWFudGl0eSA9PT0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XG4gICAgICAgICAgcHJvZHVjdC5yZWZ1bmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vVXBkYXRpbmcgbGluZSBwcm9tb3Rpb25zIGFuZCBsaW5lIGRpc2NvdW50cyAgICAgIFxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMgJiYgIXByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5saW5lUHJvbW90aW9uLnB1c2gocHJvZHVjdC5saW5lUHJvbW90aW9ucylcbiAgICAgIH1cbiAgICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCAmJiAhcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVEaXNjb3VudC5wdXNoKHByb2R1Y3QubGluZURpc2NvdW50KVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzXCIsIFwiY3VycmVudCB0cmFuc2FjdGlvbiBkZXRhaWxzIGFmdGVyIHJlbW92aW5nIG9sZCBwcm9kdWN0c1wiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyk7XG5cbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5wdXNoKC4uLmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeSA9IHt9IGFzIEJhc2tldFN1bW1hcnk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlU2FsZVRvdGFsKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zID0gYmFza2V0LnF1YW50aXR5O1xuXG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsID0gYmFza2V0LmJhc2tldFRvdGFsO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLnVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNSZWZ1bmRUb3RhbCgpO1xuICAgIC8vIEZvciBwYXJ0aWFsIHJlZnVuZCBkaXNjb3VudCBpcyB1cGRhdGllZCBpbiB0b3RhbCBsaW5lIHByaWNlIHNvIGRpc2NvdW50VG90YWwgd2lsbCBhbHdheXMgYmUgemVybyAmIGluIGNhc2Ugb2YgZXhjaGFuZ2UgZGlzY291bnQgdG90YWwgaXMgY2FsY3VsYXRlZFxuXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWwoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZGlzY291bnRUb3RhbCA9IDA7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgZGlzY291bnRBbW91bnQ6IG51bWJlcjsgfSkgPT4ge1xuICAgICAgICAgIGRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWwgPSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcImN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNcIiwgXCJjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG5cbiAgLyoqXG4gKiBjdXJyZW50IHRyYW5zYWN0aW9uIFRheCBUb3RhbFxuICogQHJldHVybnMgVGF4IFRvdGFsXG4gKi9cblxuICB1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzVGF4QnJlYWtkb3duKGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBsZXQgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID0gMDtcbiAgICBsZXQgdGF4QnJlYWtkb3duOiBUYXhCcmVha2Rvd24gPSB7XG4gICAgICB0YXhMaW5lczogW10sXG4gICAgICB0b3RhbFRheGFibGVBbW91bnQ6IDAsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChkaXNjb3VudDogeyBkaXNjb3VudEFtb3VudDogbnVtYmVyOyB9KSA9PiB7XG4gICAgICAgIHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCArPSBkaXNjb3VudC5kaXNjb3VudEFtb3VudDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiB7IGl0ZW1MaW5lSWQ6IGFueTsgc2VsZWN0ZWRWQVQ6IGFueTsgc2VsZWN0ZWRWQVRDb2RlOiBhbnk7IHRvdGFsOiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgaXRlbURpc2NvdW50czogeyBjdXJyZW50UmVmdW5kUG9ydGlvbjogbnVtYmVyOyB0cm5EaXNjb3VudHNQb3J0aW9uOiBudW1iZXI7IHRyblByb21vdGlvbnNQb3J0aW9uOiBudW1iZXI7IH07IH0pID0+IHtcbiAgICAgICAgbGV0IHRheExpbmU6IFRheExpbmUgPSB7XG4gICAgICAgICAgaXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtTGluZUlkLFxuICAgICAgICAgIFZBVDogcHJvZHVjdC5zZWxlY3RlZFZBVCA/IHByb2R1Y3Quc2VsZWN0ZWRWQVQgOiAwLFxuICAgICAgICAgIFZBVENvZGU6IHByb2R1Y3Quc2VsZWN0ZWRWQVRDb2RlLFxuICAgICAgICAgIHRheExpbmVUb3RhbDogMCxcbiAgICAgICAgICB0YXhhYmxlQW1vdW50OiBwcm9kdWN0LnRvdGFsLFxuICAgICAgICAgIFByZVRheDogMFxuXG4gICAgICAgIH07XG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzVGF4QnJlYWtkb3duXCIsIGBpdGVtIGxpbmUgSUQgOmN1cnJlbnQgdHJhbnNhY3Rpb24gRGV0YWlsc1wiLFxuICAgICAgICAgICR7cHJvZHVjdC5pdGVtTGluZUlkfSwgdGF4IGxpbmUgOiAke3RheExpbmV9LCBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsICR7YmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbH1gKTtcblxuICAgICAgICAvL3N0ZXAgMVxuICAgICAgICAvLyBpZiBUcmFuc2FjdGlvbiBEaXNjb3VudCBhbmQvb3IgcHJvbW90aW9uIGFwcGxpZWQsIGZpbmQgbmV0IHNlbGxpbmcgcHJpY2Ugb2YgZWFjaCBwcm9kdWN0IGFzIHRheGFibGVhbW91bnRcblxuICAgICAgICAvL0lmIHRyYW5zYWN0aW9uIGRpc2NvdW50L3Byb21vdGlvbiBpcyBhcHBsaWVkIHRheGFibGUgYW1vdW50IHNob3VsZCBiZSBkZWR1Y3RpbmcgdHJhbnNhY3Rpb24gcHJvbW90aW9uIGFuZCB0cmFuc2FjdGlvbiBkaXNhY291bnQgcG9ydGlvblxuICAgICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICYmIHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcblxuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IC1NYXRoLmFicyh0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMuY3VycmVudFJlZnVuZFBvcnRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IHRheExpbmUudGF4YWJsZUFtb3VudCAtIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uIC0gcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9zdGVwIDIgLSBmaW5kIHByZSB0YXhcbiAgICAgICAgdGF4TGluZS5QcmVUYXggPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMigodGF4TGluZS50YXhhYmxlQW1vdW50ICogMTAwKSAvICgxMDAgKyB0YXhMaW5lLlZBVCkpO1xuXG4gICAgICAgIC8vc3RlcCAzIC0gVXBkYXRlIHRheGJyZWFrZG93blxuICAgICAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ICs9IHRheExpbmUudGF4YWJsZUFtb3VudDtcbiAgICAgICAgdGF4TGluZS50YXhhYmxlQW1vdW50ID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4TGluZS50YXhhYmxlQW1vdW50KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0ZXAgNCAtIHVwZGF0ZSB0YXggTGluZSB0b3RhbFxuICAgICAgICB0YXhMaW5lLnRheExpbmVUb3RhbCA9ICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhMaW5lLnRheGFibGVBbW91bnQgLSB0YXhMaW5lLlByZVRheCk7XG4gICAgICAgIHRheEJyZWFrZG93bi50YXhMaW5lcy5wdXNoKHRheExpbmUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93biA9IHRheEJyZWFrZG93bjtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcy5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgdGF4TGluZVRvdGFsIH06IGFueSkgPT4gbiArIHRheExpbmVUb3RhbCxcbiAgICAgICAgMFxuICAgICAgKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IDAuMDA7XG4gICAgfVxuXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzVGF4QnJlYWtkb3duXCIsIFwiZUJhc2tldDphZnRlciBjYWxjdWxhdGluZyB0YXggY3VycmVudHRyYW5zYWN0aW9uRGV0YWlsc1wiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscylcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNUb3RhbFRheFN1bW1hcnkoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICBcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNUb3RhbFRheFN1bW1hcnlcIiwgXCJUb3RhbCBUYXggU3VtbWVyeSBSZXF1ZXN0IDpcIiwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duKTtcblxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlBcnJheTogVG90YWxUYXhTdW1tYXJ5W10gPSBbXVxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlHcm91cCA9IFtdXG5cblxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiB7IFZBVENvZGU6IGFueTsgVkFUOiBhbnk7IFByZVRheDogYW55OyB0YXhMaW5lVG90YWw6IGFueTsgfSkgPT4ge1xuICAgICAgbGV0IFRheFN1bW1hcnk6IFRvdGFsVGF4U3VtbWFyeSA9IHtcbiAgICAgICAgVkFUQ29kZTpcIlwiLFxuICAgICAgICBWQVQ6IC0xMjM0NSxcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxuICAgICAgICBUYXhTdW06IDAsXG4gICAgICAgIFRYcmF0ZVN1bTogMFxuICAgICAgfTtcbiAgICAgICAgVGF4U3VtbWFyeS5WQVRDb2RlPWVsZW1lbnQuVkFUQ29kZTtcbiAgICAgICAgVGF4U3VtbWFyeS5WQVQgPSBlbGVtZW50LlZBVDsgICAgICAgIFxuICAgICAgIFxuICAgICAgICBUYXhTdW1tYXJ5LlByZVRheFN1bSA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKGVsZW1lbnQuUHJlVGF4KTsgICAgICAgIFxuICAgICAgICBUYXhTdW1tYXJ5LlRheFN1bSA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKGVsZW1lbnQudGF4TGluZVRvdGFsKTtcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgIFxuICAgICAgICB0b3RhbFRheFN1bW1hcnlBcnJheS5wdXNoKFRheFN1bW1hcnkpO1xuICAgIH0pXG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNUb3RhbFRheFN1bW1hcnlcIiwgXCJUb3RhbCBUYXggU3VtbWVyeSAgV2l0aG91dCBHcm91cGVkIDogXCIsIHRvdGFsVGF4U3VtbWFyeUFycmF5KTtcbiAgICBcbiAgICB0b3RhbFRheFN1bW1hcnlHcm91cCA9IHRvdGFsVGF4U3VtbWFyeUFycmF5LnJlZHVjZSgocHJlcGFyZWRBcnJheTphbnksY3VycmVudE9iajphbnkpID0+IHtcbiAgICAgIGxldCBpbmQgPSBwcmVwYXJlZEFycmF5LmZpbmRJbmRleCgoeDogeyBWQVQ6IGFueTsgfSkgPT4geC5WQVQgPT09IGN1cnJlbnRPYmouVkFUKTtcbiAgICAgIGlmKGluZCA9PT0gLTEpe1xuICAgICAgICBwcmVwYXJlZEFycmF5LnB1c2goY3VycmVudE9iailcbiAgICAgIH1lbHNlIHtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlZBVENvZGUgPSBjdXJyZW50T2JqLlZBVENvZGU7XG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVQgPSBjdXJyZW50T2JqLlZBVDtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlByZVRheFN1bSArPSBjdXJyZW50T2JqLlByZVRheFN1bTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRheFN1bSArPSBjdXJyZW50T2JqLlRheFN1bTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRYcmF0ZVN1bSArPSBjdXJyZW50T2JqLlRYcmF0ZVN1bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmVwYXJlZEFycmF5O1xuICAgIH0sW10pXG4gICAgLy8gbGlzdE9mVGFncy5tYXAoeCA9PiB1bmlxdWUuZmlsdGVyKGEgPT4gYS5sYWJlbCA9PSB4LmxhYmVsICYmIGEuY29sb3IgPT0geC5jb2xvcikubGVuZ3RoID4gMCA/IG51bGwgOiB1bmlxdWUucHVzaCh4KSk7XG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNUb3RhbFRheFN1bW1hcnlcIiwgXCJUb3RhbCAgVGF4IFN1bW1lciBHcm91cCA6XCIsIHRvdGFsVGF4U3VtbWFyeUdyb3VwKTtcblxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRvdGFsVGF4U3VtbWFyeSA9IHRvdGFsVGF4U3VtbWFyeUdyb3VwO1xuICAgIHJldHVybiB0aGlzO1xuXG4gIH1cblxuICAvKipcbiAgICogY3VycmVudCB0cmFuc2FjdGlvbiBEaXNvY3VudCBUb3RhbFxuICAgKiBAcmV0dXJucyBEaXNjb3VudCBUb3RhbFxuICAgKi9cbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWwoKSB7XG4gICAgbGV0IHJlZnVuZFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5yZWZ1bmRUb3RhbCA/IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xuXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzRGlzY291bnRUb3RhbFwiLCAgYHJlZnVuZFRvdGFsICR7cmVmdW5kVG90YWx9LCBiYXNrZXRUb3RhbCAke3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWx9LHNhbGVUb3RhbCAgJHt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbH1gKTtcbiAgICBjb25zdCBkaXNjb3VudFRvdGFsID1cbiAgICAgIE1hdGguYWJzKFxuICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCkgLVxuICAgICAgICAoTWF0aC5hYnModGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCkgKyBNYXRoLmFicyhyZWZ1bmRUb3RhbCkpXG4gICAgICApO1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWxcIiwgXCJkaXNjb3VudFRvdGFsXCIsIGRpc2NvdW50VG90YWwpXG4gICAgcmV0dXJuIE51bWJlcihkaXNjb3VudFRvdGFsLnRvRml4ZWQoMikpO1xuICB9XG5cbiAgLyoqXG4gICogY3VycmVudCB0cmFuc2FjdGlvbiBSZWZ1bmQgVG90YWxcbiAgKiBAcmV0dXJucyBSZWZ1bmQgVG90YWxcbiAgKi9cbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1JlZnVuZFRvdGFsKCkge1xuICAgIGxldCB0b3RhbFJlZnVuZCA9IDA7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgcHJvZHVjdDogUHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcbiAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkVG90YWwpIHtcbiAgICAgICAgdG90YWxSZWZ1bmQgPSB0b3RhbFJlZnVuZCArIHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcbiAgICAgIH1cbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1JlZnVuZFRvdGFsXCIsIFwidG90YWxSZWZ1bmQgZm9yIEN1cnJlbnQgVHJhbnNhY3Rpb25EZXRhaWxzXCIgLCB0b3RhbFJlZnVuZClcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsUmVmdW5kO1xuICB9XG5cblxuXG4gIC8qKlxuICAgKiBCYXNrZXRzIHN1bW1hcnlcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgc3VtbWFyeVxuICAgKi9cbiAgYmFza2V0U3VtbWFyeShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsKGJhc2tldERldGFpbHMuYmFza2V0VG90YWwpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVTYWxlVG90YWwoXG4gICAgICBiYXNrZXREZXRhaWxzXG4gICAgKSk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLmdldFJlZnVuZFRvdGFsKCk7XG4gICAgaWYgKFxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQgfHxcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvblxuICAgICkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudXBkYXRlRGlzY291bnRUb3RhbCgpKTtcbiAgICB9XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyA9IGJhc2tldERldGFpbHMucXVhbnRpdHk7XG5cblxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bikge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuVkFUVG90YWwgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5yZWR1Y2UoXG4gICAgICAgIChuOiBhbnksIHsgdGF4TGluZVRvdGFsIH06IGFueSkgPT4gbiArIHRheExpbmVUb3RhbCxcbiAgICAgICAgMFxuICAgICAgKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuVkFUVG90YWwgPSAwLjAwO1xuICAgIH1cblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJiYXNrZXRTdW1tYXJ5XCIsIFwiYmFza2V0c3VtbWFyeSB1cGRhdGVkIGluIHRyYW5zYWN0aW9uIGRvY3VtZW50OiBcIiwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmUgRGlzY291bnRcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgbGluZSBEaXNjb3VudFxuICAgKi9cbiAgbGluZURpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xuICAgICAgaWYgKGVsZW1lbnQubGluZURpc2NvdW50KSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnB1c2goZWxlbWVudC5saW5lRGlzY291bnQpO1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnJlZHVjZShcbiAgICAgICAgICAoYWNjOiBhbnlbXSwgdmFsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2MuZmluZCgoZWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFxuICAgICAgLy8gICBcImUtYmFza2V0IDpsaW5lIGRpc2NvdW50IHVwZGF0ZWQgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnRcIixcbiAgICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcbiAgICAgIC8vICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIGV4Y2hhbmdlXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXG4gICAqIEByZXR1cm5zIGV4Y2hhbmdlIFxuICAgKi9cbiAgZXhjaGFuZ2UoYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2UgPSBiYXNrZXREZXRhaWxzLmV4Y2hhbmdlICYmIGJhc2tldERldGFpbHMuZXhjaGFuZ2UubGVuZ3RoID4gMCA/IFsuLi5iYXNrZXREZXRhaWxzLmV4Y2hhbmdlXSA6IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xuXG4gICAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcbiAgICAgIGlmIChlbGVtZW50LmV4Y2hhbmdlICE9IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBpc1ByZXNlbnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlLnNvbWUoKGVsOiB7IGV4Y2hhbmdlSWQ6IGFueTsgfSkgPT4gZWwuZXhjaGFuZ2VJZCA9PT0gZWxlbWVudC5leGNoYW5nZS5leGNoYW5nZUlkKTtcbiAgICAgICAgaWYgKCFpc1ByZXNlbnQpIHtcbiAgICAgICAgICBsZXQgZXhjaGFuZ2VJdGVtcyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxlbWVudC5leGNoYW5nZS5uZXdJdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3QgaXRlbSA9IGVsZW1lbnQuZXhjaGFuZ2UubmV3SXRlbXNbal07XG4gICAgICAgICAgICBsZXQgbmV3SXRlbXM6IGFueSA9IHsgbGluZUl0ZW1JZDogaXRlbS5pdGVtTGluZUlkLCBRdWFudGl0eTogaXRlbS5xdWFudGl0eSB9XG4gICAgICAgICAgICBleGNoYW5nZUl0ZW1zLnB1c2gobmV3SXRlbXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zID0gWy4uLmV4Y2hhbmdlSXRlbXNdO1xuICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2UucHVzaChlbGVtZW50LmV4Y2hhbmdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJleGNoYW5nZVwiLFxuICAgICAgICBcInRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQgZXhjaGFuZ2VcIixcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAqIGFkZCBwcmV2aW91cyBleGNoYW5nZSBkYXRhXG4gICogQHBhcmFtIG9yaWdpbmFsVHJhbnNhY3Rpb25Eb2N1bWVudFxuICAqIEByZXR1cm5zIGxpbmUgUHJvbW90aW9uc1xuICAqL1xuICBhZGRFeGNoYW5nZURhdGEob3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2UgPSBvcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID8gWy4uLm9yaWdpbmFsVHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2VdIDogbnVsbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBsaW5lIFByb21vdGlvbnNcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgbGluZSBQcm9tb3Rpb25zXG4gICAqL1xuICBsaW5lUHJvbW90aW9uKGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSBbXTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcbiAgICAgIGlmIChlbGVtZW50LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5wdXNoKFxuICAgICAgICAgIGVsZW1lbnQubGluZVByb21vdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLnJlZHVjZShcbiAgICAgICAgICAoYWNjOiBhbnlbXSwgdmFsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY2MuZmluZCgoZWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcbiAgICAgICAgICAgICAgYWNjLnB1c2godmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiB0cmFuc2FjdGlvbiBQcm9tb3Rpb25cbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb24gUHJvbW90aW9uXG4gICAqL1xuICB0cmFuc2FjdGlvblByb21vdGlvbihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgaWYgKGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPVxuICAgICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uO1xuICAgICAgLy8gICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5UcmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgLy8gICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnB1c2goZWxlbWVudC5saW5lUHJvbW90aW9ucylcbiAgICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9ICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb25zLnJlZHVjZSgoYWNjLCB2YWwpID0+IHtcbiAgICAgIC8vICAgICBpZiAoIWFjYy5maW5kKGVsID0+IGVsLml0ZW1MaW5lSWQgPT09IHZhbC5pdGVtTGluZUlkKSkge1xuICAgICAgLy8gICAgICAgYWNjLnB1c2godmFsKTtcbiAgICAgIC8vICAgICB9XG4gICAgICAvLyAgICAgcmV0dXJuIGFjYztcbiAgICAgIC8vICAgfSwgW10pO1xuICAgICAgLy8gfVxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ0cmFuc2FjdGlvblByb21vdGlvblwiLFxuICAgICAgICBcInRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvblxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB0cmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBpZiAoYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50KSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgPVxuICAgICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQ7XG5cbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidHJhbnNhY3Rpb25EaXNjb3VudFwiLFxuICAgICAgICBcInRyYW5zYWN0aW9uIERpc2NvdW50XCIsXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGF5bWVudHMgZGV0YWlsc1xuICAgKiBAcGFyYW0gcGF5bWVudERldGFpbHNcbiAgICogQHJldHVybnNcbiAgICovXG4gIHBheW1lbnREZXRhaWxzKHBheW1lbnREZXRhaWxzOiBhbnkpIHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwicGF5bWVudERldGFpbHNcIiwgXCJwYXltZW50IGRldGFpbHMgYWZ0ZXIgdHJhbnNhY3Rpb24gY29tcGxldGVkXCIscGF5bWVudERldGFpbHMpO1xuICAgIFxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscyA9IHBheW1lbnREZXRhaWxzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cblxuICAvKipcbiAgICogUGF5bWVudHMgZGV0YWlsc1xuICAgKiBAcGFyYW0gcGF5bWVudERldGFpbHNcbiAgICogQHJldHVybnNcbiAgICovXG4gICBzcGxpdFBheW1lbnQoc3BsaXRQYXltZW50OiBib29sZWFuKSB7ICAgIFxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zcGxpdFBheW1lbnQgPSBzcGxpdFBheW1lbnQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gXG5cbiAgIC8qKlxuICAgKiBQYXltZW50cyBkZXRhaWxzXG4gICAqIEBwYXJhbSBwYXltZW50RGV0YWlsc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgICBpc1BheW1lbnRDb21wbGV0ZWQoaXNQYXltZW50Q29tcGxldGVkOiBib29sZWFuKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuaXNQYXltZW50Q29tcGxldGVkID0gaXNQYXltZW50Q29tcGxldGVkO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSBcbiAgXG5cblxuXG4gIC8qKlxuICAgKiBCYXNlcyBjdXJyZW5jeVxuICAgKiBAcGFyYW0gY3VycmVuY3lcbiAgICogQHJldHVybnMgY3VycmVuY3lcbiAgICovXG4gIGJhc2VDdXJyZW5jeShjdXJyZW5jeTogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3kgPSBjdXJyZW5jeTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAqIGdpZnQgb3B0aW9uIGF0XG4gICogQHJldHVybnMgYXRcbiAgKi9cbiAgZ2lmdE9wdGlvbihnaWZ0OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnaWZ0T3B0aW9uXCIsXG4gICAgICBcInRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5naWZ0b3B0aW9uXCIsXG4gICAgICBnaWZ0XG4gICAgKTtcbiAgICBpZiAoZ2lmdCkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmdpZnRlZFJlY2VpcHQgPSBnaWZ0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcblxuLyoqXG4gKiBtYW51YWwgRGlzY291bnRcbiAqIEBwYXJhbSBkaXNjb3VudERhdGFcbiAqIEByZXR1cm5zXG4gKi9cblxuICAvLyBtYW51YWxEaXNjb3VudChkaXNjb3VudERhdGEgOiBiYXNrZXREaXNjb3VudCk6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAvLyAgIGxldCBzYWxlVG90YWwgPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWw7XG4gIC8vICAgaWYoZGlzY291bnREYXRhLmRpc2NvdW50VHlwZSA9PSdQZXJjZW50Jyl7XG4gIC8vICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9IHNhbGVUb3RhbC0oc2FsZVRvdGFsKihkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQvMTAwKSk7XG4gIC8vICAgICBkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQgPSAtMSooc2FsZVRvdGFsLXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKTtcbiAgLy8gICB9ZWxzZSB7XG4gIC8vICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9c2FsZVRvdGFsLWRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudDtcbiAgLy8gICAgIGRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudCA9IC0xKmRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudDtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zYWN0aW9uRGlzY291bnQucHVzaChkaXNjb3VudERhdGEpO1xuICAvLyAgIHJldHVybiB0aGlzO1xuXG4gIC8vIH1cblxuICAvKipcbiAgICogVHlwZXMgdHJhbnNhY3Rpb24gZG9jdW1lbnQgYnVpbGRlclxuICAgKiBAcGFyYW0gdFxuICAgKiBAcmV0dXJucyB0eXBlXG4gICAqL1xuICB0eXBlKHQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9IHQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIE9wZXJhdGlvbnMgc3RhdHVzXG4gICAqIEBwYXJhbSBvXG4gICAqIEByZXR1cm5zIHN0YXR1c1xuICAgKi9cbiAgb3BlcmF0aW9uU3RhdHVzKG86IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3BlcmF0aW9uU3RhdHVzID0gbztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlZCBhdFxuICAgKiBAcmV0dXJucyBhdFxuICAgKi9cbiAgY3JlYXRlZEF0KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIFVwZGF0ZWQgYXRcbiAgICogQHJldHVybnMgYXRcbiAgICovXG4gIHVwZGF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVwZGF0ZWRBdCA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogdHJhbnNzYWN0aW9uIGNvbXBsZXRpb24gYXRcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb24gY29tcGxldGlvbiBkYXRlXG4gICAqL1xuICB0cmFuc2FjdGlvbkNvbXBsZXRlZEF0KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNDb21wbGV0ZWRBdCA9IGRhdGUudG9JU09TdHJpbmcoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICAvKipcbiAgICogQnVpbGRzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcbiAgICogQHJldHVybnMgYnVpbGRcbiAgICovXG4gIGJ1aWxkKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogU2FsZXMgdG90YWwgaW4gcmVmdW5kXG4gICAqIEBwYXJhbSBzYWxlVG90YWxcbiAgICogQHJldHVybnMgdG90YWwgaW4gcmVmdW5kXG4gICAqL1xuICBzYWxlVG90YWxJblJlZnVuZChzYWxlVG90YWw6IG51bWJlcik6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc2FsZVRvdGFsID0gc2FsZVRvdGFsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcbiAgICogQHJldHVybnMgYmFza2V0IGRldGFpbHNcbiAgICovXG4gIGdldEJhc2tldERldGFpbHMoKTogQmFza2V0IHtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwiZ2V0QmFza2V0RGV0YWlsc1wiLCBcIkdldHRpbmcgQmFza2V0IGZvciB0cmFuc2FjdGlvbkRvY3VtZW50XCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCk7XG5cbiAgICBsZXQgYmFza2V0OiBCYXNrZXQgPSB7XG4gICAgICBzdWJzaWRpYXJ5SWQgOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3Vic2lkaWFyeUlkLFxuICAgICAgdHJhbnNhY3Rpb25EaXNjb3VudDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LFxuICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24sXG4gICAgICB0cmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25JZCxcbiAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub2ZmbGluZVRyYW5zYWN0aW9uSWQsXG4gICAgICB0b3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gICAgICBiYXNrZXRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXG4gICAgICBkaXNjb3VudFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsLFxuICAgICAgc2FsZVRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwsXG4gICAgICByZWZ1bmRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwsXG4gICAgICBxdWFudGl0eTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyxcbiAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgIGJhc2VDdXJyZW5jeTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcbiAgICAgIGN1c3RvbWVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIsXG4gICAgfTtcblxuICAgIGJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgU0tVOiBhbnk7IGJhckNvZGU6IGFueTsgYmFyY29kZXM6IGFueTsgZGVzY3JpcHRpb246IGFueTsgaW1hZ2VVcmxzOiBhbnk7IHRvdGFsTGluZVByaWNlOiBhbnk7IGl0ZW1MaW5lSWQ6IGFueTsgZXhjbHVkZVByb21vdGlvbjogYW55OyBwcmljZTogYW55OyBxdWFudGl0eTogYW55OyBzZWxlY3RlZFJSUFByaWNlOiBhbnk7IGZ1bGxmaWxtZW50SWQ6IGFueTsgZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU6IGFueTsgZGVsaXZlcnlHcm91cDogc3RyaW5nOyBsZWFkVGltZTogYW55OyBkZWxpdmVyeU1ldGhvZDogYW55OyBnaWZ0Q2FyZDogYW55OyBnaWZ0Q2FyZEV4cGlyeURhdGU6IGFueTsgZ2lmdENhcmROdW1iZXJJc3N1ZWQ6IGFueTsgZ2lmdENhcmRSZWNpcGllbnRFbWFpbDogYW55OyBnaWZ0Q2FyZFJlY2lwaWVudE5hbWU6IGFueTsgcmVmdW5kZWRUb3RhbDogYW55OyByZWZ1bmRlZFF1YW50aXR5OiBudW1iZXI7IHJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb246IGFueTsgcmVmdW5kZWRSZWFzb246IGFueTsgcmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5OiBhbnk7IGlzTGFzdEV4Y2hhbmdlZDogYW55OyB9LCBpbmRleDogYW55KSA9PiB7XG4gICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBKU09OLnN0cmluZ2lmeShwcm9kdWN0KSwgXCJlYmFza2V0OiBiYXNrZXQgZGV0YWlsIHVwZGF0ZSBpbiBiYXNrZXRcIik7XG4gICAgICBjb25zdCBwID0ge30gYXMgYW55O1xuICAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcbiAgICAgIHAuYmFyY29kZSA9IHByb2R1Y3QuYmFyQ29kZTtcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xuXG4gICAgICBwLmRlc2NyaXB0aW9uID0gcHJvZHVjdC5kZXNjcmlwdGlvbjtcbiAgICAgIHAuaW1hZ2VVcmxzID0gcHJvZHVjdC5pbWFnZVVybHM7XG4gICAgICBwLmN1cnJlbmN5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcbiAgICAgIHAudG90YWxMaW5lUHJpY2UgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgcC5pdGVtTGluZUlkID0gTnVtYmVyKHByb2R1Y3QuaXRlbUxpbmVJZCk7XG4gICAgICBwLmV4Y2x1ZGVQcm9tb3Rpb24gPSBwcm9kdWN0LmV4Y2x1ZGVQcm9tb3Rpb247XG5cbiAgICAgIHAuc2VsZWN0ZWRQcmljZSA9IHByb2R1Y3QucHJpY2U7XG4gICAgICBwLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgICAgIHAudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xuXG4gICAgICBwLmZ1bGxmaWxtZW50SWQgPSBwcm9kdWN0LmZ1bGxmaWxtZW50SWQ7XG4gICAgICBwLmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lID0gcHJvZHVjdC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZTtcbiAgICAgIHAuZGVsaXZlcnlHcm91cCA9IHByb2R1Y3QuZGVsaXZlcnlHcm91cCB8fCBcIjFcIjtcbiAgICAgIHAubGVhZFRpbWUgPSBwcm9kdWN0LmxlYWRUaW1lO1xuICAgICAgcC5kZWxpdmVyeU1ldGhvZCA9IHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgfHwgREVMSVZFUllfTUVUSE9EUy5DT0xMRUNUX0ZST01fU1RPUkUudG9TdHJpbmcoKTtcblxuICAgICAgaWYocC5mdWxsZmlsbWVudElkICE9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkKVxuICAgICAge1xuICAgICAgICBwLmlzV2ViT3JkZXIgPSB0cnVlO1xuICAgICAgfVxuICAgIFxuICAgICAgcC5naWZ0Q2FyZCA9IHByb2R1Y3QuZ2lmdENhcmQ7XG4gICAgICBwLmdpZnRDYXJkRXhwaXJ5RGF0ZSA9IHByb2R1Y3QuZ2lmdENhcmRFeHBpcnlEYXRlO1xuICAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50RW1haWwgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50RW1haWw7XG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50TmFtZSA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnROYW1lO1xuICAgICAgXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcbiAgICAgICkge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQ6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBkaXNjb3VudGVkTGluZVByaWNlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IGxpbmVEaXNjb3VudDtcbiAgICAgICAgICAgIHAudG90YWwgPSBsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbiAmJlxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxuICAgICAgKSB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5mb3JFYWNoKChsaW5lUHJvbW90aW9uOiB7IGl0ZW1MaW5lSWQ6IHsgdG9TdHJpbmc6ICgpID0+IGFueTsgfTsgcHJvbW90aW9uTGluZVByaWNlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgcC5saW5lUHJvbW90aW9ucyA9IGxpbmVQcm9tb3Rpb247XG4gICAgICAgICAgICBwLnRvdGFsID0gbGluZVByb21vdGlvbi5wcm9tb3Rpb25MaW5lUHJpY2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93biAmJlxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5sZW5ndGggPiAwXG4gICAgICApIHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgodGF4TGluZTogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IFZBVDogYW55OyBWQVRDb2RlOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkICYmIHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gdGF4TGluZS5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgICAgIHAuc2VsZWN0ZWRWQVQgPSB0YXhMaW5lLlZBVDtcbiAgICAgICAgICAgIHAuc2VsZWN0ZWRWQVRDb2RlID0gdGF4TGluZS5WQVRDb2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQpIHtcbiAgICAgICAgcC50b3RhbCA9IHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EIHx8IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xuICAgICAgICBwLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb247XG4gICAgICAgIHAucmVmdW5kZWRSZWFzb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uO1xuICAgICAgICBpZiAoIXAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xuICAgICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHAucmVmdW5kZWRSZWFzb247XG4gICAgICAgIH1cbiAgICAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xuICAgICAgICBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eTtcbiAgICAgICAgcC5yZWZ1bmRlZFRvdGFsID0gcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuICAgICAgICBwLnRvdGFsIC09IE1hdGguYWJzKHAucmVmdW5kZWRUb3RhbCk7XG4gICAgICAgIHAuaXNMYXN0RXhjaGFuZ2VkID0gcHJvZHVjdC5pc0xhc3RFeGNoYW5nZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQpIHtcbiAgICAgICAgaWYgKHAudG90YWwgPiAwKSB7XG4gICAgICAgICAgcC50b3RhbCAqPSAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBiYXNrZXQucHJvZHVjdHMucHVzaChwKTtcblxuICAgIH0pO1xuXG4gICAgYmFza2V0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkRpc2NvdW50QW5kVHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uKGJhc2tldCk7XG4gICAgYmFza2V0LnRvdGFsID0gKGJhc2tldC5iYXNrZXRUb3RhbCB8fCAwKSArIHRoaXMuZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0KTtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9SRUZVTkQpIHtcbiAgICAgIGJhc2tldC5xdWFudGl0eSA9IHRoaXMuZ2V0UmVmdW5kZWRUb3RhbFdpdGhRdWFudGl0eShiYXNrZXQpO1xuICAgIH1cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0luZm8odGhpcy5jbGFzc05hbWUsIFwiZ2V0QmFza2V0RGV0YWlsc1wiLCBcIkJhc2tldCBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiLCBiYXNrZXQpXG4gICAgcmV0dXJuIGJhc2tldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGJhc2tldCBkZXRhaWxzXG4gICAqIEByZXR1cm5zIHJlZnVuZCBiYXNrZXQgZGV0YWlsc1xuICAgKi9cbiAgLy8gZ2V0UmVmdW5kQmFza2V0RGV0YWlscygpOiBCYXNrZXQge1xuICAvLyAgIGxldCBiYXNrZXQ6IEJhc2tldCA9IHtcbiAgLy8gICAgIHN1YnNpZGlhcnlJZCA6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdWJzaWRpYXJ5SWQsXG4gIC8vICAgICB0cmFuc2FjdGlvbkRpc2NvdW50OiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQsXG4gIC8vICAgICB0cmFuc2FjdGlvblByb21vdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbixcbiAgLy8gICAgIHRyYW5zYWN0aW9uSWQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkLFxuICAvLyAgICAgdG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsLFxuICAvLyAgICAgYmFza2V0VG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsLFxuICAvLyAgICAgZGlzY291bnRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCxcbiAgLy8gICAgIHNhbGVUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsLFxuICAvLyAgICAgcXVhbnRpdHk6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnRvdGFsSXRlbXMsXG4gIC8vICAgICBwcm9kdWN0czogW10sXG4gIC8vICAgICBiYXNlQ3VycmVuY3k6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXG4gIC8vICAgICBjdXN0b21lcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1c3RvbWVyLFxuICAvLyAgIH07XG5cbiAgLy8gICBiYXNrZXQucHJvZHVjdHMgPSBbXSBhcyBQcm9kdWN0W107XG4gIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiB7IFNLVTogYW55OyBiYXJDb2RlOiBhbnk7IGJhcmNvZGVzOiBhbnk7IGRlc2NyaXB0aW9uOiBhbnk7IGltYWdlVXJsczogYW55OyB0b3RhbExpbmVQcmljZTogYW55OyBpdGVtTGluZUlkOiBhbnk7IGV4Y2x1ZGVQcm9tb3Rpb246IGFueTsgcHJpY2U6IG51bWJlcjsgcXVhbnRpdHk6IGFueTsgc2VsZWN0ZWRSUlBQcmljZTogYW55OyBmdWxsZmlsbWVudElkOiBhbnk7IGZ1bGxmaWxtZW50TG9jYXRpb25OYW1lOiBhbnk7IGRlbGl2ZXJ5R3JvdXA6IHN0cmluZzsgbGVhZFRpbWU6IGFueTsgZGVsaXZlcnlNZXRob2Q6IGFueTsgZ2lmdENhcmQ6IGFueTsgZ2lmdENhcmRFeHBpcnlEYXRlOiBhbnk7IGdpZnRDYXJkTnVtYmVySXNzdWVkOiBhbnk7IGdpZnRDYXJkUmVjaXBpZW50RW1haWw6IGFueTsgZ2lmdENhcmRSZWNpcGllbnROYW1lOiBhbnk7IGl0ZW1EaXNjb3VudHM6IGFueTsgcmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5OiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgcmVmdW5kZWQ6IGFueTsgaXNMYXN0RXhjaGFuZ2VkOiBhbnk7IGV4Y2hhbmdlOiBhbnk7IHJlZnVuZGVkVG90YWw6IG51bWJlcjsgfSwgaW5kZXg6IGFueSkgPT4ge1xuICAvLyAgICAgY29uc3QgcCA9IHt9IGFzIFByb2R1Y3Q7XG4gIC8vICAgICBwLlNLVSA9IHByb2R1Y3QuU0tVO1xuICAvLyAgICAgcC5iYXJjb2RlID0gcHJvZHVjdC5iYXJDb2RlO1xuICAvLyAgICAgcC5iYXJjb2RlcyA9IHByb2R1Y3QuYmFyY29kZXM7XG5cbiAgLy8gICAgIHAuZGVzY3JpcHRpb24gPSBwcm9kdWN0LmRlc2NyaXB0aW9uO1xuICAvLyAgICAgcC5pbWFnZVVybHMgPSBwcm9kdWN0LmltYWdlVXJscztcbiAgLy8gICAgIHAuY3VycmVuY3kgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5O1xuICAvLyAgICAgcC50b3RhbExpbmVQcmljZSA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XG4gIC8vICAgICBwLml0ZW1MaW5lSWQgPSBOdW1iZXIocHJvZHVjdC5pdGVtTGluZUlkKTtcbiAgLy8gICAgIHAuZXhjbHVkZVByb21vdGlvbiA9IHByb2R1Y3QuZXhjbHVkZVByb21vdGlvbjtcblxuICAvLyAgICAgcC5zZWxlY3RlZFByaWNlID0gcHJvZHVjdC5wcmljZTtcbiAgLy8gICAgIHAucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xuICAvLyAgICAgcC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XG4gIC8vICAgICBwLnNlbGVjdGVkUlJQUHJpY2UgPSBwcm9kdWN0LnNlbGVjdGVkUlJQUHJpY2U7XG5cbiAgLy8gICAgIHAuZnVsbGZpbG1lbnRJZCA9IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDtcbiAgLy8gICAgIHAuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWUgPSBwcm9kdWN0LmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lO1xuICAvLyAgICAgcC5kZWxpdmVyeUdyb3VwID0gcHJvZHVjdC5kZWxpdmVyeUdyb3VwIHx8IFwiMVwiO1xuICAvLyAgICAgcC5sZWFkVGltZSA9IHByb2R1Y3QubGVhZFRpbWU7XG4gIC8vICAgICBwLmRlbGl2ZXJ5TWV0aG9kID0gcHJvZHVjdC5kZWxpdmVyeU1ldGhvZCB8fCBERUxJVkVSWV9NRVRIT0RTLkNPTExFQ1RfRlJPTV9TVE9SRS50b1N0cmluZygpO1xuXG4gIC8vICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcbiAgLy8gICAgIHAuZ2lmdENhcmRFeHBpcnlEYXRlID0gcHJvZHVjdC5naWZ0Q2FyZEV4cGlyeURhdGU7XG4gIC8vICAgICBwLmdpZnRDYXJkTnVtYmVySXNzdWVkID0gcHJvZHVjdC5naWZ0Q2FyZE51bWJlcklzc3VlZDtcbiAgLy8gICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcbiAgLy8gICAgIHAuZ2lmdENhcmRSZWNpcGllbnROYW1lID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudE5hbWU7XG4gICAgICBcbiAgICAgIFxuICAvLyAgICAgaWYocC5mdWxsZmlsbWVudElkICE9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkKVxuICAvLyAgICAge1xuICAvLyAgICAgICBwLmlzV2ViT3JkZXIgPSB0cnVlO1xuICAvLyAgICAgfVxuICAgICAgXG4gIC8vICAgICBpZiAocHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XG4gIC8vICAgICAgIHAuaXRlbURpc2NvdW50cyA9IHByb2R1Y3QuaXRlbURpc2NvdW50cyBhcyBJdGVtRGlzY291bnQ7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIC8vIGlmKCFwLml0ZW1EaXNjb3VudHMpe1xuICAvLyAgICAgLy8gICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBwLml0ZW1EaXNjb3VudHMpO1xuXG4gIC8vICAgICAvLyAgIHRoaXMuYmFza2V0U2VydmljZS50cmFuc2FjdGlvbkRpc2NvdW50QW5kUHJvbW90aW9uUHJvZHVjdG9ydGlvbkNhbGN1bGF0aW9uKGJhc2tldCk7XG4gIC8vICAgICAvLyB9XG4gIC8vICAgICBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5IDogMDtcblxuICAvLyAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xuICAvLyAgICAgICBwLnF1YW50aXR5ID0gcC5xdWFudGl0eSAtIHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcbiAgLy8gICAgICAgcC50b3RhbExpbmVQcmljZSA9IChwLnF1YW50aXR5ICogcHJvZHVjdC5wcmljZSk7XG4gIC8vICAgICAgIHAudG90YWwgPSBwLnRvdGFsTGluZVByaWNlO1xuICAvLyAgICAgICAvLyBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eTtcbiAgLy8gICAgICAgcC5yZWZ1bmRlZCA9IHByb2R1Y3QucmVmdW5kZWQ7XG4gIC8vICAgICAgIHAuaXNMYXN0RXhjaGFuZ2VkID0gcHJvZHVjdC5pc0xhc3RFeGNoYW5nZWQ7XG4gIC8vICAgICB9XG4gIC8vICAgICBpZiAocHJvZHVjdC5leGNoYW5nZSkge1xuICAvLyAgICAgICBwLmV4Y2hhbmdlID0gcHJvZHVjdC5leGNoYW5nZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgaWYgKFxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJlxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwXG4gIC8vICAgICApIHtcblxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQ6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBkaXNjb3VudGVkTGluZVByaWNlOiBhbnk7IH0pID0+IHtcblxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xuICAvLyAgICAgICAgICAgcC5saW5lRGlzY291bnQgPSBPYmplY3QuYXNzaWduKHt9LCBsaW5lRGlzY291bnQpO1xuICAvLyAgICAgICAgICAgcC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSA9IHAubGluZURpc2NvdW50LnVuaXRQcmljZSAqIHAucXVhbnRpdHlcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ID0gcC50b3RhbCAtIHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2VcbiAgLy8gICAgICAgICAgIHAudG90YWwgPSBwLmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlO1xuICAvLyAgICAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IGxpbmVEaXNjb3VudDtcbiAgLy8gICAgICAgICAgIHAudG90YWwgPSBsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZVxuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmIChcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uICYmXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwXG4gIC8vICAgICApIHtcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb246IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyByZWZ1bmRlZDogYW55OyB9KSA9PiB7XG4gIC8vICAgICAgICAgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkgJiYgIWxpbmVQcm9tb3Rpb24ucmVmdW5kZWQpIHtcbiAgLy8gICAgICAgICAgIHAubGluZVByb21vdGlvbnMgPSBsaW5lUHJvbW90aW9uO1xuICAvLyAgICAgICAgICAgcC50b3RhbCA9IHAubGluZVByb21vdGlvbnMucHJvbW90aW9uTGluZVByaWNlO1xuICAvLyAgICAgICAgICAgcC50b3RhbCA9IHAudG90YWwgLSAocHJvZHVjdC5yZWZ1bmRlZFRvdGFsID8gTWF0aC5hYnMocHJvZHVjdC5yZWZ1bmRlZFRvdGFsKSA6IDApO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIHAucmVmdW5kZWRRdWFudGl0eSA9IDA7XG4gIC8vICAgICBwLnJlZnVuZGVkVG90YWwgPSAwO1xuXG4gIC8vICAgICBpZiAoXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duICYmXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmxlbmd0aCA+IDBcbiAgLy8gICAgICkge1xuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKCh0YXhMaW5lOiB7IGl0ZW1MaW5lSWQ6IHsgdG9TdHJpbmc6ICgpID0+IGFueTsgfTsgVkFUOiBhbnk7IFZBVENvZGU6IGFueTsgfSkgPT4ge1xuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IHRheExpbmUuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gIC8vICAgICAgICAgICBwLnNlbGVjdGVkVkFUID0gdGF4TGluZS5WQVQ7XG4gIC8vICAgICAgICAgICBwLnNlbGVjdGVkVkFUQ29kZSA9IHRheExpbmUuVkFUQ29kZTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0pO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAocC5xdWFudGl0eSA+IDApIHtcbiAgLy8gICAgICAgYmFza2V0LnByb2R1Y3RzLnB1c2gocCk7XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG4gIC8vICAgLy8gcHJvZHVjdC5pdGVtRGlzY291bnRzXG4gIC8vICAgaWYgKCFiYXNrZXQucHJvZHVjdHNbMF0uaGFzT3duUHJvcGVydHkoJ2l0ZW1EaXNjb3VudHMnKSkge1xuICAvLyAgICAgYmFza2V0ID0gdGhpcy5nZXRUcmFuc2FjdGlvbkRpc2NvdW50QW5kVHJhbnNhY3Rpb25Qcm9tb3Rpb25Qb3J0aW9uKGJhc2tldCk7XG5cbiAgLy8gICB9XG5cbiAgLy8gICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImViYXNrZXQgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciAgOm5ldyBjcmVhdGVkIHJlZnVuZGVkIGJhc2tldFwiLCBKU09OLnN0cmluZ2lmeShiYXNrZXQpKVxuICAvLyAgIGJhc2tldC5xdWFudGl0eSA9IGJhc2tldC5wcm9kdWN0cy5yZWR1Y2UoXG4gIC8vICAgICAobjogYW55LCB7IHF1YW50aXR5IH06IGFueSkgPT4gbiArIHF1YW50aXR5LFxuICAvLyAgICAgMFxuICAvLyAgICk7XG4gIC8vICAgYmFza2V0LnRvdGFsID0gdGhpcy5nZXRUb3RhbFdpdGhMaW5lRGlzY291bnRBbmRMaW5lUHJvbW90aW9uQXBwbGllZChiYXNrZXQpO1xuICAvLyAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC50b3RhbDtcbiAgLy8gICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSB0aGlzLmdldFRvdGFsRGlzY291bnRXaXRoVHJhbnNhY3Rpb25EaXNjb3VudHNBbmRQcm9tb3Rpb25zKGJhc2tldCk7XG4gIC8vICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXG4gIC8vICAgICBcImViYXNrZXQgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciA6IHVwZGF0ZSBCYXNrZXQgVG90YWw6IGFmdGVyIHByb21vdGlvbiA6YmFza2V0VG90YWxcIixcbiAgLy8gICAgIGJhc2tldC5iYXNrZXRUb3RhbFxuICAvLyAgICk7XG5cbiAgLy8gICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcbiAgLy8gICAgIFwiZTpiYXNrZXQgOlRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIDogYmFza2V0RGV0YWlscyB1cGRhdGVkIHZhbHVlc1wiLFxuICAvLyAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0KVxuICAvLyAgICk7XG4gIC8vICAgcmV0dXJuIGJhc2tldDtcbiAgLy8gfVxuXG5cbiAgZ2V0VHJhbnNhY3Rpb25EaXNjb3VudEFuZFRyYW5zYWN0aW9uUHJvbW90aW9uUG9ydGlvbihiYXNrZXQ6YW55KSB7XG4gICAgaWYgKFxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiZcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50OiB7IGl0ZW1MaW5lSWRzOiBhbnk7IH0pID0+IHtcbiAgICAgICAgaWYgKCFkaXNjb3VudC5pdGVtTGluZUlkcykge1xuICAgICAgICAgIGRpc2NvdW50Lml0ZW1MaW5lSWRzID0gYmFza2V0LnByb2R1Y3RzLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBiYXNrZXQgPSB0aGlzLmJhc2tldFNlcnZpY2UudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhiYXNrZXQsIGRpc2NvdW50KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiZcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgodFByb21vdGlvbjogeyBpdGVtTGluZUlkczogYW55OyB9KSA9PiB7XG4gICAgICAgIGlmICghdFByb21vdGlvbi5pdGVtTGluZUlkcykge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGJhc2tldC5wcm9kdWN0cy5maWx0ZXIoXG4gICAgICAgICAgICAoaXRlbTogeyBleGNsdWRlUHJvbW90aW9uOiBib29sZWFuOyB9KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmV4Y2x1ZGVQcm9tb3Rpb24gPT09IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0UHJvbW90aW9uLml0ZW1MaW5lSWRzID1cbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YS5tYXAoKHByb2R1Y3Q6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBwcm9kdWN0Lml0ZW1MaW5lSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGJhc2tldCA9IHRoaXMuYmFza2V0U2VydmljZS50cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhiYXNrZXQsIHRQcm9tb3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2tldDtcbiAgfVxuXG5cbiAgZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0RGV0YWlsczogYW55KSB7XG5cbiAgICBsZXQgZGlzY291bnRUb3RhbCA9IDA7XG4gICAgaWYgKFxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbiAmJlxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICBkaXNjb3VudFRvdGFsICs9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXG4gICAgICAgIDBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDBcbiAgICApIHtcblxuICAgICAgZGlzY291bnRUb3RhbCArPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxuICAgICAgICAwXG4gICAgICApO1xuXG5cbiAgICB9XG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnZXRUb3RhbERpc2NvdW50V2l0aFRyYW5zYWN0aW9uRGlzY291bnRzQW5kUHJvbW90aW9uc1wiLCBcIlRyYW5zYWN0aW9uIGRpc2NvdW50IFRvdGFsOlwiLCBkaXNjb3VudFRvdGFsKTtcblxuICAgIHJldHVybiBkaXNjb3VudFRvdGFsO1xuICB9XG5cblxuICBhcHBlbmRDdXJyZW5jeVN5bWJvbChjdXJyZW5jeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XG4gICAgLy8gIHZhbHVlPXRoaXMuZGVjaW1hbHBpcGUudHJhbnNmb3JtKHZhbHVlLCcxLjInKTtcbiAgICBpZiAodmFsdWUgPj0gMCkge1xuICAgICAgY29uc3QgcmV0dXJudmFsID0gY3VycmVuY3kgKyB2YWx1ZTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYXBwZW5kQ3VycmVuY3lTeW1ib2xcIiwgXCJhZGQgY3VycmVuY3kgd2l0aCB2YWx1ZVwiLCByZXR1cm52YWwpO1xuICAgICAgcmV0dXJuIHJldHVybnZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmV0dXJudmFsID0gXCItXCIgKyAoY3VycmVuY3kgKyB2YWx1ZSAqIC0xKTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYXBwZW5kQ3VycmVuY3lTeW1ib2xcIiwgXCJyZXR1cm5WYWxcIiwgcmV0dXJudmFsKTtcbiAgICAgIHJldHVybiByZXR1cm52YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gLyoqXG4gIC8vICAqIFVwZGF0ZXMgdG90YWwgcmVmdW5kXG4gIC8vICAqIEByZXR1cm5zIHRvdGFsIHJlZnVuZFxuICAvLyAgKi9cbiAgLy8gdXBkYXRlVG90YWxSZWZ1bmQoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAvLyAgICAgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWRUb3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2UgKiAtMTtcbiAgLy8gICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFxuICAvLyAgICAgICBcImViYXNrZXQ6IFRyYW5zYWN0aW9uIHByaWNlIG92ZXJyaWRlIDpcIixcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcbiAgLy8gICAgICk7XG5cbiAgLy8gICAgIGlmIChcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uICYmXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5sZW5ndGggPiAwXG4gIC8vICAgICApIHtcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb24pID0+IHtcbiAgLy8gICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcbiAgLy8gICAgICAgICAgIFwiUHJvbW90aW9uOiBiYXNrZXQgbGluZVByb21vdGlvbiA6IFwiLFxuICAvLyAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcbiAgLy8gICAgICAgICAgIFwibGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIixcbiAgLy8gICAgICAgICAgIGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcbiAgLy8gICAgICAgICAgIFwiY29uZGl0aW9uIDogXCIgK1xuICAvLyAgICAgICAgICAgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkpXG4gIC8vICAgICAgICAgKTtcblxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XG4gIC8vICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPVxuICAvLyAgICAgICAgICAgICBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZSAqIC0xO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfSk7XG4gIC8vICAgICB9IGVsc2VcbiAgLy8gICAgICAgaWYgKFxuICAvLyAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXG4gIC8vICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQubGVuZ3RoID4gMFxuICAvLyAgICAgICApIHtcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQpID0+IHtcbiAgLy8gICAgICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFxuICAvLyAgICAgICAgICAgICBcInByb2R1Y3QuaXRlbUxpbmVJZCA6IFwiICtcbiAgLy8gICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcbiAgLy8gICAgICAgICAgICk7XG4gIC8vICAgICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcbiAgLy8gICAgICAgICAgICAgXCJsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpIDogXCIgK1xuICAvLyAgICAgICAgICAgICBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpXG4gIC8vICAgICAgICAgICApO1xuICAvLyAgICAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXG4gIC8vICAgICAgICAgICAgIFwiY29uZGl0aW9uIDogXCIgK1xuICAvLyAgICAgICAgICAgICAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKVxuICAvLyAgICAgICAgICAgKTtcblxuICAvLyAgICAgICAgICAgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xuICAvLyAgICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBsaW5lRGlzY291bnQudW5pdFByaWNlICogcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICogLTE7XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSk7XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJQcm9kdWN0IGRlc2NyaXB0aW9uIDpcIiArIHByb2R1Y3QuZGVzY3JpcHRpb24pO1xuICAvLyAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJQcm9kdWN0IHRvdGFsIDpcIiArIHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XG4gIC8vICAgICAvLyBwcm9kdWN0LmRpc3BsYXlyZWZ1bmRlZGFtb3VudD10aGlzLmFwcGVuZEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZW3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ldLHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XG4gIC8vICAgICAvLyBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBwcm9kdWN0LmRpc3BsYXlyZWZ1bmRlZGFtb3VudCxcImRpc3BsYXlyZWZ1bmRlZGFtb3VudFwiKTtcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xuICAvLyAgIH0pO1xuICAvLyAgIGNvbnN0IGJhc2tldHRvdGFsID0gKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsICo9IC0xKTtcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5YmFza2V0dG90YWw9dGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgYmFza2V0dG90YWwpO1xuICAvLyAgIGNvbnN0IHNhbGV0b3RhbCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwgKj0gLTEpO1xuICAvLyAgIC8vIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc3BsYXlzYWxldG90YWwgPSB0aGlzLmFwcGVuZEN1cnJlbmN5U3ltYm9sKENVUlJFTkNZW3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ldLCBzYWxldG90YWwpO1xuICAvLyAgICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCAqPSAtMSk7XG4gIC8vICAgcmV0dXJuIHRoaXM7XG4gIC8vIH1cblxuICAvKipcbiAgICogU2FsZSBUb3RhbFxuICAgKiBAcGFyYW0gYmFza2V0RGV0YWlsc1xuICAgKiBAcmV0dXJucyBTYWxlIFRvdGFsXG4gICAqL1xuICB1cGRhdGVTYWxlVG90YWwoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55W107IH0pIHtcbiAgICBjb25zdCBzYWxlVG90YWwgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLnJlZHVjZShcbiAgICAgIChuOiBhbnksIHsgdG90YWxMaW5lUHJpY2UgfTogYW55KSA9PiBuICsgdG90YWxMaW5lUHJpY2UsXG4gICAgICAwXG4gICAgKTtcbiAgICByZXR1cm4gc2FsZVRvdGFsXG4gIH1cblxuICBnZXRUb3RhbFdpdGhMaW5lRGlzY291bnRBbmRMaW5lUHJvbW90aW9uQXBwbGllZChiYXNrZXREZXRhaWxzOiB7IHByb2R1Y3RzOiBhbnk7IH0pOiBudW1iZXIge1xuICAgIGxldCBzYWxldG90YWw6IG51bWJlciA9IDAuMDtcbiAgICBmb3IgKGxldCBwcm9kdWN0IG9mIGJhc2tldERldGFpbHMucHJvZHVjdHMpIHtcbiAgICAgIC8vIGlmIChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKSB7XG4gICAgICAvLyAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcbiAgICAgIC8vIH0gZWxzZSBpZiAoXG4gICAgICAvLyAgIHByb2R1Y3QubGluZURpc2NvdW50ICYmXG4gICAgICAvLyAgICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zXG4gICAgICAvLyApIHtcbiAgICAgIC8vICAgc2FsZXRvdGFsICs9XG4gICAgICAvLyAgICAgcHJvZHVjdC5xdWFudGl0eSAqIE51bWJlcihwcm9kdWN0LmxpbmVEaXNjb3VudC51bml0UHJpY2UudG9GaXhlZCgyKSk7XG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICBzYWxldG90YWwgKz1cbiAgICAgIC8vICAgICBwcm9kdWN0LnF1YW50aXR5ICogTnVtYmVyKHByb2R1Y3Quc2VsZWN0ZWRQcmljZS50b0ZpeGVkKDIpKTtcbiAgICAgIC8vIH1cbiAgICAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LnRvdGFsO1xuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnZXRUb3RhbFdpdGhMaW5lRGlzY291bnRBbmRMaW5lUHJvbW90aW9uQXBwbGllZFwiLFxuICAgICAgICBcImUtYmFza2V0OnVwZGF0ZSBwcm9kdWN0IFRvdGFsOlwiICsgc2FsZXRvdGFsLFxuICAgICAgICBwcm9kdWN0XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2FsZXRvdGFsO1xuICB9XG5cbiAgZ2V0UmVmdW5kZWRUb3RhbFdpdGhRdWFudGl0eShiYXNrZXREZXRhaWxzOiB7IHByb2R1Y3RzOiBzdHJpbmcgfCBhbnlbXTsgfSk6IG51bWJlciB7XG4gICAgbGV0IHF1YW50aXR5ID0gMDtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IHByb2R1Y3Q6IGFueSA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xuXG4gICAgICBpZiAoIXByb2R1Y3QucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xuXG4gICAgICAgIHF1YW50aXR5ID0gcXVhbnRpdHkgKyBwcm9kdWN0LnF1YW50aXR5O1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWFudGl0eSA9IHF1YW50aXR5ICsgKHByb2R1Y3QucXVhbnRpdHkgLSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpO1xuXG4gICAgICAgIC8vIGJhc2tldERldGFpbHMudG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsICsgcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBxdWFudGl0eTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERpc2NvdW50IFRvdGFsXG4gICAqIEByZXR1cm5zIERpc2NvdW50IFRvdGFsXG4gICAqL1xuICB1cGRhdGVEaXNjb3VudFRvdGFsKCkge1xuICAgIGxldCByZWZ1bmRUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVEaXNjb3VudFRvdGFsXCIsIGByZWZ1bmRUb3RhbDogJHtyZWZ1bmRUb3RhbH0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnk6ICR7dGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnl9YCk7XG4gICAgY29uc3QgZGlzY291bnRUb3RhbCA9XG4gICAgICBNYXRoLmFicyhcbiAgICAgICAgTWF0aC5hYnModGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsKSAtXG4gICAgICAgIChcbiAgICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCkgKyBNYXRoLmFicyhyZWZ1bmRUb3RhbClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZURpc2NvdW50VG90YWxcIiwgXCJkaXNjb3VudFRvdGFsXCIsIGRpc2NvdW50VG90YWwpXG4gICAgcmV0dXJuIE51bWJlcihkaXNjb3VudFRvdGFsLnRvRml4ZWQoMikpO1xuICB9XG5cbiAgdXBkYXRlUmVhc29uQ29kZShyZWFzb25Db2RlOiB7XG4gICAgY29kZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgfSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucmVhc29uQ29kZSA9IHJlYXNvbkNvZGUuY29kZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucmVhc29uRGVzY3JpcHRpb24gPSByZWFzb25Db2RlLm5hbWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB1cGRhdGVNYW5hZ2VyT3ZlcnJpZGUoXG4gICAgdXNlcm92ZXJyaWRlOiBVc2VyT3ZlcnJpZGVcbiAgKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vdmVycmlkZSA9IHVzZXJvdmVycmlkZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZVVzZXJJRChcbiAgICB1c2VySUQ6IHN0cmluZ1xuICApOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJJZCA9IHVzZXJJRDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHVwZGF0ZVVzZXJOYW1lKG5hbWU6IGFueSkgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcblxuICB9XG4gIFxuICBhZGRDdXN0b21lckRldGFpbHMoY3VzdG9tZXJEZXRhaWw6IEN1c3RvbWVyKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lciA9IGN1c3RvbWVyRGV0YWlsO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlVGF4QnJlYWtkb3duKGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICAvLyBsZXQgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID0gMDtcbiAgICBsZXQgdGF4QnJlYWtkb3duOiBUYXhCcmVha2Rvd24gPSB7XG4gICAgICB0YXhMaW5lczogW10sXG4gICAgICB0b3RhbFRheGFibGVBbW91bnQ6IDAsXG4gICAgfTtcblxuXG5cbiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwKSB7XG4gICAgLy8gICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQpID0+IHtcbiAgICAvLyAgICAgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsICs9IGRpc2NvdW50LmRpc2NvdW50QW1vdW50O1xuICAgIC8vICAgfSk7XG4gICAgLy8gfVxuXG4gICAgLy8gaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgLy8gICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goXG4gICAgLy8gICAgIChwcm9tb3Rpb24pID0+IHtcbiAgICAvLyAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgKz0gcHJvbW90aW9uLnByb21vdGlvbkFtb3VudDtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgKTtcbiAgICAvLyB9XG5cbiAgICBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xuICAgICAgbGV0IHRheExpbmU6IFRheExpbmUgPSB7XG4gICAgICAgIGl0ZW1MaW5lSWQ6IHByb2R1Y3QuaXRlbUxpbmVJZCxcbiAgICAgICAgVkFUOiBwcm9kdWN0LnNlbGVjdGVkVkFUID8gcHJvZHVjdC5zZWxlY3RlZFZBVCA6IDAsXG4gICAgICAgIFZBVENvZGU6IHByb2R1Y3Quc2VsZWN0ZWRWQVRDb2RlLFxuICAgICAgICB0YXhMaW5lVG90YWw6IDAsXG4gICAgICAgIHRheGFibGVBbW91bnQ6IHByb2R1Y3QudG90YWwsXG4gICAgICAgIFByZVRheDogMFxuICAgICAgfTtcbiAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nSW5mbyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVUYXhCcmVha2Rvd25cIiwgYGl0ZW0gbGluZSBJRCA6LCAke3Byb2R1Y3QuaXRlbUxpbmVJZH0sXG4gICAgICAgIFwidGF4IGxpbmUgOlwiLCAke3RheExpbmV9YCk7XG5cbiAgICAgIC8vIHN0ZXAgMVxuICAgICAgLy8gaWYgVHJhbnNhY3Rpb24gRGlzY291bnQgYW5kL29yIHByb21vdGlvbiBhcHBsaWVkLCBmaW5kIG5ldCBzZWxsaW5nIHByaWNlIG9mIGVhY2ggcHJvZHVjdCBhcyB0YXhhYmxlYW1vdW50XG4gICAgICAvLyBpZiAodHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID4gMCkge1xuICAgICAgcHJvZHVjdCA9IHRoaXMuYmFza2V0U2VydmljZS52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdCk7XG5cbiAgICAgIGNvbnN0IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsID1cbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gK1xuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gLVxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbjtcbiAgICAgIC8vICB0cCt0ZC1ycDtcblxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dJbmZvKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVRheEJyZWFrZG93blwiLCBgaXRlbSBsaW5lIElEICwgJHtwcm9kdWN0Lml0ZW1MaW5lSWR9LFxuICAgICAgICBcImNvbnRyaWJ1dGlvbiA6XCIsICR7cHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWx9YCk7XG4gICAgICAvLyBjYWxjdWxhdGUgbmV0IHNlbGxpbmcgcHJpY2UgYWZ0ZXIgYXBwbHlpbmcgdHJhbnNhY3Rpb24gZGlzY291bnQgYXMgcGVyIHByb2R1Y3QgY29udHJpYnV0aW9uXG4gICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgLT0gcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWw7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vc3RlcCAyIC0gZmluZCBwcmUgdGF4XG4gICAgICB0YXhMaW5lLlByZVRheCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKCh0YXhMaW5lLnRheGFibGVBbW91bnQgKiAxMDApIC8gKDEwMCArIHRheExpbmUuVkFUKSk7XG5cbiAgICAgIC8vc3RlcCAzIC0gVXBkYXRlIHRheGJyZWFrZG93blxuICAgICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCArPSB0YXhMaW5lLnRheGFibGVBbW91bnQ7XG4gICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhMaW5lLnRheGFibGVBbW91bnQpO1xuICAgICAgXG4gICAgICAvLyBzdGVwIDQgLSB1cGRhdGUgdGF4IExpbmUgdG90YWxcbiAgICAgIHRheExpbmUudGF4TGluZVRvdGFsID0gIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCAtIHRheExpbmUuUHJlVGF4KTtcbiAgICAgIHRheEJyZWFrZG93bi50YXhMaW5lcy5wdXNoKHRheExpbmUpO1xuICAgIH0pO1xuXG4gICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQpO1xuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duID0gdGF4QnJlYWtkb3duO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXBkYXRlVG90YWxUYXhTdW1tYXJ5KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVG90YWxUYXhTdW1tYXJ5XCIsIFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duKTtcblxuXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUFycmF5OiBUb3RhbFRheFN1bW1hcnlbXSA9IFtdXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cblxuICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwidXBkYXRlVG90YWxUYXhTdW1tYXJ5XCIsIFwiVGF4IExpbmVzIGZvciBUb3RhbCBUYXggU3VtbWVyeSA6XCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzKTtcblxuXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgoZWxlbWVudDogeyBWQVRDb2RlOiBhbnk7IFZBVDogYW55OyBQcmVUYXg6IGFueTsgdGF4TGluZVRvdGFsOiBhbnk7IH0pID0+IHtcbiAgICAgIGxldCBUYXhTdW1tYXJ5OiBUb3RhbFRheFN1bW1hcnkgPSB7XG4gICAgICAgIFZBVENvZGU6IFwiXCIsXG4gICAgICAgIFZBVDogLTEyMzQ1LFxuICAgICAgICBQcmVUYXhTdW06IDAsXG4gICAgICAgIFRheFN1bTogMCxcbiAgICAgICAgVFhyYXRlU3VtOiAwXG4gIFxuICAgICAgfTtcbiAgICAgICBUYXhTdW1tYXJ5LlZBVENvZGUgPSBlbGVtZW50LlZBVENvZGU7XG4gICAgICAgIFRheFN1bW1hcnkuVkFUID0gZWxlbWVudC5WQVQ7ICAgICAgICBcbiAgICAgICAgVGF4U3VtbWFyeS5QcmVUYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LlByZVRheCk7XG4gICAgICAgIFRheFN1bW1hcnkuVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC50YXhMaW5lVG90YWwpO1xuICAgICAgICBUYXhTdW1tYXJ5LlRYcmF0ZVN1bSA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKFRheFN1bW1hcnkuUHJlVGF4U3VtICsgVGF4U3VtbWFyeS5UYXhTdW0pOyAgICAgIFxuICAgICAgICB0b3RhbFRheFN1bW1hcnlBcnJheS5wdXNoKFRheFN1bW1hcnkpO1xuICAgIH0pXG5cbiAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcInVwZGF0ZVRvdGFsVGF4U3VtbWFyeVwiLCBcIlRvdGFsIFRheCBTdW1tZXJ5ICBXaXRob3V0IEdyb3VwZWQgOiBcIiwgdG90YWxUYXhTdW1tYXJ5QXJyYXkpO1xuICAgIFxuICAgIHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gdG90YWxUYXhTdW1tYXJ5QXJyYXkucmVkdWNlKChwcmVwYXJlZEFycmF5OmFueSxjdXJyZW50T2JqKSA9PiB7XG5cbiAgICAgIGxldCBpbmQgPSBwcmVwYXJlZEFycmF5LmZpbmRJbmRleCgoeDogeyBWQVQ6IGFueTsgfSkgPT4geC5WQVQgPT09IGN1cnJlbnRPYmouVkFUKTtcbiAgICAgIGlmKGluZCA9PT0gLTEpe1xuICAgICAgICBwcmVwYXJlZEFycmF5LnB1c2goY3VycmVudE9iailcbiAgICAgIH1lbHNlIHtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlZBVENvZGUgPSBjdXJyZW50T2JqLlZBVENvZGU7XG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVQgPSBjdXJyZW50T2JqLlZBVDtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlByZVRheFN1bSArPSBjdXJyZW50T2JqLlByZVRheFN1bTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRheFN1bSArPSBjdXJyZW50T2JqLlRheFN1bTtcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRYcmF0ZVN1bSArPSBjdXJyZW50T2JqLlRYcmF0ZVN1bTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcmVwYXJlZEFycmF5O1xuICAgIH0sW10pXG4gICAgXG4gICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJ1cGRhdGVUb3RhbFRheFN1bW1hcnlcIiwgXCJUb3RhbCAgVGF4IFN1bW1lciBHcm91cCA6XCIsdG90YWxUYXhTdW1tYXJ5R3JvdXApO1xuXG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRvdGFsVGF4U3VtbWFyeSA9IHRvdGFsVGF4U3VtbWFyeUdyb3VwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRyYW5zYWN0aW9uSWRcbiAgICogQHJldHVybnMgT3JpZ2luYWxUcmFuc2FjdGlvbklkXG4gICAqL1xuICBhZGRPcmlnaW5hbFRyYW5zSWQodHJhbkRvYzpUcmFuc2FjdGlvbkRvY3VtZW50KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5SRUZVTkQgfHwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9SRUZVTkQgfHwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9yaWdpbmFsVHJhbnNJZCA9IHRyYW5Eb2MudHJhbnNhY3Rpb25JZDtcbiAgICAgIGlmKHRyYW5Eb2MuYXBpUmVzcG9uc2UgJiYgdHJhbkRvYy5hcGlSZXNwb25zZS5pbnRlcm5hbElkKVxuICAgICAge1xuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3JpZ2luYWxFeHRlcm5hbElkID0gdHJhbkRvYy5hcGlSZXNwb25zZS5pbnRlcm5hbElkLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIHVucmVmZXJlbmNlZCBSZWZ1bmRcbiAgICogQHJldHVybnMgYm9vbGVhbiB2YWx1ZVxuICAgKi9cbiAgYWRkVW5yZWZlcmVuY2VkUmVmdW5kKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudW5yZWZlcmVuY2VkUmVmdW5kID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldFJlZnVuZFRvdGFsKCkge1xuICAgIGxldCB0b3RhbFJlZnVuZCA9IDA7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBwcm9kdWN0OiBUUHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHNbaW5kZXhdO1xuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkge1xuICAgICAgICB0b3RhbFJlZnVuZCA9IHRvdGFsUmVmdW5kICsgcHJvZHVjdC5yZWZ1bmRlZFRvdGFsO1xuICAgICAgfVxuICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJnZXRSZWZ1bmRUb3RhbFwiLCBcInRvdGFsUmVmdW5kXCIgLCB0b3RhbFJlZnVuZClcbiAgICB9XG4gICAgcmV0dXJuIHRvdGFsUmVmdW5kO1xuICB9XG5cbiAgZG9jSWQoZG9jSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5pZCA9IGRvY0lkO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iXX0=