ng-easycommerce 0.0.683 → 0.0.684

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/README.md +9 -0
  2. package/bundles/ng-easycommerce.umd.js +427 -38
  3. package/bundles/ng-easycommerce.umd.js.map +1 -1
  4. package/bundles/ng-easycommerce.umd.min.js +1 -1
  5. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  6. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +317 -8
  7. package/esm2015/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +2 -2
  8. package/esm2015/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +41 -24
  9. package/esm2015/lib/services/checkout/addressing.service.js +21 -1
  10. package/esm2015/lib/services/checkout/shipment.service.js +5 -4
  11. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +359 -8
  12. package/esm5/lib/ec-component/checkout-ec/payment-ec/payment-ec.component.js +2 -2
  13. package/esm5/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.js +41 -24
  14. package/esm5/lib/services/checkout/addressing.service.js +21 -1
  15. package/esm5/lib/services/checkout/shipment.service.js +10 -9
  16. package/fesm2015/ng-easycommerce.js +380 -33
  17. package/fesm2015/ng-easycommerce.js.map +1 -1
  18. package/fesm5/ng-easycommerce.js +427 -38
  19. package/fesm5/ng-easycommerce.js.map +1 -1
  20. package/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.d.ts +26 -0
  21. package/lib/ec-component/widgets-ec/redsys-redirect-ec/redsys-redirect-ec.component.d.ts +4 -3
  22. package/lib/services/checkout/addressing.service.d.ts +5 -0
  23. package/ng-easycommerce.metadata.json +1 -1
  24. package/package.json +1 -1
@@ -63,11 +63,13 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
63
63
  this.allready_data = false;
64
64
  this.addressBook = [];
65
65
  this.addressBookSelected = { id: 0, notes: "" };
66
+ this.addressBookSelectedFacturacion = { id: 0, notes: "" };
66
67
  this.finish = false; //Esta variable se usa para mostrar el boton de finalizar.
67
68
  this.validado = false;
68
69
  this.viewDataFacturacion = true;
69
70
  this.params = {};
70
71
  this.selectAddres = false;
72
+ this.selectAddressFacturacion = false;
71
73
  this.addressSearch = '';
72
74
  this.addressDropdownOpen = false;
73
75
  this.formReadonly = false;
@@ -75,6 +77,10 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
75
77
  this.tempAddressId = 0;
76
78
  this.postalCodeErrorMessage = "";
77
79
  this.postalCodeErrorMessageFacturacion = "";
80
+ this.postalCodeVisible = true;
81
+ this.postalCodeVisibleFacturacion = true;
82
+ this.postalCodeRequired = true;
83
+ this.postalCodeRequiredFacturacion = true;
78
84
  this.documentErrorMessage = "";
79
85
  this.documentErrorMessageFacturacion = "";
80
86
  this.customerHasCustomerTaxRate = false;
@@ -229,6 +235,54 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
229
235
  const current = this.checkoutFormFacturacion.controls['documentType'].value;
230
236
  return ((_b = (_a = documentTypes) === null || _a === void 0 ? void 0 : _a.find(doc => doc.code == current)) === null || _b === void 0 ? void 0 : _b.name) || '';
231
237
  };
238
+ this.getBasePostalCodeEnabled = () => { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = this.addressingService.getTypeForm()) === null || _a === void 0 ? void 0 : _a.viewForms) === null || _b === void 0 ? void 0 : _b.postcode) === null || _c === void 0 ? void 0 : _c.enabled, (_d !== null && _d !== void 0 ? _d : true); };
239
+ this.getBasePostalCodeRequired = () => { var _a, _b, _c, _d; return _d = (_c = (_b = (_a = this.addressingService.getTypeForm()) === null || _a === void 0 ? void 0 : _a.viewForms) === null || _b === void 0 ? void 0 : _b.postcode) === null || _c === void 0 ? void 0 : _c.required, (_d !== null && _d !== void 0 ? _d : true); };
240
+ this.getDefaultPostalCodeFieldState = () => {
241
+ const visible = this.getBasePostalCodeEnabled();
242
+ return {
243
+ visible,
244
+ required: visible && this.getBasePostalCodeRequired()
245
+ };
246
+ };
247
+ this.resolveCountryByCode = (code) => {
248
+ if (!code)
249
+ return null;
250
+ const countryFromSubjects = [
251
+ ...(this.countriesSubject.value || []),
252
+ ...(this.countriesFacturacionSubject.value || [])
253
+ ].find(country => country.code == code);
254
+ return countryFromSubjects
255
+ || this.addressingService.countriesList.find(country => country.code == code)
256
+ || null;
257
+ };
258
+ this.resolveCountryForPostalCode = (selectedCountry) => {
259
+ if (!selectedCountry)
260
+ return null;
261
+ if (selectedCountry.checkoutRequiredFields || selectedCountry.isPostalCodeNumeric !== undefined) {
262
+ return selectedCountry;
263
+ }
264
+ return this.resolveCountryByCode(selectedCountry.code || selectedCountry.countryCode);
265
+ };
266
+ this.resolvePostalCodeFieldState = (country) => {
267
+ var _a, _b;
268
+ const checkoutPostalCode = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.checkoutRequiredFields) === null || _b === void 0 ? void 0 : _b.postalCode;
269
+ if (checkoutPostalCode === false) {
270
+ return { visible: false, required: false };
271
+ }
272
+ if (checkoutPostalCode === true) {
273
+ return { visible: true, required: true };
274
+ }
275
+ return this.getDefaultPostalCodeFieldState();
276
+ };
277
+ this.isPostalCodeFieldVisible = (billing = false) => billing ? this.postalCodeVisibleFacturacion : this.postalCodeVisible;
278
+ this.isPostalCodeFieldRequired = (billing = false) => billing ? this.postalCodeRequiredFacturacion : this.postalCodeRequired;
279
+ this.shouldShowPostalCodeByCountryCode = (code) => {
280
+ const country = this.resolveCountryByCode(code);
281
+ if (!country) {
282
+ return this.getDefaultPostalCodeFieldState().visible;
283
+ }
284
+ return this.resolvePostalCodeFieldState(country).visible;
285
+ };
232
286
  this.toggleDocumentTypeDropdown = (event) => {
233
287
  var _a;
234
288
  event.stopPropagation();
@@ -454,6 +508,221 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
454
508
  this.setCheckoutFormReadonly(this.compactAddressView && !this.getMode());
455
509
  this.evaluateDirtyState();
456
510
  };
