ng-easycommerce 0.0.688 → 0.0.689

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +13 -0
  2. package/assets/docs/SEO.md +174 -0
  3. package/bundles/ng-easycommerce.umd.js +859 -558
  4. package/bundles/ng-easycommerce.umd.js.map +1 -1
  5. package/bundles/ng-easycommerce.umd.min.js +1 -1
  6. package/bundles/ng-easycommerce.umd.min.js.map +1 -1
  7. package/esm2015/lib/ec-component/auth-ec/auth-ec.component.js +31 -3
  8. package/esm2015/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +14 -3
  9. package/esm2015/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +14 -3
  10. package/esm2015/lib/ec-component/cart-ec/cart-ec.component.js +17 -3
  11. package/esm2015/lib/ec-component/checkout-ec/checkout-ec.component.js +17 -3
  12. package/esm2015/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +3 -3
  13. package/esm2015/lib/ec-component/collection-ec/collection-ec.component.js +36 -3
  14. package/esm2015/lib/ec-component/home-ec/home-ec.component.js +14 -3
  15. package/esm2015/lib/ec-component/password-reset-ec/password-reset-ec.component.js +14 -3
  16. package/esm2015/lib/ec-component/product-detail-ec/product-detail-ec.component.js +17 -12
  17. package/esm2015/lib/ec-component/section-container-ec/section-container-ec.component.js +45 -4
  18. package/esm2015/lib/ec-directive/add-action-redirect.directive.js +35 -13
  19. package/esm2015/lib/ec-directive/product-off.directive.js +2 -2
  20. package/esm2015/lib/services/seo.service.js +112 -0
  21. package/esm2015/public-api.js +2 -1
  22. package/esm5/lib/ec-component/auth-ec/auth-ec.component.js +31 -3
  23. package/esm5/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.js +14 -3
  24. package/esm5/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.js +14 -3
  25. package/esm5/lib/ec-component/cart-ec/cart-ec.component.js +17 -3
  26. package/esm5/lib/ec-component/checkout-ec/checkout-ec.component.js +17 -3
  27. package/esm5/lib/ec-component/checkout-ec/dataform-ec/dataform-ec.component.js +3 -3
  28. package/esm5/lib/ec-component/collection-ec/collection-ec.component.js +36 -3
  29. package/esm5/lib/ec-component/home-ec/home-ec.component.js +14 -3
  30. package/esm5/lib/ec-component/password-reset-ec/password-reset-ec.component.js +14 -3
  31. package/esm5/lib/ec-component/product-detail-ec/product-detail-ec.component.js +17 -12
  32. package/esm5/lib/ec-component/section-container-ec/section-container-ec.component.js +45 -4
  33. package/esm5/lib/ec-directive/add-action-redirect.directive.js +35 -13
  34. package/esm5/lib/ec-directive/product-off.directive.js +2 -2
  35. package/esm5/lib/services/seo.service.js +116 -0
  36. package/esm5/public-api.js +2 -1
  37. package/fesm2015/ng-easycommerce.js +855 -559
  38. package/fesm2015/ng-easycommerce.js.map +1 -1
  39. package/fesm5/ng-easycommerce.js +860 -560
  40. package/fesm5/ng-easycommerce.js.map +1 -1
  41. package/lib/ec-component/auth-ec/auth-ec.component.d.ts +4 -1
  42. package/lib/ec-component/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +3 -1
  43. package/lib/ec-component/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +3 -1
  44. package/lib/ec-component/cart-ec/cart-ec.component.d.ts +4 -1
  45. package/lib/ec-component/checkout-ec/checkout-ec.component.d.ts +4 -1
  46. package/lib/ec-component/collection-ec/collection-ec.component.d.ts +5 -1
  47. package/lib/ec-component/home-ec/home-ec.component.d.ts +3 -1
  48. package/lib/ec-component/password-reset-ec/password-reset-ec.component.d.ts +3 -1
  49. package/lib/ec-component/product-detail-ec/product-detail-ec.component.d.ts +3 -3
  50. package/lib/ec-component/section-container-ec/section-container-ec.component.d.ts +7 -1
  51. package/lib/ec-directive/add-action-redirect.directive.d.ts +1 -0
  52. package/lib/services/seo.service.d.ts +16 -0
  53. package/ng-easycommerce.metadata.json +1 -1
  54. package/package.json +1 -1
  55. package/public-api.d.ts +1 -0
