ng-easycommerce 0.0.635 → 0.0.636
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/assets/ec-i18n/ct.json +2 -1
- package/assets/ec-i18n/en.json +2 -1
- package/assets/ec-i18n/es.json +2 -1
- package/assets/ec-i18n/fr.json +2 -1
- package/assets/ec-i18n/gl.json +2 -1
- package/assets/ec-i18n/pr.json +2 -1
- package/bundles/ng-easycommerce.umd.js +37 -6
- package/bundles/ng-easycommerce.umd.js.map +1 -1
- package/bundles/ng-easycommerce.umd.min.js +1 -1
- package/bundles/ng-easycommerce.umd.min.js.map +1 -1
- package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +7 -2
- package/esm2015/lib/services/checkout/addressing.service.js +32 -5
- package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +8 -3
- package/esm5/lib/services/checkout/addressing.service.js +32 -5
- package/fesm2015/ng-easycommerce.js +36 -5
- package/fesm2015/ng-easycommerce.js.map +1 -1
- package/fesm5/ng-easycommerce.js +37 -6
- package/fesm5/ng-easycommerce.js.map +1 -1
- package/lib/services/checkout/addressing.service.d.ts +4 -1
- package/ng-easycommerce.metadata.json +1 -1
- package/package.json +1 -1
|
@@ -299,11 +299,16 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
299
299
|
_this.addressBookSelected.id = _this.addressBook.find(function (address) { return address.selected; }).id || 0;
|
|
300
300
|
};
|
|
301
301
|
_this.selectAddress = function (items) { return __awaiter(_this, void 0, void 0, function () {
|
|
302
|
-
var addressSelected, request, resultSede_1, e_2;
|
|
302
|
+
var notesCfg, addressSelected, request, resultSede_1, e_2;
|
|
303
303
|
var _this = this;
|
|
304
304
|
return __generator(this, function (_a) {
|
|
305
305
|
switch (_a.label) {
|
|
306
306
|
case 0:
|
|
307
|
+
notesCfg = this.addressingService.getTypeForm().viewForms.notes;
|
|
308
|
+
if (notesCfg.required && (!this.addressBookSelected.notes || !this.addressBookSelected.notes.trim())) {
|
|
309
|
+
this.toast.show('required-fields');
|
|
310
|
+
return [2 /*return*/];
|
|
311
|
+
}
|
|
307
312
|
this.loading = true;
|
|
308
313
|
addressSelected = this.addressBook.find(function (address) { return address.selected; });
|
|
309
314
|
if (!addressSelected) return [3 /*break*/, 5];
|
|
@@ -498,7 +503,7 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
498
503
|
DataFormEcComponent = __decorate([
|
|
499
504
|
Component({
|
|
500
505
|
selector: 'app-dataform-ec',
|
|
501
|
-
template: "<ng-container *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n<ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\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' : '')\" *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\" *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (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=\"getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\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 <form (submit)=\"verifyValidate(false,this.cartService.items)\">\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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"text\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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.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 }}</option>\n </select>\n <div *ngIf=\"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 --> <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"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.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></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.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.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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"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 [value]=\"''\" selected>{{'document-type'|translate}}</option>\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.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\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.touched && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\"><!--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\" [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 <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n <div class=\"row mt-df\"><!--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\">\n <div class=\"col-12\">\n <p>\n <!-- <span class=\"required\"></span> -->\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\n (change)=\"onInputChange()\" /> </label><br />\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this' |\n translate }}</a>\n <div class=\"text-danger-container\"\n *ngIf=\"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\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}</button>\n\n\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 </form>\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 <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(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 <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> {{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> {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\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 <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}</label>\n <label class=\"field-label\"\n *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n </div>\n </div>\n </div>\n <div class=\"checkout-btn-unique text-end\">\n <button (click)=\"selectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | 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.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.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.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.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=\"text\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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.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.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.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=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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\" name=\"postcode\"\n [formControl]=\"checkoutFormFacturacion.controls['postcode']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *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 [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\n <option\n *ngFor=\"let item of documentTypes\"\n [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"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\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.touched && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\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\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}aaa <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\"></div>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" 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 <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\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>",
|
|
506
|
+
template: "<ng-container *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n<ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\">\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' : '')\" *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\" *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (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=\"getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\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 <form (submit)=\"verifyValidate(false,this.cartService.items)\">\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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"text\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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.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 }}</option>\n </select>\n <div *ngIf=\"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 --> <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"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.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></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.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.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=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"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 [value]=\"''\" selected>{{'document-type'|translate}}</option>\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.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\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.touched && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\"><!--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\" [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 <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n </div>\n <div class=\"row mt-df\"><!--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\">\n <div class=\"col-12\">\n <p>\n <!-- <span class=\"required\"></span> -->\n <label class=\"required text-underline\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n [formControl]=\"checkoutForm.controls['terms']\" type=\"checkbox\" required\n (change)=\"onInputChange()\" /> </label><br />\n <a (click)=\"openModal(template)\" role=\"button\" class=\"ms-3 nota-input text-dark\">{{ 'whats-this' |\n translate }}</a>\n <div class=\"text-danger-container\"\n *ngIf=\"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\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}</button>\n\n\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 </form>\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 <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(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 <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> {{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> {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\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\"\n *ngIf=\"getLabelNotesParam() as labelnotes\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n 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 {{(isLastOne ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | 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.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.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.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.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=\"text\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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.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.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.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=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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.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\" name=\"postcode\"\n [formControl]=\"checkoutFormFacturacion.controls['postcode']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.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=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *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 [value]=\"''\" selected>{{'document-type'|translate}}</option> -->\n <option\n *ngFor=\"let item of documentTypes\"\n [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"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\"\n [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"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.touched && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\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\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}aaa <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\"></div>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" 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 <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [formControl]=\"checkoutFormFacturacion.controls['notes']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\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>",
|
|
502
507
|
providers: [BsModalService],
|
|
503
508
|
styles: [".mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.field-label{color:#000}.btn.valid-btn{background-color:#000;color:#fff;margin-right:-3px;margin-bottom:10px}label{color:#000}.input-size-lg{width:1.8rem;height:1.8rem}"]
|
|
504
509
|
})
|
|
@@ -506,4 +511,4 @@ var DataFormEcComponent = /** @class */ (function (_super) {
|
|
|
506
511
|
return DataFormEcComponent;
|
|
507
512
|
}(ComponentHelper));
|
|
508
513
|
export { DataFormEcComponent };
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRjtJQUF5Qyx1Q0FBZTtJQTBDcEQsNkJBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixL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QjtRQUM5QyxJQUFJLENBQUMsZ0JBQWdCLENBQ2pCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFlBQVksRUFDakIsc0JBQXNCLEVBQ3RCLFdBQVcsRUFDWCx3QkFBd0IsQ0FDM0IsQ0FBQztJQUNOLENBQUM7SUFFRCxpRUFBbUMsR0FBbkMsVUFBb0Msb0JBQXlCO1FBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsdUJBQXVCLEVBQzVCLGlDQUFpQyxFQUNqQyxXQUFXLEVBQ1gsd0JBQXdCLENBQzNCLENBQUM7SUFDTixDQUFDO0lBcURELG9DQUFNLEdBQU4sVUFBTyxDQUFDO1FBQ0osT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixDQUFDOztnQkExWitCLFdBQVc7Z0JBQzVCLFdBQVc7Z0JBQ1IsWUFBWTtnQkFDQSxpQkFBaUI7Z0JBQ3ZCLFdBQVc7Z0JBQ1QsY0FBYztnQkFDZCxpQkFBaUI7Z0JBQ3hCLFNBQVM7Z0JBQ0Ysb0JBQW9COztJQWhEckM7UUFBUixLQUFLLEVBQUU7d0RBQVM7SUFDUjtRQUFSLEtBQUssRUFBRTswREFBNEI7SUFDM0I7UUFBUixLQUFLLEVBQUU7eURBQW9CO0lBSm5CLG1CQUFtQjtRQU4vQixTQUFTLENBQUM7WUFDUCxRQUFRLEVBQUUsaUJBQWlCO1lBQzNCLCt5aURBQXlDO1lBRXpDLFNBQVMsRUFBRSxDQUFDLGNBQWMsQ0FBQzs7U0FDOUIsQ0FBQztPQUNXLG1CQUFtQixDQWlkL0I7SUFBRCwwQkFBQztDQUFBLEFBamRELENBQXlDLGVBQWUsR0FpZHZEO1NBamRZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4uLy4uLy4uL2NsYXNzZXMvY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NhcnQuc2VydmljZSc7XG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoZWNrb3V0L2FkZHJlc3Npbmcuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBCc01vZGFsUmVmIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbC9icy1tb2RhbC1yZWYuc2VydmljZSc7XG5pbXBvcnQgeyBDb25zdGFudHMgfSBmcm9tICcuLi8uLi8uLi9jb3JlLmNvbnN0cyc7XG5pbXBvcnQgeyBhZGQgfSBmcm9tICduZ3gtYm9vdHN0cmFwL2Nocm9ub3MnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9wYXJhbWV0ZXJzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbm5lbENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGFubmVsLWNvbmZpZy5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtZGF0YWZvcm0tZWMnLFxuICAgIHRlbXBsYXRlVXJsOiAnZGF0YWZvcm0tZWMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydkYXRhZm9ybS1lYy5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW0JzTW9kYWxTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBEYXRhRm9ybUVjQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50SGVscGVyIGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIEBJbnB1dCgpIHN0ZXBfaWQ7XG4gICAgQElucHV0KCkgaXNMYXN0T25lOiBib29sZWFuID0gZmFsc2U7XG4gICAgQElucHV0KCkgbmV4dFN0ZXA6IEZ1bmN0aW9uO1xuXG4gICAgcHJvdGVjdGVkIGNvdW50cmllc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBjb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIHByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcblxuICAgIHB1YmxpYyBjb3VudHJpZXMkID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXMkID0gdGhpcy5wcm92aW5jZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzJCA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGNvdW50cmllc0ZhY3R1cmFjaW9uJCA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXNGYWN0dXJhY2lvbiQgPSB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uJCA9IHRoaXMuZG9jdW1lbnRUeXBlc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHB1YmxpYyByZXF1aXJlX2xvZ2luID0gZmFsc2U7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybTogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm1GYWN0dXJhY2lvbjogRm9ybUdyb3VwO1xuICAgIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWxscmVhZHlfZGF0YSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9vayA9IFtdO1xuICAgIHB1YmxpYyBhZGRyZXNzQm9va1NlbGVjdGVkID0geyBpZDogMCwgbm90ZXM6IFwiXCIgfVxuICAgIHB1YmxpYyBmaW5pc2g6IGJvb2xlYW4gPSBmYWxzZTsgLy9Fc3RhIHZhcmlhYmxlIHNlIHVzYSBwYXJhIG1vc3RyYXIgZWwgYm90b24gZGUgZmluYWxpemFyLlxuXG4gICAgcHVibGljIHZhbGlkYWRvID0gZmFsc2U7XG4gICAgcHVibGljIHZpZXdEYXRhRmFjdHVyYWNpb246IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgcHVibGljIG1vZGFsUmVmOiBCc01vZGFsUmVmIHwgbnVsbDtcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnkgPSB7fTtcbiAgICBwdWJsaWMgc2VsZWN0QWRkcmVzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZUVycm9yTWVzc2FnZUZhY3R1cmFjaW9uOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBkb2N1bWVudEVycm9yTWVzc2FnZTogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHB1YmxpYyB0b2FzdDogVG9hc3RTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgYWRkcmVzc2luZ1NlcnZpY2U6IEFkZHJlc3NpbmdTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogQ2hhbm5lbENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dIC8vIFNlIGFncmVnYSBwYXJhIHF1ZSBzw7NsbyBhY2VwdGUgY8OzZGlnb3MgcG9zdGFsZXMgbWF5b3JlcyBxdWUgY2Vyb1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSAvLyBTZSBhZ3JlZ2EgcGFyYSBxdWUgc8OzbG8gYWNlcHRlIGPDs2RpZ29zIHBvc3RhbGVzIG1heW9yZXMgcXVlIGNlcm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucGFyYW1zU2VydmljZS5wYXJhbWV0ZXJzLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wYXJhbXMgPSByZXMpO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5zdGVwX2lkKTtcbiAgICAgICAgY29uc3QgbG9jYWxFbWFpbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdtYWlsJylcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLmF1dGhTZXJ2aWNlLmdldEN1c3RvbWVyKCk/LmVtYWlsIHx8IGxvY2FsRW1haWwpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzID0gdGhpcy5maWx0ZXJDb3VudHJ5QnlDb2RlKHJlcylcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpIHtcblxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gcmVzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzc0Jvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHNlbGVjdGVkQWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGZpbHRyYSBsb3MgcGFpc2VzIGRlIGFjdWVyZG8gYWwgYSBsb3MgY29kaWdvcyByZXRvcm5hZG9zIGVuIGxhIGZ1bmNpb24gZ2V0Q291bnRyaWVzLlxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogU2kgZ2V0Q291bnRyaWVzIGNvbnRpZW5lIHZhbG9yZXMgcXVlIG5vIGNvaW5jaWRlbiwgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogRGUgbG8gY29udHJhcmlvIHJldG9ybmEgbG9zIHZhbG9yZXMgZmlsdHJhZG9zLlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxuICAgICAqIEByZXR1cm5zIHVuIGFycmVnbG8gZGUgY291bnRyaWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNvbnN0cy5nZXRDb3VudHJpZXMoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzRmlsdGVyZWQgPSBjb3VudHJpZXMuZmlsdGVyKGVsZW0gPT4gdGhpcy5jb25zdHMuZ2V0Q291bnRyaWVzKCkuaW5jbHVkZXMoZWxlbS5jb2RlKSlcbiAgICAgICAgICAgIGlmIChjb3VudHJpZXNGaWx0ZXJlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc0ZpbHRlcmVkXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VsL2xvcyBjb2RpZ28vcyBpbmdyZXNhZG8vcyBubyBjb2luY2lkZW4gY29uIGxvcyBwcm92aXN0b3MgZGVzZGUgZWwgYmFja2VuZCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY291bnRyaWVzXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICB9XG5cbiAgICBvbkZvcm1WYWxpZCA9ICgpID0+IHtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Gb3JtQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXG4gICAgfVxuXG4gICAgb25JbnB1dENoYW5nZSA9ICgpID0+IHRoaXMuZm9ybV9yZWFkeSA9IGZhbHNlO1xuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcbiAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmVyaWZ5VmFsaWRhdGUgPSBhc3luYyAoZSwgaXRlbXMpID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhcIlZlcmlmeWluZzogXCIsIGUpXG4gICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAvLyAgICBjb25zb2xlLmxvZyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY2l0eSddWyd2YWx1ZSddKVxuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSB7IHNoaXBwaW5nQWRkcmVzczogeyAuLi50aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLCBwaG9uZU51bWJlcjogdGhpcy5jaGVja291dEZvcm0udmFsdWUucGhvbmVOdW1iZXIudG9TdHJpbmcoKSB9LCBub3RlczogKHRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCkpLm5vdGVzIH07XG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIGRhdGEgPSB7IC4uLmRhdGEsIG5vdGVzOiBkYXRhLm5vdGVzLCBiaWxsaW5nQWRkcmVzczogdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5nZXRSYXdWYWx1ZSgpIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRBZGRyZXNzKGRhdGEpO1xuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgIT09IGZhbHNlICYmIHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQgPSBhZGRyZXNzLmlkID09PSBhZGRyZXNzU2VsZWN0LmlkKVxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKS5pZCB8fCAwXG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZ1xuICAgICkge1xuICAgICAgICBpZiAoIXNlbGVjdGVkSXRlbSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGlzTnVtZXJpYyA9IHNlbGVjdGVkSXRlbVtpc051bWVyaWNLZXldID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBwYXR0ZXJuID0gaXNOdW1lcmljID8gL15cXGQrJC8gOiAvLiovO1xuICAgICAgICB0aGlzW2Vycm9yTWVzc2FnZVZhcl0gPSBpc051bWVyaWMgPyBgJHtlcnJvcktleVByZWZpeH0ubnVtZXJpY2AgOiBgJHtlcnJvcktleVByZWZpeH0uZGVmYXVsdGA7XG5cbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnNldFZhbGlkYXRvcnMoW1xuICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucGF0dGVybihwYXR0ZXJuKVxuICAgICAgICBdKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0sXG4gICAgICAgICAgICAncG9zdGFsQ29kZUVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkQ291bnRyeSxcbiAgICAgICAgICAgICdwb3N0Y29kZScsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLFxuICAgICAgICAgICAgJ3Bvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNQb3N0YWxDb2RlTnVtZXJpYycsXG4gICAgICAgICAgICAncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGU6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZERvY3VtZW50VHlwZSxcbiAgICAgICAgICAgICdkb2N1bWVudE51bWJlcicsXG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybSxcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZScsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2VsZWN0QWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZClcbiAgICAgICAgaWYgKGFkZHJlc3NTZWxlY3RlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IGFkZHJlc3NTZWxlY3RlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKSB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRNb2RlID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWRkcmVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJ1ZWJhKHgpIHtcbiAgICAgICAgY29uc29sZS5sb2coeCk7XG4gICAgfVxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB0aGlzLnNlbGVjdEFkZHJlcyA9IG1vZGUgPT0gXCJjYXJnYVwiXG5cbiAgICBnZXRDb3VudHJ5ID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuY291bnRyaWVzTGlzdC5maW5kKHBhaXNlcyA9PiBwYWlzZXMuY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldFByb3ZpbmNlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UucHJvdmluY2VMaXN0LmZpbmQoY3QgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXREb2N1bWVudFR5cGUgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5kb2N1bWVudFR5cGVzLmZpbmQoZHQgPT4gZHQuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXRMYWJlbE5vdGVzUGFyYW0gPSAoKSA9PiB0aGlzLmhhc1BhcmFtcyh0aGlzLnBhcmFtcywgJ2xhYmVsX25vdGVzXycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnXycgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdKVxuXG4gICAgZ2V0UGFyYW1CeUNoYW5uZWxBbmRMYW5ndWFnZSA9IChuYW1lUGFyYW0pID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnXycgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdKVxufVxuIl19
|
|
514
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBd0IsS0FBSyxFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN2RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDcEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQVFoRjtJQUF5Qyx1Q0FBZTtJQTBDcEQsNkJBQW1CLFdBQXdCLEVBQ2hDLEVBQWUsRUFDZixL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QUF5QztZQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O1NBQzlCLENBQUM7T0FDVyxtQkFBbUIsQ0F1ZC9CO0lBQUQsMEJBQUM7Q0FBQSxBQXZkRCxDQUF5QyxlQUFlLEdBdWR2RDtTQXZkWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgT25Jbml0LCBWaWV3Q2hpbGQsIFRlbXBsYXRlUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcblxuICAgIHByb3RlY3RlZCBjb3VudHJpZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBwcm92aW5jZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBwcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG5cbiAgICBwdWJsaWMgY291bnRyaWVzJCA9IHRoaXMuY291bnRyaWVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzJCA9IHRoaXMucHJvdmluY2VzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlcyQgPSB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBjb3VudHJpZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgcHJvdmluY2VzRmFjdHVyYWNpb24kID0gdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvbiQgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm06IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb246IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgbG9hZGluZyA9IGZhbHNlO1xuICAgIHB1YmxpYyBmb3JtX3JlYWR5ID0gZmFsc2U7XG4gICAgcHVibGljIGFsbHJlYWR5X2RhdGEgPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2sgPSBbXTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tTZWxlY3RlZCA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHBvc3RhbENvZGVFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIHBvc3RhbENvZGVFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbjogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGRvY3VtZW50RXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgZmI6IEZvcm1CdWlsZGVyLFxuICAgICAgICBwdWJsaWMgdG9hc3Q6IFRvYXN0U2VydmljZSxcbiAgICAgICAgcHVibGljIGFkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSxcbiAgICAgICAgcHVibGljIGNhcnRTZXJ2aWNlOiBDYXJ0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IEJzTW9kYWxTZXJ2aWNlLFxuICAgICAgICBwdWJsaWMgcGFyYW1zU2VydmljZTogUGFyYW1ldGVyc1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjb25zdHM6IENvbnN0YW50cyxcbiAgICAgICAgcHVibGljIGNoYW5uZWxDb25maWc6IENoYW5uZWxDb25maWdTZXJ2aWNlKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZWNPbkNvbnN0cnVjdCgpXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkuY29uZmlnRm9ybS5mb3JtQWRkcmVzLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSAvLyBTZSBhZ3JlZ2EgcGFyYSBxdWUgc8OzbG8gYWNlcHRlIGPDs2RpZ29zIHBvc3RhbGVzIG1heW9yZXMgcXVlIGNlcm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcblxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkuY29uZmlnRm9ybS5mb3JtQmlsbGluZyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0gLy8gU2UgYWdyZWdhIHBhcmEgcXVlIHPDs2xvIGFjZXB0ZSBjw7NkaWdvcyBwb3N0YWxlcyBtYXlvcmVzIHF1ZSBjZXJvXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnBhcmFtc1NlcnZpY2UucGFyYW1ldGVycy5zdWJzY3JpYmUocmVzID0+IHRoaXMucGFyYW1zID0gcmVzKTtcbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5pbml0aWFsaXplKHRoaXMuc3RlcF9pZCk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpXG4gICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgJiYgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUodGhpcy5hdXRoU2VydmljZS5nZXRDdXN0b21lcigpPy5lbWFpbCB8fCBsb2NhbEVtYWlsKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldEFkZHJlc3NpbmdEYXRhKCkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllcyA9IHRoaXMuZmlsdGVyQ291bnRyeUJ5Q29kZShyZXMpXG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChjb3VudHJpZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKSB7XG5cbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc0Jvb2soKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHJlcyB8fCBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFkZHJlc3NCb29rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShzZWxlY3RlZEFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRNb2RlKCdjYXJnYScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3VudHJpZXMkLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5lY09uSW5pdCgpXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBmaWx0cmEgbG9zIHBhaXNlcyBkZSBhY3VlcmRvIGFsIGEgbG9zIGNvZGlnb3MgcmV0b3JuYWRvcyBlbiBsYSBmdW5jaW9uIGdldENvdW50cmllcy5cbiAgICAgKiBDYXNvcyBkZSB1c29zOiBTaSBnZXRDb3VudHJpZXMgZXMgdmFjaW8sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIFNpIGdldENvdW50cmllcyBjb250aWVuZSB2YWxvcmVzIHF1ZSBubyBjb2luY2lkZW4sIHJldG9ybmEgZWwgYXJyZWdsbyBxdWUgaW5ncmVzYSBwb3IgcGFyYW1ldHJvLlxuICAgICAqIERlIGxvIGNvbnRyYXJpbyByZXRvcm5hIGxvcyB2YWxvcmVzIGZpbHRyYWRvcy5cbiAgICAgKiBAcGFyYW0gY291bnRyaWVzIEFycmVnbG8gcXVlIGNvbnRpZW5lIGxvcyBjb3VudHJpZXMgcmVjaWJpZG9zIGVuIGxhIHN1YnNjcmlwY2lvbiBkZWwgb2JzZXJ2YWJsZS5cbiAgICAgKiBAcmV0dXJucyB1biBhcnJlZ2xvIGRlIGNvdW50cmllcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbHRlckNvdW50cnlCeUNvZGUgPSAoY291bnRyaWVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZ2V0Q291bnRyaWVzKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGNvdW50cmllc0ZpbHRlcmVkID0gY291bnRyaWVzLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllc1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2hvd0Zvcm1GYWN0dXJhY2lvbiA9ICgpID0+IHtcbiAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbikge1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvbiQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcyAmJiByZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHJlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBQcm92aW5jaWFcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LnByb3ZpbmNlcylcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb2N1bWVudG9cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24ocmVzWzBdPy5kb2N1bWVudFR5cGVzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgfVxuXG4gICAgb25Gb3JtVmFsaWQgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9ybUNoYW5nZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWRhZG8gPSBmYWxzZVxuICAgIH1cblxuICAgIG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcblxuICAgIG9uQ291bnRyeVNlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSB2YWx1ZSAmJiB2YWx1ZSAhPSAnbnVsbCcgP1xuICAgICAgICAgICAgdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlc1xuICAgICAgICAgICAgOlxuICAgICAgICAgICAgW11cbiAgICAgICAgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShwcm92aW5jZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL0RvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KGRvY3VtZW50VHlwZXMpO1xuICAgICAgICBpZiAoZG9jdW1lbnRUeXBlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSgnJyk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvdmluY2VzXG4gICAgICAgIGxldCBwcm92aW5jZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkucHJvdmluY2VzIDogW107XG4gICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocHJvdmluY2VzKTtcbiAgICAgICAgaWYgKHByb3ZpbmNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERvY3VtZW50IHR5cGVzXG4gICAgICAgIGxldCBkb2N1bWVudFR5cGVzID0gc2VsZWN0ZWRDb3VudHJ5ID8gc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMgOiBbXTtcbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoZG9jdW1lbnRUeXBlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IGRvY3VtZW50VHlwZXMuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgb25Qcm92aW5jZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBvbkRvY3VtZW50VHlwZXNTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHZhbHVlKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWREb2N1bWVudFR5cGUpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZlcmlmeVZhbGlkYXRlID0gYXN5bmMgKGUsIGl0ZW1zKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJWZXJpZnlpbmc6IFwiLCBlKVxuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnNldFZhbHVlKGUpO1xuICAgICAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXQoJ2VtYWlsJykuZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3Qpe1xuICAgICAgICAgICAgLy8gIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyAgICAgICBpZiAoIWl0ZW0ubG90WzBdKXtcbiAgICAgICAgICAgIC8vICAgICAgLy8gICAgY29uc29sZS5sb2codGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSlcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LDAsaXRlbS52YXJpYW50X2lkLDAsaXRlbS5pdGVtX2lkLGl0ZW0ucXVhbnRpdHksaXRlbS5wcm9kdWN0LnByaWNlLGl0ZW0ucXVhbnRpdHksaXRlbS5kaXNjb3VudCxpdGVtLnByb2R1Y3QucHJpY2UqaXRlbS5xdWFudGl0eSwnbmV3JywnJywnJywwLHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjaXR5J11bJ3ZhbHVlJ10rICcgLSAnICsgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3N0cmVldCddWyd2YWx1ZSddLCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAvLyAgICAgICB9XG4gICAgICAgICAgICAvLyAgIH0pO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzdWx0KCk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpO1xuICAgIH1cblxuICAgIHNob3dFcnJvciA9IChlcnJvcl9tZXNzYWdlKSA9PiB7IHRoaXMudG9hc3Quc2hvdyhlcnJvcl9tZXNzYWdlKTsgcmV0dXJuIHRydWU7IH1cblxuICAgIHByb3RlY3RlZCBlbWl0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMubW9kYWxSZWYgPSB0aGlzLm1vZGFsU2VydmljZS5zaG93KHRlbXBsYXRlLCB7IGNsYXNzOiAnbW9kYWwtbGcgJywga2V5Ym9hcmQ6IGZhbHNlLCBiYWNrZHJvcDogJ3N0YXRpYycgfSk7XG4gICAgfVxuXG4gICAgc2V0U2VsZWN0QWRkcmVzcyA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vay5tYXAoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkID0gYWRkcmVzcy5pZCA9PT0gYWRkcmVzc1NlbGVjdC5pZClcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCkuaWQgfHwgMFxuICAgIH1cblxuICAgIHVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgIHNlbGVjdGVkSXRlbTogYW55LFxuICAgICAgICBmb3JtQ29udHJvbE5hbWU6IHN0cmluZyxcbiAgICAgICAgZm9ybTogYW55LFxuICAgICAgICBlcnJvck1lc3NhZ2VWYXI6IHN0cmluZyxcbiAgICAgICAgaXNOdW1lcmljS2V5OiBzdHJpbmcsXG4gICAgICAgIGVycm9yS2V5UHJlZml4OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZEl0ZW0pIHJldHVybjtcblxuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBzZWxlY3RlZEl0ZW1baXNOdW1lcmljS2V5XSA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IGlzTnVtZXJpYyA/IC9eXFxkKyQvIDogLy4qLztcbiAgICAgICAgdGhpc1tlcnJvck1lc3NhZ2VWYXJdID0gaXNOdW1lcmljID8gYCR7ZXJyb3JLZXlQcmVmaXh9Lm51bWVyaWNgIDogYCR7ZXJyb3JLZXlQcmVmaXh9LmRlZmF1bHRgO1xuXG4gICAgICAgIGZvcm0uY29udHJvbHNbZm9ybUNvbnRyb2xOYW1lXS5zZXRWYWxpZGF0b3JzKFtcbiAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXG4gICAgICAgICAgICBWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybilcbiAgICAgICAgXSk7XG4gICAgICAgIGZvcm0uY29udHJvbHNbZm9ybUNvbnRyb2xOYW1lXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5OiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWRDb3VudHJ5LFxuICAgICAgICAgICAgJ3Bvc3Rjb2RlJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxuICAgICAgICAgICAgJ3Bvc3RhbENvZGVFcnJvck1lc3NhZ2UnLFxuICAgICAgICAgICAgJ2lzUG9zdGFsQ29kZU51bWVyaWMnLFxuICAgICAgICAgICAgJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3InXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhbGlkYXRpb24oXG4gICAgICAgICAgICBzZWxlY3RlZENvdW50cnksXG4gICAgICAgICAgICAncG9zdGNvZGUnLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24nLFxuICAgICAgICAgICAgJ2lzUG9zdGFsQ29kZU51bWVyaWMnLFxuICAgICAgICAgICAgJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3InXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgdXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0sXG4gICAgICAgICAgICAnZG9jdW1lbnRFcnJvck1lc3NhZ2UnLFxuICAgICAgICAgICAgJ2lzTnVtZXJpYycsXG4gICAgICAgICAgICAnZG9jdW1lbnQtcGF0dGVybi1lcnJvcidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB1cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24sXG4gICAgICAgICAgICAnZG9jdW1lbnRFcnJvck1lc3NhZ2VGYWN0dXJhY2lvbicsXG4gICAgICAgICAgICAnaXNOdW1lcmljJyxcbiAgICAgICAgICAgICdkb2N1bWVudC1wYXR0ZXJuLWVycm9yJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHsgICAgICAgIFxuICAgICAgICBjb25zdCBub3Rlc0NmZyA9IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXM7XG4gICAgICAgIGlmIChub3Rlc0NmZy5yZXF1aXJlZCAmJiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCAhdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzLnRyaW0oKSkpIHtcbiAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygncmVxdWlyZWQtZmllbGRzJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgYWRkcmVzc1NlbGVjdGVkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZClcbiAgICAgICAgaWYgKGFkZHJlc3NTZWxlY3RlZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IGFkZHJlc3NTZWxlY3RlZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKSB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRNb2RlID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0QWRkcmVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJ1ZWJhKHgpIHtcbiAgICAgICAgY29uc29sZS5sb2coeCk7XG4gICAgfVxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB0aGlzLnNlbGVjdEFkZHJlcyA9IG1vZGUgPT0gXCJjYXJnYVwiXG5cbiAgICBnZXRDb3VudHJ5ID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuY291bnRyaWVzTGlzdC5maW5kKHBhaXNlcyA9PiBwYWlzZXMuY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldFByb3ZpbmNlID0gKGNvZGUpID0+IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UucHJvdmluY2VMaXN0LmZpbmQoY3QgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXREb2N1bWVudFR5cGUgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5kb2N1bWVudFR5cGVzLmZpbmQoZHQgPT4gZHQuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiXG5cbiAgICBnZXRMYWJlbE5vdGVzUGFyYW0gPSAoKSA9PiB0aGlzLmhhc1BhcmFtcyh0aGlzLnBhcmFtcywgJ2xhYmVsX25vdGVzXycgKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnXycgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdKVxuXG4gICAgZ2V0UGFyYW1CeUNoYW5uZWxBbmRMYW5ndWFnZSA9IChuYW1lUGFyYW0pID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLmNvbnN0cy5nZXRDaGFubmVsKCkgKyAnXycgKyB0aGlzLmNvbnN0cy5nZXRMb2NhbGUoKS5zcGxpdCgnXycpWzBdKVxufVxuIl19
|