511
+ this.getModeFacturacion = () => {
512
+ switch (this.addressingService.modeSelectAddress) {
513
+ case 'ONLY_LOAD_ADDRESS':
514
+ return true;
515
+ case 'ONLY_ADDRESS_SELECTION':
516
+ return !this.authService.isAuthenticated();
517
+ case 'LOAD_ADDRESS_AND_SELECTION':
518
+ return this.authService.isAuthenticated() ? this.selectAddressFacturacion : true;
519
+ }
520
+ };
521
+ this.setModeFacturacion = (mode) => {
522
+ this.selectAddressFacturacion = mode === 'carga';
523
+ this.onFormChange();
524
+ this.evaluateDirtyState();
525
+ };
526
+ this.setSelectAddressFacturacion = (addressSelect) => {
527
+ var _a;
528
+ (this.addressBook || []).forEach(address => {
529
+ var _a;
530
+ address.selectedFacturacion = String(address.id) === String((_a = addressSelect) === null || _a === void 0 ? void 0 : _a.id);
531
+ });
532
+ this.addressBookSelectedFacturacion.id = ((_a = (this.addressBook || []).find(address => address.selectedFacturacion)) === null || _a === void 0 ? void 0 : _a.id) || 0;
533
+ };
534
+ this.buildAddressFromBook = (bookAddress) => {
535
+ var _a, _b;
536
+ const contact = ((_a = bookAddress) === null || _a === void 0 ? void 0 : _a.addressContact) || {};
537
+ return {
538
+ firstName: contact.firstName || '',
539
+ lastName: contact.lastName || '',
540
+ phoneNumber: contact.phoneNumber || '',
541
+ email: contact.email || '',
542
+ documentType: contact.documentType || '',
543
+ documentNumber: contact.documentNumber || '',
544
+ countryCode: bookAddress.countryCode,
545
+ provinceCode: bookAddress.provinceCode,
546
+ city: bookAddress.city,
547
+ street: bookAddress.street,
548
+ postcode: ((_b = bookAddress.postcode) === null || _b === void 0 ? void 0 : _b.toString()) || ''
549
+ };
550
+ };
551
+ this.handleBillingFormSubmit = (event) => {
552
+ event.preventDefault();
553
+ if (this.getMode()) {
554
+ this.verifyValidate(null, null);
555
+ }
556
+ };
557
+ this.onSelectAddress = (items) => __awaiter(this, void 0, void 0, function* () {
558
+ if (this.canCompleteLegacyAddressOnlyCheckout()) {
559
+ this.nextStep();
560
+ return;
561
+ }
562
+ const notesCfg = this.addressingService.getTypeForm().viewForms.notes;
563
+ if (notesCfg.required && (!this.addressBookSelected.notes || !this.addressBookSelected.notes.trim())) {
564
+ this.toast.show('required-fields');
565
+ return;
566
+ }
567
+ const previousTotals = Object.assign({}, this.lastSummaryTotalsSnapshot);
568
+ this.loading = true;
569
+ try {
570
+ const addressSelected = this.addressBook.find(address => address.selected);
571
+ if (!addressSelected) {
572
+ this.showError('invalid-form');
573
+ return;
574
+ }
575
+ if (!this.addressBookSelected.id)
576
+ this.addressBookSelected.id = addressSelected.id || 0;
577
+ const request = {
578
+ shippingAddressId: addressSelected.id,
579
+ billingAddressId: addressSelected.id,
580
+ notes: this.addressBookSelected.notes || ""
581
+ };
582
+ const resultSede = yield this.addressingService.setHeadquarterByIds(request);
583
+ if (!resultSede) {
584
+ this.toast.show('operation-error');
585
+ return;
586
+ }
587
+ if (this.cartService.channelConfig.applyOrderLot) {
588
+ (items || []).forEach(item => {
589
+ var _a, _b, _c, _d;
590
+ if (!item.lot[0]) {
591
+ this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, ((_b = (_a = resultSede) === null || _a === void 0 ? void 0 : _a.shippingAddress) === null || _b === void 0 ? void 0 : _b.city) + ' - ' + ((_d = (_c = resultSede) === null || _c === void 0 ? void 0 : _c.shippingAddress) === null || _d === void 0 ? void 0 : _d.street), 'newlot');
592
+ }
593
+ });
594
+ }
595
+ this.form_ready = true;
596
+ this.allready_data = true;
597
+ this.setSavedStateFromCurrent();
598
+ const totalsChanged = this.haveTotalsChanged(previousTotals, resultSede);
599
+ if (this.compactAddressView && this.nextStep) {
600
+ this.nextStep();
601
+ }
602
+ else if (this.isLegacyAddressOnlyCheckout()) {
603
+ totalsChanged && this.scrollToLegacySummary();
604
+ return;
605
+ }
606
+ else {
607
+ this.nextStep();
608
+ }
609
+ }
610
+ catch (e) {
611
+ this.toast.show('operation-error');
612
+ }
613
+ finally {
614
+ this.loading = false;
615
+ }
616
+ });
617
+ this.onSelectAddressFacturacion = (items) => __awaiter(this, void 0, void 0, function* () {
618
+ const addressSelectedFacturacion = this.addressBook.find(address => address.selectedFacturacion);
619
+ const addressSelectedEnvio = this.addressBook.find(address => address.selected);
620
+ if (!addressSelectedFacturacion || !addressSelectedEnvio) {
621
+ this.showError('invalid-form');
622
+ return;
623
+ }
624
+ const previousTotals = Object.assign({}, this.lastSummaryTotalsSnapshot);
625
+ this.loading = true;
626
+ try {
627
+ this.addressBookSelected.id = addressSelectedEnvio.id || 0;
628
+ this.addressBookSelectedFacturacion.id = addressSelectedFacturacion.id || 0;
629
+ const request = {
630
+ shippingAddressId: addressSelectedEnvio.id,
631
+ billingAddressId: addressSelectedFacturacion.id,
632
+ notes: this.addressBookSelected.notes || ""
633
+ };
634
+ const resultSede = yield this.addressingService.setHeadquarterByIds(request);
635
+ if (!resultSede) {
636
+ this.toast.show('operation-error');
637
+ return;
638
+ }
639
+ if (this.cartService.channelConfig.applyOrderLot) {
640
+ (items || []).forEach(item => {
641
+ if (!item.lot[0]) {
642
+ this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, addressSelectedEnvio.city + ' - ' + addressSelectedEnvio.street, 'newlot');
643
+ }
644
+ });
645
+ }
646
+ this.form_ready = true;
647
+ this.allready_data = true;
648
+ this.setSavedStateFromCurrent();
649
+ const totalsChanged = this.haveTotalsChanged(previousTotals, resultSede);
650
+ if (this.compactAddressView && this.nextStep) {
651
+ this.nextStep();
652
+ }
653
+ else if (this.isLegacyAddressOnlyCheckout()) {
654
+ totalsChanged && this.scrollToLegacySummary();
655
+ return;
656
+ }
657
+ else {
658
+ this.nextStep();
659
+ }
660
+ }
661
+ catch (e) {
662
+ this.toast.show('operation-error');
663
+ }
664
+ finally {
665
+ this.loading = false;
666
+ }
667
+ });
668
+ this.onSubmitNewBillingAddress = (items) => __awaiter(this, void 0, void 0, function* () {
669
+ var _a;
670
+ if (!this.checkoutFormFacturacion.valid) {
671
+ this.showError('invalid-form');
672
+ return;
673
+ }
674
+ const addressSelectedEnvio = this.addressBook.find(address => address.selected);
675
+ if (!addressSelectedEnvio) {
676
+ this.showError('invalid-form');
677
+ return;
678
+ }
679
+ const previousTotals = Object.assign({}, this.lastSummaryTotalsSnapshot);
680
+ this.loading = true;
681
+ try {
682
+ const billingFormData = Object.assign({}, this.checkoutFormFacturacion.getRawValue());
683
+ billingFormData.postcode = (_a = billingFormData.postcode) === null || _a === void 0 ? void 0 : _a.toString();
684
+ const addressData = {
685
+ shippingAddress: this.buildAddressFromBook(addressSelectedEnvio),
686
+ billingAddress: billingFormData,
687
+ notes: this.addressBookSelected.notes || ""
688
+ };
689
+ const result = yield this.addressingService.setAddress(addressData);
690
+ if (result === false) {
691
+ this.require_login = true;
692
+ this.toast.show('email_already_registered');
693
+ return;
694
+ }
695
+ if (result !== undefined) {
696
+ if (this.cartService.channelConfig.applyOrderLot) {
697
+ (items || []).forEach(item => {
698
+ if (!item.lot[0]) {
699
+ this.cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, addressSelectedEnvio.city + ' - ' + addressSelectedEnvio.street, 'newlot');
700
+ }
701
+ });
702
+ }
703
+ this.form_ready = true;
704
+ this.allready_data = true;
705
+ this.setSavedStateFromCurrent();
706
+ const totalsChanged = this.haveTotalsChanged(previousTotals, result);
707
+ if (this.compactAddressView && this.nextStep) {
708
+ this.nextStep();
709
+ }
710
+ else if (this.isLegacyAddressOnlyCheckout()) {
711
+ totalsChanged && this.scrollToLegacySummary();
712
+ return;
713
+ }
714
+ else {
715
+ this.nextStep();
716
+ }
717
+ }
718
+ }
719
+ catch (e) {
720
+ this.toast.show('operation-error');
721
+ }
722
+ finally {
723
+ this.loading = false;
724
+ }
725
+ });
457
726
  this.toggleAddressDropdown = () => {
458
727
  this.addressDropdownOpen = !this.addressDropdownOpen;
459
728
  };
@@ -788,24 +1057,26 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
788
1057
  this.updateDocumentValidation(selectedDoc);
789
1058
  }
790
1059
  }
1060
+ const selectedBillingCountry = this.countriesFacturacionSubject.value.find(country => country.code == this.checkoutFormFacturacion.controls['countryCode'].value);
1061
+ this.updatePostalCodeValidationFacturacion(selectedBillingCountry);
791
1062
  this.onFormChange();
792
1063
  }
793
1064
  this.suppressDirty = false;
794
1065
  this.setDirtyState(false);
795
1066
  };
796
1067
  this.ecOnConstruct();
797
- this.checkoutForm = this.fb.group(Object.assign(Object.assign({}, this.addressingService.getTypeForm().configForm.formAddres), { postcode: ['', [Validators.required]] // Se agrega para que sólo acepte códigos postales mayores que cero
798
- }));
1068
+ this.checkoutForm = this.fb.group(Object.assign(Object.assign({}, this.addressingService.getTypeForm().configForm.formAddres), { postcode: [''] }));
799
1069
  this.checkoutForm.statusChanges
800
1070
  .pipe(filter(() => { this.onFormChange(); return this.checkoutForm.valid; }))
801
1071
  .subscribe(() => this.onFormValid());
802
1072
  this.checkoutForm.valueChanges.subscribe(() => this.evaluateDirtyState());
803
- this.checkoutFormFacturacion = this.fb.group(Object.assign(Object.assign({}, this.addressingService.getTypeForm().configForm.formBilling), { postcode: ['', [Validators.required]] // Se agrega para que sólo acepte códigos postales mayores que cero
804
- }));
1073
+ this.checkoutFormFacturacion = this.fb.group(Object.assign(Object.assign({}, this.addressingService.getTypeForm().configForm.formBilling), { postcode: [''] }));
805
1074
  this.checkoutFormFacturacion.statusChanges
806
1075
  .pipe(filter(() => { this.onFormChange(); return this.checkoutFormFacturacion.valid; }))
807
1076
  .subscribe(() => this.onFormValid());
808
1077
  this.checkoutFormFacturacion.valueChanges.subscribe(() => this.evaluateDirtyState());
1078
+ this.updatePostalCodeValidation(null);
1079
+ this.updatePostalCodeValidationFacturacion(null);
809
1080
  }