@@ -1264,10 +1264,10 @@ __decorate([
1264
1264
  DataFormEcComponent = __decorate([
1265
1265
  Component({
1266
1266
  selector: 'app-dataform-ec',
1267
- template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible()\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired()\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelnotes\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\"><!--Direcci\u00F3n de facturaci\u00F3n-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFactSelection\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFactSelection\"></label>\n </div>\n </div>\n <ng-container *ngIf=\"!viewDataFacturacion\">\n <!-- Selector de modo para direcci\u00F3n de facturaci\u00F3n -->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption1\" autocomplete=\"off\"\n [checked]=\"!getModeFacturacion()\" (change)=\"setModeFacturacion('seleccion')\">\n {{'select-address' | translate | titlecase}}\n </label>\n <label [class]=\"'btn btn-outline-secondary ' + (getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption2\" autocomplete=\"off\"\n [checked]=\"getModeFacturacion()\" (change)=\"setModeFacturacion('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n </div>\n </div>\n </div>\n </div>\n <!-- Formulario de nueva direcci\u00F3n de facturaci\u00F3n -->\n <ng-container *ngIf=\"getModeFacturacion()\">\n <ng-container *ngTemplateOutlet=\"datosFormFacturacion\"></ng-container>\n </ng-container>\n <!-- Selecci\u00F3n de direcci\u00F3n de facturaci\u00F3n del address book -->\n <ng-container *ngIf=\"!getModeFacturacion()\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'billing-'+i\"\n [id]=\"'billing-'+i\" [checked]=\"item.selectedFacturacion\"\n (click)=\"setSelectAddressFacturacion(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <div class=\"checkout-btn-unique text-end\">\n <button *ngIf=\"!viewDataFacturacion && !getModeFacturacion()\"\n (click)=\"onSelectAddressFacturacion(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"!addressBookSelectedFacturacion.id\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"!viewDataFacturacion && getModeFacturacion()\"\n (click)=\"onSubmitNewBillingAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"checkoutFormFacturacion.invalid\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"viewDataFacturacion\"\n (click)=\"onSelectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"handleBillingFormSubmit($event)\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible(true)\">\n <label class=\"field-label\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired(true)\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessageFacturacion |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
1267
+ template: "<ng-container\n *ngIf=\"this.channelConfig.channelType != 'b2b' || (this.channelConfig.channelType == 'b2b' && authService.isAuthenticated()); else pleaseLogin\">\n <ng-container\n *ngIf=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null && !compactAddressView\">\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\"\n *ngIf=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\"\n *ngIf=\"getParamByChannelAndLanguage('btn_new_address_') as param\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\"\n (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"compactAddressView || getMode(); else addressSelection\">\n <div *ngIf=\"!require_login; else requireLoginView\">\n <div class=\"single-step-surface\">\n <div class=\"single-step-overlay\" *ngIf=\"compactAddressView && loading\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_LOAD_ADDRESS'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n </ng-container>\n\n <app-dataform-ec-single\n *ngIf=\"compactAddressView\"\n [showToggle]=\"this.addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && this.authService.isAuthenticated() && this.addressBook != null\"\n [isNewAddressMode]=\"getMode()\"\n [showDefaultNewAddressButton]=\"!getParamByChannelAndLanguage('btn_new_address_') && !customerHasCustomerTaxRate\"\n [customNewAddressLabel]=\"getParamByChannelAndLanguage('btn_new_address_')?.value\"\n [isTemporarySelected]=\"selectedAddress?.isTemporary\"\n [selectedAddressLabel]=\"getSelectedAddressLabel()\"\n [addressDropdownOpen]=\"addressDropdownOpen\"\n [addressSearch]=\"addressSearch\"\n [addressOptions]=\"getFilteredAddressOptions()\"\n [showSelectBlock]=\"!getMode()\"\n [hasSelectedAddress]=\"hasSelectedAddress()\"\n (modeChange)=\"setMode($event)\"\n (toggleDropdown)=\"toggleAddressDropdown()\"\n (closeDropdown)=\"addressDropdownOpen = false\"\n (selectAddress)=\"selectAddressFromDropdown($event)\"\n (addressSearchChange)=\"addressSearch = $event\">\n </app-dataform-ec-single>\n\n <form (submit)=\"verifyValidate(false,this.cartService.items)\"\n [class.compact-address-form]=\"compactAddressView\"\n *ngIf=\"!compactAddressView || getMode() || hasSelectedAddress()\">\n <div class=\"row mt-df\"><!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\" for=\"shipping-firstName\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-firstName\" class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutForm.controls['firstName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.firstName.dirty || checkoutForm.controls.firstName.touched) && checkoutForm.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\" for=\"shipping-lastName\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-lastName\" class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutForm.controls['lastName']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.lastName.dirty || checkoutForm.controls.lastName.touched) && checkoutForm.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\"><!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\" for=\"shipping-phoneNumber\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-phoneNumber\" (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\" name=\"phoneNumber\"\n [formControl]=\"checkoutForm.controls['phoneNumber']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.phoneNumber.dirty || checkoutForm.controls.phoneNumber.touched) && checkoutForm.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\" for=\"shipping-email\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-email\" (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutForm.controls['email']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.email.dirty || checkoutForm.controls.email.touched) && checkoutForm.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 3-->\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(countries$ | async) as countries\">\n <label class=\"field-label\" for=\"shipping-countryCode\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select id=\"shipping-countryCode\" class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutForm.controls['countryCode']\"\n (change)=\"onCountrySelected($event.target.value)\">\n <!-- <option selected [value]=\"countries[0].code\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">{{ country.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.countryCode.dirty || checkoutForm.controls.countryCode.touched) && checkoutForm.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(provinces$ | async) as provinces\">\n <label class=\"field-label\" for=\"shipping-provinceCode\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select id=\"shipping-provinceCode\" class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option>\n -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">{{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutForm.controls.provinceCode.dirty || checkoutForm.controls.provinceCode.touched) && checkoutForm.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\" for=\"shipping-city\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-city\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutForm.controls['city']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.city.dirty || checkoutForm.controls.city.touched) && checkoutForm.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\" for=\"shipping-street\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span>\n <span class=\"char-count\">\n {{ 50 - (checkoutForm.controls['street'].value?.length || 0) }}\n {{'remainingCharacters'|translate}}\n </span>\n </label>\n <input id=\"shipping-street\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutForm.controls['street']\" value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.street.dirty || checkoutForm.controls.street.touched) && checkoutForm.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n\n <!-- form direcci\u00F3n -->\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible()\">\n <label class=\"field-label\" for=\"shipping-postcode\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired()\"\n class=\"required\">*</span></label>\n <input id=\"shipping-postcode\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n [formControl]=\"checkoutForm.controls['postcode']\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.postcode.dirty || checkoutForm.controls.postcode.touched) && checkoutForm.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\"> {{postalCodeErrorMessage | translate}} </span>\n </div>\n </div>\n </div>\n\n <div class=\"row mt-df\"><!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFull\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnly\">\n <div class=\"form-group col-12\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdown($event)\"\n [attr.aria-expanded]=\"documentTypeDropdownOpen\"\n [disabled]=\"checkoutForm.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabel(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentType(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <label class=\"visually-hidden\" for=\"shipping-documentNumber\">{{'document-number'|translate}}</label>\n <input id=\"shipping-documentNumber\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnly>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\" for=\"shipping-documentNumberOnly\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-documentNumberOnly\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFull>\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\" *ngIf=\"(documentTypes$ | async) as documentTypes\">\n <label class=\"field-label\" for=\"shipping-documentType\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select id=\"shipping-documentType\" name=\"documentType\" class=\"form-select\"\n (change)=\"onDocumentTypesSelected($event.target.value)\"\n [formControl]=\"checkoutForm.controls['documentType']\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">{{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentType.dirty || checkoutForm.controls.documentType.touched) && checkoutForm.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\" for=\"shipping-documentNumberFull\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"shipping-documentNumberFull\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n [formControl]=\"checkoutForm.controls['documentNumber']\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">{{ 'document-number-help' | translate }}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.documentNumber.dirty || checkoutForm.controls.documentNumber.touched) && checkoutForm.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </div>\n\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a' && !(compactAddressView && !getMode())\"><!--Fila 6-->\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n\n <label class=\"field-label\" for=\"shipping-notes\" *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\" [attr.for]=\"'shipping-notes'\"\n [innerHTML]=\"labelnotes.value\"><span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea id=\"shipping-notes\" (change)=\"onInputChange()\" class=\"form-control notes-textarea\" name=\"notes\"\n [formControl]=\"checkoutForm.controls['notes']\" rows=\"3\" placeholder=\"\"\n autocomplete=\"off\"></textarea>\n </div>\n </div>\n <div class=\"row mt-df address-meta-row\" *ngIf=\"!(compactAddressView && !getMode())\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df address-required-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"col-12\">\n <span class=\"required-hint-text\">\n <span class=\"required-hint-asterisk\">*</span> {{ 'required-fields' | translate }}\n </span>\n </div>\n </div>\n <div class=\"row mt-df address-terms-row\" *ngIf=\"!(compactAddressView && !getMode())\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.enabled\">\n <label class=\"terms-label\" for=\"\">\n <input class=\"me-2\" name=\"terms\" [formControl]=\"checkoutForm.controls['terms']\"\n type=\"checkbox\" required (change)=\"onInputChange()\" />\n <span>{{ 'accept-terms-prefix' | translate }}</span>\n <button type=\"button\" class=\"terms-link\" (click)=\"openModal(template)\">\n {{ 'terms-and-conditions' | translate }}\n </button>\n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.terms.required\"\n class=\"required\">*</span>\n </label>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutForm.controls.terms.dirty || checkoutForm.controls.terms.touched) && !checkoutForm.controls.terms.value\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"viewDataFacturacion ; else datosFormFacturacion\"> </div>\n <div class=\"checkout-btn-unique text-end\" *ngIf=\"!formReadonly\">\n <button type=\"submit\" [disabled]=\"!validado\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}</button>\n\n\n </div>\n <div *ngIf=\"loading && !compactAddressView\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </form>\n <ng-container *ngIf=\"compactAddressView && !getMode()\">\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" for=\"selection-notes\" *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\" [attr.for]=\"'selection-notes'\"\n [innerHTML]=\"labelnotes.value\"></label>\n <textarea id=\"selection-notes\" (change)=\"onSelectionNotesChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" rows=\"3\"\n placeholder=\"\" autocomplete=\"off\" [disabled]=\"selectedAddress?.isTemporary\"></textarea>\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n\n <ng-template #addressSelection>\n\n <ng-container *ngIf=\"this.addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION'\">\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"this.addressBook; else addressBookNotResult\">\n\n <ng-container *ngIf=\"this.addressBook?.length ;else addressBookLoading\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <ng-container *ngIf=\"compactAddressView; else addressCardFull\">\n <div class=\"address-card-compact\" [class.is-selected]=\"item.selected\"\n (click)=\"setSelectAddress(item); onInputChange()\">\n <label class=\"address-card-radio\">\n <input class=\"form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n </label>\n <div class=\"address-card-content\">\n <div class=\"address-card-main\">\n <div class=\"address-card-title\">{{ item.street }}</div>\n <div class=\"address-card-sub\">\n {{ item.city }} - {{ getProvince(item.provinceCode) }} - {{ getCountry(item.countryCode) }}\n </div>\n <div class=\"address-card-sub\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n {{ 'postal-code' | translate }} {{ item.postcode }}\n </div>\n </div>\n <details class=\"address-card-details\" (click)=\"$event.stopPropagation()\">\n <summary>{{ 'details' | translate }}</summary>\n <div class=\"address-card-details-body\">\n <div class=\"address-card-detail-title\">{{ 'address-contact' | translate }}</div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'first-name' | translate }}</strong> {{ item.addressContact.firstName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'last-name' | translate }}</strong> {{ item.addressContact.lastName }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-type' | translate }}</strong> {{ getDocumentType(item.addressContact.documentType) }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'document-number' | translate }}</strong> {{ item.addressContact.documentNumber }}\n </div>\n <div class=\"address-card-detail-line\">\n <strong>{{ 'email-address' | translate }}</strong> {{ item.addressContact.email }}\n </div>\n </div>\n </details>\n </div>\n </div>\n </ng-container>\n <ng-template #addressCardFull>\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\"\n [id]=\"i\" [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\"\n (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n </div>\n <!-- Se hardcodea el canal de mundo del juguete empresa A ya que se necesita con urgencia, se sustituira por un campo que llegara de backend. -->\n <div class=\"w-100\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n <label class=\"field-label\" for=\"selection-notes\" *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\" [attr.for]=\"'selection-notes'\"\n [innerHTML]=\"labelnotes.value\"></label>\n <input id=\"selection-notes\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"invalid-feedback d-block\" *ngIf=\"\n addressingService.getTypeForm().viewForms.notes.required\n && (!addressBookSelected.notes || !addressBookSelected.notes.trim())\n \">\n {{ 'required-field' | translate }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n <div class=\"row mt-df\"><!--Direcci\u00F3n de facturaci\u00F3n-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFactSelection\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFactSelection\"></label>\n </div>\n </div>\n <ng-container *ngIf=\"!viewDataFacturacion\">\n <!-- Selector de modo para direcci\u00F3n de facturaci\u00F3n -->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption1\" autocomplete=\"off\"\n [checked]=\"!getModeFacturacion()\" (change)=\"setModeFacturacion('seleccion')\">\n {{'select-address' | translate | titlecase}}\n </label>\n <label [class]=\"'btn btn-outline-secondary ' + (getModeFacturacion() ? 'active' : '')\">\n <input type=\"radio\" name=\"billingOptions\" id=\"billingOption2\" autocomplete=\"off\"\n [checked]=\"getModeFacturacion()\" (change)=\"setModeFacturacion('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n </div>\n </div>\n </div>\n </div>\n <!-- Formulario de nueva direcci\u00F3n de facturaci\u00F3n -->\n <ng-container *ngIf=\"getModeFacturacion()\">\n <ng-container *ngTemplateOutlet=\"datosFormFacturacion\"></ng-container>\n </ng-container>\n <!-- Selecci\u00F3n de direcci\u00F3n de facturaci\u00F3n del address book -->\n <ng-container *ngIf=\"!getModeFacturacion()\">\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-sm-6 col-12 my-3\" *ngFor=\"let item of addressBook; let i = index\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'billing-'+i\"\n [id]=\"'billing-'+i\" [checked]=\"item.selectedFacturacion\"\n (click)=\"setSelectAddressFacturacion(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\"\n *ngIf=\"shouldShowPostalCodeByCountryCode(item.countryCode)\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <div class=\"checkout-btn-unique text-end\">\n <button *ngIf=\"!viewDataFacturacion && !getModeFacturacion()\"\n (click)=\"onSelectAddressFacturacion(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"!addressBookSelectedFacturacion.id\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"!viewDataFacturacion && getModeFacturacion()\"\n (click)=\"onSubmitNewBillingAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\"\n [disabled]=\"checkoutFormFacturacion.invalid\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n <button *ngIf=\"viewDataFacturacion\"\n (click)=\"onSelectAddress(this.cartService.items)\" class=\"btn valid-btn mt-2\">\n {{ getPrimaryActionLabel() | translate }}\n </button>\n </div>\n <div *ngIf=\"loading\" class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </ng-container>\n </ng-container>\n\n </ng-template>\n\n\n <ng-template #requireLoginView>\n <div id=\"loginCheckout\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\" *ngIf=\"require_login\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #datosFormFacturacion>\n <div class=\"container-fluid px-0 px-md-2\">\n <div class=\"row\">\n <div class=\"col-12\">\n <div class=\"card \">\n <div class=\"card-header text-dark text-center\">\n <h3>{{'billing-data'|translate}}</h3>\n </div>\n <div class=\"card-body\">\n <form (submit)=\"handleBillingFormSubmit($event)\">\n <div class=\"row mt-df\">\n <!--Fila 1-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.enabled\">\n <label class=\"field-label\" for=\"billing-firstName\">{{'first-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.firstName.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-firstName\" class=\"form-control\" type=\"text\" name=\"firstName\"\n [formControl]=\"checkoutFormFacturacion.controls['firstName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.required\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.firstName.dirty || checkoutFormFacturacion.controls.firstName.touched) && checkoutFormFacturacion.controls.firstName.errors?.pattern\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.enabled\">\n <label class=\"field-label\" for=\"billing-lastName\">{{'last-name'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.lastName.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-lastName\" class=\"form-control\" type=\"text\" name=\"lastName\"\n [formControl]=\"checkoutFormFacturacion.controls['lastName']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.required\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.lastName.dirty || checkoutFormFacturacion.controls.lastName.touched) && checkoutFormFacturacion.controls.lastName.errors?.pattern\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 2-->\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.enabled\">\n <label class=\"field-label\" for=\"billing-phoneNumber\">{{'phone'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.phoneNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-phoneNumber\" (change)=\"onInputChange()\" class=\"form-control\" type=\"tel\"\n name=\"phoneNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['phoneNumber']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.phoneNumber.dirty || checkoutFormFacturacion.controls.phoneNumber.touched) && checkoutFormFacturacion.controls.phoneNumber.errors?.pattern\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-6\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.enabled\">\n <label class=\"field-label\" for=\"billing-email\">{{'email-address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.email.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-email\" (change)=\"onInputChange()\" class=\"form-control\" type=\"email\" name=\"email\"\n [formControl]=\"checkoutFormFacturacion.controls['email']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.required\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.email.dirty || checkoutFormFacturacion.controls.email.touched) && checkoutFormFacturacion.controls.email.errors?.email\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 3-->\n\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(countriesFacturacion$ | async) as countries\">\n <label class=\"field-label\" for=\"billing-countryCode\">{{'country'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.countryCode.required\"\n class=\"required\">*</span></label>\n <select id=\"billing-countryCode\" class=\"form-select\" name=\"countryCode\"\n [formControl]=\"checkoutFormFacturacion.controls['countryCode']\"\n (change)=\"onCountrySelectedFacturacion($event.target.value)\">\n <!-- <option selected [value]=\"null\">{{ 'choose-country' | translate }}</option> -->\n <option *ngFor=\"let country of countries\" [value]=\"country.code\">\n {{ country.name }}</option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.countryCode.dirty || checkoutFormFacturacion.controls.countryCode.touched) && checkoutFormFacturacion.controls.countryCode.errors?.required\"\n class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.enabled\">\n\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(provincesFacturacion$ | async) as provinces\">\n <label class=\"field-label\" for=\"billing-provinceCode\">{{'state'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.provinceCode.required\"\n class=\"required\">*</span></label>\n <select id=\"billing-provinceCode\" class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelectedFacturacion($event.target.value)\"\n [formControl]=\"checkoutFormFacturacion.controls['provinceCode']\">\n <!-- <option selected [value]=\"null\">{{ 'choose-province' | translate }}</option> -->\n <option *ngFor=\"let province of provinces\" [value]=\"province.code\">\n {{ province.name }}\n </option>\n </select>\n <div *ngIf=\"(checkoutFormFacturacion.controls.provinceCode.dirty || checkoutFormFacturacion.controls.provinceCode.touched) && checkoutFormFacturacion.controls.provinceCode.errors?.required\"\n class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n </div>\n </ng-container>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.enabled\">\n <label class=\"field-label\" for=\"billing-city\">{{'town-city'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.city.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-city\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n [formControl]=\"checkoutFormFacturacion.controls['city']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.city.dirty || checkoutFormFacturacion.controls.city.touched) && checkoutFormFacturacion.controls.city.errors?.required\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 4-->\n <div class=\"form-group col-12 col-md-8\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.enabled\">\n <label class=\"field-label\" for=\"billing-street\">{{'address'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.street.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-street\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n [formControl]=\"checkoutFormFacturacion.controls['street']\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.required\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.street.dirty || checkoutFormFacturacion.controls.street.touched) && checkoutFormFacturacion.controls.street.errors?.maxlength\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"isPostalCodeFieldVisible(true)\">\n <label class=\"field-label\" for=\"billing-postcode\">{{'postal-code'|translate}}<span\n *ngIf=\"isPostalCodeFieldRequired(true)\"\n class=\"required\">*</span></label>\n <input id=\"billing-postcode\" (change)=\"onInputChange()\" class=\"form-control\" type=\"text\"\n name=\"postcode\" [formControl]=\"checkoutFormFacturacion.controls['postcode']\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.required\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.postcode.dirty || checkoutFormFacturacion.controls.postcode.touched) && checkoutFormFacturacion.controls.postcode.errors?.pattern\">\n <span class=\"text-danger\">{{postalCodeErrorMessageFacturacion |translate}}</span>\n </div>\n </div>\n </div>\n <div class=\"row mt-df\">\n <!--Fila 5-->\n <ng-container *ngIf=\"compactAddressView; else documentRowFullFacturacion\">\n <ng-container *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled; else documentNumberOnlyFacturacion\">\n <div class=\"form-group col-12\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\">{{'document-type-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <div class=\"input-group document-input-group\">\n <button class=\"btn btn-outline-secondary dropdown-toggle\" type=\"button\"\n (click)=\"toggleDocumentTypeDropdownFacturacion($event)\"\n [attr.aria-expanded]=\"documentTypeFactDropdownOpen\"\n [disabled]=\"checkoutFormFacturacion.controls['documentType']?.disabled || formReadonly\">\n {{ getSelectedDocumentTypeLabelFacturacion(documentTypes) || ('document-type' | translate) }}\n </button>\n <div class=\"dropdown-menu\" [class.show]=\"documentTypeFactDropdownOpen\">\n <button class=\"dropdown-item\" type=\"button\"\n *ngFor=\"let item of documentTypes\"\n (click)=\"selectDocumentTypeFacturacion(item.code)\">\n {{ item.name }}\n </button>\n </div>\n <label class=\"visually-hidden\" for=\"billing-documentNumber\">{{'document-number'|translate}}</label>\n <input id=\"billing-documentNumber\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n <ng-template #documentNumberOnlyFacturacion>\n <div class=\"form-group col-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\" for=\"billing-documentNumberOnly\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-documentNumberOnly\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-template>\n </ng-container>\n <ng-template #documentRowFullFacturacion>\n <ng-container\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.enabled\">\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"(documentTypesFacturacion$ | async) as documentTypes\">\n <label class=\"field-label\" for=\"billing-documentType\">{{'document-type'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentType.required\"\n class=\"required\">*</span></label>\n <select id=\"billing-documentType\" name=\"documentType\" class=\"form-select\"\n [formControl]=\"checkoutFormFacturacion.controls['documentType']\"\n (change)=\"onDocumentTypesSelectedFacturacion($event.target.value)\">\n <option *ngFor=\"let item of documentTypes\" [value]=\"item.code\">\n {{item.name}}</option>\n </select>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentType.dirty || checkoutFormFacturacion.controls.documentType.touched) && checkoutFormFacturacion.controls.documentType.errors?.required\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n </div>\n <div class=\"form-group col-12 col-md-4\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.enabled\">\n <label class=\"field-label\" for=\"billing-documentNumberFull\">{{'document-number'|translate}}<span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.documentNumber.required\"\n class=\"required\">*</span></label>\n <input id=\"billing-documentNumberFull\" (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\"\n name=\"documentNumber\"\n [formControl]=\"checkoutFormFacturacion.controls['documentNumber']\"\n placeholder=\"\" autocomplete=\"off\">\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.required\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n <div class=\"text-danger-container\"\n *ngIf=\"(checkoutFormFacturacion.controls.documentNumber.dirty || checkoutFormFacturacion.controls.documentNumber.touched) && checkoutFormFacturacion.controls.documentNumber.errors?.pattern\">\n <span class=\"text-danger\">{{ documentErrorMessage | translate }}</span>\n </div>\n </div>\n </ng-container>\n </ng-template>\n </div>\n <div class=\"row mt-df\" *ngIf=\"this.consts.getChannel() != 'mdj-empresa-a'\">\n <div class=\"form-group col-12 col-md-12\"\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.enabled\">\n <label class=\"field-label\" for=\"billing-notes\"\n *ngIf=\"!getLabelNotesParam()\">{{'notes'|translate}} <span\n *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span></label>\n <label class=\"field-label\" *ngIf=\"getLabelNotesParam() as labelNotesHtml\" [attr.for]=\"'billing-notes'\">\n <div [innerHTML]=\"labelNotesHtml.value\"></div> \n <span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\"\n class=\"required\">*</span>\n </label>\n\n <!-- <label class=\"field-label\">{{'notes'|translate}}<span *ngIf=\"this.addressingService.getTypeForm().viewForms.notes.required\" class=\"required\">*</span></label> -->\n <textarea id=\"billing-notes\" (change)=\"onInputChange()\" class=\"form-control notes-textarea\"\n name=\"notes\" [formControl]=\"checkoutFormFacturacion.controls['notes']\"\n rows=\"3\" placeholder=\"\" autocomplete=\"off\"></textarea>\n </div>\n </div>\n </form>\n </div>\n\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n\n\n\n <ng-template #template>\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <button type=\"button\" class=\"btn-close float-end\" aria-label=\"Close\" (click)=\"modalRef.hide()\">\n </button>\n </div>\n </div>\n\n <div class=\"modal-body scrol-if\">\n <app-section-container-ec [name]=\"'terminos-y-condiciones'\"> </app-section-container-ec>\n </div>\n\n </ng-template>\n\n\n <ng-template #addressBookNotResult>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n </ng-template>\n\n <ng-template #addressBookLoading>\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n</ng-container>\n\n<ng-template #pleaseLogin>\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n</ng-template>\n",
1268
1268
  providers: [BsModalService],
1269
- styles: ["@charset \"UTF-8\";.btn.valid-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);margin-right:-3px;margin-bottom:10px}.btn.valid-btn:disabled,.btn.valid-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.address-required-row .required-hint-text{color:#6b6b6b;font-size:.85rem;font-weight:500;letter-spacing:.01em}.address-required-row .required-hint-asterisk{color:#6b6b6b;font-weight:700}.field-label{color:#000}:host-context(#appCheckoutEc) .field-label{font-weight:700}:host-context(#appCheckoutEc) .address-meta-row b,:host-context(#appCheckoutEc) .address-terms-row label{font-weight:400}.terms-label{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem}.terms-link{background:0 0;border:0;padding:0;color:inherit;text-decoration:underline;cursor:pointer}.form-control.ng-dirty.ng-invalid,.form-control.ng-touched.ng-invalid{border-color:#dc3545;box-shadow:0 0 0 .15rem rgba(220,53,69,.18)}.form-control.ng-dirty.ng-valid,.form-control.ng-touched.ng-valid{border-color:#16a34a;box-shadow:0 0 0 .15rem rgba(22,163,74,.15)}.char-count{margin-left:.35rem;font-size:.78rem;font-weight:400;color:#888;white-space:nowrap}.notes-textarea{min-height:120px;max-height:240px;resize:vertical;max-width:100%}.compact-address-form .valid-btn{font-size:1rem;padding:.7rem 1.1rem;letter-spacing:.02em}.document-input-group{position:relative;align-items:stretch}.document-input-group .dropdown-menu{max-height:240px;overflow-y:auto}.document-input-group .dropdown-toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;min-height:100%;border-color:#ced4da;color:#495057}.document-input-group .form-control{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}:host-context(#appCheckoutEc) .checkout-btn-unique{display:flex;justify-content:flex-end}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{display:block;margin-left:auto;width:56%;max-width:360px;min-width:220px}@media screen and (max-width:992px){:host-context(#appCheckoutEc) .checkout-btn-unique{justify-content:stretch}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{width:100%;min-width:0}.address-required-row .required-hint-text{font-size:.82rem}}:host-context(#appCheckoutEc) .valid-btn{text-transform:uppercase}label{color:#000}#appCheckoutEc .checkout-single .btn-group-toggle{border:1px solid #e3e3e3;border-radius:6px;overflow:hidden}#appCheckoutEc .checkout-single .btn-group-toggle .btn{border-radius:0!important;font-weight:600;padding:.55rem 1rem;border-left:1px solid #e3e3e3}#appCheckoutEc .checkout-single .btn-group-toggle .btn:first-child{border-left:0}.input-size-lg{width:1.8rem;height:1.8rem}.address-card-compact{display:flex;gap:.75rem;border:1px solid #e3e3e3;border-radius:6px;padding:.75rem;background:#fff;align-items:flex-start;cursor:pointer;transition:border-color .2s,box-shadow .2s}.address-card-compact.is-selected{border-color:#000;box-shadow:0 0 0 1px #000 inset}.address-card-compact:hover{border-color:#444}.address-card-radio{margin-top:.25rem}.address-card-content{flex:1;display:flex;flex-direction:column;gap:.35rem}.address-card-title{font-weight:600;font-size:1rem}.address-card-sub{color:#666;font-size:.9rem}.address-card-details{margin-top:.5rem}.address-card-details summary{cursor:pointer;color:#000;font-weight:600;font-size:.9rem;list-style:none;display:inline-flex;align-items:center;gap:.35rem}.address-card-details summary::-webkit-details-marker{display:none}.address-card-details summary::before{content:\"\u25B8\";font-size:.85rem}.address-card-details[open] summary::before{content:\"\u25BE\"}.address-card-details-body{margin-top:.5rem;padding:.5rem;background:#f8f8f8;border-radius:6px}.address-card-detail-title{font-weight:600;margin-bottom:.25rem}.address-card-detail-line{font-size:.9rem;color:#555}.single-step-surface{position:relative}.single-step-overlay{position:absolute;inset:0;background:rgba(255,255,255,.6);display:flex;align-items:center;justify-content:center;z-index:5}.compact-address-form .address-meta-row,.compact-address-form .address-required-row,.compact-address-form .address-terms-row{margin-top:.4rem}.compact-address-form .address-meta-row label,.compact-address-form .address-terms-row label{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:0;font-weight:600}.compact-address-form .address-terms-row a{margin-left:0!important;display:inline-block;font-size:.85rem}.compact-address-form .address-terms-row .text-danger-container{margin-top:.35rem}"]
1269
+ styles: ["@charset \"UTF-8\";.btn.valid-btn{background-color:var(--ec-primary,#000);border-color:var(--ec-primary,#000);color:var(--ec-primary-contrast,#fff);margin-right:-3px;margin-bottom:10px}.btn.valid-btn:disabled,.btn.valid-btn[disabled]{background-color:var(--ec-primary-muted,#6c757d);border-color:var(--ec-primary-muted,#6c757d);color:var(--ec-primary-contrast,#fff);opacity:.8}.mt-df{margin:10px auto 0}.btn.btn-outline-secondary.active,.btn.btn-outline-secondary:hover{color:#fff!important}.required{color:red}.address-required-row .required-hint-text{color:#6b6b6b;font-size:.85rem;font-weight:500;letter-spacing:.01em}.address-required-row .required-hint-asterisk{color:#6b6b6b;font-weight:700}.field-label{color:#000}:host-context(#appCheckoutEc) .field-label{font-weight:700}:host-context(#appCheckoutEc) .address-meta-row b,:host-context(#appCheckoutEc) .address-terms-row label{font-weight:400}.terms-label{display:inline-flex;flex-wrap:wrap;align-items:center;gap:.35rem}.terms-link{background:0 0;border:0;padding:0;color:inherit;text-decoration:underline;cursor:pointer}.form-control.ng-dirty.ng-invalid,.form-control.ng-touched.ng-invalid{border-color:#dc3545;box-shadow:0 0 0 .15rem rgba(220,53,69,.18)}.form-control.ng-dirty.ng-valid,.form-control.ng-touched.ng-valid{border-color:#16a34a;box-shadow:0 0 0 .15rem rgba(22,163,74,.15)}.char-count{margin-left:.35rem;font-size:.78rem;font-weight:400;color:#666;white-space:nowrap}.notes-textarea{min-height:120px;max-height:240px;resize:vertical;max-width:100%}.compact-address-form .valid-btn{font-size:1rem;padding:.7rem 1.1rem;letter-spacing:.02em}.document-input-group{position:relative;align-items:stretch}.document-input-group .dropdown-menu{max-height:240px;overflow-y:auto}.document-input-group .dropdown-toggle{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;min-height:100%;border-color:#ced4da;color:#495057}.document-input-group .form-control{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}:host-context(#appCheckoutEc) .checkout-btn-unique{display:flex;justify-content:flex-end}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{display:block;margin-left:auto;width:56%;max-width:360px;min-width:220px}@media screen and (max-width:992px){:host-context(#appCheckoutEc) .checkout-btn-unique{justify-content:stretch}:host-context(#appCheckoutEc) .checkout-btn-unique .valid-btn{width:100%;min-width:0}.address-required-row .required-hint-text{font-size:.82rem}}:host-context(#appCheckoutEc) .valid-btn{text-transform:uppercase}label{color:#000}#appCheckoutEc .checkout-single .btn-group-toggle{border:1px solid #e3e3e3;border-radius:6px;overflow:hidden}#appCheckoutEc .checkout-single .btn-group-toggle .btn{border-radius:0!important;font-weight:600;padding:.55rem 1rem;border-left:1px solid #e3e3e3}#appCheckoutEc .checkout-single .btn-group-toggle .btn:first-child{border-left:0}.input-size-lg{width:1.8rem;height:1.8rem}.address-card-compact{display:flex;gap:.75rem;border:1px solid #e3e3e3;border-radius:6px;padding:.75rem;background:#fff;align-items:flex-start;cursor:pointer;transition:border-color .2s,box-shadow .2s}.address-card-compact.is-selected{border-color:#000;box-shadow:0 0 0 1px #000 inset}.address-card-compact:hover{border-color:#444}.address-card-radio{margin-top:.25rem}.address-card-content{flex:1;display:flex;flex-direction:column;gap:.35rem}.address-card-title{font-weight:600;font-size:1rem}.address-card-sub{color:#666;font-size:.9rem}.address-card-details{margin-top:.5rem}.address-card-details summary{cursor:pointer;color:#000;font-weight:600;font-size:.9rem;list-style:none;display:inline-flex;align-items:center;gap:.35rem}.address-card-details summary::-webkit-details-marker{display:none}.address-card-details summary::before{content:\"\u25B8\";font-size:.85rem}.address-card-details[open] summary::before{content:\"\u25BE\"}.address-card-details-body{margin-top:.5rem;padding:.5rem;background:#f8f8f8;border-radius:6px}.address-card-detail-title{font-weight:600;margin-bottom:.25rem}.address-card-detail-line{font-size:.9rem;color:#555}.single-step-surface{position:relative}.single-step-overlay{position:absolute;inset:0;background:rgba(255,255,255,.6);display:flex;align-items:center;justify-content:center;z-index:5}.compact-address-form .address-meta-row,.compact-address-form .address-required-row,.compact-address-form .address-terms-row{margin-top:.4rem}.compact-address-form .address-meta-row label,.compact-address-form .address-terms-row label{display:inline-flex;align-items:center;gap:.4rem;margin-bottom:0;font-weight:600}.compact-address-form .address-terms-row a{margin-left:0!important;display:inline-block;font-size:.85rem}.compact-address-form .address-terms-row .text-danger-container{margin-top:.35rem}"]
1270
1270
  })
1271
1271
  ], DataFormEcComponent);
1272
1272
  export { DataFormEcComponent };
1273
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxt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RTt3REFBMkM7QUFnZHBEO0lBREMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO2lFQUk5QjtBQXpkUSxtQkFBbUI7SUFOL0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQiw4L2pGQUF5QztRQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0tBQzlCLENBQUM7R0FDVyxtQkFBbUIsQ0E0dkMvQjtTQTV2Q1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9jaGVja291dC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuXG50eXBlIFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHtcbiAgICBzdWJ0b3RhbDogbnVtYmVyO1xuICAgIHRheGVzOiBudW1iZXI7XG4gICAgc2hpcHBpbmc6IG51bWJlcjtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGNsaWVudFRheGVzOiBudW1iZXI7XG4gICAgcHJvbW90aW9uOiBudW1iZXI7XG4gICAgaXRlbXM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcbiAgICBASW5wdXQoKSBjb21wYWN0QWRkcmVzc1ZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBAT3V0cHV0KCkgZGlydHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLnByb3ZpbmNlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZm9ybV9yZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NCb29rID0gW107XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWQgPSB7IGlkOiAwLCBub3RlczogXCJcIiB9XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RBZGRyZXNzRmFjdHVyYWNpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc1NlYXJjaCA9ICcnO1xuICAgIHB1YmxpYyBhZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1SZWFkb25seSA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZEFkZHJlc3M6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSB0ZW1wQWRkcmVzc0lkID0gMDtcblxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIHBvc3RhbENvZGVWaXNpYmxlID0gdHJ1ZTtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZCA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uID0gdHJ1ZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGRvY3VtZW50RXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogYW55IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhZGRyZXNzU3luY2VkRm9yQ29tcGxldGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgbGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdDogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0ge1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHVibGljIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogQ2hhbm5lbENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24obnVsbCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucGFyYW1zU2VydmljZS5wYXJhbWV0ZXJzLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wYXJhbXMgPSByZXMpO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5zdGVwX2lkKTtcbiAgICAgICAgLy8gSW4gc2luZ2xlL2NvbXBhY3Qgc2VsZWN0aW9uIG1vZGUgd2Ugc2hvdWxkIG5vdCBzaG93IHRoZSBzdWJtaXQgYnV0dG9uLlxuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmNhcnQuc3Vic2NyaWJlKGNhcnQgPT4gdGhpcy5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSA9IGNhcnQ/LmN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLmF1dGhTZXJ2aWNlLmdldEN1c3RvbWVyKCk/LmVtYWlsIHx8IGxvY2FsRW1haWwpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzID0gdGhpcy5maWx0ZXJDb3VudHJ5QnlDb2RlKHJlcylcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpIHtcblxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gcmVzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzc0Jvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTaSBubyBoYXkgbmluZ3VuYSBkaXJlY2Npw7NuIHNlbGVjY2lvbmFkYSwgc2VsZWNjaW9uYXIgbGEgcHJpbWVyYSBwb3IgZGVmZWN0b1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQWRkcmVzcyAmJiB0aGlzLmFkZHJlc3NCb29rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9va1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHNlbGVjdGVkQWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSAmJiAhdGhpcy5sYXN0U2F2ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSB8fCB0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuYXNvY2lhdGVkRGF0YSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90ID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbUFzc29jaWF0ZWREYXRhKGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGZpbHRyYSBsb3MgcGFpc2VzIGRlIGFjdWVyZG8gYWwgYSBsb3MgY29kaWdvcyByZXRvcm5hZG9zIGVuIGxhIGZ1bmNpb24gZ2V0Q291bnRyaWVzLlxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogU2kgZ2V0Q291bnRyaWVzIGNvbnRpZW5lIHZhbG9yZXMgcXVlIG5vIGNvaW5jaWRlbiwgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogRGUgbG8gY29udHJhcmlvIHJldG9ybmEgbG9zIHZhbG9yZXMgZmlsdHJhZG9zLlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxuICAgICAqIEByZXR1cm5zIHVuIGFycmVnbG8gZGUgY291bnRyaWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIC8vIDEuIFNpIGhheSBwYcOtc2VzIEVYQ0xVSURPUywgcXXDrXRhbG9zIHNpZW1wcmVcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gY291bnRyaWVzO1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMgJiYgdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiAhdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMuaW5jbHVkZXMoZWxlbS5jb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gU2kgaGF5IHBhw61zZXMgSU5DTFVJRE9TLCBhcGxpY2EgZWwgZmlsdHJvIGRlIGluY2x1c2nDs25cbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXNGaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKClcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYWRvID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9O1xuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcbiAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbCA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnZhbHVlO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY3VycmVudCk/Lm5hbWUgfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbEZhY3R1cmFjaW9uID0gKGRvY3VtZW50VHlwZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy52aWV3Rm9ybXM/LnBvc3Rjb2RlPy5lbmFibGVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldEJhc2VQb3N0YWxDb2RlUmVxdWlyZWQgPSAoKSA9PlxuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LnZpZXdGb3Jtcz8ucG9zdGNvZGU/LnJlcXVpcmVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2aXNpYmxlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHZpc2libGUgJiYgdGhpcy5nZXRCYXNlUG9zdGFsQ29kZVJlcXVpcmVkKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVDb3VudHJ5QnlDb2RlID0gKGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudHJ5RnJvbVN1YmplY3RzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZSB8fCBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUgfHwgW10pXG4gICAgICAgIF0uZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSBjb2RlKTtcblxuICAgICAgICByZXR1cm4gY291bnRyeUZyb21TdWJqZWN0c1xuICAgICAgICAgICAgfHwgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gY29kZSlcbiAgICAgICAgICAgIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUgPSAoc2VsZWN0ZWRDb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZENvdW50cnkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkuY2hlY2tvdXRSZXF1aXJlZEZpZWxkcyB8fCBzZWxlY3RlZENvdW50cnkuaXNQb3N0YWxDb2RlTnVtZXJpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb3VudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvdW50cnlCeUNvZGUoc2VsZWN0ZWRDb3VudHJ5LmNvZGUgfHwgc2VsZWN0ZWRDb3VudHJ5LmNvdW50cnlDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZSA9IChjb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRQb3N0YWxDb2RlID0gY291bnRyeT8uY2hlY2tvdXRSZXF1aXJlZEZpZWxkcz8ucG9zdGFsQ29kZTtcblxuICAgICAgICBpZiAoY2hlY2tvdXRQb3N0YWxDb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrb3V0UG9zdGFsQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogdHJ1ZSwgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlzUG9zdGFsQ29kZUZpZWxkVmlzaWJsZSA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVWaXNpYmxlRmFjdHVyYWNpb24gOiB0aGlzLnBvc3RhbENvZGVWaXNpYmxlO1xuXG4gICAgaXNQb3N0YWxDb2RlRmllbGRSZXF1aXJlZCA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uIDogdGhpcy5wb3N0YWxDb2RlUmVxdWlyZWQ7XG5cbiAgICBzaG91bGRTaG93UG9zdGFsQ29kZUJ5Q291bnRyeUNvZGUgPSAoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUJ5Q29kZShjb2RlKTtcblxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpLnZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUG9zdGFsQ29kZUZpZWxkU3RhdGUoY291bnRyeSkudmlzaWJsZTtcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVFcnJvck1lc3NhZ2UgPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHZpc2libGU7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVJlcXVpcmVkRmFjdHVyYWNpb24gPSByZXF1aXJlZDtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24gPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxuICAgICAgICAgICAgJ2RvY3VtZW50RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMsIHNob3dOb3Rlc0Vycm9yOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgaWYgKHNob3dOb3Rlc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdyZXF1aXJlZC1maWVsZHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBheWxvYWQgPSB0aGlzLmNvbXBhY3RBZGRyZXNzVmlld1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkLFxuICAgICAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vZGUgPSAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gbW9kZSA9PSBcImNhcmdhXCI7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0TW9kZUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgPyB0aGlzLnNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA6IHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGVGYWN0dXJhY2lvbiA9IChtb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzRmFjdHVyYWNpb24gPSBtb2RlID09PSAnY2FyZ2EnO1xuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHNldFNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkRmFjdHVyYWNpb24gPSBTdHJpbmcoYWRkcmVzcy5pZCkgPT09IFN0cmluZyhhZGRyZXNzU2VsZWN0Py5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZEZhY3R1cmFjaW9uKT8uaWQgfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQWRkcmVzc0Zyb21Cb29rID0gKGJvb2tBZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGJvb2tBZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgJycsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYm9va0FkZHJlc3MuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGJvb2tBZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgIGNpdHk6IGJvb2tBZGRyZXNzLmNpdHksXG4gICAgICAgICAgICBzdHJlZXQ6IGJvb2tBZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBib29rQWRkcmVzcy5wb3N0Y29kZT8udG9TdHJpbmcoKSB8fCAnJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUJpbGxpbmdGb3JtU3VibWl0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmVyaWZ5VmFsaWRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdGhpcy5uZXh0U3RlcCgpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ3JlcXVpcmVkLWZpZWxkcycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzSWQ6IGFkZHJlc3NTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCBcIlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXJCeUlkcyhyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGU/LnNoaXBwaW5nQWRkcmVzcz8uY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZT8uc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxzQ2hhbmdlZCA9IHRoaXMuaGF2ZVRvdGFsc0NoYW5nZWQocHJldmlvdXNUb3RhbHMsIHJlc3VsdFNlZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmIHRoaXMubmV4dFN0ZXApIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7IHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTsgcmV0dXJuOyB9XG4gICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWRGYWN0dXJhY2lvbik7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZEVudmlvID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XG4gICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkRmFjdHVyYWNpb24gfHwgIWFkZHJlc3NTZWxlY3RlZEVudmlvKSB7IHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZEVudmlvLmlkIHx8IDA7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9IGFkZHJlc3NTZWxlY3RlZEZhY3R1cmFjaW9uLmlkIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRFbnZpby5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8IFwiXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlckJ5SWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHRTZWRlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgYWRkcmVzc1NlbGVjdGVkRW52aW8uY2l0eSArICcgLSAnICsgYWRkcmVzc1NlbGVjdGVkRW52aW8uc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkgeyB0b3RhbHNDaGFuZ2VkICYmIHRoaXMuc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5KCk7IHJldHVybjsgfVxuICAgICAgICAgICAgZWxzZSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IH1cbiAgICAgICAgZmluYWxseSB7IHRoaXMubG9hZGluZyA9IGZhbHNlOyB9XG4gICAgfVxuXG4gICAgb25TdWJtaXROZXdCaWxsaW5nQWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgYWRkcmVzc1NlbGVjdGVkRW52aW8gPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWRFbnZpbykgeyB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5nRm9ybURhdGEgPSB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICAgICAgYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlID0gYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiB0aGlzLmJ1aWxkQWRkcmVzc0Zyb21Cb29rKGFkZHJlc3NTZWxlY3RlZEVudmlvKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzczogYmlsbGluZ0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgXCJcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCBhZGRyZXNzU2VsZWN0ZWRFbnZpby5jaXR5ICsgJyAtICcgKyBhZGRyZXNzU2VsZWN0ZWRFbnZpby5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpOyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICB0b2dnbGVBZGRyZXNzRHJvcGRvd24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW47XG4gICAgfVxuXG4gICAgc2VsZWN0QWRkcmVzc0Zyb21Ecm9wZG93biA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbk5vdGVzQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEFkZHJlc3NMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzIHx8IHRoaXMuYWRkcmVzc0Jvb2s/LmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzKSByZXR1cm4gdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IFtuYW1lLCBhZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIHJldHVybiBtYWluIHx8IHRoaXMuZ2V0RGVmYXVsdFNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzT3B0aW9uTGFiZWwgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBhZGRyZXNzPy5zdHJlZXQsIGFkZHJlc3M/LmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3KSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGggPyAodGhpcy5hZGRyZXNzQm9va1swXT8uc3RyZWV0IHx8ICcnKSA6ICcnO1xuICAgIH1cblxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldERvY3VtZW50VHlwZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZChkdCA9PiBkdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NCb29rID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2sgfHwgIXRoaXMuYWRkcmVzc0Jvb2subGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVybSA9ICh0aGlzLmFkZHJlc3NTZWFyY2ggfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJlZXQsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jaXR5LFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvdW50cnkoYWRkcmVzcy5jb3VudHJ5Q29kZSksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm92aW5jZShhZGRyZXNzLnByb3ZpbmNlQ29kZSksXG4gICAgICAgICAgICAgICAgY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmVtYWlsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RmlsdGVyZWRBZGRyZXNzT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRBZGRyZXNzQm9vaygpLm1hcChhZGRyZXNzID0+ICh7XG4gICAgICAgICAgICAuLi5hZGRyZXNzLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0QWRkcmVzc09wdGlvbkxhYmVsKGFkZHJlc3MpXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBoYXNTZWxlY3RlZEFkZHJlc3MgPSAoKSA9PiAhIXRoaXMuYWRkcmVzc0Jvb2s/LnNvbWUoaXRlbSA9PiBpdGVtPy5zZWxlY3RlZCk7XG5cbiAgICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRBZGRyZXNzID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBwaG9uZU51bWJlcjogY29udGFjdC5waG9uZU51bWJlciB8fCAnJyxcbiAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsIHx8IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnZhbHVlLFxuICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSB8fCAnJyxcbiAgICAgICAgICAgIGRvY3VtZW50TnVtYmVyOiBjb250YWN0LmRvY3VtZW50TnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgc3RyZWV0OiBhZGRyZXNzLnN0cmVldCB8fCAnJyxcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhZGRyZXNzLmNvdW50cnlDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBjaXR5OiBhZGRyZXNzLmNpdHkgfHwgJycsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGFkZHJlc3MucHJvdmluY2VDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBwb3N0Y29kZTogYWRkcmVzcy5wb3N0Y29kZSB8fCAnJyxcbiAgICAgICAgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IGFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZERvYyA9IHNlbGVjdGVkQ291bnRyeT8uZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY29udGFjdC5kb2N1bWVudFR5cGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGVja291dEZvcm1SZWFkb25seSA9IChyZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLmZvcm1SZWFkb25seSA9IHJlYWRvbmx5O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzW2tleV07XG4gICAgICAgICAgICByZWFkb25seSA/IGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRBdXRvU2VsZWN0QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyB8fCB0aGlzLmdldE1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEFkZHJlc3M/LmlzVGVtcG9yYXJ5KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGVtcG9yYXJ5QWRkcmVzc0Zyb21Gb3JtID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0ID0gdGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IHtcbiAgICAgICAgICAgIGlkOiAtMSAqICgrK3RoaXMudGVtcEFkZHJlc3NJZCksXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWV0OiBjb250YWN0LnN0cmVldCxcbiAgICAgICAgICAgIGNpdHk6IGNvbnRhY3QuY2l0eSxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBjb250YWN0LnBvc3Rjb2RlLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGNvbnRhY3QuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGNvbnRhY3QucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgYWRkcmVzc0NvbnRhY3Q6IHtcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsLFxuICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZTogY29udGFjdC5kb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IFtcbiAgICAgICAgICAgIG5ld0FkZHJlc3MsXG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+ICh7IC4uLmFkZHJlc3MsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gbmV3QWRkcmVzcy5pZDtcbiAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhuZXdBZGRyZXNzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVRlbXBvcmFyeUFkZHJlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vaz8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ3VycmVudFN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCB8fCB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaWQgfHwgMCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiAnZm9ybScsXG4gICAgICAgICAgICBmb3JtOiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgYmlsbGluZzogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID8gbnVsbCA6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSxcbiAgICAgICAgICAgIHZpZXdEYXRhRmFjdHVyYWNpb246IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlydHlTdGF0ZSA9IChuZXh0RGlydHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSA9PT0gbmV4dERpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IG5leHREaXJ0eTtcbiAgICAgICAgaWYgKG5leHREaXJ0eSAmJiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuaXNEaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXZhbHVhdGVEaXJ0eVN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc0RpcnR5KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWlsZEN1cnJlbnRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXh0RGlydHkgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXN0U2F2ZWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShuZXh0RGlydHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jYXJ0U2VydmljZT8uY2hhbm5lbENvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJlxuICAgICAgICAgICAgdGhpcy5pc0xhc3RPbmUgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4gdGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSAmJiB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uICYmICF0aGlzLmlzRGlydHk7XG5cbiAgICBnZXRQcmltYXJ5QWN0aW9uTGFiZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0T25lICYmICF0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogJ3JlYWR5LWZvcm0nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCA9ICgpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4gKHtcbiAgICAgICAgc3VidG90YWw6IDAsXG4gICAgICAgIHRheGVzOiAwLFxuICAgICAgICBzaGlwcGluZzogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGNsaWVudFRheGVzOiAwLFxuICAgICAgICBwcm9tb3Rpb246IDAsXG4gICAgICAgIGl0ZW1zOiAwXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGdldFN1bW1hcnlUb3RhbHNGcm9tQXNzb2NpYXRlZERhdGEgPSAoZGF0YTogYW55W10gfCBudWxsKTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldEVtcHR5VG90YWxzU25hcHNob3QoKTtcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihpdGVtPy5hbW91bnQgfHwgMCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0/LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnN1YnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5pdGVtcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50YXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5zaGlwcGluZyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5jbGllbnRUYXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndG90YWwnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50b3RhbCA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzY291bnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnByb21vdGlvbiArPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlciA9IChvcmRlcjogYW55KTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gb3JkZXI/LnRvdGFscyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnRvdGFsOiBOdW1iZXIodG90YWxzLnN1YnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgdGF4ZXM6IE51bWJlcih0b3RhbHMudGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBzaGlwcGluZzogTnVtYmVyKHRvdGFscy5zaGlwcGluZyB8fCAwKSxcbiAgICAgICAgICAgIHRvdGFsOiBOdW1iZXIodG90YWxzLnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXM6IE51bWJlcih0b3RhbHMuY2xpZW50VGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBwcm9tb3Rpb246IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KG9yZGVyKSxcbiAgICAgICAgICAgIGl0ZW1zOiBOdW1iZXIodG90YWxzLml0ZW1zIHx8IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXZlVG90YWxzQ2hhbmdlZCA9IChiZWZvcmU6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCwgb3JkZXI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBhZnRlciA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlcihvcmRlcik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBiZWZvcmUuc3VidG90YWwgIT09IGFmdGVyLnN1YnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUudGF4ZXMgIT09IGFmdGVyLnRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUuc2hpcHBpbmcgIT09IGFmdGVyLnNoaXBwaW5nIHx8XG4gICAgICAgICAgICBiZWZvcmUudG90YWwgIT09IGFmdGVyLnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUuY2xpZW50VGF4ZXMgIT09IGFmdGVyLmNsaWVudFRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUucHJvbW90aW9uICE9PSBhZnRlci5wcm9tb3Rpb24gfHxcbiAgICAgICAgICAgIGJlZm9yZS5pdGVtcyAhPT0gYWZ0ZXIuaXRlbXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvTGVnYWN5U3VtbWFyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2NhcmRDaGFuZ2VzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubGFzdFNhdmVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNhdmVkU3RhdGUubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnNlbGVjdGVkSWQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zZWxlY3RlZCA9IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZCB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLm5vdGVzIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS52aWV3RGF0YUZhY3R1cmFjaW9uID8/IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbjtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5mb3JtIHx8IHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5wYXRjaFZhbHVlKHRoaXMubGFzdFNhdmVkU3RhdGUuYmlsbGluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==
1273
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZWFzeWNvbW1lcmNlLyIsInNvdXJjZXMiOlsibGliL2VjLWNvbXBvbmVudC9jaGVja291dC1lYy9kYXRhZm9ybS1lYy9kYXRhZm9ybS1lYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0MsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRWpELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQWtCeEUsSUFBYSxtQkFBbUIsR0FBaEMsTUFBYSxtQkFBb0IsU0FBUSxlQUFlO0lBdUVwRCxZQUFtQixXQUF3QixFQUNoQyxFQUFlLEVBQ2YsS0FBbUIsRUFDbkIsaUJBQW9DLEVBQ3BDLFdBQXdCLEVBQ3hCLGVBQWdDLEVBQy9CLFVBQStCLEVBQy9CLFlBQTRCLEVBQzdCLGFBQWdDLEVBQ2hDLE1BQWlCLEVBQ2pCLGFBQW1DO1FBQzFDLEtBQUssRUFBRSxDQUFDO1FBWE8sZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDaEMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQWM7UUFDbkIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDL0IsZUFBVSxHQUFWLFVBQVUsQ0FBcUI7UUFDL0IsaUJBQVksR0FBWixZQUFZLENBQWdCO1FBQzdCLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQTlFckMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUUzQix1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDbkMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRTFDLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELGdDQUEyQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzdELGdDQUEyQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzdELG9DQUErQixHQUFHLElBQUksZUFBZSxDQUFRLEVBQUUsQ0FBQyxDQUFDO1FBRXBFLGVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEQsZUFBVSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxtQkFBYyxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxRCwwQkFBcUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEUsMEJBQXFCLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hFLDhCQUF5QixHQUFHLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVoRixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUd0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsd0JBQW1CLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQTtRQUMxQyxtQ0FBOEIsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFBO1FBQ3JELFdBQU0sR0FBWSxLQUFLLENBQUMsQ0FBQywwREFBMEQ7UUFFbkYsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQix3QkFBbUIsR0FBWSxJQUFJLENBQUM7UUFHcEMsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUNqQixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM5Qiw2QkFBd0IsR0FBWSxLQUFLLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFDbkIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBQzVCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLG9CQUFlLEdBQVEsSUFBSSxDQUFDO1FBQzNCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRW5CLDJCQUFzQixHQUFXLEVBQUUsQ0FBQztRQUNwQyxzQ0FBaUMsR0FBVyxFQUFFLENBQUM7UUFDL0Msc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLGlDQUE0QixHQUFHLElBQUksQ0FBQztRQUNwQyx1QkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDMUIsa0NBQTZCLEdBQUcsSUFBSSxDQUFDO1FBQ3JDLHlCQUFvQixHQUFXLEVBQUUsQ0FBQztRQUNsQyxvQ0FBK0IsR0FBVyxFQUFFLENBQUM7UUFDN0MsK0JBQTBCLEdBQVksS0FBSyxDQUFDO1FBQzVDLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxpQ0FBNEIsR0FBRyxLQUFLLENBQUM7UUFDcEMsbUJBQWMsR0FBZSxJQUFJLENBQUM7UUFDbEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUN0QiwrQkFBMEIsR0FBRyxLQUFLLENBQUM7UUFDbkMsOEJBQXlCLEdBQTBCO1lBQ3ZELFFBQVEsRUFBRSxDQUFDO1lBQ1gsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1gsQ0FBQztRQWtIRjs7Ozs7OztXQU9HO1FBQ0ssd0JBQW1CLEdBQUcsQ0FBQyxTQUFnQixFQUFFLEVBQUU7WUFDL0MsK0NBQStDO1lBQy9DLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzRSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDMUY7WUFDRCw0REFBNEQ7WUFDNUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZDLElBQUksaUJBQWlCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO2dCQUMvRixJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQzlCLE9BQU8saUJBQWlCLENBQUE7aUJBQzNCO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsNkVBQTZFLENBQUMsQ0FBQTtvQkFDNUYsT0FBTyxRQUFRLENBQUE7aUJBQ2xCO2FBQ0o7aUJBQU07Z0JBQ0gsT0FBTyxRQUFRLENBQUE7YUFDbEI7UUFDTCxDQUFDLENBQUE7UUFFRCx3QkFBbUIsR0FBRyxHQUFHLEVBQUU7WUFDdkIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFBO1lBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7O29CQUN2QyxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUMxRSxJQUFJLENBQUMscUNBQXFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBRW5ELFlBQVk7d0JBQ1osSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLE9BQzFELEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQzVCLENBQUE7d0JBQ0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksT0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFNBQVMsQ0FBQyxDQUFBO3dCQUV4RCxZQUFZO3dCQUNaLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTt3QkFDN0YsSUFBSSxDQUFDLG1DQUFtQyxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO3dCQUNuRSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUE7cUJBQ25FO2dCQUNMLENBQUMsQ0FBQyxDQUFBO2FBQ0w7WUFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUE7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUE7WUFDekIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUE7UUFDbkMsQ0FBQyxDQUFBO1FBRUQsZ0JBQVcsR0FBRyxHQUFHLEVBQUU7UUFDbkIsQ0FBQyxDQUFBO1FBZ0JELGtCQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsQ0FBQztRQUVGLHNCQUFpQixHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUV4RCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFFekYsSUFBSSxlQUFlLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNwRDtZQUVELFdBQVc7WUFDWCxJQUFJLFNBQVMsR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsU0FBUztnQkFDNUUsQ0FBQztvQkFDRCxFQUFFLENBQUE7WUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3RDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxRTtZQUVELGdCQUFnQjtZQUNoQixJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlDLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5RTtZQUVELElBQUksb0JBQW9CLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkgsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDdkQ7UUFFTCxDQUFDLENBQUE7UUFFRCxpQ0FBNEIsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUYsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbkUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDO1lBRXBHLElBQUksZUFBZSxFQUFFO2dCQUNqQixJQUFJLENBQUMscUNBQXFDLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDL0Q7WUFFRCxZQUFZO1lBQ1osSUFBSSxTQUFTLEdBQUcsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNyRjtZQUVELGlCQUFpQjtZQUNqQixJQUFJLGFBQWEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN6RSxJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDdEIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3pGO1lBRUQsSUFBSSxvQkFBb0IsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlILElBQUksb0JBQW9CLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO2FBQ2xFO1FBQ0wsQ0FBQyxDQUFDO1FBR0Ysd0JBQW1CLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXJILG1DQUE4QixHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNJLDRCQUF1QixHQUFHLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDaEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFOUUsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFFMUYsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDdkQ7UUFDTCxDQUFDLENBQUM7UUFFRix1Q0FBa0MsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQzNDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekYsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsK0JBQStCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLENBQUM7WUFFckcsSUFBSSxvQkFBb0IsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLG1DQUFtQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7YUFDbEU7UUFDTCxDQUFDLENBQUM7UUFFRixpQ0FBNEIsR0FBRyxDQUFDLGFBQW9CLEVBQUUsRUFBRTs7WUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pFLE9BQU8sYUFBQSxhQUFhLDBDQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTywyQ0FBRyxJQUFJLEtBQUksRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQTtRQUVELDRDQUF1QyxHQUFHLENBQUMsYUFBb0IsRUFBRSxFQUFFOztZQUMvRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM1RSxPQUFPLGFBQUEsYUFBYSwwQ0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sMkNBQUcsSUFBSSxLQUFJLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUE7UUFFTyw2QkFBd0IsR0FBRyxHQUFHLEVBQUUscURBQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsMENBQUUsU0FBUywwQ0FBRSxRQUFRLDBDQUFFLE9BQU8sdUNBQUksSUFBSSxJQUFBLENBQUM7UUFFdkUsOEJBQXlCLEdBQUcsR0FBRyxFQUFFLHFEQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLDBDQUFFLFNBQVMsMENBQUUsUUFBUSwwQ0FBRSxRQUFRLHVDQUFJLElBQUksSUFBQSxDQUFDO1FBRXhFLG1DQUE4QixHQUFHLEdBQUcsRUFBRTtZQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztZQUNoRCxPQUFPO2dCQUNILE9BQU87Z0JBQ1AsUUFBUSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7YUFDeEQsQ0FBQztRQUNOLENBQUMsQ0FBQTtRQUVPLHlCQUFvQixHQUFHLENBQUMsSUFBK0IsRUFBRSxFQUFFO1lBQy9ELElBQUksQ0FBQyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRXZCLE1BQU0sbUJBQW1CLEdBQUc7Z0JBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2FBQ3BELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQztZQUV4QyxPQUFPLG1CQUFtQjttQkFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQzttQkFDMUUsSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQTtRQUVPLGdDQUEyQixHQUFHLENBQUMsZUFBb0IsRUFBRSxFQUFFO1lBQzNELElBQUksQ0FBQyxlQUFlO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBRWxDLElBQUksZUFBZSxDQUFDLHNCQUFzQixJQUFJLGVBQWUsQ0FBQyxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7Z0JBQzdGLE9BQU8sZUFBZSxDQUFDO2FBQzFCO1lBRUQsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLElBQUksSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUYsQ0FBQyxDQUFBO1FBRU8sZ0NBQTJCLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTs7WUFDbkQsTUFBTSxrQkFBa0IsZUFBRyxPQUFPLDBDQUFFLHNCQUFzQiwwQ0FBRSxVQUFVLENBQUM7WUFFdkUsSUFBSSxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7Z0JBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQzthQUM5QztZQUVELElBQUksa0JBQWtCLEtBQUssSUFBSSxFQUFFO2dCQUM3QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDNUM7WUFFRCxPQUFPLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQ2pELENBQUMsQ0FBQTtRQUVELDZCQUF3QixHQUFHLENBQUMsVUFBbUIsS0FBSyxFQUFFLEVBQUUsQ0FDcEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUV6RSw4QkFBeUIsR0FBRyxDQUFDLFVBQW1CLEtBQUssRUFBRSxFQUFFLENBQ3JELE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFFM0Usc0NBQWlDLEdBQUcsQ0FBQyxJQUErQixFQUFFLEVBQUU7WUFDcEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBRWhELElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQyxPQUFPLENBQUM7YUFDeEQ7WUFFRCxPQUFPLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDN0QsQ0FBQyxDQUFBO1FBRUQsK0JBQTBCLEdBQUcsQ0FBQyxLQUFpQixFQUFFLEVBQUU7O1lBQy9DLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLE9BQUEsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLDBDQUFFLFFBQVEsS0FBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUMzRSxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2dCQUN0QyxPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDL0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUM7YUFDN0M7UUFDTCxDQUFDLENBQUE7UUFFRCwwQ0FBcUMsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTs7WUFDMUQsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksT0FBQSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxRQUFRLEtBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDdEYsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztnQkFDMUMsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLDRCQUE0QixHQUFHLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDO1lBQ3ZFLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNuQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDO2FBQ3pDO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsdUJBQWtCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTs7WUFDbEMsSUFBSSxPQUFBLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQywwQ0FBRSxRQUFRLEtBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDM0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQztnQkFDdEMsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDMUMsQ0FBQyxDQUFBO1FBRUQsa0NBQTZCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTs7WUFDN0MsSUFBSSxPQUFBLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLDBDQUFFLFFBQVEsS0FBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0RixJQUFJLENBQUMsNEJBQTRCLEdBQUcsS0FBSyxDQUFDO2dCQUMxQyxPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztRQUM5QyxDQUFDLENBQUE7UUFRRCxtQkFBYyxHQUFHLENBQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDaEIsT0FBTzthQUNWO1lBQ0QsSUFBSSxDQUFDLEVBQUU7Z0JBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBRXBHO1lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtnQkFDekIscURBQXFEO2dCQUNyRCwyQkFBMkI7Z0JBQzNCLDJCQUEyQjtnQkFDM0IsOFNBQThTO2dCQUM5UyxVQUFVO2dCQUNWLFFBQVE7Z0JBQ1IsSUFBSTtnQkFDSixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDckI7O2dCQUNHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFBLENBQUE7UUFFRCxjQUFTLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFckUsZUFBVSxHQUFHLEdBQVMsRUFBRTtZQUM5QixJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87YUFDVjtZQUNELE1BQU0sY0FBYyxxQkFBUSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLElBQUksR0FBUSxFQUFFLGVBQWUsa0NBQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsS0FBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxHQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pMLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUs7Z0JBQUUsSUFBSSxtQ0FBUSxJQUFJLEtBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsR0FBRSxDQUFDO1lBQ3ZLLElBQUk7Z0JBQ0EsSUFBSSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUUzRCxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO2lCQUU5QztxQkFDSSxJQUFJLE1BQU0sS0FBSyxLQUFLLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDL0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7b0JBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFBO29CQUN6QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDckUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFO3dCQUMzQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7d0JBQ2pDLCtEQUErRDt3QkFDL0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztxQkFDcEU7b0JBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFDMUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUNuQjt5QkFBTSxJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFO3dCQUMzQyxhQUFhLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7d0JBQzlDLE9BQU87cUJBQ1Y7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO3FCQUNuQjtpQkFDSjthQUVKO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTthQUNyQztvQkFBUztnQkFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN4QjtRQUNMLENBQUMsQ0FBQSxDQUFBO1FBTUQscUJBQWdCLEdBQUcsQ0FBQyxhQUFrQixFQUFFLEVBQUU7O1lBQ3RDLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLEVBQUUsRUFBRTtnQkFDbkUsT0FBTzthQUNWO1lBQ0QsSUFBSSxhQUFhLFdBQUksSUFBSSxDQUFDLGVBQWUsMENBQUUsV0FBVyxDQUFBLElBQUksYUFBYSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRTtnQkFDcEcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7YUFDakM7WUFDRCxNQUFNLFVBQVUsU0FBRyxhQUFhLDBDQUFFLEVBQUUsQ0FBQztZQUNyQyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QyxPQUFPLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLE9BQUEsZUFBZSwwQ0FBRSxFQUFFLEtBQUksQ0FBQyxDQUFDO1lBQ3ZELElBQUksZUFBZSxFQUFFO2dCQUNqQixJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDOUM7WUFDRCx5RUFBeUU7WUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQTtRQWtHRCxrQkFBYSxHQUFHLENBQU8sS0FBSyxFQUFFLGlCQUEwQixJQUFJLEVBQUUsRUFBRTtZQUM1RCxJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFO2dCQUM3QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87YUFDVjtZQUNELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3RFLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFDbEcsSUFBSSxjQUFjLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7aUJBQ3RDO2dCQUNELE9BQU87YUFDVjtZQUVELE1BQU0sY0FBYyxxQkFBUSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJO2dCQUNBLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO2dCQUN4RSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxDQUFBO29CQUM5QixPQUFPO2lCQUNWO2dCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFO29CQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxHQUFHLGVBQWUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO2lCQUN4RDtnQkFDRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsa0JBQWtCO29CQUMzQyxDQUFDLENBQUM7d0JBQ0UsRUFBRSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO3dCQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxFQUFFO3FCQUM5QztvQkFDRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDO2dCQUMvQixNQUFNLE9BQU8sR0FBRztvQkFDWixRQUFRLEVBQUUsZUFBZTtvQkFDekIsZUFBZSxFQUFFLGVBQWU7aUJBQ25DLENBQUE7Z0JBQ0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUNiLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQ25DLE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUU7b0JBQzlDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7NEJBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7eUJBQzlSO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2dCQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztnQkFDMUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7Z0JBQ2hDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ3pFLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQzFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7cUJBQU0sSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtvQkFDM0MsYUFBYSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUM5QyxPQUFPO2lCQUNWO3FCQUFNO29CQUNILElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFDbkI7YUFDSjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7YUFDckM7b0JBQVM7Z0JBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFDeEI7UUFDTCxDQUFDLENBQUEsQ0FBQTtRQUVELFlBQU8sR0FBRyxHQUFHLEVBQUU7WUFDWCxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDOUMsS0FBSyxtQkFBbUI7b0JBQ3BCLE9BQU8sSUFBSSxDQUFBO2dCQUNmLEtBQUssd0JBQXdCO29CQUN6QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUU7d0JBQ3BDLE9BQU8sS0FBSyxDQUFBO3FCQUNmO29CQUNELE9BQU8sSUFBSSxDQUFBO2dCQUNmLEtBQUssNEJBQTRCO29CQUM3QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQUU7d0JBQ3BDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQTtxQkFDM0I7b0JBQ0QsT0FBTyxJQUFJLENBQUE7YUFDbEI7UUFDTCxDQUFDLENBQUE7UUFHRCxZQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztZQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ2pDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUE7UUFFRCx1QkFBa0IsR0FBRyxHQUFHLEVBQUU7WUFDdEIsUUFBUSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzlDLEtBQUssbUJBQW1CO29CQUNwQixPQUFPLElBQUksQ0FBQTtnQkFDZixLQUFLLHdCQUF3QjtvQkFDekIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUE7Z0JBQzlDLEtBQUssNEJBQTRCO29CQUM3QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBO2FBQ3ZGO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsdUJBQWtCLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxLQUFLLE9BQU8sQ0FBQztZQUNqRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDOUIsQ0FBQyxDQUFBO1FBRUQsZ0NBQTJCLEdBQUcsQ0FBQyxhQUFrQixFQUFFLEVBQUU7O1lBQ2pELENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7O2dCQUN2QyxPQUFPLENBQUMsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLE9BQUMsYUFBYSwwQ0FBRSxFQUFFLENBQUMsQ0FBQztZQUNuRixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFLEdBQUcsT0FBQSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLDBDQUFFLEVBQUUsS0FBSSxDQUFDLENBQUM7UUFDNUgsQ0FBQyxDQUFBO1FBRU8seUJBQW9CLEdBQUcsQ0FBQyxXQUFnQixFQUFFLEVBQUU7O1lBQ2hELE1BQU0sT0FBTyxHQUFHLE9BQUEsV0FBVywwQ0FBRSxjQUFjLEtBQUksRUFBRSxDQUFDO1lBQ2xELE9BQU87Z0JBQ0gsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRTtnQkFDbEMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRTtnQkFDaEMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXLElBQUksRUFBRTtnQkFDdEMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDMUIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRTtnQkFDeEMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRTtnQkFDNUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxXQUFXO2dCQUNwQyxZQUFZLEVBQUUsV0FBVyxDQUFDLFlBQVk7Z0JBQ3RDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtnQkFDdEIsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO2dCQUMxQixRQUFRLEVBQUUsT0FBQSxXQUFXLENBQUMsUUFBUSwwQ0FBRSxRQUFRLE9BQU0sRUFBRTthQUNuRCxDQUFDO1FBQ04sQ0FBQyxDQUFBO1FBRUQsNEJBQXVCLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRTtZQUN2QyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ25DO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsb0JBQWUsR0FBRyxDQUFPLEtBQUssRUFBRSxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLG9DQUFvQyxFQUFFLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUFDLE9BQU87YUFBRTtZQUM3RSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUN0RSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUU7Z0JBQ2xHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Z0JBQ25DLE9BQU87YUFDVjtZQUNELE1BQU0sY0FBYyxxQkFBUSxJQUFJLENBQUMseUJBQXlCLENBQUUsQ0FBQztZQUM3RCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJO2dCQUNBLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRSxJQUFJLENBQUMsZUFBZSxFQUFFO29CQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQUMsT0FBTztpQkFBRTtnQkFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO29CQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3hGLE1BQU0sT0FBTyxHQUFHO29CQUNaLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxFQUFFO29CQUNyQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsRUFBRTtvQkFDcEMsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksRUFBRTtpQkFDOUMsQ0FBQztnQkFDRixNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDN0UsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUFDLE9BQU87aUJBQUU7Z0JBQ2hFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFO29CQUM5QyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7O3dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGFBQUEsVUFBVSwwQ0FBRSxlQUFlLDBDQUFFLElBQUksSUFBRyxLQUFLLGdCQUFHLFVBQVUsMENBQUUsZUFBZSwwQ0FBRSxNQUFNLENBQUEsRUFBRSxRQUFRLENBQUMsQ0FBQzt5QkFDbFM7b0JBQ0wsQ0FBQyxDQUFDLENBQUM7aUJBQ047Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDekUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtvQkFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7aUJBQUU7cUJBQzdELElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7b0JBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO29CQUFDLE9BQU87aUJBQUU7cUJBQ2xHO29CQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFBRTthQUM1QjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFBRTtvQkFDM0M7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFBRTtRQUNyQyxDQUFDLENBQUEsQ0FBQTtRQUVELCtCQUEwQixHQUFHLENBQU8sS0FBSyxFQUFFLEVBQUU7WUFDekMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLDBCQUEwQixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFBQyxPQUFPO2FBQUU7WUFDckcsTUFBTSxjQUFjLHFCQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUk7Z0JBQ0EsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsOEJBQThCLENBQUMsRUFBRSxHQUFHLDBCQUEwQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzVFLE1BQU0sT0FBTyxHQUFHO29CQUNaLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDLEVBQUU7b0JBQzFDLGdCQUFnQixFQUFFLDBCQUEwQixDQUFDLEVBQUU7b0JBQy9DLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLEVBQUU7aUJBQzlDLENBQUM7Z0JBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzdFLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFBQyxPQUFPO2lCQUFFO2dCQUNoRSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRTtvQkFDOUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTs0QkFDZCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3lCQUNsUjtvQkFDTCxDQUFDLENBQUMsQ0FBQztpQkFDTjtnQkFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztpQkFBRTtxQkFDN0QsSUFBSSxJQUFJLENBQUMsMkJBQTJCLEVBQUUsRUFBRTtvQkFBRSxhQUFhLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQUMsT0FBTztpQkFBRTtxQkFDbEc7b0JBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUFFO2FBQzVCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQzthQUFFO29CQUMzQztnQkFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUFFO1FBQ3JDLENBQUMsQ0FBQSxDQUFBO1FBRUQsOEJBQXlCLEdBQUcsQ0FBTyxLQUFLLEVBQUUsRUFBRTs7WUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFBQyxPQUFPO2FBQUU7WUFDcEYsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNoRixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFBQyxPQUFPO2FBQUU7WUFDdEUsTUFBTSxjQUFjLHFCQUFRLElBQUksQ0FBQyx5QkFBeUIsQ0FBRSxDQUFDO1lBQzdELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUk7Z0JBQ0EsTUFBTSxlQUFlLHFCQUFRLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBRSxDQUFDO2dCQUMxRSxlQUFlLENBQUMsUUFBUSxTQUFHLGVBQWUsQ0FBQyxRQUFRLDBDQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUNoRSxNQUFNLFdBQVcsR0FBRztvQkFDaEIsZUFBZSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQztvQkFDaEUsY0FBYyxFQUFFLGVBQWU7b0JBQy9CLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxJQUFJLEVBQUU7aUJBQzlDLENBQUM7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLE1BQU0sS0FBSyxLQUFLLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO29CQUM1QyxPQUFPO2lCQUNWO2dCQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtvQkFDdEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUU7d0JBQzlDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0NBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLEdBQUcsS0FBSyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzs2QkFDbFI7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7cUJBQ047b0JBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO29CQUMxQixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztvQkFDaEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDckUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTt3QkFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7cUJBQUU7eUJBQzdELElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7d0JBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO3dCQUFDLE9BQU87cUJBQUU7eUJBQ2xHO3dCQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztxQkFBRTtpQkFDNUI7YUFDSjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7YUFBRTtvQkFDM0M7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7YUFBRTtRQUNyQyxDQUFDLENBQUEsQ0FBQTtRQUVELDBCQUFxQixHQUFHLEdBQUcsRUFBRTtZQUN6QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFDekQsQ0FBQyxDQUFBO1FBRUQsOEJBQXlCLEdBQUcsQ0FBQyxPQUFZLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUNqQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixDQUFDLENBQUE7UUFFRCwyQkFBc0IsR0FBRyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO2FBQ25EO1FBQ0wsQ0FBQyxDQUFBO1FBRUQsNEJBQXVCLEdBQUcsR0FBRyxFQUFFOztZQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxXQUFJLElBQUksQ0FBQyxXQUFXLDBDQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUMsQ0FBQztZQUN0RixJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ3BELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlFLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2xELENBQUMsQ0FBQTtRQUVELDBCQUFxQixHQUFHLENBQUMsT0FBWSxFQUFFLEVBQUU7O1lBQ3JDLE1BQU0sT0FBTyxHQUFHLE9BQUEsT0FBTywwQ0FBRSxjQUFjLEtBQUksRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxPQUFPLENBQUMsSUFBSSxRQUFFLE9BQU8sMENBQUUsTUFBTSxRQUFFLE9BQU8sMENBQUUsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUE7UUFFRCw0QkFBdUIsR0FBRyxHQUFHLEVBQUU7O1lBQzNCLElBQUksSUFBSSxDQUFDLGtCQUFrQjtnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUN2QyxPQUFPLE9BQUEsSUFBSSxDQUFDLFdBQVcsMENBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQyxDQUFDLE9BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsMENBQUUsTUFBTSxLQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDL0UsQ0FBQyxDQUFBO1FBRUQsZUFBVSxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsV0FBQyxPQUFBLE9BQUEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsMENBQUUsSUFBSSxLQUFJLEVBQUUsQ0FBQSxFQUFBLENBQUE7UUFFMUosZ0JBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsMENBQUUsSUFBSSxLQUFJLEVBQUUsQ0FBQSxFQUFBLENBQUE7UUFFbkcsb0JBQWUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLFdBQUMsT0FBQSxPQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsMENBQUUsSUFBSSxLQUFJLEVBQUUsQ0FBQSxFQUFBLENBQUE7UUFFeEcsdUJBQWtCLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRS9JLGlDQUE0QixHQUFHLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFN0osMkJBQXNCLEdBQUcsR0FBRyxFQUFFO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7Z0JBQy9DLE9BQU8sRUFBRSxDQUFDO2FBQ2I7WUFDRCxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDN0QsSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDUCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7WUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxRQUFRLEdBQUc7b0JBQ2IsT0FBTyxDQUFDLE1BQU07b0JBQ2QsT0FBTyxDQUFDLElBQUk7b0JBQ1osT0FBTyxDQUFDLFFBQVE7b0JBQ2hCLE9BQU8sQ0FBQyxXQUFXO29CQUNuQixPQUFPLENBQUMsWUFBWTtvQkFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO29CQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7b0JBQ3RDLE9BQU8sQ0FBQyxTQUFTO29CQUNqQixPQUFPLENBQUMsUUFBUTtvQkFDaEIsT0FBTyxDQUFDLEtBQUs7aUJBQ2hCO3FCQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUM7cUJBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQztxQkFDVCxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFBO1FBRUQsOEJBQXlCLEdBQUcsR0FBRyxFQUFFO1lBQzdCLE9BQU8sSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUNBQzdDLE9BQU8sS0FDVixLQUFLLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxJQUM1QyxDQUFDLENBQUM7UUFDUixDQUFDLENBQUE7UUFFRCx1QkFBa0IsR0FBRyxHQUFHLEVBQUUsV0FBQyxPQUFBLENBQUMsUUFBQyxJQUFJLENBQUMsV0FBVywwQ0FBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQUMsSUFBSSwwQ0FBRSxRQUFRLEdBQUEsRUFBQyxDQUFBLEVBQUEsQ0FBQztRQUVwRSx5QkFBb0IsR0FBRyxDQUFDLE9BQVksRUFBRSxFQUFFOztZQUM1QyxJQUFJLENBQUMsT0FBTztnQkFBRSxPQUFPO1lBQ3JCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFDO1lBQy9CLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1lBQzdDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUN6QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFO2dCQUNsQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO2dCQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxFQUFFO2dCQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLO2dCQUNqRSxZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFO2dCQUN4QyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsSUFBSSxFQUFFO2dCQUM1QyxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFO2dCQUM1QixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJO2dCQUN4QyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUN4QixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVksSUFBSSxJQUFJO2dCQUMxQyxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxFQUFFO2FBQ25DLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUV6QixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3pHLElBQUksZUFBZSxFQUFFO2dCQUNqQixJQUFJLENBQUMsMEJBQTBCLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQzthQUNqRTtZQUVELE1BQU0sV0FBVyxlQUFHLGVBQWUsMENBQUUsYUFBYSwwQ0FBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNsRyxJQUFJLFdBQVcsRUFBRTtnQkFDYixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUM7WUFFRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDL0IsQ0FBQyxDQUFBO1FBRU8sNEJBQXVCLEdBQUcsQ0FBQyxRQUFpQixFQUFFLEVBQUU7WUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7WUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDNUYsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkgsQ0FBQyxDQUFBO1FBRU8sNEJBQXVCLEdBQUcsR0FBRyxFQUFFOztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDN0QsVUFBSSxJQUFJLENBQUMsZUFBZSwwQ0FBRSxXQUFXO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1lBQ3BELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3RFLElBQUksUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRTtnQkFDbEcsT0FBTyxLQUFLLENBQUM7YUFDaEI7WUFDRCxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDLENBQUE7UUFFTyxnQ0FBMkIsR0FBRyxHQUFHLEVBQUU7WUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFVBQVUsR0FBRztnQkFDZixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQy9CLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFBRSxJQUFJO2dCQUNqQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2dCQUMxQixXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7Z0JBQ2hDLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtnQkFDbEMsY0FBYyxFQUFFO29CQUNaLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO29CQUMxQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ3BCLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztvQkFDaEMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWM7aUJBQ3pDO2FBQ0osQ0FBQztZQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxXQUFXLEdBQUc7Z0JBQ2YsVUFBVTtnQkFDVixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsaUNBQU0sT0FBTyxLQUFFLFFBQVEsRUFBRSxLQUFLLElBQUcsQ0FBQzthQUN4RSxDQUFDO1lBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUE7UUFFTywyQkFBc0IsR0FBRyxHQUFHLEVBQUU7O1lBQ2xDLElBQUksUUFBQyxJQUFJLENBQUMsV0FBVywwQ0FBRSxNQUFNLENBQUE7Z0JBQUUsT0FBTztZQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEYsQ0FBQyxDQUFBO1FBRU8sc0JBQWlCLEdBQUcsR0FBRyxFQUFFOztZQUM3QixJQUFJLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDNUMsT0FBTztvQkFDSCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsV0FBSSxJQUFJLENBQUMsZUFBZSwwQ0FBRSxFQUFFLENBQUEsSUFBSSxDQUFDO29CQUN4RSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssSUFBSSxFQUFFO2lCQUM5QyxDQUFDO2FBQ0w7WUFDRCxPQUFPO2dCQUNILElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRTtnQkFDckMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFO2dCQUNyRixtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO2FBQ2hELENBQUM7UUFDTixDQUFDLENBQUE7UUFFTyxrQkFBYSxHQUFHLENBQUMsU0FBa0IsRUFBRSxFQUFFO1lBQzNDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO2dCQUFFLE9BQU87WUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7Z0JBQ2pELElBQUksQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUM7YUFDM0M7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEMsQ0FBQyxDQUFBO1FBRU8sNkJBQXdCLEdBQUcsR0FBRyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLElBQUksQ0FBQywyQkFBMkIsRUFBRSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDO2FBQzFDO1FBQ0wsQ0FBQyxDQUFBO1FBRU8sdUJBQWtCLEdBQUcsR0FBRyxFQUFFO1lBQzlCLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQUUsT0FBTztZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWM7Z0JBQUUsT0FBTztZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFBO1FBRU8sZ0NBQTJCLEdBQUcsR0FBRyxFQUFFOztZQUN2QyxNQUFNLE9BQU8sU0FBRyxJQUFJLENBQUMsV0FBVywwQ0FBRSxhQUFhLENBQUM7WUFDaEQsT0FBTyxDQUNILENBQUMsSUFBSSxDQUFDLGtCQUFrQjtnQkFDeEIsSUFBSSxDQUFDLFNBQVM7Z0JBQ2QsQ0FBQyxRQUFDLE9BQU8sMENBQUUsNkJBQTZCLENBQUE7Z0JBQ3hDLENBQUMsUUFBQyxPQUFPLDBDQUFFLDRCQUE0QixDQUFBLENBQzFDLENBQUM7UUFDTixDQUFDLENBQUE7UUFFTyx5Q0FBb0MsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxJQUFJLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBRTVJLDBCQUFxQixHQUFHLEdBQUcsRUFBRTtZQUN6QixJQUFJLElBQUksQ0FBQyxvQ0FBb0MsRUFBRSxFQUFFO2dCQUM3QyxPQUFPLGlCQUFpQixDQUFDO2FBQzVCO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUU7Z0JBQ3ZELE9BQU8saUJBQWlCLENBQUM7YUFDNUI7WUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3hELENBQUMsQ0FBQTtRQUVPLDJCQUFzQixHQUFHLEdBQTBCLEVBQUUsQ0FBQyxDQUFDO1lBQzNELFFBQVEsRUFBRSxDQUFDO1lBQ1gsS0FBSyxFQUFFLENBQUM7WUFDUixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsV0FBVyxFQUFFLENBQUM7WUFDZCxTQUFTLEVBQUUsQ0FBQztZQUNaLEtBQUssRUFBRSxDQUFDO1NBQ1gsQ0FBQyxDQUFDO1FBRUssdUNBQWtDLEdBQUcsQ0FBQyxJQUFrQixFQUF5QixFQUFFOztZQUN2RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUMvQyxJQUFJLFFBQUMsSUFBSSwwQ0FBRSxNQUFNLENBQUE7Z0JBQUUsT0FBTyxRQUFRLENBQUM7WUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFOztnQkFDdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQUEsSUFBSSwwQ0FBRSxNQUFNLEtBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLGNBQVEsSUFBSSwwQ0FBRSxJQUFJLEVBQUU7b0JBQ2hCLEtBQUssVUFBVTt3QkFDWCxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQzt3QkFDM0IsUUFBUSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUM7d0JBQ3hCLE1BQU07b0JBQ1YsS0FBSyxPQUFPO3dCQUNSLFFBQVEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO3dCQUN4QixNQUFNO29CQUNWLEtBQUssVUFBVTt3QkFDWCxRQUFRLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQzt3QkFDM0IsTUFBTTtvQkFDVixLQUFLLGFBQWE7d0JBQ2QsUUFBUSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7d0JBQzlCLE1BQU07b0JBQ1YsS0FBSyxPQUFPO3dCQUNSLFFBQVEsQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO3dCQUN4QixNQUFNO29CQUNWLEtBQUssVUFBVSxDQUFDO29CQUNoQixLQUFLLFFBQVE7d0JBQ1QsUUFBUSxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUM7d0JBQzdCLE1BQU07b0JBQ1Y7d0JBQ0ksTUFBTTtpQkFDYjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxRQUFRLENBQUM7UUFDcEIsQ0FBQyxDQUFBO1FBRU8sOEJBQXlCLEdBQUcsQ0FBQyxLQUFVLEVBQXlCLEVBQUU7O1lBQ3RFLE1BQU0sTUFBTSxHQUFHLE9BQUEsS0FBSywwQ0FBRSxNQUFNLEtBQUksRUFBRSxDQUFDO1lBQ25DLE9BQU87Z0JBQ0gsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztnQkFDdEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDaEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQztnQkFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDO2dCQUMzRCxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO2FBQ25DLENBQUM7UUFDTixDQUFDLENBQUE7UUFFTyxzQkFBaUIsR0FBRyxDQUFDLE1BQTZCLEVBQUUsS0FBVSxFQUFXLEVBQUU7WUFDL0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FDSCxNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO2dCQUNsQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLO2dCQUM1QixNQUFNLENBQUMsUUFBUSxLQUFLLEtBQUssQ0FBQyxRQUFRO2dCQUNsQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLO2dCQUM1QixNQUFNLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxXQUFXO2dCQUN4QyxNQUFNLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxTQUFTO2dCQUNwQyxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLENBQy9CLENBQUM7UUFDTixDQUFDLENBQUE7UUFFTywwQkFBcUIsR0FBRyxHQUFHLEVBQUU7WUFDakMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO2dCQUFFLE9BQU87WUFDMUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVc7b0JBQUUsT0FBTztnQkFDMUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDcEQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1YsQ0FBQyxDQUFBO1FBRU0sbUJBQWMsR0FBRyxHQUFHLEVBQUU7O1lBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYztnQkFBRSxPQUFPO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQ2xELE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2dCQUM1RyxJQUFJLGVBQWUsRUFBRTtvQkFDakIsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDdkMsT0FBTyxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDakUsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ2pFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDOUM7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7aUJBQ3BFO2dCQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUM1RTtpQkFBTTtnQkFDSCxJQUFJLENBQUMsbUJBQW1CLFNBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsdUNBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFBLENBQUM7Z0JBQy9GLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO29CQUM3QixJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQzlGO2dCQUNELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckksSUFBSSxlQUFlLEVBQUU7b0JBQ2pCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3RELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO29CQUM5RCxNQUFNLFdBQVcsZUFBRyxlQUFlLDBDQUFFLGFBQWEsMENBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDOUgsSUFBSSxXQUFXLEVBQUU7d0JBQ2IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxDQUFDO3FCQUM5QztpQkFDSjtnQkFDRCxNQUFNLHNCQUFzQixHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsSyxJQUFJLENBQUMscUNBQXFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUE7UUF4cUNHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxpQ0FDMUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEtBQzdELFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUNoQixDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhO2FBQzFCLElBQUksQ0FDRCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pFLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUUxRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLGlDQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FDOUQsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQ2hCLENBQUM7UUFDSCxJQUFJLENBQUMsdUJBQXVCLENBQUMsYUFBYTthQUNyQyxJQUFJLENBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BGLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBRXJGLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFFBQVE7O1FBQ0osSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCx5RUFBeUU7UUFDekUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLFdBQUMsT0FBQSxJQUFJLENBQUMsMEJBQTBCLFNBQUcsSUFBSSwwQ0FBRSwwQkFBMEIsQ0FBQSxFQUFBLENBQUMsQ0FBQztRQUM1RyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFBLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLDBDQUFFLEtBQUssS0FBSSxVQUFVLENBQUMsQ0FBQztRQUN4SSxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDN0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLEtBQUssNEJBQTRCO1lBQ3pFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBaUIsS0FBSyx3QkFBd0IsRUFBRTtZQUV2RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUM7Z0JBQy9CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbEIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3pFLCtFQUErRTtvQkFDL0UsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFDcEMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsQ0FBQztxQkFDcEQ7b0JBQ0QsSUFBSSxlQUFlLEVBQUU7d0JBQ2pCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3RELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDM0MsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQzt3QkFDaEYsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGVBQWUsQ0FBQyxDQUFDO3dCQUNqRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7d0JBQ3pFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFOzRCQUNyRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzt5QkFDbkM7d0JBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTs0QkFDaEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7eUJBQ25EO3FCQUNKO2lCQUNKO3FCQUFNO29CQUNILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQ3pCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFOztZQUM1QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDL0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUV4QyxZQUFZO2dCQUNaLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFFBQVEsT0FDL0MsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FDNUIsQ0FBQTtnQkFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUyxDQUFDLENBQUE7Z0JBRTdDLFlBQVk7Z0JBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtnQkFDbEYsSUFBSSxDQUFDLHdCQUF3QixPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxPQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsMENBQUUsYUFBYSxDQUFDLENBQUE7YUFDeEQ7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxjQUFjO2dCQUFFLE9BQU87WUFDaEYsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ2pELElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkYsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDbkIsQ0FBQztJQTBEUyxZQUFZO1FBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7WUFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFO2dCQUNqRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDcEIsT0FBTTthQUNUO1lBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFBO2dCQUNwQixPQUFNO2FBQ1Q7U0FDSjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO0lBQ3pCLENBQUM7SUEwTkQsc0JBQXNCO1FBQ2xCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDdEMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztJQUM5QyxDQUFDO0lBMEVELFNBQVMsQ0FBQyxRQUEwQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsSCxDQUFDO0lBeUJELGdCQUFnQixDQUNaLFlBQWlCLEVBQ2pCLGVBQXVCLEVBQ3ZCLElBQVMsRUFDVCxlQUF1QixFQUN2QixZQUFvQixFQUNwQixjQUFzQixFQUN0QixXQUFvQixJQUFJOztRQUV4QixJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU87UUFFMUIsTUFBTSxTQUFTLFNBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyx1Q0FBSSxLQUFLLEVBQUEsQ0FBQztRQUN0RCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxVQUFVLENBQUM7UUFFOUYsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNqSCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDNUQsQ0FBQztJQUVELDBCQUEwQixDQUFDLGVBQW9COztRQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEUsTUFBTSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPO1lBQ2pDLENBQUMsQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsT0FBTyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUM1QyxNQUFNLFNBQVMsZUFBRyxPQUFPLDBDQUFFLG1CQUFtQix1Q0FBSSxLQUFLLEVBQUEsQ0FBQztRQUN4RCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFFdEIsSUFBSSxRQUFRLEVBQUU7WUFDVixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QztRQUVELElBQUksT0FBTyxJQUFJLFNBQVMsRUFBRTtZQUN0QixVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUNoRDtRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7UUFDakMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQztRQUNuQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUztZQUNuQyxDQUFDLENBQUMsbUNBQW1DO1lBQ3JDLENBQUMsQ0FBQyxtQ0FBbUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBRUQscUNBQXFDLENBQUMsZUFBb0I7O1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU87WUFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUM7WUFDM0MsQ0FBQyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO1FBQzVDLE1BQU0sU0FBUyxlQUFHLE9BQU8sMENBQUUsbUJBQW1CLHVDQUFJLEtBQUssRUFBQSxDQUFDO1FBQ3hELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUV0QixJQUFJLFFBQVEsRUFBRTtZQUNWLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxPQUFPLElBQUksU0FBUyxFQUFFO1lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQsSUFBSSxDQUFDLDRCQUE0QixHQUFHLE9BQU8sQ0FBQztRQUM1QyxJQUFJLENBQUMsNkJBQTZCLEdBQUcsUUFBUSxDQUFDO1FBQzlDLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxTQUFTO1lBQzlDLENBQUMsQ0FBQyxtQ0FBbUM7WUFDckMsQ0FBQyxDQUFDLG1DQUFtQyxDQUFDO1FBRTFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsc0JBQXNCLENBQUMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBRUQsd0JBQXdCLENBQUMsb0JBQXlCO1FBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsWUFBWSxFQUNqQixzQkFBc0IsRUFDdEIsV0FBVyxFQUNYLHdCQUF3QixFQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQ3pFLENBQUM7SUFDTixDQUFDO0lBRUQsbUNBQW1DLENBQUMsb0JBQXlCO1FBQ3pELElBQUksQ0FBQyxnQkFBZ0IsQ0FDakIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQixJQUFJLENBQUMsdUJBQXVCLEVBQzVCLGlDQUFpQyxFQUNqQyxXQUFXLEVBQ1gsd0JBQXdCLEVBQ3hCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FDekUsQ0FBQztJQUNOLENBQUM7Q0FnbUJKLENBQUE7O1lBcnJDbUMsV0FBVztZQUM1QixXQUFXO1lBQ1IsWUFBWTtZQUNBLGlCQUFpQjtZQUN2QixXQUFXO1lBQ1AsZUFBZTtZQUNuQixtQkFBbUI7WUFDakIsY0FBYztZQUNkLGlCQUFpQjtZQUN4QixTQUFTO1lBQ0Ysb0JBQW9COztBQS9FckM7SUFBUixLQUFLLEVBQUU7b0RBQVM7QUFDUjtJQUFSLEtBQUssRUFBRTtzREFBNEI7QUFDM0I7SUFBUixLQUFLLEVBQUU7cURBQW9CO0FBQ25CO0lBQVIsS0FBSyxFQUFFOytEQUFxQztBQUNuQztJQUFULE1BQU0sRUFBRTt3REFBMkM7QUFnZHBEO0lBREMsWUFBWSxDQUFDLGdCQUFnQixDQUFDO2lFQUk5QjtBQXpkUSxtQkFBbUI7SUFOL0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGlCQUFpQjtRQUMzQixxN25GQUF5QztRQUV6QyxTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7O0tBQzlCLENBQUM7R0FDVyxtQkFBbUIsQ0E0dkMvQjtTQTV2Q1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb21wb25lbnRIZWxwZXIgfSBmcm9tICcuLi8uLi8uLi9jbGFzc2VzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FydFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWRkcmVzc2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9hZGRyZXNzaW5nLnNlcnZpY2UnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBCc01vZGFsU2VydmljZSB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwnO1xuaW1wb3J0IHsgQnNNb2RhbFJlZiB9IGZyb20gJ25neC1ib290c3RyYXAvbW9kYWwvYnMtbW9kYWwtcmVmLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29yZS5jb25zdHMnO1xuaW1wb3J0IHsgYWRkIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9jaHJvbm9zJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFyYW1ldGVycy5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxDb25maWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhbm5lbC1jb25maWcuc2VydmljZSc7XG5pbXBvcnQgeyBDaGVja291dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGVja291dC9jaGVja291dC5zZXJ2aWNlJztcbmltcG9ydCB7IE9yZGVyVXRpbGl0eVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi91dGlscy9vcmRlci11dGlsLnNlcnZpY2UnO1xuXG50eXBlIFN1bW1hcnlUb3RhbHNTbmFwc2hvdCA9IHtcbiAgICBzdWJ0b3RhbDogbnVtYmVyO1xuICAgIHRheGVzOiBudW1iZXI7XG4gICAgc2hpcHBpbmc6IG51bWJlcjtcbiAgICB0b3RhbDogbnVtYmVyO1xuICAgIGNsaWVudFRheGVzOiBudW1iZXI7XG4gICAgcHJvbW90aW9uOiBudW1iZXI7XG4gICAgaXRlbXM6IG51bWJlcjtcbn07XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWRhdGFmb3JtLWVjJyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RhdGFmb3JtLWVjLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnZGF0YWZvcm0tZWMuY29tcG9uZW50LnNjc3MnXSxcbiAgICBwcm92aWRlcnM6IFtCc01vZGFsU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgRGF0YUZvcm1FY0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEhlbHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBzdGVwX2lkO1xuICAgIEBJbnB1dCgpIGlzTGFzdE9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIG5leHRTdGVwOiBGdW5jdGlvbjtcbiAgICBASW5wdXQoKSBjb21wYWN0QWRkcmVzc1ZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBAT3V0cHV0KCkgZGlydHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgZG9jdW1lbnRUeXBlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55W10+KFtdKTtcbiAgICBwcm90ZWN0ZWQgcHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuXG4gICAgcHVibGljIGNvdW50cmllcyQgPSB0aGlzLmNvdW50cmllc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlcyQgPSB0aGlzLnByb3ZpbmNlc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZXMkID0gdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uOiBGb3JtR3JvdXA7XG4gICAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcbiAgICBwdWJsaWMgZm9ybV9yZWFkeSA9IGZhbHNlO1xuICAgIHB1YmxpYyBhbGxyZWFkeV9kYXRhID0gZmFsc2U7XG4gICAgcHVibGljIGFkZHJlc3NCb29rID0gW107XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWQgPSB7IGlkOiAwLCBub3RlczogXCJcIiB9XG4gICAgcHVibGljIGFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZmluaXNoOiBib29sZWFuID0gZmFsc2U7IC8vRXN0YSB2YXJpYWJsZSBzZSB1c2EgcGFyYSBtb3N0cmFyIGVsIGJvdG9uIGRlIGZpbmFsaXphci5cblxuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuICAgIHB1YmxpYyB2aWV3RGF0YUZhY3R1cmFjaW9uOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBtb2RhbFJlZjogQnNNb2RhbFJlZiB8IG51bGw7XG4gICAgcHVibGljIHBhcmFtczogYW55ID0ge307XG4gICAgcHVibGljIHNlbGVjdEFkZHJlczogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RBZGRyZXNzRmFjdHVyYWNpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgYWRkcmVzc1NlYXJjaCA9ICcnO1xuICAgIHB1YmxpYyBhZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHVibGljIGZvcm1SZWFkb25seSA9IGZhbHNlO1xuICAgIHB1YmxpYyBzZWxlY3RlZEFkZHJlc3M6IGFueSA9IG51bGw7XG4gICAgcHJpdmF0ZSB0ZW1wQWRkcmVzc0lkID0gMDtcblxuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBwb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIHBvc3RhbENvZGVWaXNpYmxlID0gdHJ1ZTtcbiAgICBwdWJsaWMgcG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZCA9IHRydWU7XG4gICAgcHVibGljIHBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uID0gdHJ1ZTtcbiAgICBwdWJsaWMgZG9jdW1lbnRFcnJvck1lc3NhZ2U6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGRvY3VtZW50RXJyb3JNZXNzYWdlRmFjdHVyYWNpb246IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBsYXN0U2F2ZWRTdGF0ZTogYW55IHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSBpc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBzdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhZGRyZXNzU3luY2VkRm9yQ29tcGxldGlvbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgbGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdDogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0ge1xuICAgICAgICBzdWJ0b3RhbDogMCxcbiAgICAgICAgdGF4ZXM6IDAsXG4gICAgICAgIHNoaXBwaW5nOiAwLFxuICAgICAgICB0b3RhbDogMCxcbiAgICAgICAgY2xpZW50VGF4ZXM6IDAsXG4gICAgICAgIHByb21vdGlvbjogMCxcbiAgICAgICAgaXRlbXM6IDBcbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHVibGljIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHVibGljIHRvYXN0OiBUb2FzdFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBhZGRyZXNzaW5nU2VydmljZTogQWRkcmVzc2luZ1NlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjYXJ0U2VydmljZTogQ2FydFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBjaGVja291dFNlcnZpY2U6IENoZWNrb3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBvcmRlclV0aWxzOiBPcmRlclV0aWxpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogQnNNb2RhbFNlcnZpY2UsXG4gICAgICAgIHB1YmxpYyBwYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSxcbiAgICAgICAgcHVibGljIGNvbnN0czogQ29uc3RhbnRzLFxuICAgICAgICBwdWJsaWMgY2hhbm5lbENvbmZpZzogQ2hhbm5lbENvbmZpZ1NlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5lY09uQ29uc3RydWN0KClcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1BZGRyZXMsXG4gICAgICAgICAgICBwb3N0Y29kZTogWycnXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkIH0pKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLm9uRm9ybVZhbGlkKCkpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCkpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIC4uLnRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKS5jb25maWdGb3JtLmZvcm1CaWxsaW5nLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJ11cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKG51bGwpO1xuICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24obnVsbCk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMucGFyYW1zU2VydmljZS5wYXJhbWV0ZXJzLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wYXJhbXMgPSByZXMpO1xuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmluaXRpYWxpemUodGhpcy5zdGVwX2lkKTtcbiAgICAgICAgLy8gSW4gc2luZ2xlL2NvbXBhY3Qgc2VsZWN0aW9uIG1vZGUgd2Ugc2hvdWxkIG5vdCBzaG93IHRoZSBzdWJtaXQgYnV0dG9uLlxuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIGNvbnN0IGxvY2FsRW1haWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWFpbCcpO1xuICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmNhcnQuc3Vic2NyaWJlKGNhcnQgPT4gdGhpcy5jdXN0b21lckhhc0N1c3RvbWVyVGF4UmF0ZSA9IGNhcnQ/LmN1c3RvbWVySGFzQ3VzdG9tZXJUYXhSYXRlKTtcbiAgICAgICAgdGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZW1haWwnXS5zZXRWYWx1ZSh0aGlzLmF1dGhTZXJ2aWNlLmdldEN1c3RvbWVyKCk/LmVtYWlsIHx8IGxvY2FsRW1haWwpO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UuZ2V0QWRkcmVzc2luZ0RhdGEoKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBsZXQgY291bnRyaWVzID0gdGhpcy5maWx0ZXJDb3VudHJ5QnlDb2RlKHJlcylcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KGNvdW50cmllcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nIHx8XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLm1vZGVTZWxlY3RBZGRyZXNzID09PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpIHtcblxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gcmVzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWRkcmVzc0Jvb2spIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQWRkcmVzcyA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBTaSBubyBoYXkgbmluZ3VuYSBkaXJlY2Npw7NuIHNlbGVjY2lvbmFkYSwgc2VsZWNjaW9uYXIgbGEgcHJpbWVyYSBwb3IgZGVmZWN0b1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkQWRkcmVzcyAmJiB0aGlzLmFkZHJlc3NCb29rLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBZGRyZXNzID0gdGhpcy5hZGRyZXNzQm9va1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRBZGRyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3MuaWQgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnNldFZhbHVlKHNlbGVjdGVkQWRkcmVzcy5jb3VudHJ5Q29kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQWRkcmVzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSAmJiAhdGhpcy5sYXN0U2F2ZWRTdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zaG91bGRBdXRvU2VsZWN0QWRkcmVzcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE1vZGUoJ2NhcmdhJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvdW50cmllcyQuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICByZXNbMF0/LnByb3ZpbmNlc1swXS5jb2RlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgLy8gRG9jdW1lbnRvXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXS5jb2RlKVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHJlc1swXT8uZG9jdW1lbnRUeXBlc1swXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzU3ViamVjdC5uZXh0KHJlc1swXT8uZG9jdW1lbnRUeXBlcylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNoZWNrb3V0U2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jaGVja291dFNlcnZpY2UuaXNTdGVwUmVhZHkoJ2FkZHJlc3MnKSB8fCB0aGlzLmxhc3RTYXZlZFN0YXRlKSByZXR1cm47XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0U2F2ZWRTdGF0ZUZyb21DdXJyZW50KCksIDApO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jaGVja291dFNlcnZpY2UuYXNvY2lhdGVkRGF0YSQuc3Vic2NyaWJlKGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90ID0gdGhpcy5nZXRTdW1tYXJ5VG90YWxzRnJvbUFzc29jaWF0ZWREYXRhKGRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVjT25Jbml0KClcbiAgICB9XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIGZpbHRyYSBsb3MgcGFpc2VzIGRlIGFjdWVyZG8gYWwgYSBsb3MgY29kaWdvcyByZXRvcm5hZG9zIGVuIGxhIGZ1bmNpb24gZ2V0Q291bnRyaWVzLlxuICAgICAqIENhc29zIGRlIHVzb3M6IFNpIGdldENvdW50cmllcyBlcyB2YWNpbywgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogU2kgZ2V0Q291bnRyaWVzIGNvbnRpZW5lIHZhbG9yZXMgcXVlIG5vIGNvaW5jaWRlbiwgcmV0b3JuYSBlbCBhcnJlZ2xvIHF1ZSBpbmdyZXNhIHBvciBwYXJhbWV0cm8uXG4gICAgICogRGUgbG8gY29udHJhcmlvIHJldG9ybmEgbG9zIHZhbG9yZXMgZmlsdHJhZG9zLlxuICAgICAqIEBwYXJhbSBjb3VudHJpZXMgQXJyZWdsbyBxdWUgY29udGllbmUgbG9zIGNvdW50cmllcyByZWNpYmlkb3MgZW4gbGEgc3Vic2NyaXBjaW9uIGRlbCBvYnNlcnZhYmxlLlxuICAgICAqIEByZXR1cm5zIHVuIGFycmVnbG8gZGUgY291bnRyaWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgZmlsdGVyQ291bnRyeUJ5Q29kZSA9IChjb3VudHJpZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIC8vIDEuIFNpIGhheSBwYcOtc2VzIEVYQ0xVSURPUywgcXXDrXRhbG9zIHNpZW1wcmVcbiAgICAgICAgbGV0IGZpbHRlcmVkID0gY291bnRyaWVzO1xuICAgICAgICBpZiAodGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMgJiYgdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmlsdGVyZWQgPSBmaWx0ZXJlZC5maWx0ZXIoZWxlbSA9PiAhdGhpcy5jb25zdHMuZXhjbHVkZWRDb3VudHJpZXMuaW5jbHVkZXMoZWxlbS5jb2RlKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gMi4gU2kgaGF5IHBhw61zZXMgSU5DTFVJRE9TLCBhcGxpY2EgZWwgZmlsdHJvIGRlIGluY2x1c2nDs25cbiAgICAgICAgaWYgKHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjb3VudHJpZXNGaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihlbGVtID0+IHRoaXMuY29uc3RzLmdldENvdW50cmllcygpLmluY2x1ZGVzKGVsZW0uY29kZSkpXG4gICAgICAgICAgICBpZiAoY291bnRyaWVzRmlsdGVyZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHJpZXNGaWx0ZXJlZFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFbC9sb3MgY29kaWdvL3MgaW5ncmVzYWRvL3Mgbm8gY29pbmNpZGVuIGNvbiBsb3MgcHJvdmlzdG9zIGRlc2RlIGVsIGJhY2tlbmQnKVxuICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93Rm9ybUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gPSAhdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uKSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc0ZhY3R1cmFjaW9uJC5zdWJzY3JpYmUocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUocmVzWzBdLmNvZGUpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3ZpbmNpYVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5zZXRWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1swXT8ucHJvdmluY2VzWzBdLmNvZGVcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc0ZhY3R1cmFjaW9uU3ViamVjdC5uZXh0KHJlc1swXT8ucHJvdmluY2VzKVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChyZXNbMF0/LmRvY3VtZW50VHlwZXMpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpXG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKClcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgIH1cblxuICAgIG9uRm9ybVZhbGlkID0gKCkgPT4ge1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24gJiYgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52YWxpZGFkbyA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbGlkYWRvID0gZmFsc2VcbiAgICB9XG5cbiAgICBvbklucHV0Q2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9O1xuXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKG51bGwpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUoJycpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZENvdW50cnkgPSB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9Qcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHZhbHVlICYmIHZhbHVlICE9ICdudWxsJyA/XG4gICAgICAgICAgICB0aGlzLmNvdW50cmllc1N1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSkucHJvdmluY2VzXG4gICAgICAgICAgICA6XG4gICAgICAgICAgICBbXVxuICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHByb3ZpbmNlc1swXS5jb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIGlmIChkb2N1bWVudFR5cGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKGRvY3VtZW50VHlwZXNbMF0uY29kZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSBkb2N1bWVudFR5cGVzLmZpbmQoZG9jID0+IGRvYy5jb2RlID09IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBvbkNvdW50cnlTZWxlY3RlZEZhY3R1cmFjaW9uID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUobnVsbCk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKCcnKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcm92aW5jZXNcbiAgICAgICAgbGV0IHByb3ZpbmNlcyA9IHNlbGVjdGVkQ291bnRyeSA/IHNlbGVjdGVkQ291bnRyeS5wcm92aW5jZXMgOiBbXTtcbiAgICAgICAgdGhpcy5wcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChwcm92aW5jZXMpO1xuICAgICAgICBpZiAocHJvdmluY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUocHJvdmluY2VzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRG9jdW1lbnQgdHlwZXNcbiAgICAgICAgbGV0IGRvY3VtZW50VHlwZXMgPSBzZWxlY3RlZENvdW50cnkgPyBzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyA6IFtdO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QubmV4dChkb2N1bWVudFR5cGVzKTtcbiAgICAgICAgaWYgKGRvY3VtZW50VHlwZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShkb2N1bWVudFR5cGVzWzBdLmNvZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNlbGVjdGVkRG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlcy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZSk7XG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG5cbiAgICBvblByb3ZpbmNlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9ICh2YWx1ZSkgPT4gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10uc2V0VmFsdWUodmFsdWUgPT0gJ251bGwnID8gbnVsbCA6IHZhbHVlKTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZSh2YWx1ZSA9PSAnJyA/ICcnIDogdmFsdWUpO1xuXG4gICAgICAgIGxldCBzZWxlY3RlZERvY3VtZW50VHlwZSA9IHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb24oc2VsZWN0ZWREb2N1bWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24gPSAodmFsdWUpID0+IHtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uc2V0VmFsdWUodmFsdWUgPT0gJycgPyAnJyA6IHZhbHVlKTtcblxuICAgICAgICBsZXQgc2VsZWN0ZWREb2N1bWVudFR5cGUgPSB0aGlzLmRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUuZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gdmFsdWUpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZERvY3VtZW50VHlwZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEb2N1bWVudFZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZERvY3VtZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbCA9IChkb2N1bWVudFR5cGVzOiBhbnlbXSkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnZhbHVlO1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY3VycmVudCk/Lm5hbWUgfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0U2VsZWN0ZWREb2N1bWVudFR5cGVMYWJlbEZhY3R1cmFjaW9uID0gKGRvY3VtZW50VHlwZXM6IGFueVtdKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50VHlwZXM/LmZpbmQoZG9jID0+IGRvYy5jb2RlID09IGN1cnJlbnQpPy5uYW1lIHx8ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkID0gKCkgPT5cbiAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpPy52aWV3Rm9ybXM/LnBvc3Rjb2RlPy5lbmFibGVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldEJhc2VQb3N0YWxDb2RlUmVxdWlyZWQgPSAoKSA9PlxuICAgICAgICB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCk/LnZpZXdGb3Jtcz8ucG9zdGNvZGU/LnJlcXVpcmVkID8/IHRydWU7XG5cbiAgICBwcml2YXRlIGdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZ2V0QmFzZVBvc3RhbENvZGVFbmFibGVkKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2aXNpYmxlLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHZpc2libGUgJiYgdGhpcy5nZXRCYXNlUG9zdGFsQ29kZVJlcXVpcmVkKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVDb3VudHJ5QnlDb2RlID0gKGNvZGU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgaWYgKCFjb2RlKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjb3VudHJ5RnJvbVN1YmplY3RzID0gW1xuICAgICAgICAgICAgLi4uKHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZSB8fCBbXSksXG4gICAgICAgICAgICAuLi4odGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QudmFsdWUgfHwgW10pXG4gICAgICAgIF0uZmluZChjb3VudHJ5ID0+IGNvdW50cnkuY29kZSA9PSBjb2RlKTtcblxuICAgICAgICByZXR1cm4gY291bnRyeUZyb21TdWJqZWN0c1xuICAgICAgICAgICAgfHwgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gY29kZSlcbiAgICAgICAgICAgIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUgPSAoc2VsZWN0ZWRDb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZENvdW50cnkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZENvdW50cnkuY2hlY2tvdXRSZXF1aXJlZEZpZWxkcyB8fCBzZWxlY3RlZENvdW50cnkuaXNQb3N0YWxDb2RlTnVtZXJpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb3VudHJ5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZUNvdW50cnlCeUNvZGUoc2VsZWN0ZWRDb3VudHJ5LmNvZGUgfHwgc2VsZWN0ZWRDb3VudHJ5LmNvdW50cnlDb2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZSA9IChjb3VudHJ5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY2hlY2tvdXRQb3N0YWxDb2RlID0gY291bnRyeT8uY2hlY2tvdXRSZXF1aXJlZEZpZWxkcz8ucG9zdGFsQ29kZTtcblxuICAgICAgICBpZiAoY2hlY2tvdXRQb3N0YWxDb2RlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoZWNrb3V0UG9zdGFsQ29kZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdmlzaWJsZTogdHJ1ZSwgcmVxdWlyZWQ6IHRydWUgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgIH1cblxuICAgIGlzUG9zdGFsQ29kZUZpZWxkVmlzaWJsZSA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVWaXNpYmxlRmFjdHVyYWNpb24gOiB0aGlzLnBvc3RhbENvZGVWaXNpYmxlO1xuXG4gICAgaXNQb3N0YWxDb2RlRmllbGRSZXF1aXJlZCA9IChiaWxsaW5nOiBib29sZWFuID0gZmFsc2UpID0+XG4gICAgICAgIGJpbGxpbmcgPyB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZEZhY3R1cmFjaW9uIDogdGhpcy5wb3N0YWxDb2RlUmVxdWlyZWQ7XG5cbiAgICBzaG91bGRTaG93UG9zdGFsQ29kZUJ5Q291bnRyeUNvZGUgPSAoY29kZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUJ5Q29kZShjb2RlKTtcblxuICAgICAgICBpZiAoIWNvdW50cnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpLnZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZXNvbHZlUG9zdGFsQ29kZUZpZWxkU3RhdGUoY291bnRyeSkudmlzaWJsZTtcbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXT8uZGlzYWJsZWQgfHwgdGhpcy5mb3JtUmVhZG9ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW47XG4gICAgICAgIGlmICh0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVEb2N1bWVudFR5cGVEcm9wZG93bkZhY3R1cmFjaW9uID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSAhdGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuO1xuICAgICAgICBpZiAodGhpcy5kb2N1bWVudFR5cGVGYWN0RHJvcGRvd25PcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VsZWN0RG9jdW1lbnRUeXBlID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddPy5kaXNhYmxlZCB8fCB0aGlzLmZvcm1SZWFkb25seSkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGNvZGUpO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNlbGVjdERvY3VtZW50VHlwZUZhY3R1cmFjaW9uID0gKGNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10/LmRpc2FibGVkIHx8IHRoaXMuZm9ybVJlYWRvbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkRmFjdHVyYWNpb24oY29kZSk7XG4gICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlRmFjdERyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgICBjbG9zZURvY3VtZW50RHJvcGRvd25zKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZURyb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRvY3VtZW50VHlwZUZhY3REcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSA9IGFzeW5jIChlLCBpdGVtcykgPT4ge1xuICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHtcbiAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uc2V0VmFsdWUoZSk7XG4gICAgICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUgfSk7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCl7XG4gICAgICAgICAgICAvLyAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgIGlmICghaXRlbS5sb3RbMF0pe1xuICAgICAgICAgICAgLy8gICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAsdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXVsndmFsdWUnXSsgJyAtICcgKyB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snc3RyZWV0J11bJ3ZhbHVlJ10sICduZXdsb3QnKTtcbiAgICAgICAgICAgIC8vICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgfSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB0aGlzLmVtaXRSZXN1bHQoKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7XG4gICAgfVxuXG4gICAgc2hvd0Vycm9yID0gKGVycm9yX21lc3NhZ2UpID0+IHsgdGhpcy50b2FzdC5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHJldmlvdXNUb3RhbHMgPSB7IC4uLnRoaXMubGFzdFN1bW1hcnlUb3RhbHNTbmFwc2hvdCB9O1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBsZXQgZGF0YTogYW55ID0geyBzaGlwcGluZ0FkZHJlc3M6IHsgLi4udGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKSwgcGhvbmVOdW1iZXI6IHRoaXMuY2hlY2tvdXRGb3JtLnZhbHVlLnBob25lTnVtYmVyLnRvU3RyaW5nKCkgfSwgbm90ZXM6ICh0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpKS5ub3RlcyB9O1xuICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhkYXRhKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVfbG9naW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnZW1haWxfYWxyZWFkeV9yZWdpc3RlcmVkJylcblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0ICE9PSBmYWxzZSAmJiByZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b3RhbHNDaGFuZ2VkID0gdGhpcy5oYXZlVG90YWxzQ2hhbmdlZChwcmV2aW91c1RvdGFscywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRUZW1wb3JhcnlBZGRyZXNzRnJvbUZvcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzRHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIEd1ZXN0cyBtdXN0IGJlIGFibGUgdG8gcmVvcGVuIHN0ZXAgMSBhbmQgZWRpdCB0aGVpciBhZGRyZXNzLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgdGhpcy5uZXh0U3RlcCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dFN0ZXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvcGVuTW9kYWwodGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgICAgICAgdGhpcy5tb2RhbFJlZiA9IHRoaXMubW9kYWxTZXJ2aWNlLnNob3codGVtcGxhdGUsIHsgY2xhc3M6ICdtb2RhbC1sZyAnLCBrZXlib2FyZDogZmFsc2UsIGJhY2tkcm9wOiAnc3RhdGljJyB9KTtcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzID0gKGFkZHJlc3NTZWxlY3Q6IGFueSkgPT4ge1xuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPT09IGFkZHJlc3NTZWxlY3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdCAmJiB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaXNUZW1wb3JhcnkgJiYgYWRkcmVzc1NlbGVjdC5pZCAhPT0gdGhpcy5zZWxlY3RlZEFkZHJlc3MuaWQpIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGVtcG9yYXJ5QWRkcmVzcygpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBhZGRyZXNzU2VsZWN0Py5pZDtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkID0gU3RyaW5nKGFkZHJlc3MuaWQpID09PSBTdHJpbmcoc2VsZWN0ZWRJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBzZWxlY3RlZEFkZHJlc3M/LmlkIHx8IDA7XG4gICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbHlTZWxlY3RlZEFkZHJlc3Moc2VsZWN0ZWRBZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBLZWVwIHRoZSBmb3JtIHJlYWQtb25seSB3aGlsZSBicm93c2luZyBzYXZlZCBhZGRyZXNzZXMgaW4gc2luZ2xlIG1vZGUuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgc2VsZWN0ZWRJdGVtOiBhbnksXG4gICAgICAgIGZvcm1Db250cm9sTmFtZTogc3RyaW5nLFxuICAgICAgICBmb3JtOiBhbnksXG4gICAgICAgIGVycm9yTWVzc2FnZVZhcjogc3RyaW5nLFxuICAgICAgICBpc051bWVyaWNLZXk6IHN0cmluZyxcbiAgICAgICAgZXJyb3JLZXlQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW4gPSB0cnVlXG4gICAgKSB7XG4gICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaXNOdW1lcmljID0gc2VsZWN0ZWRJdGVtW2lzTnVtZXJpY0tleV0gPz8gZmFsc2U7XG4gICAgICAgIGNvbnN0IHBhdHRlcm4gPSBpc051bWVyaWMgPyAvXlxcZCskLyA6IC8uKi87XG4gICAgICAgIHRoaXNbZXJyb3JNZXNzYWdlVmFyXSA9IGlzTnVtZXJpYyA/IGAke2Vycm9yS2V5UHJlZml4fS5udW1lcmljYCA6IGAke2Vycm9yS2V5UHJlZml4fS5kZWZhdWx0YDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gcmVxdWlyZWQgPyBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5wYXR0ZXJuKHBhdHRlcm4pXSA6IFtWYWxpZGF0b3JzLnBhdHRlcm4ocGF0dGVybildO1xuICAgICAgICBmb3JtLmNvbnRyb2xzW2Zvcm1Db250cm9sTmFtZV0uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgZm9ybS5jb250cm9sc1tmb3JtQ29udHJvbE5hbWVdLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG5cbiAgICB1cGRhdGVQb3N0YWxDb2RlVmFsaWRhdGlvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGUgPSB2aXNpYmxlO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVSZXF1aXJlZCA9IHJlcXVpcmVkO1xuICAgICAgICB0aGlzLnBvc3RhbENvZGVFcnJvck1lc3NhZ2UgPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgdXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb25GYWN0dXJhY2lvbihzZWxlY3RlZENvdW50cnk6IGFueSkge1xuICAgICAgICBjb25zdCBjb3VudHJ5ID0gdGhpcy5yZXNvbHZlQ291bnRyeUZvclBvc3RhbENvZGUoc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgY29uc3QgeyB2aXNpYmxlLCByZXF1aXJlZCB9ID0gY291bnRyeVxuICAgICAgICAgICAgPyB0aGlzLnJlc29sdmVQb3N0YWxDb2RlRmllbGRTdGF0ZShjb3VudHJ5KVxuICAgICAgICAgICAgOiB0aGlzLmdldERlZmF1bHRQb3N0YWxDb2RlRmllbGRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBpc051bWVyaWMgPSBjb3VudHJ5Py5pc1Bvc3RhbENvZGVOdW1lcmljID8/IGZhbHNlO1xuICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW107XG5cbiAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICB2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmlzaWJsZSAmJiBpc051bWVyaWMpIHtcbiAgICAgICAgICAgIHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4oL15cXGQrJC8pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVZpc2libGVGYWN0dXJhY2lvbiA9IHZpc2libGU7XG4gICAgICAgIHRoaXMucG9zdGFsQ29kZVJlcXVpcmVkRmFjdHVyYWNpb24gPSByZXF1aXJlZDtcbiAgICAgICAgdGhpcy5wb3N0YWxDb2RlRXJyb3JNZXNzYWdlRmFjdHVyYWNpb24gPSBpc051bWVyaWNcbiAgICAgICAgICAgID8gJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IubnVtZXJpYydcbiAgICAgICAgICAgIDogJ3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3IuZGVmYXVsdCc7XG5cbiAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvY3VtZW50VHlwZTogYW55KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsaWRhdGlvbihcbiAgICAgICAgICAgIHNlbGVjdGVkRG9jdW1lbnRUeXBlLFxuICAgICAgICAgICAgJ2RvY3VtZW50TnVtYmVyJyxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLFxuICAgICAgICAgICAgJ2RvY3VtZW50RXJyb3JNZXNzYWdlJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbkZhY3R1cmFjaW9uKHNlbGVjdGVkRG9jdW1lbnRUeXBlOiBhbnkpIHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWxpZGF0aW9uKFxuICAgICAgICAgICAgc2VsZWN0ZWREb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAnZG9jdW1lbnROdW1iZXInLFxuICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbixcbiAgICAgICAgICAgICdkb2N1bWVudEVycm9yTWVzc2FnZUZhY3R1cmFjaW9uJyxcbiAgICAgICAgICAgICdpc051bWVyaWMnLFxuICAgICAgICAgICAgJ2RvY3VtZW50LXBhdHRlcm4tZXJyb3InLFxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudE51bWJlci5yZXF1aXJlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMsIHNob3dOb3Rlc0Vycm9yOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jYW5Db21wbGV0ZUxlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkge1xuICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgaWYgKHNob3dOb3Rlc0Vycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdyZXF1aXJlZC1maWVsZHMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJylcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBheWxvYWQgPSB0aGlzLmNvbXBhY3RBZGRyZXNzVmlld1xuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkLFxuICAgICAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogc2VsZWN0ZWRQYXlsb2FkLFxuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlcihyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3MuY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZS5zaGlwcGluZ0FkZHJlc3Muc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICAgICAgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldE1vZGUgPSAoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcykge1xuICAgICAgICAgICAgY2FzZSAnT05MWV9MT0FEX0FERFJFU1MnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICBjYXNlICdPTkxZX0FERFJFU1NfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIGNhc2UgJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgc2V0TW9kZSA9IChtb2RlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gbW9kZSA9PSBcImNhcmdhXCI7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldENoZWNrb3V0Rm9ybVJlYWRvbmx5KHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmICF0aGlzLmdldE1vZGUoKSk7XG4gICAgICAgIHRoaXMuZXZhbHVhdGVEaXJ0eVN0YXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0TW9kZUZhY3R1cmFjaW9uID0gKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpXG4gICAgICAgICAgICBjYXNlICdMT0FEX0FERFJFU1NfQU5EX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKCkgPyB0aGlzLnNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA6IHRydWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldE1vZGVGYWN0dXJhY2lvbiA9IChtb2RlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzRmFjdHVyYWNpb24gPSBtb2RlID09PSAnY2FyZ2EnO1xuICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB0aGlzLmV2YWx1YXRlRGlydHlTdGF0ZSgpO1xuICAgIH1cblxuICAgIHNldFNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IChhZGRyZXNzU2VsZWN0OiBhbnkpID0+IHtcbiAgICAgICAgKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZvckVhY2goYWRkcmVzcyA9PiB7XG4gICAgICAgICAgICBhZGRyZXNzLnNlbGVjdGVkRmFjdHVyYWNpb24gPSBTdHJpbmcoYWRkcmVzcy5pZCkgPT09IFN0cmluZyhhZGRyZXNzU2VsZWN0Py5pZCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9ICh0aGlzLmFkZHJlc3NCb29rIHx8IFtdKS5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZEZhY3R1cmFjaW9uKT8uaWQgfHwgMDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQWRkcmVzc0Zyb21Cb29rID0gKGJvb2tBZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgY29udGFjdCA9IGJvb2tBZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogY29udGFjdC5maXJzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogY29udGFjdC5sYXN0TmFtZSB8fCAnJyxcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgZW1haWw6IGNvbnRhY3QuZW1haWwgfHwgJycsXG4gICAgICAgICAgICBkb2N1bWVudFR5cGU6IGNvbnRhY3QuZG9jdW1lbnRUeXBlIHx8ICcnLFxuICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXIgfHwgJycsXG4gICAgICAgICAgICBjb3VudHJ5Q29kZTogYm9va0FkZHJlc3MuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGJvb2tBZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgIGNpdHk6IGJvb2tBZGRyZXNzLmNpdHksXG4gICAgICAgICAgICBzdHJlZXQ6IGJvb2tBZGRyZXNzLnN0cmVldCxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBib29rQWRkcmVzcy5wb3N0Y29kZT8udG9TdHJpbmcoKSB8fCAnJ1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhhbmRsZUJpbGxpbmdGb3JtU3VibWl0ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5nZXRNb2RlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmVyaWZ5VmFsaWRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3MgPSBhc3luYyAoaXRlbXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdGhpcy5uZXh0U3RlcCgpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3Qgbm90ZXNDZmcgPSB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzO1xuICAgICAgICBpZiAobm90ZXNDZmcucmVxdWlyZWQgJiYgKCF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgIXRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3Rlcy50cmltKCkpKSB7XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnNob3coJ3JlcXVpcmVkLWZpZWxkcycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZCA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWQpO1xuICAgICAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQuaWQgPSBhZGRyZXNzU2VsZWN0ZWQuaWQgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzSWQ6IGFkZHJlc3NTZWxlY3RlZC5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICAgICAgbm90ZXM6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyB8fCBcIlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0U2VkZSA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0SGVhZHF1YXJ0ZXJCeUlkcyhyZXF1ZXN0KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0U2VkZSkgeyB0aGlzLnRvYXN0LnNob3coJ29wZXJhdGlvbi1lcnJvcicpOyByZXR1cm47IH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlLmNoYW5uZWxDb25maWcuYXBwbHlPcmRlckxvdCkge1xuICAgICAgICAgICAgICAgIChpdGVtcyB8fCBbXSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsIDAsIGl0ZW0udmFyaWFudF9pZCwgMCwgaXRlbS5pdGVtX2lkLCBpdGVtLnF1YW50aXR5LCBpdGVtLnByb2R1Y3QucHJpY2UsIGl0ZW0ucXVhbnRpdHksIGl0ZW0uZGlzY291bnQsIGl0ZW0ucHJvZHVjdC5wcmljZSAqIGl0ZW0ucXVhbnRpdHksICduZXcnLCAnJywgJycsIDAsIHJlc3VsdFNlZGU/LnNoaXBwaW5nQWRkcmVzcz8uY2l0eSArICcgLSAnICsgcmVzdWx0U2VkZT8uc2hpcHBpbmdBZGRyZXNzPy5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgY29uc3QgdG90YWxzQ2hhbmdlZCA9IHRoaXMuaGF2ZVRvdGFsc0NoYW5nZWQocHJldmlvdXNUb3RhbHMsIHJlc3VsdFNlZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3ICYmIHRoaXMubmV4dFN0ZXApIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7IHRvdGFsc0NoYW5nZWQgJiYgdGhpcy5zY3JvbGxUb0xlZ2FjeVN1bW1hcnkoKTsgcmV0dXJuOyB9XG4gICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICBvblNlbGVjdEFkZHJlc3NGYWN0dXJhY2lvbiA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBjb25zdCBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbiA9IHRoaXMuYWRkcmVzc0Jvb2suZmluZChhZGRyZXNzID0+IGFkZHJlc3Muc2VsZWN0ZWRGYWN0dXJhY2lvbik7XG4gICAgICAgIGNvbnN0IGFkZHJlc3NTZWxlY3RlZEVudmlvID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKGFkZHJlc3MgPT4gYWRkcmVzcy5zZWxlY3RlZCk7XG4gICAgICAgIGlmICghYWRkcmVzc1NlbGVjdGVkRmFjdHVyYWNpb24gfHwgIWFkZHJlc3NTZWxlY3RlZEVudmlvKSB7IHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKTsgcmV0dXJuOyB9XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVG90YWxzID0geyAuLi50aGlzLmxhc3RTdW1tYXJ5VG90YWxzU25hcHNob3QgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZEVudmlvLmlkIHx8IDA7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCA9IGFkZHJlc3NTZWxlY3RlZEZhY3R1cmFjaW9uLmlkIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRFbnZpby5pZCxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc0lkOiBhZGRyZXNzU2VsZWN0ZWRGYWN0dXJhY2lvbi5pZCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8IFwiXCJcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHRTZWRlID0gYXdhaXQgdGhpcy5hZGRyZXNzaW5nU2VydmljZS5zZXRIZWFkcXVhcnRlckJ5SWRzKHJlcXVlc3QpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHRTZWRlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IHJldHVybjsgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2FydFNlcnZpY2UuY2hhbm5lbENvbmZpZy5hcHBseU9yZGVyTG90KSB7XG4gICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubG90WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvTG90KGl0ZW0ucHJvZHVjdCwgMCwgaXRlbS52YXJpYW50X2lkLCAwLCBpdGVtLml0ZW1faWQsIGl0ZW0ucXVhbnRpdHksIGl0ZW0ucHJvZHVjdC5wcmljZSwgaXRlbS5xdWFudGl0eSwgaXRlbS5kaXNjb3VudCwgaXRlbS5wcm9kdWN0LnByaWNlICogaXRlbS5xdWFudGl0eSwgJ25ldycsICcnLCAnJywgMCwgYWRkcmVzc1NlbGVjdGVkRW52aW8uY2l0eSArICcgLSAnICsgYWRkcmVzc1NlbGVjdGVkRW52aW8uc3RyZWV0LCAnbmV3bG90Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmFsbHJlYWR5X2RhdGEgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHRTZWRlKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSkgeyB0b3RhbHNDaGFuZ2VkICYmIHRoaXMuc2Nyb2xsVG9MZWdhY3lTdW1tYXJ5KCk7IHJldHVybjsgfVxuICAgICAgICAgICAgZWxzZSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICB9IGNhdGNoIChlKSB7IHRoaXMudG9hc3Quc2hvdygnb3BlcmF0aW9uLWVycm9yJyk7IH1cbiAgICAgICAgZmluYWxseSB7IHRoaXMubG9hZGluZyA9IGZhbHNlOyB9XG4gICAgfVxuXG4gICAgb25TdWJtaXROZXdCaWxsaW5nQWRkcmVzcyA9IGFzeW5jIChpdGVtcykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHsgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpOyByZXR1cm47IH1cbiAgICAgICAgY29uc3QgYWRkcmVzc1NlbGVjdGVkRW52aW8gPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoYWRkcmVzcyA9PiBhZGRyZXNzLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzU2VsZWN0ZWRFbnZpbykgeyB0aGlzLnNob3dFcnJvcignaW52YWxpZC1mb3JtJyk7IHJldHVybjsgfVxuICAgICAgICBjb25zdCBwcmV2aW91c1RvdGFscyA9IHsgLi4udGhpcy5sYXN0U3VtbWFyeVRvdGFsc1NuYXBzaG90IH07XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBiaWxsaW5nRm9ybURhdGEgPSB7IC4uLnRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICAgICAgYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlID0gYmlsbGluZ0Zvcm1EYXRhLnBvc3Rjb2RlPy50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgYWRkcmVzc0RhdGEgPSB7XG4gICAgICAgICAgICAgICAgc2hpcHBpbmdBZGRyZXNzOiB0aGlzLmJ1aWxkQWRkcmVzc0Zyb21Cb29rKGFkZHJlc3NTZWxlY3RlZEVudmlvKSxcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzczogYmlsbGluZ0Zvcm1EYXRhLFxuICAgICAgICAgICAgICAgIG5vdGVzOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgfHwgXCJcIlxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYWRkcmVzc2luZ1NlcnZpY2Uuc2V0QWRkcmVzcyhhZGRyZXNzRGF0YSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVxdWlyZV9sb2dpbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdC5zaG93KCdlbWFpbF9hbHJlYWR5X3JlZ2lzdGVyZWQnKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKGl0ZW1zIHx8IFtdKS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLmxvdFswXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FydFNlcnZpY2UuYWRkVG9Mb3QoaXRlbS5wcm9kdWN0LCAwLCBpdGVtLnZhcmlhbnRfaWQsIDAsIGl0ZW0uaXRlbV9pZCwgaXRlbS5xdWFudGl0eSwgaXRlbS5wcm9kdWN0LnByaWNlLCBpdGVtLnF1YW50aXR5LCBpdGVtLmRpc2NvdW50LCBpdGVtLnByb2R1Y3QucHJpY2UgKiBpdGVtLnF1YW50aXR5LCAnbmV3JywgJycsICcnLCAwLCBhZGRyZXNzU2VsZWN0ZWRFbnZpby5jaXR5ICsgJyAtICcgKyBhZGRyZXNzU2VsZWN0ZWRFbnZpby5zdHJlZXQsICduZXdsb3QnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybV9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNhdmVkU3RhdGVGcm9tQ3VycmVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsc0NoYW5nZWQgPSB0aGlzLmhhdmVUb3RhbHNDaGFuZ2VkKHByZXZpb3VzVG90YWxzLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiB0aGlzLm5leHRTdGVwKSB7IHRoaXMubmV4dFN0ZXAoKTsgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0KCkpIHsgdG90YWxzQ2hhbmdlZCAmJiB0aGlzLnNjcm9sbFRvTGVnYWN5U3VtbWFyeSgpOyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICBlbHNlIHsgdGhpcy5uZXh0U3RlcCgpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy50b2FzdC5zaG93KCdvcGVyYXRpb24tZXJyb3InKTsgfVxuICAgICAgICBmaW5hbGx5IHsgdGhpcy5sb2FkaW5nID0gZmFsc2U7IH1cbiAgICB9XG5cbiAgICB0b2dnbGVBZGRyZXNzRHJvcGRvd24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuYWRkcmVzc0Ryb3Bkb3duT3BlbiA9ICF0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW47XG4gICAgfVxuXG4gICAgc2VsZWN0QWRkcmVzc0Zyb21Ecm9wZG93biA9IChhZGRyZXNzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3MpO1xuICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ldmFsdWF0ZURpcnR5U3RhdGUoKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGlvbk5vdGVzQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkQXV0b1NlbGVjdEFkZHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RBZGRyZXNzKHRoaXMuY2FydFNlcnZpY2UuZ2V0Q2FydDIoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRTZWxlY3RlZEFkZHJlc3NMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgYWRkcmVzcyA9IHRoaXMuc2VsZWN0ZWRBZGRyZXNzIHx8IHRoaXMuYWRkcmVzc0Jvb2s/LmZpbmQoaXRlbSA9PiBpdGVtLnNlbGVjdGVkKTtcbiAgICAgICAgaWYgKCFhZGRyZXNzKSByZXR1cm4gdGhpcy5nZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCgpO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgY29uc3QgbWFpbiA9IFtuYW1lLCBhZGRyZXNzLnN0cmVldCwgYWRkcmVzcy5jaXR5XS5maWx0ZXIoQm9vbGVhbikuam9pbignIC0gJyk7XG4gICAgICAgIHJldHVybiBtYWluIHx8IHRoaXMuZ2V0RGVmYXVsdFNlbGVjdGVkTGFiZWwoKTtcbiAgICB9XG5cbiAgICBnZXRBZGRyZXNzT3B0aW9uTGFiZWwgPSAoYWRkcmVzczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzPy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgY29uc3QgbmFtZSA9IFtjb250YWN0LmZpcnN0TmFtZSwgY29udGFjdC5sYXN0TmFtZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBhZGRyZXNzPy5zdHJlZXQsIGFkZHJlc3M/LmNpdHldLmZpbHRlcihCb29sZWFuKS5qb2luKCcgLSAnKTtcbiAgICB9XG5cbiAgICBnZXREZWZhdWx0U2VsZWN0ZWRMYWJlbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGFjdEFkZHJlc3NWaWV3KSByZXR1cm4gJyc7XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGggPyAodGhpcy5hZGRyZXNzQm9va1swXT8uc3RyZWV0IHx8ICcnKSA6ICcnO1xuICAgIH1cblxuICAgIGdldENvdW50cnkgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQocGFpc2VzID0+IHBhaXNlcy5jb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpKSk/Lm5hbWUgfHwgXCJcIlxuXG4gICAgZ2V0UHJvdmluY2UgPSAoY29kZSkgPT4gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZChjdCA9PiBjdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldERvY3VtZW50VHlwZSA9IChjb2RlKSA9PiB0aGlzLmFkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZChkdCA9PiBkdC5jb2RlID09IGNvZGUpPy5uYW1lIHx8IFwiXCJcblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSA9ICgpID0+IHRoaXMuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlID0gKG5hbWVQYXJhbSkgPT4gdGhpcy5oYXNQYXJhbXModGhpcy5wYXJhbXMsIG5hbWVQYXJhbSArIHRoaXMuY29uc3RzLmdldENoYW5uZWwoKSArICdfJyArIHRoaXMuY29uc3RzLmdldExvY2FsZSgpLnNwbGl0KCdfJylbMF0pXG5cbiAgICBnZXRGaWx0ZXJlZEFkZHJlc3NCb29rID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuYWRkcmVzc0Jvb2sgfHwgIXRoaXMuYWRkcmVzc0Jvb2subGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVybSA9ICh0aGlzLmFkZHJlc3NTZWFyY2ggfHwgJycpLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgICAgICBpZiAoIXRlcm0pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhY3QgPSBhZGRyZXNzLmFkZHJlc3NDb250YWN0IHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgaGF5c3RhY2sgPSBbXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJlZXQsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jaXR5LFxuICAgICAgICAgICAgICAgIGFkZHJlc3MucG9zdGNvZGUsXG4gICAgICAgICAgICAgICAgYWRkcmVzcy5jb3VudHJ5Q29kZSxcbiAgICAgICAgICAgICAgICBhZGRyZXNzLnByb3ZpbmNlQ29kZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvdW50cnkoYWRkcmVzcy5jb3VudHJ5Q29kZSksXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQcm92aW5jZShhZGRyZXNzLnByb3ZpbmNlQ29kZSksXG4gICAgICAgICAgICAgICAgY29udGFjdC5maXJzdE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGFjdC5sYXN0TmFtZSxcbiAgICAgICAgICAgICAgICBjb250YWN0LmVtYWlsXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcgJylcbiAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcyh0ZXJtKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0RmlsdGVyZWRBZGRyZXNzT3B0aW9ucyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyZWRBZGRyZXNzQm9vaygpLm1hcChhZGRyZXNzID0+ICh7XG4gICAgICAgICAgICAuLi5hZGRyZXNzLFxuICAgICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0QWRkcmVzc09wdGlvbkxhYmVsKGFkZHJlc3MpXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBoYXNTZWxlY3RlZEFkZHJlc3MgPSAoKSA9PiAhIXRoaXMuYWRkcmVzc0Jvb2s/LnNvbWUoaXRlbSA9PiBpdGVtPy5zZWxlY3RlZCk7XG5cbiAgICBwcml2YXRlIGFwcGx5U2VsZWN0ZWRBZGRyZXNzID0gKGFkZHJlc3M6IGFueSkgPT4ge1xuICAgICAgICBpZiAoIWFkZHJlc3MpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEFkZHJlc3MgPSBhZGRyZXNzO1xuICAgICAgICBjb25zdCBjb250YWN0ID0gYWRkcmVzcy5hZGRyZXNzQ29udGFjdCB8fCB7fTtcbiAgICAgICAgdGhpcy5jaGVja291dEZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnLFxuICAgICAgICAgICAgbGFzdE5hbWU6IGNvbnRhY3QubGFzdE5hbWUgfHwgJycsXG4gICAgICAgICAgICBwaG9uZU51bWJlcjogY29udGFjdC5waG9uZU51bWJlciB8fCAnJyxcbiAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsIHx8IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnZhbHVlLFxuICAgICAgICAgICAgZG9jdW1lbnRUeXBlOiBjb250YWN0LmRvY3VtZW50VHlwZSB8fCAnJyxcbiAgICAgICAgICAgIGRvY3VtZW50TnVtYmVyOiBjb250YWN0LmRvY3VtZW50TnVtYmVyIHx8ICcnLFxuICAgICAgICAgICAgc3RyZWV0OiBhZGRyZXNzLnN0cmVldCB8fCAnJyxcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhZGRyZXNzLmNvdW50cnlDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBjaXR5OiBhZGRyZXNzLmNpdHkgfHwgJycsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGFkZHJlc3MucHJvdmluY2VDb2RlIHx8IG51bGwsXG4gICAgICAgICAgICBwb3N0Y29kZTogYWRkcmVzcy5wb3N0Y29kZSB8fCAnJyxcbiAgICAgICAgfSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQ291bnRyeSA9IHRoaXMuY291bnRyaWVzU3ViamVjdC52YWx1ZS5maW5kKGNvdW50cnkgPT4gY291bnRyeS5jb2RlID09IGFkZHJlc3MuY291bnRyeUNvZGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWRDb3VudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uKHNlbGVjdGVkQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRUeXBlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkuZG9jdW1lbnRUeXBlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3RlZERvYyA9IHNlbGVjdGVkQ291bnRyeT8uZG9jdW1lbnRUeXBlcz8uZmluZChkb2MgPT4gZG9jLmNvZGUgPT0gY29udGFjdC5kb2N1bWVudFR5cGUpO1xuICAgICAgICBpZiAoc2VsZWN0ZWREb2MpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9jdW1lbnRWYWxpZGF0aW9uKHNlbGVjdGVkRG9jKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0Q2hlY2tvdXRGb3JtUmVhZG9ubHkodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKTtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDaGVja291dEZvcm1SZWFkb25seSA9IChyZWFkb25seTogYm9vbGVhbikgPT4ge1xuICAgICAgICB0aGlzLmZvcm1SZWFkb25seSA9IHJlYWRvbmx5O1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzW2tleV07XG4gICAgICAgICAgICByZWFkb25seSA/IGNvbnRyb2wuZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSkgOiBjb250cm9sLmVuYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmF1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKS5kaXNhYmxlKHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRBdXRvU2VsZWN0QWRkcmVzcyA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyB8fCB0aGlzLmdldE1vZGUoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEFkZHJlc3M/LmlzVGVtcG9yYXJ5KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IG5vdGVzQ2ZnID0gdGhpcy5hZGRyZXNzaW5nU2VydmljZS5nZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3RlcztcbiAgICAgICAgaWYgKG5vdGVzQ2ZnLnJlcXVpcmVkICYmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICF0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMudHJpbSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVGVtcG9yYXJ5QWRkcmVzc0Zyb21Gb3JtID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWN0ID0gdGhpcy5jaGVja291dEZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgICAgY29uc3QgbmV3QWRkcmVzcyA9IHtcbiAgICAgICAgICAgIGlkOiAtMSAqICgrK3RoaXMudGVtcEFkZHJlc3NJZCksXG4gICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzVGVtcG9yYXJ5OiB0cnVlLFxuICAgICAgICAgICAgc3RyZWV0OiBjb250YWN0LnN0cmVldCxcbiAgICAgICAgICAgIGNpdHk6IGNvbnRhY3QuY2l0eSxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBjb250YWN0LnBvc3Rjb2RlLFxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGNvbnRhY3QuY291bnRyeUNvZGUsXG4gICAgICAgICAgICBwcm92aW5jZUNvZGU6IGNvbnRhY3QucHJvdmluY2VDb2RlLFxuICAgICAgICAgICAgYWRkcmVzc0NvbnRhY3Q6IHtcbiAgICAgICAgICAgICAgICBmaXJzdE5hbWU6IGNvbnRhY3QuZmlyc3ROYW1lLFxuICAgICAgICAgICAgICAgIGxhc3ROYW1lOiBjb250YWN0Lmxhc3ROYW1lLFxuICAgICAgICAgICAgICAgIGVtYWlsOiBjb250YWN0LmVtYWlsLFxuICAgICAgICAgICAgICAgIHBob25lTnVtYmVyOiBjb250YWN0LnBob25lTnVtYmVyLFxuICAgICAgICAgICAgICAgIGRvY3VtZW50VHlwZTogY29udGFjdC5kb2N1bWVudFR5cGUsXG4gICAgICAgICAgICAgICAgZG9jdW1lbnROdW1iZXI6IGNvbnRhY3QuZG9jdW1lbnROdW1iZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkZHJlc3NCb29rID0gKHRoaXMuYWRkcmVzc0Jvb2sgfHwgW10pLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IFtcbiAgICAgICAgICAgIG5ld0FkZHJlc3MsXG4gICAgICAgICAgICAuLi50aGlzLmFkZHJlc3NCb29rLm1hcChhZGRyZXNzID0+ICh7IC4uLmFkZHJlc3MsIHNlbGVjdGVkOiBmYWxzZSB9KSlcbiAgICAgICAgXTtcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gbmV3QWRkcmVzcy5pZDtcbiAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhuZXdBZGRyZXNzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbW92ZVRlbXBvcmFyeUFkZHJlc3MgPSAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9vaz8ubGVuZ3RoKSByZXR1cm47XG4gICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPSB0aGlzLmFkZHJlc3NCb29rLmZpbHRlcihhZGRyZXNzID0+ICFhZGRyZXNzLmlzVGVtcG9yYXJ5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkQ3VycmVudFN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb21wYWN0QWRkcmVzc1ZpZXcgJiYgIXRoaXMuZ2V0TW9kZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG1vZGU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCB8fCB0aGlzLnNlbGVjdGVkQWRkcmVzcz8uaWQgfHwgMCxcbiAgICAgICAgICAgICAgICBub3RlczogdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzIHx8ICcnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBtb2RlOiAnZm9ybScsXG4gICAgICAgICAgICBmb3JtOiB0aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLFxuICAgICAgICAgICAgYmlsbGluZzogdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID8gbnVsbCA6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSxcbiAgICAgICAgICAgIHZpZXdEYXRhRmFjdHVyYWNpb246IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvblxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGlydHlTdGF0ZSA9IChuZXh0RGlydHk6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNEaXJ0eSA9PT0gbmV4dERpcnR5KSByZXR1cm47XG4gICAgICAgIHRoaXMuaXNEaXJ0eSA9IG5leHREaXJ0eTtcbiAgICAgICAgaWYgKG5leHREaXJ0eSAmJiB0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJ0eUNoYW5nZS5lbWl0KHRoaXMuaXNEaXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTYXZlZFN0YXRlRnJvbUN1cnJlbnQgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMubGFzdFNhdmVkU3RhdGUgPSB0aGlzLmJ1aWxkQ3VycmVudFN0YXRlKCk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShmYWxzZSk7XG4gICAgICAgIGlmICh0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZXZhbHVhdGVEaXJ0eVN0YXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdXBwcmVzc0RpcnR5KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5sYXN0U2F2ZWRTdGF0ZSkgcmV0dXJuO1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5idWlsZEN1cnJlbnRTdGF0ZSgpO1xuICAgICAgICBjb25zdCBuZXh0RGlydHkgPSBKU09OLnN0cmluZ2lmeShjdXJyZW50KSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5sYXN0U2F2ZWRTdGF0ZSk7XG4gICAgICAgIHRoaXMuc2V0RGlydHlTdGF0ZShuZXh0RGlydHkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5jYXJ0U2VydmljZT8uY2hhbm5lbENvbmZpZztcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJlxuICAgICAgICAgICAgdGhpcy5pc0xhc3RPbmUgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1NoaXBwaW5nU3RlcEFsbG93ZWQgJiZcbiAgICAgICAgICAgICEhY2hhbm5lbD8uaXNTa2lwcGluZ1BheW1lbnRTdGVwQWxsb3dlZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FuQ29tcGxldGVMZWdhY3lBZGRyZXNzT25seUNoZWNrb3V0ID0gKCkgPT4gdGhpcy5pc0xlZ2FjeUFkZHJlc3NPbmx5Q2hlY2tvdXQoKSAmJiB0aGlzLmFkZHJlc3NTeW5jZWRGb3JDb21wbGV0aW9uICYmICF0aGlzLmlzRGlydHk7XG5cbiAgICBnZXRQcmltYXJ5QWN0aW9uTGFiZWwgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNhbkNvbXBsZXRlTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuaXNMYXN0T25lICYmICF0aGlzLmlzTGVnYWN5QWRkcmVzc09ubHlDaGVja291dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2ZpbmlzaC1jaGVja291dCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogJ3JlYWR5LWZvcm0nO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RW1wdHlUb3RhbHNTbmFwc2hvdCA9ICgpOiBTdW1tYXJ5VG90YWxzU25hcHNob3QgPT4gKHtcbiAgICAgICAgc3VidG90YWw6IDAsXG4gICAgICAgIHRheGVzOiAwLFxuICAgICAgICBzaGlwcGluZzogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICAgIGNsaWVudFRheGVzOiAwLFxuICAgICAgICBwcm9tb3Rpb246IDAsXG4gICAgICAgIGl0ZW1zOiAwXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIGdldFN1bW1hcnlUb3RhbHNGcm9tQXNzb2NpYXRlZERhdGEgPSAoZGF0YTogYW55W10gfCBudWxsKTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLmdldEVtcHR5VG90YWxzU25hcHNob3QoKTtcbiAgICAgICAgaWYgKCFkYXRhPy5sZW5ndGgpIHJldHVybiBzbmFwc2hvdDtcbiAgICAgICAgZGF0YS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFtb3VudCA9IE51bWJlcihpdGVtPy5hbW91bnQgfHwgMCk7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0/LnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdWJ0b3RhbCc6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnN1YnRvdGFsID0gYW1vdW50O1xuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5pdGVtcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50YXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnc2hpcG1lbnQnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5zaGlwcGluZyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2xpZW50VGF4ZXMnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC5jbGllbnRUYXhlcyA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAndG90YWwnOlxuICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdC50b3RhbCA9IGFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzY291bnQnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2NvdXBvbic6XG4gICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LnByb21vdGlvbiArPSBhbW91bnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNuYXBzaG90O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlciA9IChvcmRlcjogYW55KTogU3VtbWFyeVRvdGFsc1NuYXBzaG90ID0+IHtcbiAgICAgICAgY29uc3QgdG90YWxzID0gb3JkZXI/LnRvdGFscyB8fCB7fTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1YnRvdGFsOiBOdW1iZXIodG90YWxzLnN1YnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgdGF4ZXM6IE51bWJlcih0b3RhbHMudGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBzaGlwcGluZzogTnVtYmVyKHRvdGFscy5zaGlwcGluZyB8fCAwKSxcbiAgICAgICAgICAgIHRvdGFsOiBOdW1iZXIodG90YWxzLnRvdGFsIHx8IDApLFxuICAgICAgICAgICAgY2xpZW50VGF4ZXM6IE51bWJlcih0b3RhbHMuY2xpZW50VGF4ZXMgfHwgMCksXG4gICAgICAgICAgICBwcm9tb3Rpb246IHRoaXMub3JkZXJVdGlscy5nZXRTdW1tYXJ5UHJvbW90aW9uQW1vdW50KG9yZGVyKSxcbiAgICAgICAgICAgIGl0ZW1zOiBOdW1iZXIodG90YWxzLml0ZW1zIHx8IDApXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXZlVG90YWxzQ2hhbmdlZCA9IChiZWZvcmU6IFN1bW1hcnlUb3RhbHNTbmFwc2hvdCwgb3JkZXI6IGFueSk6IGJvb2xlYW4gPT4ge1xuICAgICAgICBjb25zdCBhZnRlciA9IHRoaXMuZ2V0U3VtbWFyeVRvdGFsc0Zyb21PcmRlcihvcmRlcik7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBiZWZvcmUuc3VidG90YWwgIT09IGFmdGVyLnN1YnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUudGF4ZXMgIT09IGFmdGVyLnRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUuc2hpcHBpbmcgIT09IGFmdGVyLnNoaXBwaW5nIHx8XG4gICAgICAgICAgICBiZWZvcmUudG90YWwgIT09IGFmdGVyLnRvdGFsIHx8XG4gICAgICAgICAgICBiZWZvcmUuY2xpZW50VGF4ZXMgIT09IGFmdGVyLmNsaWVudFRheGVzIHx8XG4gICAgICAgICAgICBiZWZvcmUucHJvbW90aW9uICE9PSBhZnRlci5wcm9tb3Rpb24gfHxcbiAgICAgICAgICAgIGJlZm9yZS5pdGVtcyAhPT0gYWZ0ZXIuaXRlbXNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNjcm9sbFRvTGVnYWN5U3VtbWFyeSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2NhcmRDaGFuZ2VzID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMubGFzdFNhdmVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdXBwcmVzc0RpcnR5ID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFNhdmVkU3RhdGUubW9kZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0QWRkcmVzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3NEcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLnNlbGVjdGVkSWQ7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFkZHJlc3MgPSAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZmluZChhZGRyZXNzID0+IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFkZHJlc3MpIHtcbiAgICAgICAgICAgICAgICAodGhpcy5hZGRyZXNzQm9vayB8fCBbXSkuZm9yRWFjaChhZGRyZXNzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zZWxlY3RlZCA9IFN0cmluZyhhZGRyZXNzLmlkKSA9PT0gU3RyaW5nKHNlbGVjdGVkSWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IHNlbGVjdGVkQWRkcmVzcy5pZCB8fCAwO1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5ub3RlcyA9IHRoaXMubGFzdFNhdmVkU3RhdGUubm90ZXMgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVNlbGVjdGVkQWRkcmVzcyhzZWxlY3RlZEFkZHJlc3MpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQubm90ZXMgPSB0aGlzLmxhc3RTYXZlZFN0YXRlLm5vdGVzIHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZXRDaGVja291dEZvcm1SZWFkb25seSh0aGlzLmNvbXBhY3RBZGRyZXNzVmlldyAmJiAhdGhpcy5nZXRNb2RlKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uID0gdGhpcy5sYXN0U2F2ZWRTdGF0ZS52aWV3RGF0YUZhY3R1cmFjaW9uID8/IHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbjtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnBhdGNoVmFsdWUodGhpcy5sYXN0U2F2ZWRTdGF0ZS5mb3JtIHx8IHt9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5sYXN0U2F2ZWRTdGF0ZS5iaWxsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5wYXRjaFZhbHVlKHRoaXMubGFzdFNhdmVkU3RhdGUuYmlsbGluZywgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDb3VudHJ5ID0gdGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udmFsdWUpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQ291bnRyeSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUG9zdGFsQ29kZVZhbGlkYXRpb24oc2VsZWN0ZWRDb3VudHJ5KTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpbmNlc1N1YmplY3QubmV4dChzZWxlY3RlZENvdW50cnkucHJvdmluY2VzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50VHlwZXNTdWJqZWN0Lm5leHQoc2VsZWN0ZWRDb3VudHJ5LmRvY3VtZW50VHlwZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRG9jID0gc2VsZWN0ZWRDb3VudHJ5Py5kb2N1bWVudFR5cGVzPy5maW5kKGRvYyA9PiBkb2MuY29kZSA9PSB0aGlzLmNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZERvYykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURvY3VtZW50VmFsaWRhdGlvbihzZWxlY3RlZERvYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSA9IHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS52YWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVBvc3RhbENvZGVWYWxpZGF0aW9uRmFjdHVyYWNpb24oc2VsZWN0ZWRCaWxsaW5nQ291bnRyeSk7XG4gICAgICAgICAgICB0aGlzLm9uRm9ybUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3VwcHJlc3NEaXJ0eSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldERpcnR5U3RhdGUoZmFsc2UpO1xuICAgIH1cbn1cbiJdfQ==