810
1081
  ngOnInit() {
811
1082
  var _a;
@@ -909,10 +1180,48 @@ let DataFormEcComponent = class DataFormEcComponent extends ComponentHelper {
909
1180
  form.controls[formControlName].updateValueAndValidity();
910
1181
  }
911
1182
  updatePostalCodeValidation(selectedCountry) {
912
- this.updateValidation(selectedCountry, 'postcode', this.checkoutForm, 'postalCodeErrorMessage', 'isPostalCodeNumeric', 'postal-code-pattern-error');
1183
+ var _a, _b;
1184
+ const country = this.resolveCountryForPostalCode(selectedCountry);
1185
+ const { visible, required } = country
1186
+ ? this.resolvePostalCodeFieldState(country)
1187
+ : this.getDefaultPostalCodeFieldState();
1188
+ const isNumeric = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.isPostalCodeNumeric, (_b !== null && _b !== void 0 ? _b : false));
1189
+ const validators = [];
1190
+ if (required) {
1191
+ validators.push(Validators.required);
1192
+ }
1193
+ if (visible && isNumeric) {
1194
+ validators.push(Validators.pattern(/^\d+$/));
1195
+ }
1196
+ this.postalCodeVisible = visible;
1197
+ this.postalCodeRequired = required;
1198
+ this.postalCodeErrorMessage = isNumeric
1199
+ ? 'postal-code-pattern-error.numeric'
1200
+ : 'postal-code-pattern-error.default';
1201
+ this.checkoutForm.controls['postcode'].setValidators(validators);
1202
+ this.checkoutForm.controls['postcode'].updateValueAndValidity({ emitEvent: false });
913
1203
  }
914
1204
  updatePostalCodeValidationFacturacion(selectedCountry) {
915
- this.updateValidation(selectedCountry, 'postcode', this.checkoutFormFacturacion, 'postalCodeErrorMessageFacturacion', 'isPostalCodeNumeric', 'postal-code-pattern-error');
1205
+ var _a, _b;
1206
+ const country = this.resolveCountryForPostalCode(selectedCountry);
1207
+ const { visible, required } = country
1208
+ ? this.resolvePostalCodeFieldState(country)
1209
+ : this.getDefaultPostalCodeFieldState();
1210
+ const isNumeric = (_b = (_a = country) === null || _a === void 0 ? void 0 : _a.isPostalCodeNumeric, (_b !== null && _b !== void 0 ? _b : false));
1211
+ const validators = [];
1212
+ if (required) {
1213
+ validators.push(Validators.required);
1214
+ }
1215
+ if (visible && isNumeric) {
1216
+ validators.push(Validators.pattern(/^\d+$/));
1217
+ }
1218
+ this.postalCodeVisibleFacturacion = visible;
1219
+ this.postalCodeRequiredFacturacion = required;
1220
+ this.postalCodeErrorMessageFacturacion = isNumeric
1221
+ ? 'postal-code-pattern-error.numeric'
1222
+ : 'postal-code-pattern-error.default';
1223
+ this.checkoutFormFacturacion.controls['postcode'].setValidators(validators);
1224
+ this.checkoutFormFacturacion.controls['postcode'].updateValueAndValidity({ emitEvent: false });
916
1225
  }
917
1226
  updateDocumentValidation(selectedDocumentType) {
918
1227
  this.updateValidation(selectedDocumentType, 'documentNumber', this.checkoutForm, 'documentErrorMessage', 'isNumeric', 'document-pattern-error', this.addressingService.getTypeForm().viewForms.documentNumber.required);
@@ -955,10 +1264,10 @@ __decorate([
955
1264
  DataFormEcComponent = __decorate([
956
1265
  Component({
957
1266
  selector: 'app-dataform-ec',
958
- template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"checkout-btn-unique text-end\">\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"verifyValidate()\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.enabled\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.postcode.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessage |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
1267
+ template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible()\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired()\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\"><!--Direcci\u00F3n de facturaci\u00F3n-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFactSelection\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFactSelection\"></label>\n </div>\n </div>\n <ng-container *ngIf=\"!viewDataFacturacion\">\n <!-- Selector de modo para direcci\u00F3n de facturaci\u00F3n -->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption1\" autocomplete=\"off\"\n [checked]=\"!getModeFacturacion()\" (change)=\"setModeFacturacion('seleccion')\">\n {{'select-address' | translate | titlecase}}\n </label>\n <label [class]=\"'btn btn-outline-secondary ' + (getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption2\" autocomplete=\"off\"\n [checked]=\"getModeFacturacion()\" (change)=\"setModeFacturacion('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n </div>\n </div>\n </div>\n </div>\n <!-- Formulario de nueva direcci\u00F3n de facturaci\u00F3n -->\n <ng-container *ngIf=\"getModeFacturacion()\">\n <ng-container *ngTemplateOutlet=\"datosFormFacturacion\"></ng-container>\n </ng-container>\n <!-- Selecci\u00F3n de direcci\u00F3n de facturaci\u00F3n del address book -->\n <ng-container *ngIf=\"!getModeFacturacion()\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'billing-'+i\"\n [id]=\"'billing-'+i\" [checked]=\"item.selectedFacturacion\"\n (click)=\"setSelectAddressFacturacion(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <div class=\"checkout-btn-unique text-end\">\n <button *ngIf=\"!viewDataFacturacion && !getModeFacturacion()\"\n (click)=\"onSelectAddressFacturacion(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"!addressBookSelectedFacturacion.id\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"!viewDataFacturacion && getModeFacturacion()\"\n (click)=\"onSubmitNewBillingAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"checkoutFormFacturacion.invalid\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"viewDataFacturacion\"\n (click)=\"onSelectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"handleBillingFormSubmit($event)\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible(true)\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired(true)\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessageFacturacion |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
959
1268
  providers: [BsModalService],
960
1269
  styles: ["@charset \"UTF-8\";.btn.valid-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);margin-right:-3px;margin-bottom:10px}.btn.valid-btn:disabled,.btn.valid-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.address-required-row .required-hint-text{color:#6b6b6b;font-size:.85rem;font-weight:500;letter-spacing:.01em}.address-required-row .required-hint-asterisk{color:#6b6b6b;font-weight:700}.field-label{color:#000}:host-context(#appCheckoutEc) .field-label{font-weight:700}:host-context(#appCheckoutEc) .address-meta-row b,:host-context(#appCheckoutEc) .address-terms-row label{font-weight:400}.terms-label{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem}.terms-link{background:0 0;border:0;padding:0;color:inherit;text-decoration:underline;cursor:pointer}.form-control.ng-dirty.ng-invalid,.form-control.ng-touched.ng-invalid{border-color:#dc3545;box-shadow:0 0 0 .15rem rgba(220,53,69,.18)}.form-control.ng-dirty.ng-valid,.form-control.ng-touched.ng-valid{border-color:#16a34a;box-shadow:0 0 0 .15rem rgba(22,163,74,.15)}.char-count{margin-left:.35rem;font-size:.78rem;font-weight:400;color:#888;white-space:nowrap}.notes-textarea{min-height:120px;max-height:240px;resize:vertical;max-width:100%}.compact-address-form .valid-btn{font-size:1rem;padding:.7rem 1.1rem;letter-spacing:.02em}.document-input-group{position:relative;align-items:stretch}.document-input-group .dropdown-menu{max-height:240px;overflow-y:auto}.document-input-group .dropdown-toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;min-height:100%;border-color:#ced4da;color:#495057}.document-input-group .form-control{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}:host-context(#appCheckoutEc) .checkout-btn-unique{display:flex;justify-content:flex-end}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{display:block;margin-left:auto;width:56%;max-width:360px;min-width:220px}@media screen and (max-width:992px){:host-context(#appCheckoutEc) .checkout-btn-unique{justify-content:stretch}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{width:100%;min-width:0}.address-required-row .required-hint-text{font-size:.82rem}}:host-context(#appCheckoutEc) .valid-btn{text-transform:uppercase}label{color:#000}#appCheckoutEc .checkout-single .btn-group-toggle{border:1px solid #e3e3e3;border-radius:6px;overflow:hidden}#appCheckoutEc .checkout-single .btn-group-toggle .btn{border-radius:0!important;font-weight:600;padding:.55rem 1rem;border-left:1px solid #e3e3e3}#appCheckoutEc .checkout-single .btn-group-toggle .btn:first-child{border-left:0}.input-size-lg{width:1.8rem;height:1.8rem}.address-card-compact{display:flex;gap:.75rem;border:1px solid #e3e3e3;border-radius:6px;padding:.75rem;background:#fff;align-items:flex-start;cursor:pointer;transition:border-color .2s,box-shadow .2s}.address-card-compact.is-selected{border-color:#000;box-shadow:0 0 0 1px #000 inset}.address-card-compact:hover{border-color:#444}.address-card-radio{margin-top:.25rem}.address-card-content{flex:1;display:flex;flex-direction:column;gap:.35rem}.address-card-title{font-weight:600;font-size:1rem}.address-card-sub{color:#666;font-size:.9rem}.address-card-details{margin-top:.5rem}.address-card-details summary{cursor:pointer;color:#000;font-weight:600;font-size:.9rem;list-style:none;display:inline-flex;align-items:center;gap:.35rem}.address-card-details summary::-webkit-details-marker{display:none}.address-card-details summary::before{content:\"\u25B8\";font-size:.85rem}.address-card-details[open] summary::before{content:\"\u25BE\"}.address-card-details-body{margin-top:.5rem;padding:.5rem;background:#f8f8f8;border-radius:6px}.address-card-detail-title{font-weight:600;margin-bottom:.25rem}.address-card-detail-line{font-size:.9rem;color:#555}.single-step-surface{position:relative}.single-step-overlay{position:absolute;inset:0;background:rgba(255,255,255,.6);display:flex;align-items:center;justify-content:center;z-index:5}.compact-address-form .address-meta-row,.compact-address-form .address-required-row,.compact-address-form .address-terms-row{margin-top:.4rem}.compact-address-form .address-meta-row label,.compact-address-form .address-terms-row label{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:0;font-weight:600}.compact-address-form .address-terms-row a{margin-left:0!important;display:inline-block;font-size:.85rem}.compact-address-form .address-terms-row .text-danger-container{margin-top:.35rem}"]
961
1270
  })
962
1271
  ], DataFormEcComponent);
963
1272
  export { DataFormEcComponent };
964
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxt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RUFBeUM7UUFFekMsU0FBUyxFQUFFLENBQUMsY0FBYyxDQUFDOztLQUM5QixDQUFDO0dBQ1csbUJBQW1CLENBZy9CL0I7U0FoL0JZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgVGVtcGxhdGVSZWYsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi4vLi4vLi4vY2xhc3Nlcy9jb21wb25lbnQtaGVscGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENhcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2FydC5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3NpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hlY2tvdXQvYWRkcmVzc2luZy5zZXJ2aWNlJztcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3RvYXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQnNNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsL2JzLW1vZGFsLXJlZi5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnN0YW50cyB9IGZyb20gJy4uLy4uLy4uL2NvcmUuY29uc3RzJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJ25neC1ib290c3RyYXAvY2hyb25vcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3BhcmFtZXRlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBDaGFubmVsQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYW5uZWwtY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hlY2tvdXQvY2hlY2tvdXQuc2VydmljZSc7XG5pbXBvcnQgeyBPcmRlclV0aWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvb3JkZXItdXRpbC5zZXJ2aWNlJztcblxudHlwZSBTdW1tYXJ5VG90YWxzU25hcHNob3QgPSB7XG4gICAgc3VidG90YWw6IG51bWJlcjtcbiAgICB0YXhlczogbnVtYmVyO1xuICAgIHNoaXBwaW5nOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgICBjbGllbnRUYXhlczogbnVtYmVyO1xuICAgIHByb21vdGlvbjogbnVtYmVyO1xuICAgIGl0ZW1zOiBudW1iZXI7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXRhZm9ybS1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgcHJvdmlkZXJzOiBbQnNNb2RhbFNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIERhdGFGb3JtRWNDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRIZWxwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc3RlcF9pZDtcbiAgICBASW5wdXQoKSBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBuZXh0U3RlcDogRnVuY3Rpb247XG4gICAgQElucHV0KCkgY29tcGFjdEFkZHJlc3NWaWV3OiBib29sZWFuID0gZmFsc2U7XG4gICAgQE91dHB1dCgpIGRpcnR5Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgcHJvdGVjdGVkIGNvdW50cmllc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcblxuICAgIHB1YmxpYyBjb3VudHJpZXMkID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXMkID0gdGhpcy5wcm92aW5jZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzJCA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGNvdW50cmllc0ZhY3R1cmFjaW9uJCA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXNGYWN0dXJhY2lvbiQgPSB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uJCA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHB1YmxpYyByZXF1aXJlX2xvZ2luID0gZmFsc2U7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybTogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm1GYWN0dXJhY2lvbjogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWxscmVhZHlfZGF0YSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9vayA9IFtdO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxuICAgIHB1YmxpYyBmaW5pc2g6IGJvb2xlYW4gPSBmYWxzZTsgLy9Fc3RhIHZhcmlhYmxlIHNlIHVzYSBwYXJhIG1vc3RyYXIgZWwgYm90b24gZGUgZmluYWxpemFyLlxuXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XG4gICAgcHVibGljIHZpZXdEYXRhRmFjdHVyYWNpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgc2VsZWN0QWRkcmVzOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NTZWFyY2ggPSAnJztcbiAgICBwdWJsaWMgYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBmb3JtUmVhZG9ubHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgc2VsZWN0ZWRBZGRyZXNzOiBhbnkgPSBudWxsO1xuICAgIHByaXZhdGUgdGVtcEFkZHJlc3NJZCA9IDA7XG5cbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZUZhY3R1cmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgY3VzdG9tZXJIYXNDdXN0b21lclRheFJhdGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIGxhc3RTYXZlZFN0YXRlOiBhbnkgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGlzRGlydHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIHN1cHByZXNzRGlydHkgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90OiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPSB7XG4gICAgICAgIHN1YnRvdGFsOiAwLFxuICAgICAgICB0YXhlczogMCxcbiAgICAgICAgc2hpcHBpbmc6IDAsXG4gICAgICAgIHRvdGFsOiAwLFxuICAgICAgICBjbGllbnRUYXhlczogMCxcbiAgICAgICAgcHJvbW90aW9uOiAwLFxuICAgICAgICBpdGVtczogMFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICAgICAgcHVibGljIGNoZWNrb3V0U2VydmljZTogQ2hlY2tvdXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9yZGVyVXRpbHM6IE9yZGVyVXRpbGl0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBCc01vZGFsU2VydmljZSxcbiAgICAgICAgcHVibGljIHBhcmFtc1NlcnZpY2U6IFBhcmFtZXRlcnNTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY29uc3RzOiBDb25zdGFudHMsXG4gICAgICAgIHB1YmxpYyBjaGFubmVsQ29uZmlnOiBDaGFubmVsQ29uZmlnU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmVjT25Db25zdHJ1Y3QoKVxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUFkZHJlcyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm0udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKSk7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbiA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLmNvbmZpZ0Zvcm0uZm9ybUJpbGxpbmcsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4geyB0aGlzLm9uRm9ybUNoYW5nZSgpOyByZXR1cm4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhcmFtc1NlcnZpY2UucGFyYW1ldGVycy5zdWJzY3JpYmUocmVzID0+IHRoaXMucGFyYW1zID0gcmVzKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XG4gICAgICAgIC8vIEluIHNpbmdsZS9jb21wYWN0IHNlbGVjdGlvbiBtb2RlIHdlIHNob3VsZCBub3Qgc2hvdyB0aGUgc3VibWl0IGJ1dHRvbi5cbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICBjb25zdCBsb2NhbEVtYWlsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21haWwnKTtcbiAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5jYXJ0LnN1YnNjcmliZShjYXJ0ID0+IHRoaXMuY3VzdG9tZXJIYXNDdXN0b21lclRheFJhdGUgPSBjYXJ0Py5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUodGhpcy5hdXRoU2VydmljZS5nZXRDdXN0b21lcigpPy5lbWFpbCB8fCBsb2NhbEVtYWlsKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NpbmdEYXRhKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllcyA9IHRoaXMuZmlsdGVyQ291bnRyeUJ5Q29kZShyZXMpXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKSB7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHJlcyB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZEFkZHJlc3MgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2kgbm8gaGF5IG5pbmd1bmEgZGlyZWNjacOzbiBzZWxlY2Npb25hZGEsIHNlbGVjY2lvbmFyIGxhIHByaW1lcmEgcG9yIGRlZmVjdG9cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEFkZHJlc3MgJiYgdGhpcy5hZGRyZXNzQm9vay5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2tbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gc2VsZWN0ZWRBZGRyZXNzLmlkIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdhZGRyZXNzJykgJiYgIXRoaXMubGFzdFNhdmVkU3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzcyh0aGlzLmNhcnRTZXJ2aWNlLmdldENhcnQyKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdjYXJnYScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2Uuc3RhdGUkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRTZXJ2aWNlLmlzU3RlcFJlYWR5KCdhZGRyZXNzJykgfHwgdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpLCAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRTZXJ2aWNlLmFzb2NpYXRlZERhdGEkLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21Bc3NvY2lhdGVkRGF0YShkYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cbiAgICAgKiBDYXNvcyBkZSB1c29zOiBTaSBnZXRDb3VudHJpZXMgZXMgdmFjaW8sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIFNpIGdldENvdW50cmllcyBjb250aWVuZSB2YWxvcmVzIHF1ZSBubyBjb2luY2lkZW4sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIEFycmVnbG8gcXVlIGNvbnRpZW5lIGxvcyBjb3VudHJpZXMgcmVjaWJpZG9zIGVuIGxhIHN1YnNjcmlwY2lvbiBkZWwgb2JzZXJ2YWJsZS5cbiAgICAgKiBAcmV0dXJucyB1biBhcnJlZ2xvIGRlIGNvdW50cmllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlckNvdW50cnlCeUNvZGUgPSAoY291bnRyaWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICAvLyAxLiBTaSBoYXkgcGHDrXNlcyBFWENMVUlET1MsIHF1w610YWxvcyBzaWVtcHJlXG4gICAgICAgIGxldCBmaWx0ZXJlZCA9IGNvdW50cmllcztcbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzICYmIHRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGVsZW0gPT4gIXRoaXMuY29uc3RzLmV4Y2x1ZGVkQ291bnRyaWVzLmluY2x1ZGVzKGVsZW0uY29kZSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIDIuIFNpIGhheSBwYcOtc2VzIElOQ0xVSURPUywgYXBsaWNhIGVsIGZpbHRybyBkZSBpbmNsdXNpw7NuXG4gICAgICAgIGlmICh0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzRmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiB0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5pbmNsdWRlcyhlbGVtLmNvZGUpKVxuICAgICAgICAgICAgaWYgKGNvdW50cmllc0ZpbHRlcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRyaWVzRmlsdGVyZWRcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRWwvbG9zIGNvZGlnby9zIGluZ3Jlc2Fkby9zIG5vIGNvaW5jaWRlbiBjb24gbG9zIHByb3Zpc3RvcyBkZXNkZSBlbCBiYWNrZW5kJylcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbikge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICB9XG5cbiAgICBvbkZvcm1WYWxpZCA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Gb3JtQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfTtcblxuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShwcm92aW5jZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0RvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KGRvY3VtZW50VHlwZXMpO1xuICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkucHJvdmluY2VzIDogW107XG4gICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IGRvY3VtZW50VHlwZXMuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGdldFNlbGVjdGVkRG9jdW1lbnRUeXBlTGFiZWwgPSAoZG9jdW1lbnRUeXBlczogYW55W10pID0+IHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIGdldFNlbGVjdGVkRG9jdW1lbnRUeXBlTGFiZWxGYWN0dXJhY2lvbiA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWU7XG4gICAgICAgIHJldHVybiBkb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSBjdXJyZW50KT8ubmFtZSB8fCAnJztcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0sXG4gICAgICAgICAgICAncG9zdGFsQ29kZUVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkQ291bnRyeSxcbiAgICAgICAgICAgICdwb3N0Y29kZScsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLFxuICAgICAgICAgICAgJ3Bvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGU6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZERvY3VtZW50VHlwZSxcbiAgICAgICAgICAgICdkb2N1bWVudE51bWJlcicsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSxcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24sXG4gICAgICAgICAgICAnZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJyxcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIucmVxdWlyZWRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBzZWxlY3RBZGRyZXNzID0gYXN5bmMgKGl0ZW1zLCBzaG93Tm90ZXNFcnJvcjogYm9vbGVhbiA9IHRydWUpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBub3Rlc0NmZyA9IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXM7XG4gICAgICAgIGlmIChub3Rlc0NmZy5yZXF1aXJlZCAmJiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAhdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzLnRyaW0oKSkpIHtcbiAgICAgICAgICAgIGlmIChzaG93Tm90ZXNFcnJvcikge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygncmVxdWlyZWQtZmllbGRzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZClcbiAgICAgICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYXlsb2FkID0gdGhpcy5jb21wYWN0QWRkcmVzc1ZpZXdcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAnJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IHNlbGVjdGVkUGF5bG9hZCxcbiAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IGFkZHJlc3NTZWxlY3RlZFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXIocmVxdWVzdCk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdFNlZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLmNpdHkgKyAnIC0gJyArIHJlc3VsdFNlZGUuc2hpcHBpbmdBZGRyZXNzLnN0cmVldCwgJ25ld2xvdCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0U2VkZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRNb2RlID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWRkcmVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIHNldE1vZGUgPSAobW9kZSkgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdEFkZHJlcyA9IG1vZGUgPT0gXCJjYXJnYVwiO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHRvZ2dsZUFkZHJlc3NEcm9wZG93biA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gIXRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbjtcbiAgICB9XG5cbiAgICBzZWxlY3RBZGRyZXNzRnJvbURyb3Bkb3duID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnNldFNlbGVjdEFkZHJlc3MoYWRkcmVzcyk7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIG9uU2VsZWN0aW9uTm90ZXNDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMub25JbnB1dENoYW5nZSgpO1xuICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdEFkZHJlc3ModGhpcy5jYXJ0U2VydmljZS5nZXRDYXJ0MigpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFNlbGVjdGVkQWRkcmVzc0xhYmVsID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzID0gdGhpcy5zZWxlY3RlZEFkZHJlc3MgfHwgdGhpcy5hZGRyZXNzQm9vaz8uZmluZChpdGVtID0+IGl0ZW0uc2VsZWN0ZWQpO1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybiB0aGlzLmdldERlZmF1bHRTZWxlY3RlZExhYmVsKCk7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICBjb25zdCBuYW1lID0gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICBjb25zdCBtYWluID0gW25hbWUsIGFkZHJlc3Muc3RyZWV0LCBhZGRyZXNzLmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICAgICAgcmV0dXJuIG1haW4gfHwgdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgIH1cblxuICAgIGdldEFkZHJlc3NPcHRpb25MYWJlbCA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGFkZHJlc3M/LmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICBjb25zdCBuYW1lID0gW2NvbnRhY3QuZmlyc3ROYW1lLCBjb250YWN0Lmxhc3ROYW1lXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuICAgICAgICByZXR1cm4gW25hbWUsIGFkZHJlc3M/LnN0cmVldCwgYWRkcmVzcz8uY2l0eV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpO1xuICAgIH1cblxuICAgIGdldERlZmF1bHRTZWxlY3RlZExhYmVsID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcpIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2s/Lmxlbmd0aCA/ICh0aGlzLmFkZHJlc3NCb29rWzBdPy5zdHJlZXQgfHwgJycpIDogJyc7XG4gICAgfVxuXG4gICAgZ2V0Q291bnRyeSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmNvdW50cmllc0xpc3QuZmluZChwYWlzZXMgPT4gcGFpc2VzLmNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyhjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkpKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXRQcm92aW5jZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLnByb3ZpbmNlTGlzdC5maW5kKGN0ID0+IGN0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0RG9jdW1lbnRUeXBlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZG9jdW1lbnRUeXBlcy5maW5kKGR0ID0+IGR0LmNvZGUgPT0gY29kZSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0TGFiZWxOb3Rlc1BhcmFtID0gKCkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsICdsYWJlbF9ub3Rlc18nICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcblxuICAgIGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UgPSAobmFtZVBhcmFtKSA9PiB0aGlzLmhhc1BhcmFtcyh0aGlzLnBhcmFtcywgbmFtZVBhcmFtICsgdGhpcy5jb25zdHMuZ2V0Q2hhbm5lbCgpICsgJ18nICsgdGhpcy5jb25zdHMuZ2V0TG9jYWxlKCkuc3BsaXQoJ18nKVswXSlcblxuICAgIGdldEZpbHRlcmVkQWRkcmVzc0Jvb2sgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vayB8fCAhdGhpcy5hZGRyZXNzQm9vay5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0ZXJtID0gKHRoaXMuYWRkcmVzc1NlYXJjaCB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgICAgIGlmICghdGVybSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2s7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc0Jvb2suZmlsdGVyKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFjdCA9IGFkZHJlc3MuYWRkcmVzc0NvbnRhY3QgfHwge307XG4gICAgICAgICAgICBjb25zdCBoYXlzdGFjayA9IFtcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLmNpdHksXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5wb3N0Y29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLmNvdW50cnlDb2RlLFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q291bnRyeShhZGRyZXNzLmNvdW50cnlDb2RlKSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldFByb3ZpbmNlKGFkZHJlc3MucHJvdmluY2VDb2RlKSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmZpcnN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGNvbnRhY3QuZW1haWxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJyAnKVxuICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKHRlcm0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NPcHRpb25zID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZEFkZHJlc3NCb29rKCkubWFwKGFkZHJlc3MgPT4gKHtcbiAgICAgICAgICAgIC4uLmFkZHJlc3MsXG4gICAgICAgICAgICBsYWJlbDogdGhpcy5nZXRBZGRyZXNzT3B0aW9uTGFiZWwoYWRkcmVzcylcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIGhhc1NlbGVjdGVkQWRkcmVzcyA9ICgpID0+ICEhdGhpcy5hZGRyZXNzQm9vaz8uc29tZShpdGVtID0+IGl0ZW0/LnNlbGVjdGVkKTtcblxuICAgIHByaXZhdGUgYXBwbHlTZWxlY3RlZEFkZHJlc3MgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGlmICghYWRkcmVzcykgcmV0dXJuO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWUsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBzdHJlZXQ6IGFkZHJlc3Muc3RyZWV0IHx8ICcnLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFkZHJlc3MuY291bnRyeUNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIGNpdHk6IGFkZHJlc3MuY2l0eSB8fCAnJyxcbiAgICAgICAgICAgIHByb3ZpbmNlQ29kZTogYWRkcmVzcy5wcm92aW5jZUNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBhZGRyZXNzLnBvc3Rjb2RlIHx8ICcnLFxuICAgICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gYWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5kb2N1bWVudFR5cGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSBjb250YWN0LmRvY3VtZW50VHlwZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENoZWNrb3V0Rm9ybVJlYWRvbmx5ID0gKHJlYWRvbmx5OiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMuZm9ybVJlYWRvbmx5ID0gcmVhZG9ubHk7XG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNba2V5XTtcbiAgICAgICAgICAgIHJlYWRvbmx5ID8gY29udHJvbC5kaXNhYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KSA6IGNvbnRyb2wuZW5hYmxlKHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uZ2V0KCdlbWFpbCcpLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNob3VsZEF1dG9TZWxlY3RBZGRyZXNzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGFjdEFkZHJlc3NWaWV3IHx8IHRoaXMuZ2V0TW9kZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgICAgICBjb25zdCBuZXdBZGRyZXNzID0ge1xuICAgICAgICAgICAgaWQ6IC0xICogKCsrdGhpcy50ZW1wQWRkcmVzc0lkKSxcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNUZW1wb3Jhcnk6IHRydWUsXG4gICAgICAgICAgICBzdHJlZXQ6IGNvbnRhY3Quc3RyZWV0LFxuICAgICAgICAgICAgY2l0eTogY29udGFjdC5jaXR5LFxuICAgICAgICAgICAgcG9zdGNvZGU6IGNvbnRhY3QucG9zdGNvZGUsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogY29udGFjdC5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgIHByb3ZpbmNlQ29kZTogY29udGFjdC5wcm92aW5jZUNvZGUsXG4gICAgICAgICAgICBhZGRyZXNzQ29udGFjdDoge1xuICAgICAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUsXG4gICAgICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwsXG4gICAgICAgICAgICAgICAgcGhvbmVOdW1iZXI6IGNvbnRhY3QucGhvbmVOdW1iZXIsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudE51bWJlcjogY29udGFjdC5kb2N1bWVudE51bWJlclxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmlsdGVyKGFkZHJlc3MgPT4gIWFkZHJlc3MuaXNUZW1wb3JhcnkpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gW1xuICAgICAgICAgICAgbmV3QWRkcmVzcyxcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc0Jvb2subWFwKGFkZHJlc3MgPT4gKHsgLi4uYWRkcmVzcywgc2VsZWN0ZWQ6IGZhbHNlIH0pKVxuICAgICAgICBdO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBuZXdBZGRyZXNzLmlkO1xuICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKG5ld0FkZHJlc3MpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHRoaXMuYWRkcmVzc0Jvb2suZmlsdGVyKGFkZHJlc3MgPT4gIWFkZHJlc3MuaXNUZW1wb3JhcnkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYnVpbGRDdXJyZW50U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbW9kZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkIHx8IHRoaXMuc2VsZWN0ZWRBZGRyZXNzPy5pZCB8fCAwLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgJydcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1vZGU6ICdmb3JtJyxcbiAgICAgICAgICAgIGZvcm06IHRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCksXG4gICAgICAgICAgICBiaWxsaW5nOiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPyBudWxsIDogdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgdmlld0RhdGFGYWN0dXJhY2lvbjogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXREaXJ0eVN0YXRlID0gKG5leHREaXJ0eTogYm9vbGVhbikgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0RpcnR5ID09PSBuZXh0RGlydHkpIHJldHVybjtcbiAgICAgICAgdGhpcy5pc0RpcnR5ID0gbmV4dERpcnR5O1xuICAgICAgICBpZiAobmV4dERpcnR5ICYmIHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRpcnR5Q2hhbmdlLmVtaXQodGhpcy5pc0RpcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCA9ICgpID0+IHtcbiAgICAgICAgdGhpcy5sYXN0U2F2ZWRTdGF0ZSA9IHRoaXMuYnVpbGRDdXJyZW50U3RhdGUoKTtcbiAgICAgICAgdGhpcy5zZXREaXJ0eVN0YXRlKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBldmFsdWF0ZURpcnR5U3RhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN1cHByZXNzRGlydHkpIHJldHVybjtcbiAgICAgICAgaWYgKCF0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIGNvbnN0IG5leHREaXJ0eSA9IEpTT04uc3RyaW5naWZ5KGN1cnJlbnQpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmxhc3RTYXZlZFN0YXRlKTtcbiAgICAgICAgdGhpcy5zZXREaXJ0eVN0YXRlKG5leHREaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNhcnRTZXJ2aWNlPy5jaGFubmVsQ29uZmlnO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgIXRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmXG4gICAgICAgICAgICB0aGlzLmlzTGFzdE9uZSAmJlxuICAgICAgICAgICAgISFjaGFubmVsPy5pc1NraXBwaW5nU2hpcHBpbmdTdGVwQWxsb3dlZCAmJlxuICAgICAgICAgICAgISFjaGFubmVsPy5pc1NraXBwaW5nUGF5bWVudFN0ZXBBbGxvd2VkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQgPSAoKSA9PiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpICYmIHRoaXMuYWRkcmVzc1N5bmNlZEZvckNvbXBsZXRpb24gJiYgIXRoaXMuaXNEaXJ0eTtcblxuICAgIGdldFByaW1hcnlBY3Rpb25MYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnZmluaXNoLWNoZWNrb3V0JztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0xhc3RPbmUgJiYgIXRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHJldHVybiAnZmluaXNoLWNoZWNrb3V0JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5hbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOiAncmVhZHktZm9ybSc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFbXB0eVRvdGFsc1NuYXBzaG90ID0gKCk6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9PiAoe1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9KTtcblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21Bc3NvY2lhdGVkRGF0YSA9IChkYXRhOiBhbnlbXSB8IG51bGwpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4ge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCgpO1xuICAgICAgICBpZiAoIWRhdGE/Lmxlbmd0aCkgcmV0dXJuIHNuYXBzaG90O1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW1vdW50ID0gTnVtYmVyKGl0ZW0/LmFtb3VudCB8fCAwKTtcbiAgICAgICAgICAgIHN3aXRjaCAoaXRlbT8udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3N1YnRvdGFsJzpcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3Quc3VidG90YWwgPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90Lml0ZW1zID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0YXhlcyc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnRheGVzID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdzaGlwbWVudCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnNoaXBwaW5nID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjbGllbnRUYXhlcyc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LmNsaWVudFRheGVzID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNjb3VudCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnY291cG9uJzpcbiAgICAgICAgICAgICAgICAgICAgc25hcHNob3QucHJvbW90aW9uICs9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc25hcHNob3Q7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTdW1tYXJ5VG90YWxzRnJvbU9yZGVyID0gKG9yZGVyOiBhbnkpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4ge1xuICAgICAgICBjb25zdCB0b3RhbHMgPSBvcmRlcj8udG90YWxzIHx8IHt9O1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VidG90YWw6IE51bWJlcih0b3RhbHMuc3VidG90YWwgfHwgMCksXG4gICAgICAgICAgICB0YXhlczogTnVtYmVyKHRvdGFscy50YXhlcyB8fCAwKSxcbiAgICAgICAgICAgIHNoaXBwaW5nOiBOdW1iZXIodG90YWxzLnNoaXBwaW5nIHx8IDApLFxuICAgICAgICAgICAgdG90YWw6IE51bWJlcih0b3RhbHMudG90YWwgfHwgMCksXG4gICAgICAgICAgICBjbGllbnRUYXhlczogTnVtYmVyKHRvdGFscy5jbGllbnRUYXhlcyB8fCAwKSxcbiAgICAgICAgICAgIHByb21vdGlvbjogdGhpcy5vcmRlclV0aWxzLmdldFN1bW1hcnlQcm9tb3Rpb25BbW91bnQob3JkZXIpLFxuICAgICAgICAgICAgaXRlbXM6IE51bWJlcih0b3RhbHMuaXRlbXMgfHwgMClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhdmVUb3RhbHNDaGFuZ2VkID0gKGJlZm9yZTogU3VtbWFyeVRvdGFsc1NuYXBzaG90LCBvcmRlcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbU9yZGVyKG9yZGVyKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGJlZm9yZS5zdWJ0b3RhbCAhPT0gYWZ0ZXIuc3VidG90YWwgfHxcbiAgICAgICAgICAgIGJlZm9yZS50YXhlcyAhPT0gYWZ0ZXIudGF4ZXMgfHxcbiAgICAgICAgICAgIGJlZm9yZS5zaGlwcGluZyAhPT0gYWZ0ZXIuc2hpcHBpbmcgfHxcbiAgICAgICAgICAgIGJlZm9yZS50b3RhbCAhPT0gYWZ0ZXIudG90YWwgfHxcbiAgICAgICAgICAgIGJlZm9yZS5jbGllbnRUYXhlcyAhPT0gYWZ0ZXIuY2xpZW50VGF4ZXMgfHxcbiAgICAgICAgICAgIGJlZm9yZS5wcm9tb3Rpb24gIT09IGFmdGVyLnByb21vdGlvbiB8fFxuICAgICAgICAgICAgYmVmb3JlLml0ZW1zICE9PSBhZnRlci5pdGVtc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5ID0gKCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZGlzY2FyZENoYW5nZXMgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnN1cHByZXNzRGlydHkgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5tb2RlID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZCA9IHRoaXMubGFzdFNhdmVkU3RhdGUuc2VsZWN0ZWRJZDtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQWRkcmVzcyA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCkpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQWRkcmVzcykge1xuICAgICAgICAgICAgICAgICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5mb3JFYWNoKGFkZHJlc3MgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gc2VsZWN0ZWRBZGRyZXNzLmlkIHx8IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS5ub3RlcyB8fCAnJztcbiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5U2VsZWN0ZWRBZGRyZXNzKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnZpZXdEYXRhRmFjdHVyYWNpb24gPz8gdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uO1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh0aGlzLmxhc3RTYXZlZFN0YXRlLmZvcm0gfHwge30sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmxhc3RTYXZlZFN0YXRlLmJpbGxpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWREb2MgPSBzZWxlY3RlZENvdW50cnk/LmRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
1273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxt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RTt3REFBMkM7QUFnZHBEO0lBREMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO2lFQUk5QjtBQXpkUSxtQkFBbUI7SUFOL0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQiw4L2pGQUF5QztRQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0tBQzlCLENBQUM7R0FDVyxtQkFBbUIsQ0E0dkMvQjtTQTV2Q1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9jaGVja291dC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuXG50eXBlIFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHtcbiAgICBzdWJ0b3RhbDogbnVtYmVyO1xuICAgIHRheGVzOiBudW1iZXI7XG4gICAgc2hpcHBpbmc6IG51bWJlcjtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGNsaWVudFRheGVzOiBudW1iZXI7XG4gICAgcHJvbW90aW9uOiBudW1iZXI7XG4gICAgaXRlbXM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcbiAgICBASW5wdXQoKSBjb21wYWN0QWRkcmVzc1ZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBAT3V0cHV0KCkgZGlydHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLnByb3ZpbmNlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZm9ybV9yZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NCb29rID0gW107XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWQgPSB7IGlkOiAwLCBub3RlczogXCJcIiB9XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RBZGRyZXNzRmFjdHVyYWNpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc1NlYXJjaCA9ICcnO1xuICAgIHB1YmxpYyBhZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1SZWFkb25seSA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZEFkZHJlc3M6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSB0ZW1wQWRkcmVzc0lkID0gMDtcblxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIHBvc3RhbENvZGVWaXNpYmxlID0gdHJ1ZTtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZCA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uID0gdHJ1ZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGRvY3VtZW50RXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogYW55IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhZGRyZXNzU3luY2VkRm9yQ29tcGxldGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgbGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdDogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0ge1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHVibGljIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogQ2hhbm5lbENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24obnVsbCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucGFyYW1zU2VydmljZS5wYXJhbWV0ZXJzLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wYXJhbXMgPSByZXMpO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5zdGVwX2lkKTtcbiAgICAgICAgLy8gSW4gc2luZ2xlL2NvbXBhY3Qgc2VsZWN0aW9uIG1vZGUgd2Ugc2hvdWxkIG5vdCBzaG93IHRoZSBzdWJtaXQgYnV0dG9uLlxuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmNhcnQuc3Vic2NyaWJlKGNhcnQgPT4gdGhpcy5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSA9IGNhcnQ/LmN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLmF1dGhTZXJ2aWNlLmdldEN1c3RvbWVyKCk/LmVtYWlsIHx8IGxvY2FsRW1haWwpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzID0gdGhpcy5maWx0ZXJDb3VudHJ5QnlDb2RlKHJlcylcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpIHtcblxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gcmVzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzc0Jvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTaSBubyBoYXkgbmluZ3VuYSBkaXJlY2Npw7NuIHNlbGVjY2lvbmFkYSwgc2VsZWNjaW9uYXIgbGEgcHJpbWVyYSBwb3IgZGVmZWN0b1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQWRkcmVzcyAmJiB0aGlzLmFkZHJlc3NCb29rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9va1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHNlbGVjdGVkQWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSAmJiAhdGhpcy5sYXN0U2F2ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSB8fCB0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuYXNvY2lhdGVkRGF0YSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90ID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbUFzc29jaWF0ZWREYXRhKGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGZpbHRyYSBsb3MgcGFpc2VzIGRlIGFjdWVyZG8gYWwgYSBsb3MgY29kaWdvcyByZXRvcm5hZG9zIGVuIGxhIGZ1bmNpb24gZ2V0Q291bnRyaWVzLlxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogU2kgZ2V0Q291bnRyaWVzIGNvbnRpZW5lIHZhbG9yZXMgcXVlIG5vIGNvaW5jaWRlbiwgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogRGUgbG8gY29udHJhcmlvIHJldG9ybmEgbG9zIHZhbG9yZXMgZmlsdHJhZG9zLlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxuICAgICAqIEByZXR1cm5zIHVuIGFycmVnbG8gZGUgY291bnRyaWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIC8vIDEuIFNpIGhheSBwYcOtc2VzIEVYQ0xVSURPUywgcXXDrXRhbG9zIHNpZW1wcmVcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gY291bnRyaWVzO1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMgJiYgdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiAhdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMuaW5jbHVkZXMoZWxlbS5jb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gU2kgaGF5IHBhw61zZXMgSU5DTFVJRE9TLCBhcGxpY2EgZWwgZmlsdHJvIGRlIGluY2x1c2nDs25cbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXNGaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKClcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYWRvID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9O1xuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcbiAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbCA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnZhbHVlO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY3VycmVudCk/Lm5hbWUgfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbEZhY3R1cmFjaW9uID0gKGRvY3VtZW50VHlwZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy52aWV3Rm9ybXM/LnBvc3Rjb2RlPy5lbmFibGVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldEJhc2VQb3N0YWxDb2RlUmVxdWlyZWQgPSAoKSA9PlxuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LnZpZXdGb3Jtcz8ucG9zdGNvZGU/LnJlcXVpcmVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2aXNpYmxlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHZpc2libGUgJiYgdGhpcy5nZXRCYXNlUG9zdGFsQ29kZVJlcXVpcmVkKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVDb3VudHJ5QnlDb2RlID0gKGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudHJ5RnJvbVN1YmplY3RzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZSB8fCBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUgfHwgW10pXG4gICAgICAgIF0uZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSBjb2RlKTtcblxuICAgICAgICByZXR1cm4gY291bnRyeUZyb21TdWJqZWN0c1xuICAgICAgICAgICAgfHwgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gY29kZSlcbiAgICAgICAgICAgIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUgPSAoc2VsZWN0ZWRDb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZENvdW50cnkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkuY2hlY2tvdXRSZXF1aXJlZEZpZWxkcyB8fCBzZWxlY3RlZENvdW50cnkuaXNQb3N0YWxDb2RlTnVtZXJpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb3VudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvdW50cnlCeUNvZGUoc2VsZWN0ZWRDb3VudHJ5LmNvZGUgfHwgc2VsZWN0ZWRDb3VudHJ5LmNvdW50cnlDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZSA9IChjb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRQb3N0YWxDb2RlID0gY291bnRyeT8uY2hlY2tvdXRSZXF1aXJlZEZpZWxkcz8ucG9zdGFsQ29kZTtcblxuICAgICAgICBpZiAoY2hlY2tvdXRQb3N0YWxDb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrb3V0UG9zdGFsQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogdHJ1ZSwgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlzUG9zdGFsQ29kZUZpZWxkVmlzaWJsZSA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVWaXNpYmxlRmFjdHVyYWNpb24gOiB0aGlzLnBvc3RhbENvZGVWaXNpYmxlO1xuXG4gICAgaXNQb3N0YWxDb2RlRmllbGRSZXF1aXJlZCA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uIDogdGhpcy5wb3N0YWxDb2RlUmVxdWlyZWQ7XG5cbiAgICBzaG91bGRTaG93UG9zdGFsQ29kZUJ5Q291bnRyeUNvZGUgPSAoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUJ5Q29kZShjb2RlKTtcblxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpLnZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUG9zdGFsQ29kZUZpZWxkU3RhdGUoY291bnRyeSkudmlzaWJsZTtcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVFcnJvck1lc3NhZ2UgPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHZpc2libGU7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVJlcXVpcmVkRmFjdHVyYWNpb24gPSByZXF1aXJlZDtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24gPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxuICAgICAgICAgICAgJ2RvY3VtZW50RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMsIHNob3dOb3Rlc0Vycm9yOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgaWYgKHNob3dOb3Rlc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdyZXF1aXJlZC1maWVsZHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBheWxvYWQgPSB0aGlzLmNvbXBhY3RBZGRyZXNzVmlld1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkLFxuICAgICAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vZGUgPSAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gbW9kZSA9PSBcImNhcmdhXCI7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0TW9kZUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgPyB0aGlzLnNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA6IHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGVGYWN0dXJhY2lvbiA9IChtb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzRmFjdHVyYWNpb24gPSBtb2RlID09PSAnY2FyZ2EnO1xuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHNldFNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkRmFjdHVyYWNpb24gPSBTdHJpbmcoYWRkcmVzcy5pZCkgPT09IFN0cmluZyhhZGRyZXNzU2VsZWN0Py5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZEZhY3R1cmFjaW9uKT8uaWQgfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQWRkcmVzc0Zyb21Cb29rID0gKGJvb2tBZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGJvb2tBZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgJycsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYm9va0FkZHJlc3MuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGJvb2tBZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgIGNpdHk6IGJvb2tBZGRyZXNzLmNpdHksXG4gICAgICAgICAgICBzdHJlZXQ6IGJvb2tBZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBib29rQWRkcmVzcy5wb3N0Y29kZT8udG9TdHJpbmcoKSB8fCAnJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUJpbGxpbmdGb3JtU3VibWl0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmVyaWZ5VmFsaWRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdGhpcy5uZXh0U3RlcCgpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ3JlcXVpcmVkLWZpZWxkcycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzSWQ6IGFkZHJlc3NTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCBcIlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXJCeUlkcyhyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGU/LnNoaXBwaW5nQWRkcmVzcz8uY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZT8uc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxzQ2hhbmdlZCA9IHRoaXMuaGF2ZVRvdGFsc0NoYW5nZWQocHJldmlvdXNUb3RhbHMsIHJlc3VsdFNlZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmIHRoaXMubmV4dFN0ZXApIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7IHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTsgcmV0dXJuOyB9XG4gICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWRGYWN0dXJhY2lvbik7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZEVudmlvID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XG4gICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkRmFjdHVyYWNpb24gfHwgIWFkZHJlc3NTZWxlY3RlZEVudmlvKSB7IHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZEVudmlvLmlkIHx8IDA7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9IGFkZHJlc3NTZWxlY3RlZEZhY3R1cmFjaW9uLmlkIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRFbnZpby5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8IFwiXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlckJ5SWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHRTZWRlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgYWRkcmVzc1NlbGVjdGVkRW52aW8uY2l0eSArICcgLSAnICsgYWRkcmVzc1NlbGVjdGVkRW52aW8uc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkgeyB0b3RhbHNDaGFuZ2VkICYmIHRoaXMuc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5KCk7IHJldHVybjsgfVxuICAgICAgICAgICAgZWxzZSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IH1cbiAgICAgICAgZmluYWxseSB7IHRoaXMubG9hZGluZyA9IGZhbHNlOyB9XG4gICAgfVxuXG4gICAgb25TdWJtaXROZXdCaWxsaW5nQWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgYWRkcmVzc1NlbGVjdGVkRW52aW8gPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWRFbnZpbykgeyB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5nRm9ybURhdGEgPSB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICAgICAgYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlID0gYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiB0aGlzLmJ1aWxkQWRkcmVzc0Zyb21Cb29rKGFkZHJlc3NTZWxlY3RlZEVudmlvKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzczogYmlsbGluZ0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgXCJcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCBhZGRyZXNzU2VsZWN0ZWRFbnZpby5jaXR5ICsgJyAtICcgKyBhZGRyZXNzU2VsZWN0ZWRFbnZpby5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpOyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICB0b2dnbGVBZGRyZXNzRHJvcGRvd24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW47XG4gICAgfVxuXG4gICAgc2VsZWN0QWRkcmVzc0Zyb21Ecm9wZG93biA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbk5vdGVzQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEFkZHJlc3NMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzIHx8IHRoaXMuYWRkcmVzc0Jvb2s/LmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzKSByZXR1cm4gdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IFtuYW1lLCBhZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIHJldHVybiBtYWluIHx8IHRoaXMuZ2V0RGVmYXVsdFNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzT3B0aW9uTGFiZWwgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBhZGRyZXNzPy5zdHJlZXQsIGFkZHJlc3M/LmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3KSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGggPyAodGhpcy5hZGRyZXNzQm9va1swXT8uc3RyZWV0IHx8ICcnKSA6ICcnO1xuICAgIH1cblxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldERvY3VtZW50VHlwZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZChkdCA9PiBkdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NCb29rID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2sgfHwgIXRoaXMuYWRkcmVzc0Jvb2subGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVybSA9ICh0aGlzLmFkZHJlc3NTZWFyY2ggfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJlZXQsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jaXR5LFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvdW50cnkoYWRkcmVzcy5jb3VudHJ5Q29kZSksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm92aW5jZShhZGRyZXNzLnByb3ZpbmNlQ29kZSksXG4gICAgICAgICAgICAgICAgY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmVtYWlsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RmlsdGVyZWRBZGRyZXNzT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRBZGRyZXNzQm9vaygpLm1hcChhZGRyZXNzID0+ICh7XG4gICAgICAgICAgICAuLi5hZGRyZXNzLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0QWRkcmVzc09wdGlvbkxhYmVsKGFkZHJlc3MpXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBoYXNTZWxlY3RlZEFkZHJlc3MgPSAoKSA9PiAhIXRoaXMuYWRkcmVzc0Jvb2s/LnNvbWUoaXRlbSA9PiBpdGVtPy5zZWxlY3RlZCk7XG5cbiAgICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRBZGRyZXNzID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBwaG9uZU51bWJlcjogY29udGFjdC5waG9uZU51bWJlciB8fCAnJyxcbiAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsIHx8IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnZhbHVlLFxuICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSB8fCAnJyxcbiAgICAgICAgICAgIGRvY3VtZW50TnVtYmVyOiBjb250YWN0LmRvY3VtZW50TnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgc3RyZWV0OiBhZGRyZXNzLnN0cmVldCB8fCAnJyxcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhZGRyZXNzLmNvdW50cnlDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBjaXR5OiBhZGRyZXNzLmNpdHkgfHwgJycsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGFkZHJlc3MucHJvdmluY2VDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBwb3N0Y29kZTogYWRkcmVzcy5wb3N0Y29kZSB8fCAnJyxcbiAgICAgICAgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IGFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZERvYyA9IHNlbGVjdGVkQ291bnRyeT8uZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY29udGFjdC5kb2N1bWVudFR5cGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGVja291dEZvcm1SZWFkb25seSA9IChyZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLmZvcm1SZWFkb25seSA9IHJlYWRvbmx5O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzW2tleV07XG4gICAgICAgICAgICByZWFkb25seSA/IGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRBdXRvU2VsZWN0QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyB8fCB0aGlzLmdldE1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEFkZHJlc3M/LmlzVGVtcG9yYXJ5KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGVtcG9yYXJ5QWRkcmVzc0Zyb21Gb3JtID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0ID0gdGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IHtcbiAgICAgICAgICAgIGlkOiAtMSAqICgrK3RoaXMudGVtcEFkZHJlc3NJZCksXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWV0OiBjb250YWN0LnN0cmVldCxcbiAgICAgICAgICAgIGNpdHk6IGNvbnRhY3QuY2l0eSxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBjb250YWN0LnBvc3Rjb2RlLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGNvbnRhY3QuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGNvbnRhY3QucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgYWRkcmVzc0NvbnRhY3Q6IHtcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsLFxuICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZTogY29udGFjdC5kb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IFtcbiAgICAgICAgICAgIG5ld0FkZHJlc3MsXG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+ICh7IC4uLmFkZHJlc3MsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gbmV3QWRkcmVzcy5pZDtcbiAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhuZXdBZGRyZXNzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVRlbXBvcmFyeUFkZHJlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vaz8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ3VycmVudFN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCB8fCB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaWQgfHwgMCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiAnZm9ybScsXG4gICAgICAgICAgICBmb3JtOiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgYmlsbGluZzogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID8gbnVsbCA6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSxcbiAgICAgICAgICAgIHZpZXdEYXRhRmFjdHVyYWNpb246IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlydHlTdGF0ZSA9IChuZXh0RGlydHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSA9PT0gbmV4dERpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IG5leHREaXJ0eTtcbiAgICAgICAgaWYgKG5leHREaXJ0eSAmJiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuaXNEaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXZhbHVhdGVEaXJ0eVN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc0RpcnR5KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWlsZEN1cnJlbnRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXh0RGlydHkgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXN0U2F2ZWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShuZXh0RGlydHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jYXJ0U2VydmljZT8uY2hhbm5lbENvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJlxuICAgICAgICAgICAgdGhpcy5pc0xhc3RPbmUgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4gdGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSAmJiB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uICYmICF0aGlzLmlzRGlydHk7XG5cbiAgICBnZXRQcmltYXJ5QWN0aW9uTGFiZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0T25lICYmICF0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogJ3JlYWR5LWZvcm0nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCA9ICgpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4gKHtcbiAgICAgICAgc3VidG90YWw6IDAsXG4gICAgICAgIHRheGVzOiAwLFxuICAgICAgICBzaGlwcGluZzogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGNsaWVudFRheGVzOiAwLFxuICAgICAgICBwcm9tb3Rpb246IDAsXG4gICAgICAgIGl0ZW1zOiAwXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGdldFN1bW1hcnlUb3RhbHNGcm9tQXNzb2NpYXRlZERhdGEgPSAoZGF0YTogYW55W10gfCBudWxsKTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldEVtcHR5VG90YWxzU25hcHNob3QoKTtcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihpdGVtPy5hbW91bnQgfHwgMCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0/LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnN1YnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5pdGVtcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50YXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5zaGlwcGluZyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5jbGllbnRUYXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndG90YWwnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50b3RhbCA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzY291bnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnByb21vdGlvbiArPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlciA9IChvcmRlcjogYW55KTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gb3JkZXI/LnRvdGFscyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnRvdGFsOiBOdW1iZXIodG90YWxzLnN1YnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgdGF4ZXM6IE51bWJlcih0b3RhbHMudGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBzaGlwcGluZzogTnVtYmVyKHRvdGFscy5zaGlwcGluZyB8fCAwKSxcbiAgICAgICAgICAgIHRvdGFsOiBOdW1iZXIodG90YWxzLnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXM6IE51bWJlcih0b3RhbHMuY2xpZW50VGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBwcm9tb3Rpb246IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KG9yZGVyKSxcbiAgICAgICAgICAgIGl0ZW1zOiBOdW1iZXIodG90YWxzLml0ZW1zIHx8IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXZlVG90YWxzQ2hhbmdlZCA9IChiZWZvcmU6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCwgb3JkZXI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBhZnRlciA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlcihvcmRlcik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBiZWZvcmUuc3VidG90YWwgIT09IGFmdGVyLnN1YnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUudGF4ZXMgIT09IGFmdGVyLnRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUuc2hpcHBpbmcgIT09IGFmdGVyLnNoaXBwaW5nIHx8XG4gICAgICAgICAgICBiZWZvcmUudG90YWwgIT09IGFmdGVyLnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUuY2xpZW50VGF4ZXMgIT09IGFmdGVyLmNsaWVudFRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUucHJvbW90aW9uICE9PSBhZnRlci5wcm9tb3Rpb24gfHxcbiAgICAgICAgICAgIGJlZm9yZS5pdGVtcyAhPT0gYWZ0ZXIuaXRlbXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvTGVnYWN5U3VtbWFyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2NhcmRDaGFuZ2VzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubGFzdFNhdmVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNhdmVkU3RhdGUubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnNlbGVjdGVkSWQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zZWxlY3RlZCA9IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZCB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLm5vdGVzIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS52aWV3RGF0YUZhY3R1cmFjaW9uID8/IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbjtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5mb3JtIHx8IHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5wYXRjaFZhbHVlKHRoaXMubGFzdFNhdmVkU3RhdGUuYmlsbGluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==