@tsi-developpement/tsi-shared-ui 1.7.39 → 1.8.2

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 (56) hide show
  1. package/esm2022/lib/consts/app-providers.mjs +4 -2
  2. package/esm2022/lib/models/common/entity-properties.mjs +1 -1
  3. package/esm2022/lib/services/form/form-state.service.mjs +13 -0
  4. package/esm2022/lib/services/validation/input-registry.service.mjs +9 -1
  5. package/esm2022/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.mjs +44 -7
  6. package/esm2022/lib/tsi-base/tsi-input-base/tsi-input-base.component.mjs +16 -9
  7. package/esm2022/lib/tsi-components/create-or-edit-entity-informations/create-or-edit-entity-informations.component.mjs +3 -3
  8. package/esm2022/lib/tsi-components/create-or-edit-modele-import/create-or-edit-modele-import.component.mjs +3 -3
  9. package/esm2022/lib/tsi-components/input-components/editable-grid/editable-grid.component.mjs +12 -10
  10. package/esm2022/lib/tsi-components/input-components/tsi-checkbox/tsi-checkbox.component.mjs +2 -1
  11. package/esm2022/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.mjs +6 -4
  12. package/esm2022/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.mjs +6 -4
  13. package/esm2022/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.mjs +8 -5
  14. package/esm2022/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.mjs +6 -4
  15. package/esm2022/lib/tsi-components/input-components/tsi-file-manager/tsi-file-manager.component.mjs +5 -1
  16. package/esm2022/lib/tsi-components/input-components/tsi-formula-box/tsi-formula-box.component.mjs +5 -3
  17. package/esm2022/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.mjs +6 -4
  18. package/esm2022/lib/tsi-components/input-components/tsi-radio-button/tsi-radio-button.component.mjs +2 -1
  19. package/esm2022/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.mjs +6 -4
  20. package/esm2022/lib/tsi-components/input-components/tsi-search-combo/tsi-search-combo.component.mjs +2 -1
  21. package/esm2022/lib/tsi-components/input-components/tsi-text-area/tsi-text-area.component.mjs +2 -1
  22. package/esm2022/lib/tsi-components/input-components/tsi-text-box/tsi-text-box.component.mjs +4 -3
  23. package/esm2022/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.mjs +10 -8
  24. package/esm2022/lib/tsi-components/manage-reporting/add-report-popup/add-report-popup.component.mjs +3 -3
  25. package/esm2022/lib/tsi-components/output-components/tsi-generic-grid/tsi-generic-grid.component.mjs +3 -3
  26. package/esm2022/lib/tsi-components/reporting/reporting.component.mjs +16 -9
  27. package/esm2022/lib/tsi-components/tsi-change-password/tsi-change-password.component.mjs +3 -3
  28. package/esm2022/lib/tsi-components/tsi-dynamic-form/create-or-edit-dynamic-form/create-or-edit-dynamic-form.component.mjs +3 -3
  29. package/esm2022/lib/tsi-components/tsi-form/tsi-form.component.mjs +11 -3
  30. package/esm2022/lib/tsi-components/tsi-generic-form/tsi-generic-form.component.mjs +3 -3
  31. package/esm2022/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.mjs +20 -9
  32. package/esm2022/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.mjs +8 -1
  33. package/esm2022/lib/tsi-components/tsi-notes-createoredit/tsi-notes.component.mjs +3 -3
  34. package/esm2022/lib/tsi-components/tsi-upload-fiche/tsi-upload-fiche.component.mjs +3 -3
  35. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs +202 -83
  36. package/fesm2022/tsi-developpement-tsi-shared-ui.mjs.map +1 -1
  37. package/lib/consts/app-providers.d.ts +2 -1
  38. package/lib/models/common/entity-properties.d.ts +1 -0
  39. package/lib/providers/shared-ui-tsi.provider.d.ts +1 -1
  40. package/lib/services/form/form-state.service.d.ts +7 -0
  41. package/lib/services/validation/input-registry.service.d.ts +1 -0
  42. package/lib/tsi-base/components/tsi-form-base/tsi-form-base.component.d.ts +15 -5
  43. package/lib/tsi-base/tsi-input-base/tsi-input-base.component.d.ts +5 -1
  44. package/lib/tsi-components/input-components/editable-grid/editable-grid.component.d.ts +3 -4
  45. package/lib/tsi-components/input-components/tsi-currency-other-input/tsi-currency-other-input.component.d.ts +1 -1
  46. package/lib/tsi-components/input-components/tsi-currency-societe-input/tsi-currency-societe-input.component.d.ts +1 -1
  47. package/lib/tsi-components/input-components/tsi-date-picker/tsi-date-picker.component.d.ts +3 -2
  48. package/lib/tsi-components/input-components/tsi-decimal-input/tsi-decimal-input.component.d.ts +1 -1
  49. package/lib/tsi-components/input-components/tsi-integer/tsi-integer.component.d.ts +1 -1
  50. package/lib/tsi-components/input-components/tsi-rate-input/tsi-rate-input.component.d.ts +1 -1
  51. package/lib/tsi-components/input-components/tsi-time-picker/tsi-time-picker.component.d.ts +1 -1
  52. package/lib/tsi-components/reporting/reporting.component.d.ts +4 -1
  53. package/lib/tsi-components/tsi-form/tsi-form.component.d.ts +4 -1
  54. package/lib/tsi-components/tsi-modal-footer/tsi-modal-footer.component.d.ts +6 -2
  55. package/lib/tsi-components/tsi-modal-header/tsi-modal-header.component.d.ts +3 -1
  56. package/package.json +1 -1
@@ -108,6 +108,12 @@ export class TsiFormComponent {
108
108
  set isReportingToolbarDisabled(value) {
109
109
  this._isReportingToolbarDisabled = value;
110
110
  }
111
+ get inputTitle() {
112
+ return this.modalHeaderComp?.inputTitle;
113
+ }
114
+ set inputTitle(value) {
115
+ this._inputTitle = value;
116
+ }
111
117
  get doesHaveForms() { return this._doesHaveForms; }
112
118
  set doesHaveForms(value) {
113
119
  this._doesHaveForms = value;
@@ -136,6 +142,7 @@ export class TsiFormComponent {
136
142
  this.onSave = new EventEmitter();
137
143
  this._descriminatorValue = undefined;
138
144
  this.entityStatusList = [];
145
+ this.statusColumnName = '';
139
146
  this.isDragOver = false;
140
147
  this.messagePosition = { x: 0, y: 0 };
141
148
  this.dragEnterCount = 0;
@@ -395,6 +402,7 @@ export class TsiFormComponent {
395
402
  next: (data) => {
396
403
  if (!data)
397
404
  return;
405
+ this.statusColumnName = data.statusColumnName ?? "";
398
406
  if (data.entityStatus && Array.isArray(data.entityStatus)) {
399
407
  this.entityStatusList = data.entityStatus;
400
408
  }
@@ -565,11 +573,11 @@ export class TsiFormComponent {
565
573
  });
566
574
  }
567
575
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponent, deps: [{ token: i1.EntityStatusService }, { token: i2.StatusColorService }, { token: i3.FichierService }, { token: i4.ErrorResponseManagerService }, { token: i5.TsiConfirmationService }, { token: i6.TsiNotificationService }, { token: i0.ChangeDetectorRef }, { token: i7.LayoutHelperService }, { token: i8.WorkflowConfigurationService }, { token: i9.ColonnePersonnaliseeService }, { token: i10.DynamicDialogRef }, { token: i10.DynamicDialogConfig }], target: i0.ɵɵFactoryTarget.Component }); }
568
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponent, selector: "tsi-form", inputs: { class: "class", autocomplete: "autocomplete", optionalEndpoints: "optionalEndpoints", disabled: "disabled", isLoading: "isLoading", modalSize: "modalSize", formEndpoint: "formEndpoint", formName: "formName", isReportingToolbarDisabled: "isReportingToolbarDisabled", isCreateOnly: "isCreateOnly" }, outputs: { onSave: "onSave", onSubmit: "onSubmit", onSubmitFormWorkflowConfiguration: "onSubmitFormWorkflowConfiguration", formRefChange: "formRefChange", onStatusChange: "onStatusChange" }, queries: [{ propertyName: "modalHeaderComp", first: true, predicate: TsiModalHeaderComponent, descendants: true }, { propertyName: "modalFooterComp", first: true, predicate: TsiModalFooterComponent, descendants: true }], viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "reportingApp", first: true, predicate: ["reportingApp"], descendants: true }, { propertyName: "toolbarTemplateRef", first: true, predicate: ["toolbarTemplate"], descendants: true }, { propertyName: "dynamicToolbarContainers", predicate: ["dynamicToolbarContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicFootersContainers", predicate: ["dynamicFooterContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading || hasActiveRequests\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i14.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i15.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i15.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i16.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i17.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i18.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i20.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i21.TsiLabelComponent, selector: "Tsi-Label", inputs: ["labelValue", "styleClass", "infoText"] }, { kind: "component", type: i22.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode"] }, { kind: "component", type: i23.DynamicFormListComponent, selector: "shared-dynamic-form-list", inputs: ["occurence", "occurenceBusinessClass", "occurenceDiscriminatorValue", "ignoreDialogConfig"] }, { kind: "directive", type: i24.BusyDirective, selector: "[busy]", inputs: ["busy"] }, { kind: "directive", type: i25.PresentationDesignerDirective, selector: "[presentationDesigner]" }, { kind: "pipe", type: i26.LocalizePipe, name: "localize" }] }); }
576
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TsiFormComponent, selector: "tsi-form", inputs: { class: "class", autocomplete: "autocomplete", optionalEndpoints: "optionalEndpoints", disabled: "disabled", isLoading: "isLoading", modalSize: "modalSize", formEndpoint: "formEndpoint", formName: "formName", isReportingToolbarDisabled: "isReportingToolbarDisabled", isCreateOnly: "isCreateOnly" }, outputs: { onSave: "onSave", onSubmit: "onSubmit", onSubmitFormWorkflowConfiguration: "onSubmitFormWorkflowConfiguration", formRefChange: "formRefChange", onStatusChange: "onStatusChange" }, queries: [{ propertyName: "modalHeaderComp", first: true, predicate: TsiModalHeaderComponent, descendants: true }, { propertyName: "modalFooterComp", first: true, predicate: TsiModalFooterComponent, descendants: true }], viewQueries: [{ propertyName: "formRef", first: true, predicate: ["formRef"], descendants: true }, { propertyName: "reportingApp", first: true, predicate: ["reportingApp"], descendants: true }, { propertyName: "toolbarTemplateRef", first: true, predicate: ["toolbarTemplate"], descendants: true }, { propertyName: "dynamicToolbarContainers", predicate: ["dynamicToolbarContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "dynamicFootersContainers", predicate: ["dynamicFooterContainer"], descendants: true, read: ViewContainerRef }], ngImport: i0, template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading || hasActiveRequests\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\" [inputName]=\"statusColumnName\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\" [inputName]=\"'WorkflowEtat'\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [inputName]=\"'WorkflowEtat'\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 33rem);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"], dependencies: [{ kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i12.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i12.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i13.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i14.Toolbar, selector: "p-toolbar", inputs: ["style", "styleClass", "ariaLabelledBy"] }, { kind: "component", type: i15.TabView, selector: "p-tabView", inputs: ["style", "styleClass", "controlClose", "scrollable", "activeIndex", "selectOnFocus", "nextButtonAriaLabel", "prevButtonAriaLabel", "autoHideButtons", "tabindex"], outputs: ["onChange", "onClose", "activeIndexChange"] }, { kind: "component", type: i15.TabPanel, selector: "p-tabPanel", inputs: ["closable", "headerStyle", "headerStyleClass", "cache", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "selected", "disabled", "header", "leftIcon", "rightIcon"] }, { kind: "component", type: i16.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i17.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i18.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i20.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i21.TsiLabelComponent, selector: "Tsi-Label", inputs: ["labelValue", "styleClass", "infoText"] }, { kind: "component", type: i22.ReportingComponent, selector: "app-reporting", inputs: ["showImportExportButton", "showNoteButton", "showInfoButton", "showUploadButton", "isReportingToolbarDisabled", "formName", "formEndpoint", "formEndpointBody", "isFormEndpointPaged", "filtersHtmlTemplate", "optionalEndpoints", "businessClass", "cudComponent", "httpMethodType", "requestData", "customReportingMode", "pagedRequest", "reportDiscriminator", "nombreDocumentsJoints", "id", "configModeButtonId", "selectedItemUids", "fromTsiForm", "customSendMailMode", "reportingInformation"], outputs: ["onSave", "refreshData", "closedModalFileUpload", "toggleDesignMode"] }, { kind: "component", type: i23.DynamicFormListComponent, selector: "shared-dynamic-form-list", inputs: ["occurence", "occurenceBusinessClass", "occurenceDiscriminatorValue", "ignoreDialogConfig"] }, { kind: "directive", type: i24.BusyDirective, selector: "[busy]", inputs: ["busy"] }, { kind: "directive", type: i25.PresentationDesignerDirective, selector: "[presentationDesigner]" }, { kind: "pipe", type: i26.LocalizePipe, name: "localize" }] }); }
569
577
  }
570
578
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TsiFormComponent, decorators: [{
571
579
  type: Component,
572
- args: [{ selector: 'tsi-form', template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading || hasActiveRequests\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 300px);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"] }]
580
+ args: [{ selector: 'tsi-form', template: "<form class=\"form-horizontal\" autocomplete=\"off\" (ngSubmit)=\"handleFormSubmit($event)\" #formRef=\"ngForm\">\r\n <ng-template #toolbarTemplate>\r\n <p-toolbar *ngIf=\"formEndpoint\" styleClass=\"mb-1 gap-2\" class=\"w-full\" (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event)\" (dragenter)=\"onDragEnter($event)\" (dragleave)=\"onDragLeave($event)\">\r\n\r\n <ng-template pTemplate=\"left\">\r\n <div class=\"mt-1 ml-2\">\r\n {{ inputTitle }}\r\n </div>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"right\">\r\n <div class=\"mt-1 mr-2\">\r\n <app-reporting *ngIf=\"formEndpoint\" [fromTsiForm]=\"true\" [id]=\"this.id\" [formEndpoint]=\"formEndpoint\"\r\n [formName]=\"formName\" [reportDiscriminator]=\"descriminatorValue\" [isFormEndpointPaged]=\"true\"\r\n [nombreDocumentsJoints]=\"nombreDocuments\" [configModeButtonId]=\"configModeButtonId\"\r\n [isReportingToolbarDisabled]=\"isReportingToolbarDisabled\" (toggleDesignMode)=\"toggleDesignMode($event)\"\r\n [businessClass]=\"businessClass\" (closedModalFileUpload)=\"getNombreFichier()\"\r\n [showImportExportButton]=\"false\" #reportingApp>\r\n </app-reporting>\r\n </div>\r\n </ng-template>\r\n\r\n <div *ngIf=\"isDragOver\" [ngStyle]=\"{ left: messagePosition.x + 'px', top: messagePosition.y + 'px' }\"\r\n class=\"drag-message cursor-follow\">\r\n {{ \"Jointure\" | localize }}\r\n </div>\r\n\r\n </p-toolbar>\r\n </ng-template>\r\n\r\n <div *busy=\"isLoading || hasActiveRequests\"></div>\r\n\r\n <fieldset [disabled]=\"disabled\">\r\n <div class=\"card mr\">\r\n <p-tabView>\r\n\r\n <p-tabPanel header=\"\" \r\n [headerStyle]=\"colonnesPersonnaliseeGrouped.length === 0 && !canShowForms\r\n ? { display: 'none' } \r\n : null\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <i class=\"pi pi-home mr-2\"></i>\r\n <span class=\"main-tab-text\">{{ 'shared_form_maintabTitle' | localize }}</span>\r\n </ng-template>\r\n\r\n <ng-content></ng-content>\r\n </p-tabPanel>\r\n\r\n <!-- Dynamic tabs -->\r\n <ng-container *ngIf=\"colonnesPersonnaliseeGrouped.length > 0\">\r\n <p-tabPanel *ngFor=\"let grp of colonnesPersonnaliseeGrouped\" [header]=\"grp.groupe\">\r\n\r\n <ng-template #dynamicToolbarContainer></ng-template>\r\n\r\n <div class=\"grid\">\r\n <div class=\"col-12 grid form-row\" *ngFor=\"let col of grp.colonnes\">\r\n <div class=\"col-3 form-label\">\r\n <Tsi-Label [labelValue]=\"col.nom\"></Tsi-Label>\r\n </div>\r\n\r\n <!-- String -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.string\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Text-Box [(inputField)]=\"col.data.valeurString\"></Tsi-Text-Box>\r\n </div>\r\n </div>\r\n\r\n <!-- Int -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.int\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Integer [(inputField)]=\"col.data.valeurInt\"></Tsi-Integer>\r\n </div>\r\n </div>\r\n\r\n <!-- Decimal -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.decimal\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-Decimal-Input [(inputField)]=\"col.data.valeurDecimal\"></Tsi-Decimal-Input>\r\n </div>\r\n </div>\r\n\r\n <!-- Boolean -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.boolean\">\r\n <div class=\"input-wrapper\">\r\n <Tsi-CheckBox [isBinary]=\"false\" [(inputField)]=\"col.data.valeurBoolean\">\r\n </Tsi-CheckBox>\r\n </div>\r\n </div>\r\n\r\n <!-- Binary -->\r\n <div class=\"col-8 form-input\" *ngIf=\"col.type === formType.binary\">\r\n binary input (not handled yet)\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <ng-template #dynamicFooterContainer></ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"canShowForms\">\r\n <p-tabPanel [header]=\"'shared_form_dynamicFormsTab_Title' | localize\">\r\n <ng-template pTemplate=\"content\">\r\n <shared-dynamic-form-list\r\n [occurence]=\"id\"\r\n [occurenceBusinessClass]=\"businessClass\"\r\n [occurenceDiscriminatorValue]=\"descriminatorValue\"\r\n [ignoreDialogConfig]=\"true\" />\r\n </ng-template>\r\n </p-tabPanel>\r\n </ng-container>\r\n\r\n </p-tabView>\r\n </div>\r\n </fieldset>\r\n\r\n <div *ngIf=\"(businessClass && entityStatusList.length > 0) ||\r\n workflowInformation?.workflowUid ||\r\n workflowConfigurationService.isDesginModeFromWorkflow\" class=\"mx-4 px-2 my-1 shared-footer-bar\">\r\n\r\n <div *ngIf=\"businessClass && entityStatusList && entityStatusList.length > 0\">\r\n <div class=\"flex align-items-center gap-2\" presentationDesigner=\"shared_crud_status\">\r\n <Tsi-Label [labelValue]=\"'shared_crud_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo [id-field]=\"'key'\" [label-field]=\"'value'\" [datasource]=\"entityStatusList\" [(bind)]=\"status\"\r\n [comboType]=\"'status'\" [statusMetadata]=\"statusMetadataComboStatus\" [inputName]=\"statusColumnName\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\"></Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n <div *ngIf=\"workflowInformation?.workflowUid || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n class=\"flex col-10\">\r\n <div presentationDesigner=\"shared_workflowName\" class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow'| localize\">\r\n </Tsi-Label>\r\n <Tsi-Text-Box [disabled]=\"true\" [inputName]=\"'workflowName'\" [(inputField)]=\"workflowInformation.workflowName\">\r\n </Tsi-Text-Box>\r\n </div>\r\n <div presentationDesigner=\"administration_workflow_workflow_current_status\"\r\n class=\"flex align-items-center gap-2 col-4\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_current_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" [disabled]=\"true\" id-field=\"key\" label-field=\"value\"\r\n [bind]=\"workflowInformation.workflowEtat\" [isFiltered]=\"true\" [inputName]=\"'WorkflowEtat'\"\r\n [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n <div class=\"col-4\">\r\n <div *ngIf=\"mode != formModes.create || workflowConfigurationService.isDesginModeFromWorkflow\"\r\n presentationDesigner=\"administration_workflow_workflow_next_status\"\r\n class=\"flex gap-2 align-items-center no-border\">\r\n <Tsi-Label [labelValue]=\"'administration_workflow_workflow_next_status'\"></Tsi-Label>\r\n <Tsi-Search-Combo class=\"w-7\" id-field=\"key\" label-field=\"value\" [(bind)]=\"selectedWorkflowEtatUid\"\r\n [isFiltered]=\"true\" [elementSourceUrl]=\"getWorkflowEtatAsKeyValuePair\" [inputName]=\"'WorkflowEtat'\"\r\n [listSourceUrl]=\"getWorkflowEtatSuivantAsKeyValuePair\" (bindChange)=\"confirmUpdateWorkflowEtat($event)\"\r\n [showAddButton]=\"false\"\r\n [showSearchButton]=\"false\">\r\n </Tsi-Search-Combo>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</form>", styles: [".border-black{border:solid 2px black}.no-border{border:none!important}.shared-footer-bar{display:flex;align-items:center;width:calc(100% - 33rem);height:2.5rem;position:absolute;bottom:0;z-index:5}.mr{margin:0 12px 5px}.input-wrapper,.input-wrapper>tsi-text-box,.input-wrapper>tsi-integer,.input-wrapper>tsi-decimal-input,.input-wrapper>tsi-check-box{width:100%;display:block}.form-input{display:flex;align-items:center}.main-tab-text{display:inline-block}@media (max-width: 768px){.main-tab-text{display:none}}\n"] }]
573
581
  }], ctorParameters: () => [{ type: i1.EntityStatusService }, { type: i2.StatusColorService }, { type: i3.FichierService }, { type: i4.ErrorResponseManagerService }, { type: i5.TsiConfirmationService }, { type: i6.TsiNotificationService }, { type: i0.ChangeDetectorRef }, { type: i7.LayoutHelperService }, { type: i8.WorkflowConfigurationService }, { type: i9.ColonnePersonnaliseeService }, { type: i10.DynamicDialogRef }, { type: i10.DynamicDialogConfig }], propDecorators: { formRef: [{
574
582
  type: ViewChild,
575
583
  args: ['formRef']
@@ -622,4 +630,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
622
630
  type: ViewChildren,
623
631
  args: ['dynamicFooterContainer', { read: ViewContainerRef }]
624
632
  }] } });
625
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktZm9ybS90c2ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUE0QixPQUFPLEVBQW1DLCtCQUErQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hLLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUMsTUFBTSxpREFBaUQsQ0FBQztBQUVoSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFVdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixF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LHVCQUF1QixrRkFFdkIsdUJBQXVCLCthQUVZLGdCQUFnQixnSEFHakIsZ0JBQWdCLDZCQ3JNbEUsMm9QQStKTzs7NEZEMUdNLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxVQUFVO29lQVlFLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUztnQkFDTyxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBSWhCLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUlHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDSSxNQUFNO3NCQUFmLE1BQU07Z0JBbUJILFlBQVk7c0JBRGYsS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBbUVGLDBCQUEwQjtzQkFEN0IsS0FBSztnQkFTRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csaUNBQWlDO3NCQUExQyxNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkFHdUIsa0JBQWtCO3NCQUEvQyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFDVyxlQUFlO3NCQUFyRCxZQUFZO3VCQUFDLHVCQUF1QjtnQkFFRSxlQUFlO3NCQUFyRCxZQUFZO3VCQUFDLHVCQUF1QjtnQkFHckMsd0JBQXdCO3NCQUR2QixZQUFZO3VCQUFDLHlCQUF5QixFQUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUluRSx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbXBvbmVudFJlZixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmb3JtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0cy9mb3JtLXR5cGUnO1xyXG5pbXBvcnQgeyBBZG1pbmlzdHJhdGlvbkVuZHBvaW50cyB9IGZyb20gJy4uLy4uL2VuZC1wb2ludHMvZW5kcG9pbnRzJztcclxuaW1wb3J0IHsgTW9kZXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IElNb2RhbFNpemUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRW50aXR5UHJvcGVydGllc1Jlc3BvbnNlLCBGaWNoaWVyLCBLZXlWYWx1ZVBhaXIsIE9wdGlvbmFsRW5kcG9pbnRzLCB1cGRhdGVFbnRpdHlXb3JrZmxvd0luZm9ybWF0aW9uLCB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YSwgQ29sb25uZVBlcnNvbm5hbGlzZWVHcm91cGVkUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHluYW1pYy1mb3JtL2NvbG9ubmUtcGVyc29ubmFsaXNlZSc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vY29sb25uZS1wZXJzb25uYWxpc2VlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWNoaWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpY2hpZXIvZmljaGllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xheW91dC9sYXlvdXQtaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vZXJyb3ItcmVzcG9uc2UtbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvZW50aXR5U3RhdHVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0dXNDb2xvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvc3RhdHVzLWNvbG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvd29ya2Zsb3cvd29ya2Zsb3ctY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0aW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0aW5nL3JlcG9ydGluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1mb290ZXIvdHNpLW1vZGFsLWZvb3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1oZWFkZXIvdHNpLW1vZGFsLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtdWxhaXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS9mb3JtdWxhaXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpc051bGxPckVtcHR5IH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2VudGl0eS1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0VHJhY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZW1lbnQvcmVxdWVzdC10cmFja2VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0c2ktZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcbiAgcHVibGljIGxvY2FsaXplPyA9IGluamVjdChMb2NhbGl6ZVBpcGUpXHJcbiAgXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgZmllbGRzXHJcbiAgcHJpdmF0ZSBfaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIHByb3BlcnRpZXNcclxuICBAVmlld0NoaWxkKCdmb3JtUmVmJykgZm9ybVJlZj86IE5nRm9ybTtcclxuICBAVmlld0NoaWxkKFwicmVwb3J0aW5nQXBwXCIpIHJlcG9ydGluZ0FwcD86IFJlcG9ydGluZ0NvbXBvbmVudFxyXG4gIC8vI2VuZHJlZ2lvblxyXG4gIFxyXG4gIC8vI3JlZ2lvbiBpbnB1dHNcclxuICBASW5wdXQoKSBjbGFzcz86IHN0cmluZztcclxuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IHN0cmluZyA9ICdvZmYnO1xyXG4gIC8vIEBJbnB1dCgpIGZvcm1OYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgLy8gQElucHV0KCkgZm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgXHJcbiAgQElucHV0KCkgb3B0aW9uYWxFbmRwb2ludHM/OiBPcHRpb25hbEVuZHBvaW50cztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZT86IElNb2RhbFNpemU7XHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIF9kZXNjcmltaW5hdG9yVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBnZXQgZGVzY3JpbWluYXRvclZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9kZXNjcmltaW5hdG9yVmFsdWU7IH1cclxuICBzZXQgZGVzY3JpbWluYXRvclZhbHVlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Rlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pc0Rlc2NyaW1pbmF0b3JWYWx1ZVNldCA9IHRydWU7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUZvcm1zSW5mb3MoKTtcclxuICB9XHJcblxyXG4gIGVudGl0eVN0YXR1c0xpc3Q6IEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz5bXSA9IFtdO1xyXG5cclxuICBub21icmVEb2N1bWVudHM6IG51bWJlciB8IHVuZGVmaW5lZDtcclxuICBpc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgbWVzc2FnZVBvc2l0aW9uID0geyB4OiAwLCB5OiAwIH07XHJcbiAgcHJpdmF0ZSBkcmFnRW50ZXJDb3VudCA9IDA7XHJcbiAgcHJpdmF0ZSBfZm9ybU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBcclxuICBASW5wdXQoKVxyXG4gIGdldCBmb3JtRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtRW5kcG9pbnQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybUVuZHBvaW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Zvcm1FbmRwb2ludCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybU5hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZm9ybU5hbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9idXNpbmVzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9tb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIEdldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIGdldCBidXNpbmVzc0NsYXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIHNldCBidXNpbmVzc0NsYXNzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2J1c2luZXNzQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuaXNCdXNpbmVzc0NsYXNzU2V0ID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmdldENvbG9ubmVQZXJzb25uYWxpc2VlKCk7XHJcbiAgICB0aGlzLmdldEVudGl0eVN0YXR1cygpO1xyXG4gICAgdGhpcy5nZXRTdGF0dXNNZXRhRm9yQ29tYm8oKTtcclxuICAgIHRoaXMuY2hlY2tFbnRpdHlJbmZvKCk7ICAgIFxyXG4gICAgdGhpcy5jYWxjdWxhdGVGb3Jtc0luZm9zKCk7XHJcbiAgfVxyXG5cclxuICAvLyBHZXR0ZXIgZm9yIGlkXHJcbiAgZ2V0IGlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5faWQ7XHJcbiAgfVxyXG5cclxuICAvLyBTZXR0ZXIgZm9yIGlkXHJcbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2lkID0gdmFsdWU7XHJcbiAgICB0aGlzLmdldENvbG9ubmVQZXJzb25uYWxpc2VlKCk7XHJcbiAgICB0aGlzLmdldE5vbWJyZUZpY2hpZXIoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciBmb3Igc3RhdHVzXHJcbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3Igc3RhdHVzXHJcbiAgc2V0IHN0YXR1cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcclxuICAgIHRoaXMub25TdGF0dXNDaGFuZ2UuZW1pdCh0aGlzLl9zdGF0dXMpO1xyXG4gIH1cclxuXHJcbiAgc2V0IG1vZGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5nZXRDb2xvbm5lUGVyc29ubmFsaXNlZSgpO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG1vZGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBpc0NyZWF0ZU9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBvdXRwdXRzXHJcbiAgQE91dHB1dCgpIG9uU3VibWl0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBvblN1Ym1pdEZvcm1Xb3JrZmxvd0NvbmZpZ3VyYXRpb246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvcm1SZWZDaGFuZ2U6IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+ID0gbmV3IEV2ZW50RW1pdHRlcjxOZ0Zvcm0+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3RhdHVzQ2hhbmdlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKCd0b29sYmFyVGVtcGxhdGUnKSB0b29sYmFyVGVtcGxhdGVSZWYgITogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAQ29udGVudENoaWxkKFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50KSBtb2RhbEhlYWRlckNvbXA/OiBUc2lNb2RhbEhlYWRlckNvbXBvbmVudDtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChUc2lNb2RhbEZvb3RlckNvbXBvbmVudCkgbW9kYWxGb290ZXJDb21wPzogVHNpTW9kYWxGb290ZXJDb21wb25lbnQ7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNUb29sYmFyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY1Rvb2xiYXJDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdkeW5hbWljRm9vdGVyQ29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pXHJcbiAgZHluYW1pY0Zvb3RlcnNDb250YWluZXJzITogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xyXG5cclxuICBpbnB1dFRpdGxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQ6IENvbG9ubmVQZXJzb25uYWxpc2VlR3JvdXBlZFJlc3BvbnNlW10gPSBbXTtcclxuICBjYW5TaG93Rm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3Jtc09mQnVzaW5lc3NDbGFzczogYW55W10gPSBbXTsgIFxyXG4gIHByaXZhdGUgX2RvZXNIYXZlRm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgZG9lc0hhdmVGb3JtcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RvZXNIYXZlRm9ybXM7IH1cclxuICBzZXQgZG9lc0hhdmVGb3Jtcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZG9lc0hhdmVGb3JtcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgaXNEZXNjcmltaW5hdG9yVmFsdWVTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0J1c2luZXNzQ2xhc3NTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0Zvcm1zSW5mb3NDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaWdub3JlRGVzY3JpbWluYXRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhc0FjdGl2ZVJlcXVlc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0VHJhY2tlclN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBkeW5hbWljRm9ybVNlcnZpY2UgPSBpbmplY3QoRHluYW1pY0Zvcm1TZXJ2aWNlKTtcclxuICBmb3JtdWxhaXJlU2VydmljZSA6IEZvcm11bGFpcmVTZXJ2aWNlID0gaW5qZWN0KEZvcm11bGFpcmVTZXJ2aWNlKTtcclxuICBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSA6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlID0gaW5qZWN0KEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcclxuICByZXF1ZXN0VHJhY2tlclNlcnZpY2UgOiBSZXF1ZXN0VHJhY2tlclNlcnZpY2UgPSBpbmplY3QoUmVxdWVzdFRyYWNrZXJTZXJ2aWNlKTtcclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZW50aXR5U3RhdHVzU2VydmljZTogRW50aXR5U3RhdHVzU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RhdHVzQ29sb3JTZXJ2aWNlOiBTdGF0dXNDb2xvclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgX2ZpY2hpZXJTZXJ2aWNlOiBGaWNoaWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZTogRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdHNpQ29uZmlybVNlcnZpY2U6IFRzaUNvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lOb3RpZmljYXRpb25TZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2xheW91dEhlbHBlclNlcnZpY2U6IExheW91dEhlbHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZTogV29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHB1YmxpYyBfY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlOiBDb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgcmVmPzogRHluYW1pY0RpYWxvZ1JlZixcclxuICAgIHB1YmxpYyBjb25maWc/OiBEeW5hbWljRGlhbG9nQ29uZmlnLFxyXG5cclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgaWYgKHRoaXMucmVwb3J0aW5nQXBwKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5yZXBvcnRpbmdBcHAuc2hvd1ByZXNlbnRhdGlvbkRlc2lnbmVyQ29uZmlnQnV0dG9uKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRpbmdBcHAuc2hvd1ByZXNlbnRhdGlvbkRlc2lnbmVyQ29uZmlnQnV0dG9uID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zYXZlZERhdGFTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zYXZlZERhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMucmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnJlcXVlc3RUcmFja2VyU3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiB2YXJpYWJsZXNcclxuICBwcml2YXRlIF93b3JrZmxvd0luZm9ybWF0aW9uOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSA9IG5ldyB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSgpO1xyXG4gIHNldCB3b3JrZmxvd0luZm9ybWF0aW9uKHZhbHVlOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSkge1xyXG4gICAgdGhpcy5fd29ya2Zsb3dJbmZvcm1hdGlvbiA9IHZhbHVlXHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgZ2V0V29ya2Zsb3dFbnRpdHlJbmZvcm1hdGlvbihidXNpbmVzc0NsYXNzOiBzdHJpbmcsIHVpZE9iamVjdD86IHN0cmluZywgZGlzY3JpbWluYXRvckNsYXNzTmFtZSA/OiBzdHJpbmcsIFxyXG4gIC8vIGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgPzogc3RyaW5nXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBsZXQgcmVxdWVzdDogR2V0V29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVxdWVzdCA9IG5ldyBHZXRXb3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXF1ZXN0KCk7XHJcbiAgLy8gICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gYnVzaW5lc3NDbGFzc1xyXG4gIC8vICAgICByZXF1ZXN0LnVpZE9iamV0ID0gdWlkT2JqZWN0O1xyXG4gIC8vICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JDbGFzc05hbWUgPSBkaXNjcmltaW5hdG9yQ2xhc3NOYW1lXHJcbiAgLy8gICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZSA9IGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWVcclxuICAvLyAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZVxyXG4gIC8vICAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eVdvcmtsZm93SW5zdGFuY2VJbmZvcm1hdGlvbihyZXF1ZXN0KSlcclxuICAvLyAgICAgY29uc29sZS5sb2coXCJ0aGlzLndvcmtmbG93SW5mb3JtYXRpb25cIiwgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKVxyXG4gIC8vICAgICBpZiAodGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKSB7XHJcbiAgLy8gICAgICAgbGV0IHdvcmtmbG93RXRhdEZvcm0gPSB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLndvcmtmbG93RXRhdEZvcm1Gb3JDdXJyZW50Rm9ybVxyXG4gIC8vICAgICAgICAgPy5maW5kKHggPT4geC51aWQgPT0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpXHJcbiAgLy8gICAgICAgaWYgKHdvcmtmbG93RXRhdEZvcm0pIHtcclxuICAvLyAgICAgICAgIHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2Uud29ya2Zsb3dFdGF0Rm9yRm9yQ3VycmVudEVudGl0eUZvcm0gPVxyXG4gIC8vICAgICAgICAgICB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLm1hcFdvcmtmbG93RXRhdEZvcm1Ub1ByZXNlbnRhdGlvblNldHRpbmcod29ya2Zsb3dFdGF0Rm9ybS53b3JrZmxvd0V0YXRzRm9ybXMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjYXRjaCAoZXJyb3IpIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCB3b3JrZmxvd0luZm9ybWF0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93SW5mb3JtYXRpb25cclxuICB9XHJcbiAgZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIgPVxyXG4gICAgQWRtaW5pc3RyYXRpb25FbmRwb2ludHMuZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIoKTtcclxuICBnZXRXb3JrZmxvd0V0YXRTdWl2YW50QXNLZXlWYWx1ZVBhaXIgPSAnJztcclxuICBzZWxlY3RlZFdvcmtmbG93RXRhdFVpZDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcclxuICBpc0NvbWJvRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JtTW9kZXMgPSBNb2RlcztcclxuXHJcbiAgY29uZmlnTW9kZUJ1dHRvbklkID0gXCJjb25mZy1tb2RlLWJ1dHRvbi1mcm9tLWZvcm1cIjtcclxuICBjdWRDb21wb25lbnQ6IGFueVxyXG4gIGNvbmZpZ0RhdGE6IGFueVxyXG4gIHNhdmVkRGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvblxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBMaWZlY3ljbGUgSG9va3NcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VkQ29tcG9uZW50ID0gdGhpcy5jb25maWc/LmRhdGE/LmN1ZENvbXBvbmVudDtcclxuICAgIHRoaXMuY29uZmlnRGF0YSA9IHRoaXMuY29uZmlnXHJcbiAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSB0aGlzLmNvbmZpZz8uZGF0YT8ud29ya2Zsb3dJbmZvcm1hdGlvbiA/PyBuZXcgd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UoKVxyXG4gICAgY29uc29sZS5sb2coXCJ3b3JrZmxvd0luZm9ybWF0aW9uID0+IFwiLCB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24pXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdEZvcm1TYXZlU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZVJlcXVlc3RUcmFja2VyU3RhdGVTdWJzY3JpcHRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRGb3JtU2F2ZVN1YnNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuc2F2ZWREYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5fY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlXHJcbiAgICAgIC5kYXRhU2F2ZWRPYnNlcnZhYmxlLnN1YnNjcmliZShcclxuICAgICAgICBhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGFcclxuICAgICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHgub2NjdXJlbmNlID0gZGF0YSlcclxuICAgICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlLmFkZE9yVXBkYXRlRm9ybXVsYWlyZURhdGEodGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgfVxyXG5cclxuICBmb3JtVHlwZSA9IGZvcm1UeXBlO1xyXG4gIHByaXZhdGUgZ2V0Q29sb25uZVBlcnNvbm5hbGlzZWUoKSB7XHJcbiAgICBpZiAodGhpcy5idXNpbmVzc0NsYXNzICYmIHRoaXMubW9kZSA9PSBNb2Rlcy5jcmVhdGUpIHtcclxuICAgICAgdGhpcy5fZ2V0Q29sb25uZVBlcnNvbm5hbGlzZSh0aGlzLmJ1c2luZXNzQ2xhc3MpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmJ1c2luZXNzQ2xhc3MgJiYgdGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLmlkKSB7XHJcbiAgICAgIHRoaXMuX2dldENvbG9ubmVQZXJzb25uYWxpc2UodGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q29sb25uZVBlcnNvbm5hbGlzZShidXNpbmVzc0NsYXNzOiBzdHJpbmcsIGlkPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UuZ2V0Q29sb25uZXNQZXJzb25uYWxpc2VlKGJ1c2luZXNzQ2xhc3MsIHRoaXMuaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICByZXMuZm9yRWFjaChjcGcgPT4ge1xyXG4gICAgICAgICAgY3BnLmNvbG9ubmVzLmZvckVhY2goY3AgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNwLmRhdGEpIHtcclxuICAgICAgICAgICAgICBjcC5kYXRhID0gbmV3IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YShcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRoaXMuaWQsIGNwLnVpZCxcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZCA9IHJlcztcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzRHluYW1pY1RhYnMoKVxyXG4gICAgICAgIH0sIDApO1xyXG5cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHdoZW4gZ2V0dGluZyBsaXN0IG9mIGNvbG9ubmUgcGVyc29ubmFsaXNlZVwiLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRGVzaWduTW9kZShldmVudDogYW55KSB7XHJcbiAgICAvLyB0aGlzLmNvbmZpZ0RhdGEuZGF0YS5jdWRDb21wb25lbnQgPSB1bmRlZmluZWRcclxuICAgIC8vIHRoaXMuY29uZmlnRGF0YS5kYXRhLndvcmtmbG93SW5mb3JtYXRpb24gPSB1bmRlZmluZWRcclxuXHJcbiAgICAvLyB0aGlzLnJlZj8uY2xvc2UoKTtcclxuICAgIC8vIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlID0gdHJ1ZVxyXG4gICAgLy8gdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5jdXJyZW50Rm9ybU5hbWUgPSB0aGlzLmdldENvbXBvbmVudElkZW50aWZpZXIoKVxyXG5cclxuICAgIC8vIHRoaXMucmVmID0gdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKHRoaXMuY3VkQ29tcG9uZW50LCB0aGlzLmNvbmZpZ0RhdGEpO1xyXG4gICAgLy8gdGhpcy5yZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbD86IGFueSkgPT4ge1xyXG4gICAgLy8gICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSA9IGZhbHNlXHJcbiAgICAvLyAgIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuY3VycmVudEZvcm1OYW1lID0gdW5kZWZpbmVkXHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Byb2Nlc3NEeW5hbWljVGFicygpIHtcclxuICAgIHRoaXMuZHluYW1pY1Rvb2xiYXJDb250YWluZXJzLnRvQXJyYXkoKS5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICBjb25zdCBjb21wUmVmOiBDb21wb25lbnRSZWY8VHNpTW9kYWxIZWFkZXJDb21wb25lbnQ+ID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChUc2lNb2RhbEhlYWRlckNvbXBvbmVudCk7XHJcblxyXG4gICAgICBjb21wUmVmLmluc3RhbmNlLnRvb2xiYXJUZW1wbGF0ZUhlYWRlciA9IHRoaXMubW9kYWxIZWFkZXJDb21wIS50b29sYmFyVGVtcGxhdGVIZWFkZXI7XHJcbiAgICAgIGNvbXBSZWYuaW5zdGFuY2UuaW5wdXRUaXRsZSA9IHRoaXMubW9kYWxIZWFkZXJDb21wIS5pbnB1dFRpdGxlO1xyXG5cclxuICAgICAgY29tcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmR5bmFtaWNGb290ZXJzQ29udGFpbmVycy50b0FycmF5KCkuZm9yRWFjaChjb250YWluZXIgPT4ge1xyXG4gICAgICBjb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgY29uc3QgY29tcFJlZjogQ29tcG9uZW50UmVmPFRzaU1vZGFsRm9vdGVyQ29tcG9uZW50PiA9IGNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoVHNpTW9kYWxGb290ZXJDb21wb25lbnQpO1xyXG4gICAgICBjb21wUmVmLmluc3RhbmNlLmZvb3RlclRlbXBsYXRlUmVmID0gdGhpcy5tb2RhbEZvb3RlckNvbXA/LmZvb3RlclRlbXBsYXRlUmVmXHJcbiAgICAgIGNvbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRvb2xiYXJUZW1wbGF0ZVJlZiAmJiB0aGlzLm1vZGFsSGVhZGVyQ29tcCkge1xyXG4gICAgICB0aGlzLm1vZGFsSGVhZGVyQ29tcC50b29sYmFyVGVtcGxhdGVIZWFkZXIgPSB0aGlzLnRvb2xiYXJUZW1wbGF0ZVJlZjtcclxuICAgICAgdGhpcy5pbnB1dFRpdGxlID0gdGhpcy5tb2RhbEhlYWRlckNvbXAuaW5wdXRUaXRsZTtcclxuXHJcbiAgICAgIHRoaXMubW9kYWxIZWFkZXJDb21wLnRvb2xiYXJUZW1wbGF0ZUhlYWRlciA9IHRoaXMudG9vbGJhclRlbXBsYXRlUmVmO1xyXG4gICAgICB0aGlzLmlucHV0VGl0bGUgPSB0aGlzLm1vZGFsSGVhZGVyQ29tcC5pbnB1dFRpdGxlO1xyXG4gICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybVJlZkNoYW5nZS5lbWl0KHRoaXMuZm9ybVJlZik7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGV2ZW50c1xyXG4gIGhhbmRsZUZvcm1TdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5oYXNBY3RpdmVSZXF1ZXN0cykgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICB0aGlzLm9uU3VibWl0Rm9ybVdvcmtmbG93Q29uZmlndXJhdGlvbi5lbWl0KGV2ZW50KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKVxyXG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKSB7XHJcbiAgICBjb25zdCBleGlzdGluZ1VpZHMgPSBuZXcgU2V0KFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhLm1hcCh4ID0+IHguY29sb25uZVBlcnNvbm5hbGlzZWVVaWQpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZC5mb3JFYWNoKGNwZyA9PiB7XHJcbiAgICAgIGNwZy5jb2xvbm5lcy5mb3JFYWNoKGNwID0+IHtcclxuICAgICAgICBpZiAoIWV4aXN0aW5nVWlkcy5oYXMoY3AudWlkKSkge1xyXG4gICAgICAgICAgaWYgKCFjcC5kYXRhKSB7XHJcbiAgICAgICAgICAgIGNwLmRhdGEgPSBuZXcgQ29sb25uZVBlcnNvbm5hbGlzZWVEYXRhKFxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB0aGlzLmlkLCBjcC51aWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YShcclxuICAgICAgICAgICAgY3A/LmRhdGE/LnVpZCA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGNwPy5kYXRhPy5vY2N1cmVuY2UgPz8gdGhpcy5pZCxcclxuICAgICAgICAgICAgY3AudWlkLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJvb2xlYW4sXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVySW50LFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckRlY2ltYWwsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyU3RyaW5nLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJpbmFyeSxcclxuICAgICAgICAgICAgY3Aub2JzZXJ2YXRpb25cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YS5wdXNoKG5ld0RhdGEpO1xyXG5cclxuICAgICAgICAgIGV4aXN0aW5nVWlkcy5hZGQoY3AudWlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJ0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhID0+IFwiLFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhXHJcbiAgICApXHJcblxyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiB3b3JrZmxvd1xyXG5cclxuXHJcbiAgY29uZmlybVVwZGF0ZVdvcmtmbG93RXRhdChldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhldmVudClcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICB0aGlzLl90c2lDb25maXJtU2VydmljZS5jb25maXJtKFwiYWRtaW5pc3RyYXRpb25fY29uZmlybV9zdGF0dXNfY2hhbmdlXCIsIFwiYWRtaW5pc3RyYXRpb25fY29uZmlybWF0aW9uX3RpdGxlXCIsXHJcbiAgICAgICAgKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgdXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbigpXHJcbiAgICAgICAgICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICAgICAgICAgICAgcmVxdWVzdC51aWRPYmplY3QgPSB0aGlzLl9pZFxyXG4gICAgICAgICAgICByZXF1ZXN0Lm5ld1dvcmtmbG93U3RhdHVzID0gZXZlbnQ7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3cgPSB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93VWlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtmbG93RXRhdCA9IHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgcmVxdWVzdC53b3JrZmxvd0luc3RhbmNlVWlkID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0luc3RhbmNlVWlkXHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3dFdGF0ID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVxdWVzdClcclxuICAgICAgICAgICAgdGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLnVwZGF0ZUVudGl0eVdvcmtmbG93SW5mb3JtYXRpb24ocmVxdWVzdCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN0YXR1cyAhPSBudWxsICYmIGRhdGEuc3RhdHVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gZGF0YS5zdGF0dXNcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3dFdGF0VWlkID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl90c2lOb3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKGVycm9yPy5lcnJvcilcclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWQgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGF0dXNNZXRhZGF0YUNvbWJvU3RhdHVzPzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNNZXRhRm9yQ29tYm8oKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzQnlCdXNpbmVzc0NsYXNzTmFtZSh0aGlzLmJ1c2luZXNzQ2xhc3MhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogU3RhdHVzTWV0YWRhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTWV0YWRhdGFDb21ib1N0YXR1cyA9IGRhdGE7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBFbnRpdHkgc3RhdHVzXHJcbiAgcHJpdmF0ZSBnZXRFbnRpdHlTdGF0dXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVudGl0eVN0YXR1c1NlcnZpY2UuZ2V0RW50aXR5U3RhdHVzKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IEVudGl0eVByb3BlcnRpZXNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAoZGF0YS5lbnRpdHlTdGF0dXMgJiYgQXJyYXkuaXNBcnJheShkYXRhLmVudGl0eVN0YXR1cykpIHtcclxuICAgICAgICAgIHRoaXMuZW50aXR5U3RhdHVzTGlzdCA9IGRhdGEuZW50aXR5U3RhdHVzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gTW9kZXMuY3JlYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGRhdGEuZGVmYXVsdFN0YXR1cztcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIG9uRHJhZ092ZXIoZXZlbnQ6IERyYWdFdmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Ecm9wKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBjb25zdCBmaWxlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlcj8uZmlsZXM7XHJcbiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBmaWxlID0gZmlsZXNbMF07XHJcbiAgICAgIGNvbnN0IGZpbGVFeHRlbnNpb24gPSBmaWxlLm5hbWUuc3BsaXQoJy4nKS5wb3AoKT8udG9Mb3dlckNhc2UoKSB8fCAnJztcclxuICAgICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudXBsb2FkRmlsZShmaWxlLCBmaWxlRXh0ZW5zaW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBsb2FkRmlsZShmaWxlOiBGaWxlLCBmaWxlRXh0ZW5zaW9uOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICByZWFkZXIub25sb2FkID0gKGU6IFByb2dyZXNzRXZlbnQ8RmlsZVJlYWRlcj4pID0+IHtcclxuICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBlLnRhcmdldD8ucmVzdWx0IGFzIEFycmF5QnVmZmVyO1xyXG4gICAgICBpZiAoIWFycmF5QnVmZmVyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBiYXNlNjRDb250ZW50ID0gdGhpcy5hcnJheUJ1ZmZlclRvQmFzZTY0KGFycmF5QnVmZmVyKTtcclxuXHJcbiAgICAgIGNvbnN0IGZpY2hpZXJUb1NlbmQgPSBuZXcgRmljaGllcigpO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmRhdGVGaWNoaWVyID0gbmV3IERhdGUoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5ub20gPSBmaWxlLm5hbWU7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQub2JqZXQgPSAnJztcclxuICAgICAgZmljaGllclRvU2VuZC5ub21GaWNoaWVyQ29tcGxldCA9IGZpbGUubmFtZTtcclxuICAgICAgZmljaGllclRvU2VuZC5kZXNjcmlwdGlvbiA9ICcnO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLmNvbnRlbnUgPSBiYXNlNjRDb250ZW50O1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLnRhYmxlTGllZSA9IHRoaXMuYnVzaW5lc3NDbGFzcztcclxuICAgICAgZmljaGllclRvU2VuZC5wa2V5ID0gdGhpcy5pZD8udG9TdHJpbmcoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5leHRlbnNpb24gPSBmaWxlRXh0ZW5zaW9uXHJcblxyXG4gICAgICB0aGlzLl9maWNoaWVyU2VydmljZS5jcmVhdGUoZmljaGllclRvU2VuZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldE5vbWJyZUZpY2hpZXIoKTtcclxuICAgICAgICAgIHRoaXMuX3RzaU5vdGlmaWNhdGlvblNlcnZpY2Uuc3VjY2VzcyhcImZpY2hpZXJfam9pbnRcIik7XHJcbiAgICAgICAgICB0aGlzLm9uU2F2ZS5lbWl0KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5fZXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLnNob3dFcnJvck1lc3NhZ2UocmVzcG9uc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcclxuICB9XHJcblxyXG4gIGFycmF5QnVmZmVyVG9CYXNlNjQoYnVmZmVyOiBBcnJheUJ1ZmZlcik6IHN0cmluZyB7XHJcbiAgICBsZXQgYmluYXJ5ID0gJyc7XHJcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XHJcbiAgICBjb25zdCBsZW4gPSBieXRlcy5ieXRlTGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBiaW5hcnkgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYnRvYShiaW5hcnkpO1xyXG4gIH1cclxuXHJcbiAgaGlkZSh2YWw/OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLnJlZiAhPSBudWxsICYmIHRoaXMucmVmICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodmFsID09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5yZWY/LmRlc3Ryb3koKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLnJlZj8uY2xvc2UodmFsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbChrZXk6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5sb2NhbGl6ZSAhPSBudWxsXHJcbiAgICAgICYmIHRoaXMubG9jYWxpemUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxvY2FsaXplLnRyYW5zZm9ybShrZXkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGtleTtcclxuICB9XHJcblxyXG4gIGdldE5vbWJyZUZpY2hpZXIoKSB7XHJcbiAgICBpZiAodGhpcy5pZCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMuX2ZpY2hpZXJTZXJ2aWNlXHJcbiAgICAgICAgLkdldE5vbWJyZUZpY2hpZXJKb2ludEJ5SWQodGhpcy5pZCA/PyBcIlwiKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5ub21icmVEb2N1bWVudHMgPSBkYXRhO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGVycm9yOiAocmVzcG9uc2U6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHRvIGdldCBudW1iZXIgb2YgZmlsZXMgb24gdGhpcyByZWNvcmRcIiwgcmVzcG9uc2UpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25EcmFnRW50ZXIoZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIHRoaXMuZHJhZ0VudGVyQ291bnQrKztcclxuXHJcbiAgICB0aGlzLmlzRHJhZ092ZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5zZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRHJhZ092ZXIpIHtcclxuICAgICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUsXHJcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WSArIDVcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ0xlYXZlKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmRyYWdFbnRlckNvdW50LS07XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhZ0VudGVyQ291bnQgPD0gMCkge1xyXG4gICAgICB0aGlzLmlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5kcmFnRW50ZXJDb3VudCA9IDA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldE1lc3NhZ2VQb3NpdGlvbihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLm1lc3NhZ2VQb3NpdGlvbiA9IHtcclxuICAgICAgeDogZXZlbnQuY2xpZW50WCArIDUsXHJcbiAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyA1LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tFbnRpdHlJbmZvKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYoIXRoaXMuYnVzaW5lc3NDbGFzcykgcmV0dXJuO1xyXG5cclxuICAgIHRyeXtcclxuICAgICAgbGV0IGVudGl0eUluZm8gPSBhd2FpdCB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm9Gcm9tQ2FjaGUodGhpcy5idXNpbmVzc0NsYXNzKTtcclxuXHJcbiAgICAgIGlmKCFlbnRpdHlJbmZvIHx8ICghZW50aXR5SW5mby5kaXNjcmltaW5hdG9yQ2xhc3NOYW1lICYmICFlbnRpdHlJbmZvLmRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUpKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5pZ25vcmVEZXNjcmltaW5hdG9yID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUZvcm1zSW5mb3MoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY2F0Y2goZXJyb3Ipe1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKSB7XHJcbiAgICBpZighdGhpcy5idXNpbmVzc0NsYXNzKSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuZm9ybXVsYWlyZVNlcnZpY2UuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3ModGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSlcclxuICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodmFsdWUpID0+IHtcclxuICAgICAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPCAxKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5mb3Jtc09mQnVzaW5lc3NDbGFzcyA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuZG9lc0hhdmVGb3JtcyA9IHRydWU7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICB9LFxyXG4gICAgfSlcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSByZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpIHsgdGhpcy5jYW5TaG93Rm9ybXMgPSB0aGlzLmRvZXNIYXZlRm9ybXMgJiYgIWlzTnVsbE9yRW1wdHkodGhpcy5tb2RlKSAmJiB0aGlzLm1vZGUgIT0gTW9kZXMuY3JlYXRlOyB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlRm9ybXNJbmZvcygpOiB2b2lkIHtcclxuICAgIGlmKHRoaXMuaXNGb3Jtc0luZm9zQ2FsY3VsYXRlZCkgcmV0dXJuOyAgICBcclxuICAgIGlmKCF0aGlzLmlzQnVzaW5lc3NDbGFzc1NldCB8fCAhdGhpcy5pZ25vcmVEZXNjcmltaW5hdG9yICYmICF0aGlzLmlzRGVzY3JpbWluYXRvclZhbHVlU2V0KSByZXR1cm47XHJcbiAgICBcclxuICAgIHRoaXMuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKTtcclxuICAgIHRoaXMuaXNGb3Jtc0luZm9zQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0aWFsaXplUmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMucmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucmVxdWVzdFRyYWNrZXJTZXJ2aWNlLnJlcXVlc3RTdGF0ZSQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmhhc0FjdGl2ZVJlcXVlc3RzID0gdmFsdWUuaGFzQWN0aXZlUmVxdWVzdDtcclxuICAgIH0pO1xyXG4gIH1cclxufSIsIjxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKG5nU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiICNmb3JtUmVmPVwibmdGb3JtXCI+XHJcbiAgPG5nLXRlbXBsYXRlICN0b29sYmFyVGVtcGxhdGU+XHJcbiAgICA8cC10b29sYmFyICpuZ0lmPVwiZm9ybUVuZHBvaW50XCIgc3R5bGVDbGFzcz1cIm1iLTEgZ2FwLTJcIiBjbGFzcz1cInctZnVsbFwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiIChkcmFnZW50ZXIpPVwib25EcmFnRW50ZXIoJGV2ZW50KVwiIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxlZnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtbC0yXCI+XHJcbiAgICAgICAgICB7eyBpbnB1dFRpdGxlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicmlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtci0yXCI+XHJcbiAgICAgICAgICA8YXBwLXJlcG9ydGluZyAqbmdJZj1cImZvcm1FbmRwb2ludFwiIFtmcm9tVHNpRm9ybV09XCJ0cnVlXCIgW2lkXT1cInRoaXMuaWRcIiBbZm9ybUVuZHBvaW50XT1cImZvcm1FbmRwb2ludFwiXHJcbiAgICAgICAgICAgIFtmb3JtTmFtZV09XCJmb3JtTmFtZVwiIFtyZXBvcnREaXNjcmltaW5hdG9yXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiIFtpc0Zvcm1FbmRwb2ludFBhZ2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbm9tYnJlRG9jdW1lbnRzSm9pbnRzXT1cIm5vbWJyZURvY3VtZW50c1wiIFtjb25maWdNb2RlQnV0dG9uSWRdPVwiY29uZmlnTW9kZUJ1dHRvbklkXCJcclxuICAgICAgICAgICAgW2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXT1cImlzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXCIgKHRvZ2dsZURlc2lnbk1vZGUpPVwidG9nZ2xlRGVzaWduTW9kZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIChjbG9zZWRNb2RhbEZpbGVVcGxvYWQpPVwiZ2V0Tm9tYnJlRmljaGllcigpXCJcclxuICAgICAgICAgICAgW3Nob3dJbXBvcnRFeHBvcnRCdXR0b25dPVwiZmFsc2VcIiAjcmVwb3J0aW5nQXBwPlxyXG4gICAgICAgICAgPC9hcHAtcmVwb3J0aW5nPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRHJhZ092ZXJcIiBbbmdTdHlsZV09XCJ7IGxlZnQ6IG1lc3NhZ2VQb3NpdGlvbi54ICsgJ3B4JywgdG9wOiBtZXNzYWdlUG9zaXRpb24ueSArICdweCcgfVwiXHJcbiAgICAgICAgY2xhc3M9XCJkcmFnLW1lc3NhZ2UgY3Vyc29yLWZvbGxvd1wiPlxyXG4gICAgICAgIHt7IFwiSm9pbnR1cmVcIiB8IGxvY2FsaXplIH19XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvcC10b29sYmFyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxkaXYgKmJ1c3k9XCJpc0xvYWRpbmcgfHwgaGFzQWN0aXZlUmVxdWVzdHNcIj48L2Rpdj5cclxuXHJcbiAgPGZpZWxkc2V0IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbXJcIj5cclxuICAgICAgPHAtdGFiVmlldz5cclxuXHJcbiAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwiXCIgXHJcbiAgICAgICAgW2hlYWRlclN0eWxlXT1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID09PSAwICYmICFjYW5TaG93Rm9ybXNcclxuICAgICAgPyB7IGRpc3BsYXk6ICdub25lJyB9IFxyXG4gICAgICA6IG51bGxcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob21lIG1yLTJcIj48L2k+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdGFiLXRleHRcIj57eyAnc2hhcmVkX2Zvcm1fbWFpbnRhYlRpdGxlJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgICAgICAgPCEtLSBEeW5hbWljIHRhYnMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IGdycCBvZiBjb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkXCIgW2hlYWRlcl09XCJncnAuZ3JvdXBlXCI+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2R5bmFtaWNUb29sYmFyQ29udGFpbmVyPjwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZ3JpZCBmb3JtLXJvd1wiICpuZ0Zvcj1cImxldCBjb2wgb2YgZ3JwLmNvbG9ubmVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgZm9ybS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cImNvbC5ub21cIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5zdHJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVRleHQtQm94IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyU3RyaW5nXCI+PC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLmludFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckludFwiPjwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWNpbWFsIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5kZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyRGVjaW1hbFwiPjwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5ib29sZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaXNCaW5hcnldPVwiZmFsc2VcIiBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJpbmFyeSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBmb3JtLWlucHV0XCIgKm5nSWY9XCJjb2wudHlwZSA9PT0gZm9ybVR5cGUuYmluYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgIGJpbmFyeSBpbnB1dCAobm90IGhhbmRsZWQgeWV0KVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY0Zvb3RlckNvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuU2hvd0Zvcm1zXCI+XHJcbiAgICAgICAgICA8cC10YWJQYW5lbCBbaGVhZGVyXT1cIidzaGFyZWRfZm9ybV9keW5hbWljRm9ybXNUYWJfVGl0bGUnIHwgbG9jYWxpemVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8c2hhcmVkLWR5bmFtaWMtZm9ybS1saXN0XHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZV09XCJpZFwiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZUJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZURpc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtpZ25vcmVEaWFsb2dDb25maWddPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCIoYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0Lmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgd29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHxcclxuICAgICAgICB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiIGNsYXNzPVwibXgtNCBweC0yIG15LTEgc2hhcmVkLWZvb3Rlci1iYXJcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0ICYmIGVudGl0eVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIiBwcmVzZW50YXRpb25EZXNpZ25lcj1cInNoYXJlZF9jcnVkX3N0YXR1c1wiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9jcnVkX3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbaWQtZmllbGRdPVwiJ2tleSdcIiBbbGFiZWwtZmllbGRdPVwiJ3ZhbHVlJ1wiIFtkYXRhc291cmNlXT1cImVudGl0eVN0YXR1c0xpc3RcIiBbKGJpbmQpXT1cInN0YXR1c1wiXHJcbiAgICAgICAgICBbY29tYm9UeXBlXT1cIidzdGF0dXMnXCIgW3N0YXR1c01ldGFkYXRhXT1cInN0YXR1c01ldGFkYXRhQ29tYm9TdGF0dXNcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHwgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3dcIlxyXG4gICAgICBjbGFzcz1cImZsZXggY29sLTEwXCI+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJzaGFyZWRfd29ya2Zsb3dOYW1lXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93J3wgbG9jYWxpemVcIj5cclxuICAgICAgICA8L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVRleHQtQm94IFtkaXNhYmxlZF09XCJ0cnVlXCIgW2lucHV0TmFtZV09XCInd29ya2Zsb3dOYW1lJ1wiIFsoaW5wdXRGaWVsZCldPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd05hbWVcIj5cclxuICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19jdXJyZW50X3N0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X2N1cnJlbnRfc3RhdHVzJ1wiPjwvVHNpLUxhYmVsPlxyXG4gICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgW2Rpc2FibGVkXT1cInRydWVcIiBpZC1maWVsZD1cImtleVwiIGxhYmVsLWZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgW2JpbmRdPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcIiBbaXNGaWx0ZXJlZF09XCJ0cnVlXCJcclxuICAgICAgICAgIFtlbGVtZW50U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdEFzS2V5VmFsdWVQYWlyXCIgW2xpc3RTb3VyY2VVcmxdPVwiZ2V0V29ya2Zsb3dFdGF0U3VpdmFudEFzS2V5VmFsdWVQYWlyXCI+XHJcbiAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC00XCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm1vZGUgIT0gZm9ybU1vZGVzLmNyZWF0ZSB8fCB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiXHJcbiAgICAgICAgICBwcmVzZW50YXRpb25EZXNpZ25lcj1cImFkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X25leHRfc3RhdHVzXCJcclxuICAgICAgICAgIGNsYXNzPVwiZmxleCBnYXAtMiBhbGlnbi1pdGVtcy1jZW50ZXIgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cIidhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19uZXh0X3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgaWQtZmllbGQ9XCJrZXlcIiBsYWJlbC1maWVsZD1cInZhbHVlXCIgWyhiaW5kKV09XCJzZWxlY3RlZFdvcmtmbG93RXRhdFVpZFwiXHJcbiAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJnZXRXb3JrZmxvd0V0YXRBc0tleVZhbHVlUGFpclwiXHJcbiAgICAgICAgICAgIFtsaXN0U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpclwiIChiaW5kQ2hhbmdlKT1cImNvbmZpcm1VcGRhdGVXb3JrZmxvd0V0YXQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+Il19
633
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHNpLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL3RzaS1mb3JtL3RzaS1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RzaS1zaGFyZWQtdWkvc3JjL2xpYi90c2ktY29tcG9uZW50cy90c2ktZm9ybS90c2ktZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBSUwsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxNQUFNLEVBR04sU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUE0QixPQUFPLEVBQW1DLCtCQUErQixFQUFFLG1DQUFtQyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hLLE9BQU8sRUFBRSx3QkFBd0IsRUFBdUMsTUFBTSxpREFBaUQsQ0FBQztBQUVoSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFVdEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixF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QUFFLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO2dCQUluRSx3QkFBd0I7c0JBRHZCLFlBQVk7dUJBQUMsd0JBQXdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICBBZnRlckNvbnRlbnRDaGVja2VkLFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbXBvbmVudFJlZixcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG4gIFZpZXdDb250YWluZXJSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nQ29uZmlnLCBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmb3JtVHlwZSB9IGZyb20gJy4uLy4uL2NvbnN0cy9mb3JtLXR5cGUnO1xyXG5pbXBvcnQgeyBBZG1pbmlzdHJhdGlvbkVuZHBvaW50cyB9IGZyb20gJy4uLy4uL2VuZC1wb2ludHMvZW5kcG9pbnRzJztcclxuaW1wb3J0IHsgTW9kZXMgfSBmcm9tICcuLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IElNb2RhbFNpemUgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRW50aXR5UHJvcGVydGllc1Jlc3BvbnNlLCBGaWNoaWVyLCBLZXlWYWx1ZVBhaXIsIE9wdGlvbmFsRW5kcG9pbnRzLCB1cGRhdGVFbnRpdHlXb3JrZmxvd0luZm9ybWF0aW9uLCB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YSwgQ29sb25uZVBlcnNvbm5hbGlzZWVHcm91cGVkUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvZHluYW1pYy1mb3JtL2NvbG9ubmUtcGVyc29ubmFsaXNlZSc7XHJcbmltcG9ydCB7IFN0YXR1c01ldGFkYXRhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbHMvc3RhdHVzL2NvbG9yLXN0YXR1cyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vY29sb25uZS1wZXJzb25uYWxpc2VlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEeW5hbWljRm9ybVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9keW5hbWljLWZvcm0vZHluYW1pYy1mb3JtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGaWNoaWVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpY2hpZXIvZmljaGllci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTGF5b3V0SGVscGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xheW91dC9sYXlvdXQtaGVscGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9ub3RpZmljYXRpb24vZXJyb3ItcmVzcG9uc2UtbWFuYWdlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHNpQ29uZmlybWF0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25vdGlmaWNhdGlvbi90c2ktY29uZmlybWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUc2lOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9uL3RzaS1ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IEVudGl0eVN0YXR1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvZW50aXR5U3RhdHVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTdGF0dXNDb2xvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9zdGF0dXMvc3RhdHVzLWNvbG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXb3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvd29ya2Zsb3cvd29ya2Zsb3ctY29uZmlndXJhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUmVwb3J0aW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vcmVwb3J0aW5nL3JlcG9ydGluZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEZvb3RlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1mb290ZXIvdHNpLW1vZGFsLWZvb3Rlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBUc2lNb2RhbEhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL3RzaS1tb2RhbC1oZWFkZXIvdHNpLW1vZGFsLWhlYWRlci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGb3JtdWxhaXJlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2R5bmFtaWMtZm9ybS9mb3JtdWxhaXJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBpc051bGxPckVtcHR5IH0gZnJvbSAnLi4vLi4vZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgRW50aXR5Q29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2VudGl0eS1jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSZXF1ZXN0VHJhY2tlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0LW1hbmFnZW1lbnQvcmVxdWVzdC10cmFja2VyLnNlcnZpY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd0c2ktZm9ybScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RzaS1mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90c2ktZm9ybS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVHNpRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcbiAgcHVibGljIGxvY2FsaXplPyA9IGluamVjdChMb2NhbGl6ZVBpcGUpXHJcblxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIGZpZWxkc1xyXG4gIHByaXZhdGUgX2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiBwcm9wZXJ0aWVzXHJcbiAgQFZpZXdDaGlsZCgnZm9ybVJlZicpIGZvcm1SZWY/OiBOZ0Zvcm07XHJcbiAgQFZpZXdDaGlsZChcInJlcG9ydGluZ0FwcFwiKSByZXBvcnRpbmdBcHA/OiBSZXBvcnRpbmdDb21wb25lbnRcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGlucHV0c1xyXG4gIEBJbnB1dCgpIGNsYXNzPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZTogc3RyaW5nID0gJ29mZic7XHJcbiAgLy8gQElucHV0KCkgZm9ybU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICAvLyBASW5wdXQoKSBmb3JtRW5kcG9pbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgQElucHV0KCkgb3B0aW9uYWxFbmRwb2ludHM/OiBPcHRpb25hbEVuZHBvaW50cztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1vZGFsU2l6ZT86IElNb2RhbFNpemU7XHJcbiAgQE91dHB1dCgpIG9uU2F2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwcml2YXRlIF9kZXNjcmltaW5hdG9yVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcclxuICBnZXQgZGVzY3JpbWluYXRvclZhbHVlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9kZXNjcmltaW5hdG9yVmFsdWU7IH1cclxuICBzZXQgZGVzY3JpbWluYXRvclZhbHVlKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Rlc2NyaW1pbmF0b3JWYWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pc0Rlc2NyaW1pbmF0b3JWYWx1ZVNldCA9IHRydWU7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUZvcm1zSW5mb3MoKTtcclxuICB9XHJcblxyXG4gIGVudGl0eVN0YXR1c0xpc3Q6IEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz5bXSA9IFtdO1xyXG4gIHN0YXR1c0NvbHVtbk5hbWU6IHN0cmluZyA9ICcnXHJcblxyXG4gIG5vbWJyZURvY3VtZW50czogbnVtYmVyIHwgdW5kZWZpbmVkO1xyXG4gIGlzRHJhZ092ZXIgPSBmYWxzZTtcclxuICBtZXNzYWdlUG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfTtcclxuICBwcml2YXRlIGRyYWdFbnRlckNvdW50ID0gMDtcclxuICBwcml2YXRlIF9mb3JtTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBmb3JtRW5kcG9pbnQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9mb3JtRW5kcG9pbnQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybUVuZHBvaW50KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2Zvcm1FbmRwb2ludCA9IHZhbHVlO1xyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGZvcm1OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZm9ybU5hbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgZm9ybU5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fZm9ybU5hbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9idXNpbmVzc0NsYXNzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9tb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZm9ybUVuZHBvaW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfc3RhdHVzOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8vIEdldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIGdldCBidXNpbmVzc0NsYXNzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3IgYnVzaW5lc3NDbGFzc1xyXG4gIHNldCBidXNpbmVzc0NsYXNzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2J1c2luZXNzQ2xhc3MgPSB2YWx1ZTtcclxuICAgIHRoaXMuaXNCdXNpbmVzc0NsYXNzU2V0ID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmdldENvbG9ubmVQZXJzb25uYWxpc2VlKCk7XHJcbiAgICB0aGlzLmdldEVudGl0eVN0YXR1cygpO1xyXG4gICAgdGhpcy5nZXRTdGF0dXNNZXRhRm9yQ29tYm8oKTtcclxuICAgIHRoaXMuY2hlY2tFbnRpdHlJbmZvKCk7XHJcbiAgICB0aGlzLmNhbGN1bGF0ZUZvcm1zSW5mb3MoKTtcclxuICB9XHJcblxyXG4gIC8vIEdldHRlciBmb3IgaWRcclxuICBnZXQgaWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9pZDtcclxuICB9XHJcblxyXG4gIC8vIFNldHRlciBmb3IgaWRcclxuICBzZXQgaWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcclxuICAgIHRoaXMuZ2V0Q29sb25uZVBlcnNvbm5hbGlzZWUoKTtcclxuICAgIHRoaXMuZ2V0Tm9tYnJlRmljaGllcigpO1xyXG4gIH1cclxuXHJcbiAgLy8gR2V0dGVyIGZvciBzdGF0dXNcclxuICBnZXQgc3RhdHVzKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xyXG4gIH1cclxuXHJcbiAgLy8gU2V0dGVyIGZvciBzdGF0dXNcclxuICBzZXQgc3RhdHVzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xyXG4gICAgdGhpcy5vblN0YXR1c0NoYW5nZS5lbWl0KHRoaXMuX3N0YXR1cyk7XHJcbiAgfVxyXG5cclxuICBzZXQgbW9kZSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gdmFsdWU7XHJcbiAgICB0aGlzLmdldENvbG9ubmVQZXJzb25uYWxpc2VlKCk7XHJcbiAgICB0aGlzLnJlY2FsY3VsYXRlRm9ybXNWaXNpYmlsaXR5KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgbW9kZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX21vZGU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBpc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHNldCBpc1JlcG9ydGluZ1Rvb2xiYXJEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNSZXBvcnRpbmdUb29sYmFyRGlzYWJsZWQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIGlzQ3JlYXRlT25seTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIG91dHB1dHNcclxuICBAT3V0cHV0KCkgb25TdWJtaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uU3VibWl0Rm9ybVdvcmtmbG93Q29uZmlndXJhdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZm9ybVJlZkNoYW5nZTogRXZlbnRFbWl0dGVyPE5nRm9ybT4gPSBuZXcgRXZlbnRFbWl0dGVyPE5nRm9ybT4oKTtcclxuICBAT3V0cHV0KCkgb25TdGF0dXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJUZW1wbGF0ZScpIHRvb2xiYXJUZW1wbGF0ZVJlZiAhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBDb250ZW50Q2hpbGQoVHNpTW9kYWxIZWFkZXJDb21wb25lbnQpIG1vZGFsSGVhZGVyQ29tcD86IFRzaU1vZGFsSGVhZGVyQ29tcG9uZW50O1xyXG5cclxuICBAQ29udGVudENoaWxkKFRzaU1vZGFsRm9vdGVyQ29tcG9uZW50KSBtb2RhbEZvb3RlckNvbXA/OiBUc2lNb2RhbEZvb3RlckNvbXBvbmVudDtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZHluYW1pY1Rvb2xiYXJDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuICBkeW5hbWljVG9vbGJhckNvbnRhaW5lcnMhOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2R5bmFtaWNGb290ZXJDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcclxuICBkeW5hbWljRm9vdGVyc0NvbnRhaW5lcnMhOiBRdWVyeUxpc3Q8Vmlld0NvbnRhaW5lclJlZj47XHJcblxyXG4gIHByaXZhdGUgX2lucHV0VGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgZ2V0IGlucHV0VGl0bGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLm1vZGFsSGVhZGVyQ29tcD8uaW5wdXRUaXRsZVxyXG4gIH1cclxuXHJcbiAgc2V0IGlucHV0VGl0bGUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5faW5wdXRUaXRsZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZDogQ29sb25uZVBlcnNvbm5hbGlzZWVHcm91cGVkUmVzcG9uc2VbXSA9IFtdO1xyXG4gIGNhblNob3dGb3JtczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGZvcm1zT2ZCdXNpbmVzc0NsYXNzOiBhbnlbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2RvZXNIYXZlRm9ybXM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgZG9lc0hhdmVGb3JtcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2RvZXNIYXZlRm9ybXM7IH1cclxuICBzZXQgZG9lc0hhdmVGb3Jtcyh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZG9lc0hhdmVGb3JtcyA9IHZhbHVlO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgaXNEZXNjcmltaW5hdG9yVmFsdWVTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0J1c2luZXNzQ2xhc3NTZXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0Zvcm1zSW5mb3NDYWxjdWxhdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaWdub3JlRGVzY3JpbWluYXRvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGhhc0FjdGl2ZVJlcXVlc3RzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0VHJhY2tlclN0YXRlU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG5cclxuICBkeW5hbWljRm9ybVNlcnZpY2UgPSBpbmplY3QoRHluYW1pY0Zvcm1TZXJ2aWNlKTtcclxuICBmb3JtdWxhaXJlU2VydmljZSA6IEZvcm11bGFpcmVTZXJ2aWNlID0gaW5qZWN0KEZvcm11bGFpcmVTZXJ2aWNlKTtcclxuICBlbnRpdHlDb25maWd1cmF0aW9uU2VydmljZSA6IEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlID0gaW5qZWN0KEVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlKTtcclxuICByZXF1ZXN0VHJhY2tlclNlcnZpY2UgOiBSZXF1ZXN0VHJhY2tlclNlcnZpY2UgPSBpbmplY3QoUmVxdWVzdFRyYWNrZXJTZXJ2aWNlKTtcclxuXHJcbiAgLy8jcmVnaW9uIGN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZW50aXR5U3RhdHVzU2VydmljZTogRW50aXR5U3RhdHVzU2VydmljZSxcclxuICAgIHByaXZhdGUgc3RhdHVzQ29sb3JTZXJ2aWNlOiBTdGF0dXNDb2xvclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgX2ZpY2hpZXJTZXJ2aWNlOiBGaWNoaWVyU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZTogRXJyb3JSZXNwb25zZU1hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfdHNpQ29uZmlybVNlcnZpY2U6IFRzaUNvbmZpcm1hdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90c2lOb3RpZmljYXRpb25TZXJ2aWNlOiBUc2lOb3RpZmljYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgX2xheW91dEhlbHBlclNlcnZpY2U6IExheW91dEhlbHBlclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZTogV29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHB1YmxpYyBfY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlOiBDb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgcmVmPzogRHluYW1pY0RpYWxvZ1JlZixcclxuICAgIHB1YmxpYyBjb25maWc/OiBEeW5hbWljRGlhbG9nQ29uZmlnLFxyXG5cclxuICApIHsgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgaWYgKHRoaXMucmVwb3J0aW5nQXBwKSB7XHJcblxyXG4gICAgICBpZiAodGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5pc0Rlc2lnbk1vZGUgJiYgdGhpcy5yZXBvcnRpbmdBcHAuc2hvd1ByZXNlbnRhdGlvbkRlc2lnbmVyQ29uZmlnQnV0dG9uKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRpbmdBcHAuc2hvd1ByZXNlbnRhdGlvbkRlc2lnbmVyQ29uZmlnQnV0dG9uID0gZmFsc2VcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zYXZlZERhdGFTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5zYXZlZERhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMucmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnJlcXVlc3RUcmFja2VyU3RhdGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIC8vI3JlZ2lvbiB2YXJpYWJsZXNcclxuICBwcml2YXRlIF93b3JrZmxvd0luZm9ybWF0aW9uOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSA9IG5ldyB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSgpO1xyXG4gIHNldCB3b3JrZmxvd0luZm9ybWF0aW9uKHZhbHVlOiB3b3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXNwb25zZSkge1xyXG4gICAgdGhpcy5fd29ya2Zsb3dJbmZvcm1hdGlvbiA9IHZhbHVlXHJcbiAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gYXN5bmMgZ2V0V29ya2Zsb3dFbnRpdHlJbmZvcm1hdGlvbihidXNpbmVzc0NsYXNzOiBzdHJpbmcsIHVpZE9iamVjdD86IHN0cmluZywgZGlzY3JpbWluYXRvckNsYXNzTmFtZSA/OiBzdHJpbmcsIFxyXG4gIC8vIGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWUgPzogc3RyaW5nXHJcbiAgLy8gKSB7XHJcbiAgLy8gICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSkge1xyXG4gIC8vICAgICByZXR1cm47XHJcbiAgLy8gICB9XHJcbiAgLy8gICB0cnkge1xyXG4gIC8vICAgICBsZXQgcmVxdWVzdDogR2V0V29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVxdWVzdCA9IG5ldyBHZXRXb3JrZmxvd0luc3RhbmNlSW5mb3JtYXRpb25SZXF1ZXN0KCk7XHJcbiAgLy8gICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gYnVzaW5lc3NDbGFzc1xyXG4gIC8vICAgICByZXF1ZXN0LnVpZE9iamV0ID0gdWlkT2JqZWN0O1xyXG4gIC8vICAgICByZXF1ZXN0LmRpc2NyaW1pbmF0b3JDbGFzc05hbWUgPSBkaXNjcmltaW5hdG9yQ2xhc3NOYW1lXHJcbiAgLy8gICAgIHJlcXVlc3QuZGlzY3JpbWluYXRvclByb3BlcnR5TmFtZSA9IGRpc2NyaW1pbmF0b3JQcm9wZXJ0eU5hbWVcclxuICAvLyAgICAgcmVxdWVzdC5kaXNjcmltaW5hdG9yVmFsdWUgPSB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZVxyXG4gIC8vICAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eVdvcmtsZm93SW5zdGFuY2VJbmZvcm1hdGlvbihyZXF1ZXN0KSlcclxuICAvLyAgICAgY29uc29sZS5sb2coXCJ0aGlzLndvcmtmbG93SW5mb3JtYXRpb25cIiwgdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKVxyXG4gIC8vICAgICBpZiAodGhpcy53b3JrZmxvd0luZm9ybWF0aW9uKSB7XHJcbiAgLy8gICAgICAgbGV0IHdvcmtmbG93RXRhdEZvcm0gPSB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLndvcmtmbG93RXRhdEZvcm1Gb3JDdXJyZW50Rm9ybVxyXG4gIC8vICAgICAgICAgPy5maW5kKHggPT4geC51aWQgPT0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXQpXHJcbiAgLy8gICAgICAgaWYgKHdvcmtmbG93RXRhdEZvcm0pIHtcclxuICAvLyAgICAgICAgIHRoaXMuX3dvcmtmbG93Q29uZmlndXJhdGlvblNlcnZpY2Uud29ya2Zsb3dFdGF0Rm9yRm9yQ3VycmVudEVudGl0eUZvcm0gPVxyXG4gIC8vICAgICAgICAgICB0aGlzLl93b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLm1hcFdvcmtmbG93RXRhdEZvcm1Ub1ByZXNlbnRhdGlvblNldHRpbmcod29ya2Zsb3dFdGF0Rm9ybS53b3JrZmxvd0V0YXRzRm9ybXMpXHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9XHJcbiAgLy8gICBjYXRjaCAoZXJyb3IpIHtcclxuICAvLyAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAvLyAgIH1cclxuICAvLyB9XHJcblxyXG4gIGdldCB3b3JrZmxvd0luZm9ybWF0aW9uKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93SW5mb3JtYXRpb25cclxuICB9XHJcbiAgZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIgPVxyXG4gICAgQWRtaW5pc3RyYXRpb25FbmRwb2ludHMuZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXIoKTtcclxuICBnZXRXb3JrZmxvd0V0YXRTdWl2YW50QXNLZXlWYWx1ZVBhaXIgPSAnJztcclxuICBzZWxlY3RlZFdvcmtmbG93RXRhdFVpZDogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbDtcclxuICBpc0NvbWJvRGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBmb3JtTW9kZXMgPSBNb2RlcztcclxuXHJcbiAgY29uZmlnTW9kZUJ1dHRvbklkID0gXCJjb25mZy1tb2RlLWJ1dHRvbi1mcm9tLWZvcm1cIjtcclxuICBjdWRDb21wb25lbnQ6IGFueVxyXG4gIGNvbmZpZ0RhdGE6IGFueVxyXG4gIHNhdmVkRGF0YVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvblxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIGhhbmRsZSBMaWZlY3ljbGUgSG9va3NcclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VkQ29tcG9uZW50ID0gdGhpcy5jb25maWc/LmRhdGE/LmN1ZENvbXBvbmVudDtcclxuICAgIHRoaXMuY29uZmlnRGF0YSA9IHRoaXMuY29uZmlnXHJcbiAgICB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24gPSB0aGlzLmNvbmZpZz8uZGF0YT8ud29ya2Zsb3dJbmZvcm1hdGlvbiA/PyBuZXcgd29ya2Zsb3dJbnN0YW5jZUluZm9ybWF0aW9uUmVzcG9uc2UoKVxyXG4gICAgY29uc29sZS5sb2coXCJ3b3JrZmxvd0luZm9ybWF0aW9uID0+IFwiLCB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24pXHJcbiAgICBpZiAodGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93RXRhdCkge1xyXG4gICAgICB0aGlzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpciA9IEFkbWluaXN0cmF0aW9uRW5kcG9pbnRzLmdldFdvcmtmbG93RXRhdFN1aXZhbnRCeVdvcmtmbG93RXRhdCh0aGlzLndvcmtmbG93SW5mb3JtYXRpb24ud29ya2Zsb3dFdGF0KVxyXG4gICAgfVxyXG4gICAgdGhpcy5faW5pdEZvcm1TYXZlU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gICAgdGhpcy5faW5pdGlhbGl6ZVJlcXVlc3RUcmFja2VyU3RhdGVTdWJzY3JpcHRpb24oKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRGb3JtU2F2ZVN1YnNjcmlwdGlvbigpIHtcclxuICAgIHRoaXMuc2F2ZWREYXRhU3Vic2NyaXB0aW9uID0gdGhpcy5fY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlXHJcbiAgICAgIC5kYXRhU2F2ZWRPYnNlcnZhYmxlLnN1YnNjcmliZShcclxuICAgICAgICBhc3luYyAoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZHluYW1pY0Zvcm1TZXJ2aWNlLmNvbG9ubmVzUGVyc29ubmFsaXNlZURhdGFcclxuICAgICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHgub2NjdXJlbmNlID0gZGF0YSlcclxuICAgICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fY29sb25uZVBlcnNvbm5hbGlzZWVTZXJ2aWNlLmFkZE9yVXBkYXRlRm9ybXVsYWlyZURhdGEodGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YSkpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgfVxyXG5cclxuICBmb3JtVHlwZSA9IGZvcm1UeXBlO1xyXG4gIHByaXZhdGUgZ2V0Q29sb25uZVBlcnNvbm5hbGlzZWUoKSB7XHJcbiAgICBpZiAodGhpcy5idXNpbmVzc0NsYXNzICYmIHRoaXMubW9kZSA9PSBNb2Rlcy5jcmVhdGUpIHtcclxuICAgICAgdGhpcy5fZ2V0Q29sb25uZVBlcnNvbm5hbGlzZSh0aGlzLmJ1c2luZXNzQ2xhc3MpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmJ1c2luZXNzQ2xhc3MgJiYgdGhpcy5tb2RlICE9IE1vZGVzLmNyZWF0ZSAmJiB0aGlzLmlkKSB7XHJcbiAgICAgIHRoaXMuX2dldENvbG9ubmVQZXJzb25uYWxpc2UodGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmlkKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q29sb25uZVBlcnNvbm5hbGlzZShidXNpbmVzc0NsYXNzOiBzdHJpbmcsIGlkPzogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9jb2xvbm5lUGVyc29ubmFsaXNlZVNlcnZpY2UuZ2V0Q29sb25uZXNQZXJzb25uYWxpc2VlKGJ1c2luZXNzQ2xhc3MsIHRoaXMuaWQpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcclxuICAgICAgICByZXMuZm9yRWFjaChjcGcgPT4ge1xyXG4gICAgICAgICAgY3BnLmNvbG9ubmVzLmZvckVhY2goY3AgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWNwLmRhdGEpIHtcclxuICAgICAgICAgICAgICBjcC5kYXRhID0gbmV3IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YShcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRoaXMuaWQsIGNwLnVpZCxcclxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZCA9IHJlcztcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9wcm9jZXNzRHluYW1pY1RhYnMoKVxyXG4gICAgICAgIH0sIDApO1xyXG5cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yIHdoZW4gZ2V0dGluZyBsaXN0IG9mIGNvbG9ubmUgcGVyc29ubmFsaXNlZVwiLCBlcnIpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlRGVzaWduTW9kZShldmVudDogYW55KSB7XHJcbiAgICAvLyB0aGlzLmNvbmZpZ0RhdGEuZGF0YS5jdWRDb21wb25lbnQgPSB1bmRlZmluZWRcclxuICAgIC8vIHRoaXMuY29uZmlnRGF0YS5kYXRhLndvcmtmbG93SW5mb3JtYXRpb24gPSB1bmRlZmluZWRcclxuXHJcbiAgICAvLyB0aGlzLnJlZj8uY2xvc2UoKTtcclxuICAgIC8vIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuaXNEZXNpZ25Nb2RlID0gdHJ1ZVxyXG4gICAgLy8gdGhpcy5fbGF5b3V0SGVscGVyU2VydmljZS5jdXJyZW50Rm9ybU5hbWUgPSB0aGlzLmdldENvbXBvbmVudElkZW50aWZpZXIoKVxyXG5cclxuICAgIC8vIHRoaXMucmVmID0gdGhpcy5fZGlhbG9nU2VydmljZS5vcGVuKHRoaXMuY3VkQ29tcG9uZW50LCB0aGlzLmNvbmZpZ0RhdGEpO1xyXG4gICAgLy8gdGhpcy5yZWYub25DbG9zZS5zdWJzY3JpYmUoKHZhbD86IGFueSkgPT4ge1xyXG4gICAgLy8gICB0aGlzLl9sYXlvdXRIZWxwZXJTZXJ2aWNlLmlzRGVzaWduTW9kZSA9IGZhbHNlXHJcbiAgICAvLyAgIHRoaXMuX2xheW91dEhlbHBlclNlcnZpY2UuY3VycmVudEZvcm1OYW1lID0gdW5kZWZpbmVkXHJcbiAgICAvLyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3Byb2Nlc3NEeW5hbWljVGFicygpIHtcclxuICAgIHRoaXMuZHluYW1pY1Rvb2xiYXJDb250YWluZXJzLnRvQXJyYXkoKS5mb3JFYWNoKGNvbnRhaW5lciA9PiB7XHJcbiAgICAgIGNvbnRhaW5lci5jbGVhcigpO1xyXG4gICAgICBjb25zdCBjb21wUmVmOiBDb21wb25lbnRSZWY8VHNpTW9kYWxIZWFkZXJDb21wb25lbnQ+ID0gY29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChUc2lNb2RhbEhlYWRlckNvbXBvbmVudCk7XHJcblxyXG4gICAgICBjb21wUmVmLmluc3RhbmNlLnRvb2xiYXJUZW1wbGF0ZUhlYWRlciA9IHRoaXMubW9kYWxIZWFkZXJDb21wIS50b29sYmFyVGVtcGxhdGVIZWFkZXI7XHJcbiAgICAgIGNvbXBSZWYuaW5zdGFuY2UuaW5wdXRUaXRsZSA9IHRoaXMubW9kYWxIZWFkZXJDb21wIS5pbnB1dFRpdGxlO1xyXG5cclxuICAgICAgY29tcFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmR5bmFtaWNGb290ZXJzQ29udGFpbmVycy50b0FycmF5KCkuZm9yRWFjaChjb250YWluZXIgPT4ge1xyXG4gICAgICBjb250YWluZXIuY2xlYXIoKTtcclxuICAgICAgY29uc3QgY29tcFJlZjogQ29tcG9uZW50UmVmPFRzaU1vZGFsRm9vdGVyQ29tcG9uZW50PiA9IGNvbnRhaW5lci5jcmVhdGVDb21wb25lbnQoVHNpTW9kYWxGb290ZXJDb21wb25lbnQpO1xyXG4gICAgICBjb21wUmVmLmluc3RhbmNlLmZvb3RlclRlbXBsYXRlUmVmID0gdGhpcy5tb2RhbEZvb3RlckNvbXA/LmZvb3RlclRlbXBsYXRlUmVmXHJcbiAgICAgIGNvbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnRvb2xiYXJUZW1wbGF0ZVJlZiAmJiB0aGlzLm1vZGFsSGVhZGVyQ29tcCkge1xyXG4gICAgICB0aGlzLm1vZGFsSGVhZGVyQ29tcC50b29sYmFyVGVtcGxhdGVIZWFkZXIgPSB0aGlzLnRvb2xiYXJUZW1wbGF0ZVJlZjtcclxuICAgICAgdGhpcy5pbnB1dFRpdGxlID0gdGhpcy5tb2RhbEhlYWRlckNvbXAuaW5wdXRUaXRsZTtcclxuXHJcbiAgICAgIHRoaXMubW9kYWxIZWFkZXJDb21wLnRvb2xiYXJUZW1wbGF0ZUhlYWRlciA9IHRoaXMudG9vbGJhclRlbXBsYXRlUmVmO1xyXG4gICAgICB0aGlzLmlucHV0VGl0bGUgPSB0aGlzLm1vZGFsSGVhZGVyQ29tcC5pbnB1dFRpdGxlO1xyXG4gICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZm9ybVJlZkNoYW5nZS5lbWl0KHRoaXMuZm9ybVJlZik7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gaGFuZGxlIGV2ZW50c1xyXG4gIGhhbmRsZUZvcm1TdWJtaXQoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgaWYodGhpcy5oYXNBY3RpdmVSZXF1ZXN0cykgcmV0dXJuO1xyXG4gICAgXHJcbiAgICBpZiAodGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvdykge1xyXG4gICAgICB0aGlzLm9uU3VibWl0Rm9ybVdvcmtmbG93Q29uZmlndXJhdGlvbi5lbWl0KGV2ZW50KVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKVxyXG4gICAgICB0aGlzLm9uU3VibWl0LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgc3luY0R5bmFtaWNDb2x1bW5EYXRhVG9EeW5hbWljRm9ybVNlcnZpY2UoKSB7XHJcbiAgICBjb25zdCBleGlzdGluZ1VpZHMgPSBuZXcgU2V0KFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhLm1hcCh4ID0+IHguY29sb25uZVBlcnNvbm5hbGlzZWVVaWQpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuY29sb25uZXNQZXJzb25uYWxpc2VlR3JvdXBlZC5mb3JFYWNoKGNwZyA9PiB7XHJcbiAgICAgIGNwZy5jb2xvbm5lcy5mb3JFYWNoKGNwID0+IHtcclxuICAgICAgICBpZiAoIWV4aXN0aW5nVWlkcy5oYXMoY3AudWlkKSkge1xyXG4gICAgICAgICAgaWYgKCFjcC5kYXRhKSB7XHJcbiAgICAgICAgICAgIGNwLmRhdGEgPSBuZXcgQ29sb25uZVBlcnNvbm5hbGlzZWVEYXRhKFxyXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICB0aGlzLmlkLCBjcC51aWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBuZXdEYXRhID0gbmV3IENvbG9ubmVQZXJzb25uYWxpc2VlRGF0YShcclxuICAgICAgICAgICAgY3A/LmRhdGE/LnVpZCA/PyB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIGNwPy5kYXRhPy5vY2N1cmVuY2UgPz8gdGhpcy5pZCxcclxuICAgICAgICAgICAgY3AudWlkLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJvb2xlYW4sXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVySW50LFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckRlY2ltYWwsXHJcbiAgICAgICAgICAgIGNwLmRhdGEudmFsZXVyU3RyaW5nLFxyXG4gICAgICAgICAgICBjcC5kYXRhLnZhbGV1ckJpbmFyeSxcclxuICAgICAgICAgICAgY3Aub2JzZXJ2YXRpb25cclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy5keW5hbWljRm9ybVNlcnZpY2UuY29sb25uZXNQZXJzb25uYWxpc2VlRGF0YS5wdXNoKG5ld0RhdGEpO1xyXG5cclxuICAgICAgICAgIGV4aXN0aW5nVWlkcy5hZGQoY3AudWlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJ0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhID0+IFwiLFxyXG4gICAgICB0aGlzLmR5bmFtaWNGb3JtU2VydmljZS5jb2xvbm5lc1BlcnNvbm5hbGlzZWVEYXRhXHJcbiAgICApXHJcblxyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiB3b3JrZmxvd1xyXG5cclxuXHJcbiAgY29uZmlybVVwZGF0ZVdvcmtmbG93RXRhdChldmVudDogYW55KSB7XHJcbiAgICBjb25zb2xlLmxvZyhldmVudClcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICB0aGlzLl90c2lDb25maXJtU2VydmljZS5jb25maXJtKFwiYWRtaW5pc3RyYXRpb25fY29uZmlybV9zdGF0dXNfY2hhbmdlXCIsIFwiYWRtaW5pc3RyYXRpb25fY29uZmlybWF0aW9uX3RpdGxlXCIsXHJcbiAgICAgICAgKHJlc3VsdDogYm9vbGVhbikgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWVcclxuICAgICAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgdXBkYXRlRW50aXR5V29ya2Zsb3dJbmZvcm1hdGlvbigpXHJcbiAgICAgICAgICAgIHJlcXVlc3QuY2xhc3NOYW1lID0gdGhpcy5fYnVzaW5lc3NDbGFzcztcclxuICAgICAgICAgICAgcmVxdWVzdC51aWRPYmplY3QgPSB0aGlzLl9pZFxyXG4gICAgICAgICAgICByZXF1ZXN0Lm5ld1dvcmtmbG93U3RhdHVzID0gZXZlbnQ7XHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3cgPSB0aGlzLndvcmtmbG93SW5mb3JtYXRpb24/LndvcmtmbG93VWlkO1xyXG4gICAgICAgICAgICByZXF1ZXN0LndvcmtmbG93RXRhdCA9IHRoaXMud29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgcmVxdWVzdC53b3JrZmxvd0luc3RhbmNlVWlkID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0luc3RhbmNlVWlkXHJcbiAgICAgICAgICAgIHJlcXVlc3Qud29ya2Zsb3dFdGF0ID0gdGhpcy53b3JrZmxvd0luZm9ybWF0aW9uPy53b3JrZmxvd0V0YXRcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVxdWVzdClcclxuICAgICAgICAgICAgdGhpcy53b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLnVwZGF0ZUVudGl0eVdvcmtmbG93SW5mb3JtYXRpb24ocmVxdWVzdCkuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpXHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN0YXR1cyAhPSBudWxsICYmIGRhdGEuc3RhdHVzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gZGF0YS5zdGF0dXNcclxuICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkV29ya2Zsb3dFdGF0VWlkID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLl90c2lOb3RpZmljYXRpb25TZXJ2aWNlLmVycm9yKGVycm9yPy5lcnJvcilcclxuICAgICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWQgPSBudWxsXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBzdGF0dXNNZXRhZGF0YUNvbWJvU3RhdHVzPzogU3RhdHVzTWV0YWRhdGFSZXNwb25zZTtcclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGF0dXNNZXRhRm9yQ29tYm8oKTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5zdGF0dXNDb2xvclNlcnZpY2UuZ2V0U3RhdHVzQ29sb3JEZXRhaWxzQnlCdXNpbmVzc0NsYXNzTmFtZSh0aGlzLmJ1c2luZXNzQ2xhc3MhKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoZGF0YTogU3RhdHVzTWV0YWRhdGFSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzTWV0YWRhdGFDb21ib1N0YXR1cyA9IGRhdGE7XHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBFbnRpdHkgc3RhdHVzXHJcbiAgcHJpdmF0ZSBnZXRFbnRpdHlTdGF0dXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVudGl0eVN0YXR1c1NlcnZpY2UuZ2V0RW50aXR5U3RhdHVzKHRoaXMuYnVzaW5lc3NDbGFzcykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKGRhdGE6IEVudGl0eVByb3BlcnRpZXNSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnN0YXR1c0NvbHVtbk5hbWUgPSBkYXRhLnN0YXR1c0NvbHVtbk5hbWUgPz8gXCJcIjtcclxuXHJcbiAgICAgICAgaWYgKGRhdGEuZW50aXR5U3RhdHVzICYmIEFycmF5LmlzQXJyYXkoZGF0YS5lbnRpdHlTdGF0dXMpKSB7XHJcbiAgICAgICAgICB0aGlzLmVudGl0eVN0YXR1c0xpc3QgPSBkYXRhLmVudGl0eVN0YXR1cztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT09IE1vZGVzLmNyZWF0ZSkge1xyXG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBkYXRhLmRlZmF1bHRTdGF0dXM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBvbkRyYWdPdmVyKGV2ZW50OiBEcmFnRXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uRHJvcChldmVudDogRHJhZ0V2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgZmlsZXMgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzO1xyXG4gICAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVzWzBdO1xyXG4gICAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gZmlsZS5uYW1lLnNwbGl0KCcuJykucG9wKCk/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcbiAgICAgIHRoaXMuaXNEcmFnT3ZlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnVwbG9hZEZpbGUoZmlsZSwgZmlsZUV4dGVuc2lvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwbG9hZEZpbGUoZmlsZTogRmlsZSwgZmlsZUV4dGVuc2lvbjogc3RyaW5nKSB7XHJcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgcmVhZGVyLm9ubG9hZCA9IChlOiBQcm9ncmVzc0V2ZW50PEZpbGVSZWFkZXI+KSA9PiB7XHJcbiAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gZS50YXJnZXQ/LnJlc3VsdCBhcyBBcnJheUJ1ZmZlcjtcclxuICAgICAgaWYgKCFhcnJheUJ1ZmZlcikgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgYmFzZTY0Q29udGVudCA9IHRoaXMuYXJyYXlCdWZmZXJUb0Jhc2U2NChhcnJheUJ1ZmZlcik7XHJcblxyXG4gICAgICBjb25zdCBmaWNoaWVyVG9TZW5kID0gbmV3IEZpY2hpZXIoKTtcclxuICAgICAgZmljaGllclRvU2VuZC5kYXRlRmljaGllciA9IG5ldyBEYXRlKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQubm9tID0gZmlsZS5uYW1lO1xyXG4gICAgICBmaWNoaWVyVG9TZW5kLm9iamV0ID0gJyc7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQubm9tRmljaGllckNvbXBsZXQgPSBmaWxlLm5hbWU7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZGVzY3JpcHRpb24gPSAnJztcclxuICAgICAgZmljaGllclRvU2VuZC5jb250ZW51ID0gYmFzZTY0Q29udGVudDtcclxuICAgICAgZmljaGllclRvU2VuZC50YWJsZUxpZWUgPSB0aGlzLmJ1c2luZXNzQ2xhc3M7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQucGtleSA9IHRoaXMuaWQ/LnRvU3RyaW5nKCk7XHJcbiAgICAgIGZpY2hpZXJUb1NlbmQuZXh0ZW5zaW9uID0gZmlsZUV4dGVuc2lvblxyXG5cclxuICAgICAgdGhpcy5fZmljaGllclNlcnZpY2UuY3JlYXRlKGZpY2hpZXJUb1NlbmQpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5nZXROb21icmVGaWNoaWVyKCk7XHJcbiAgICAgICAgICB0aGlzLl90c2lOb3RpZmljYXRpb25TZXJ2aWNlLnN1Y2Nlc3MoXCJmaWNoaWVyX2pvaW50XCIpO1xyXG4gICAgICAgICAgdGhpcy5vblNhdmUuZW1pdCgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChyZXNwb25zZTogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHRoaXMuX2Vycm9yUmVzcG9uc2VNYW5hZ2VyU2VydmljZS5zaG93RXJyb3JNZXNzYWdlKHJlc3BvbnNlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoZmlsZSk7XHJcbiAgfVxyXG5cclxuICBhcnJheUJ1ZmZlclRvQmFzZTY0KGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xyXG4gICAgbGV0IGJpbmFyeSA9ICcnO1xyXG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xyXG4gICAgY29uc3QgbGVuID0gYnl0ZXMuYnl0ZUxlbmd0aDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcclxuICAgICAgYmluYXJ5ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJ0b2EoYmluYXJ5KTtcclxuICB9XHJcblxyXG4gIGhpZGUodmFsPzogYW55KSB7XHJcbiAgICBpZiAodGhpcy5yZWYgIT0gbnVsbCAmJiB0aGlzLnJlZiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHZhbCA9PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMucmVmPy5kZXN0cm95KCk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdGhpcy5yZWY/LmNsb3NlKHZhbCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGwoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMubG9jYWxpemUgIT0gbnVsbFxyXG4gICAgICAmJiB0aGlzLmxvY2FsaXplICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5sb2NhbGl6ZS50cmFuc2Zvcm0oa2V5KTtcclxuICAgIH1cclxuICAgIHJldHVybiBrZXk7XHJcbiAgfVxyXG5cclxuICBnZXROb21icmVGaWNoaWVyKCkge1xyXG4gICAgaWYgKHRoaXMuaWQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLl9maWNoaWVyU2VydmljZVxyXG4gICAgICAgIC5HZXROb21icmVGaWNoaWVySm9pbnRCeUlkKHRoaXMuaWQgPz8gXCJcIilcclxuICAgICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubm9tYnJlRG9jdW1lbnRzID0gZGF0YTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKHJlc3BvbnNlOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9lcnJvclJlc3BvbnNlTWFuYWdlclNlcnZpY2Uuc2hvd0Vycm9yTWVzc2FnZShyZXNwb25zZSk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciB0byBnZXQgbnVtYmVyIG9mIGZpbGVzIG9uIHRoaXMgcmVjb3JkXCIsIHJlc3BvbnNlKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRHJhZ0VudGVyKGV2ZW50OiBEcmFnRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmRyYWdFbnRlckNvdW50Kys7XHJcblxyXG4gICAgdGhpcy5pc0RyYWdPdmVyID0gdHJ1ZTtcclxuICAgIHRoaXMuc2V0TWVzc2FnZVBvc2l0aW9uKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc0RyYWdPdmVyKSB7XHJcbiAgICAgIHRoaXMubWVzc2FnZVBvc2l0aW9uID0ge1xyXG4gICAgICAgIHg6IGV2ZW50LmNsaWVudFggKyA1LFxyXG4gICAgICAgIHk6IGV2ZW50LmNsaWVudFkgKyA1XHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkRyYWdMZWF2ZShldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5kcmFnRW50ZXJDb3VudC0tO1xyXG5cclxuICAgIGlmICh0aGlzLmRyYWdFbnRlckNvdW50IDw9IDApIHtcclxuICAgICAgdGhpcy5pc0RyYWdPdmVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZHJhZ0VudGVyQ291bnQgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRNZXNzYWdlUG9zaXRpb24oZXZlbnQ6IERyYWdFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZXNzYWdlUG9zaXRpb24gPSB7XHJcbiAgICAgIHg6IGV2ZW50LmNsaWVudFggKyA1LFxyXG4gICAgICB5OiBldmVudC5jbGllbnRZICsgNSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGNoZWNrRW50aXR5SW5mbygpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0NsYXNzKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGVudGl0eUluZm8gPSBhd2FpdCB0aGlzLmVudGl0eUNvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldEVudGl0eUluZm9Gcm9tQ2FjaGUodGhpcy5idXNpbmVzc0NsYXNzKTtcclxuXHJcbiAgICAgIGlmICghZW50aXR5SW5mbyB8fCAoIWVudGl0eUluZm8uZGlzY3JpbWluYXRvckNsYXNzTmFtZSAmJiAhZW50aXR5SW5mby5kaXNjcmltaW5hdG9yUHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgIHRoaXMuaWdub3JlRGVzY3JpbWluYXRvciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVGb3Jtc0luZm9zKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKSB7XHJcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NDbGFzcykgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZm9ybXVsYWlyZVNlcnZpY2UuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3ModGhpcy5idXNpbmVzc0NsYXNzLCB0aGlzLmRlc2NyaW1pbmF0b3JWYWx1ZSlcclxuICAgICAgLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCB2YWx1ZS5sZW5ndGggPCAxKSByZXR1cm47XHJcbiAgICAgICAgICB0aGlzLmZvcm1zT2ZCdXNpbmVzc0NsYXNzID0gdmFsdWU7XHJcbiAgICAgICAgICB0aGlzLmRvZXNIYXZlRm9ybXMgPSB0cnVlO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNhbGN1bGF0ZUZvcm1zVmlzaWJpbGl0eSgpIHsgdGhpcy5jYW5TaG93Rm9ybXMgPSB0aGlzLmRvZXNIYXZlRm9ybXMgJiYgIWlzTnVsbE9yRW1wdHkodGhpcy5tb2RlKSAmJiB0aGlzLm1vZGUgIT0gTW9kZXMuY3JlYXRlOyB9XHJcblxyXG4gIHByaXZhdGUgY2FsY3VsYXRlRm9ybXNJbmZvcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzRm9ybXNJbmZvc0NhbGN1bGF0ZWQpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5pc0J1c2luZXNzQ2xhc3NTZXQgfHwgIXRoaXMuaWdub3JlRGVzY3JpbWluYXRvciAmJiAhdGhpcy5pc0Rlc2NyaW1pbmF0b3JWYWx1ZVNldCkgcmV0dXJuO1xyXG5cclxuICAgIHRoaXMuZ2V0QWxsRm9ybXNPZkJ1c2luZXNzQ2xhc3MoKTtcclxuICAgIHRoaXMuaXNGb3Jtc0luZm9zQ2FsY3VsYXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0aWFsaXplUmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMucmVxdWVzdFRyYWNrZXJTdGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucmVxdWVzdFRyYWNrZXJTZXJ2aWNlLnJlcXVlc3RTdGF0ZSQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICB0aGlzLmhhc0FjdGl2ZVJlcXVlc3RzID0gdmFsdWUuaGFzQWN0aXZlUmVxdWVzdDtcclxuICAgIH0pO1xyXG4gIH1cclxufSIsIjxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKG5nU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiICNmb3JtUmVmPVwibmdGb3JtXCI+XHJcbiAgPG5nLXRlbXBsYXRlICN0b29sYmFyVGVtcGxhdGU+XHJcbiAgICA8cC10b29sYmFyICpuZ0lmPVwiZm9ybUVuZHBvaW50XCIgc3R5bGVDbGFzcz1cIm1iLTEgZ2FwLTJcIiBjbGFzcz1cInctZnVsbFwiIChkcmFnb3Zlcik9XCJvbkRyYWdPdmVyKCRldmVudClcIlxyXG4gICAgICAoZHJvcCk9XCJvbkRyb3AoJGV2ZW50KVwiIChkcmFnZW50ZXIpPVwib25EcmFnRW50ZXIoJGV2ZW50KVwiIChkcmFnbGVhdmUpPVwib25EcmFnTGVhdmUoJGV2ZW50KVwiPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImxlZnRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtbC0yXCI+XHJcbiAgICAgICAgICB7eyBpbnB1dFRpdGxlIH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwicmlnaHRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMSBtci0yXCI+XHJcbiAgICAgICAgICA8YXBwLXJlcG9ydGluZyAqbmdJZj1cImZvcm1FbmRwb2ludFwiIFtmcm9tVHNpRm9ybV09XCJ0cnVlXCIgW2lkXT1cInRoaXMuaWRcIiBbZm9ybUVuZHBvaW50XT1cImZvcm1FbmRwb2ludFwiXHJcbiAgICAgICAgICAgIFtmb3JtTmFtZV09XCJmb3JtTmFtZVwiIFtyZXBvcnREaXNjcmltaW5hdG9yXT1cImRlc2NyaW1pbmF0b3JWYWx1ZVwiIFtpc0Zvcm1FbmRwb2ludFBhZ2VkXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbbm9tYnJlRG9jdW1lbnRzSm9pbnRzXT1cIm5vbWJyZURvY3VtZW50c1wiIFtjb25maWdNb2RlQnV0dG9uSWRdPVwiY29uZmlnTW9kZUJ1dHRvbklkXCJcclxuICAgICAgICAgICAgW2lzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXT1cImlzUmVwb3J0aW5nVG9vbGJhckRpc2FibGVkXCIgKHRvZ2dsZURlc2lnbk1vZGUpPVwidG9nZ2xlRGVzaWduTW9kZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiIChjbG9zZWRNb2RhbEZpbGVVcGxvYWQpPVwiZ2V0Tm9tYnJlRmljaGllcigpXCJcclxuICAgICAgICAgICAgW3Nob3dJbXBvcnRFeHBvcnRCdXR0b25dPVwiZmFsc2VcIiAjcmVwb3J0aW5nQXBwPlxyXG4gICAgICAgICAgPC9hcHAtcmVwb3J0aW5nPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzRHJhZ092ZXJcIiBbbmdTdHlsZV09XCJ7IGxlZnQ6IG1lc3NhZ2VQb3NpdGlvbi54ICsgJ3B4JywgdG9wOiBtZXNzYWdlUG9zaXRpb24ueSArICdweCcgfVwiXHJcbiAgICAgICAgY2xhc3M9XCJkcmFnLW1lc3NhZ2UgY3Vyc29yLWZvbGxvd1wiPlxyXG4gICAgICAgIHt7IFwiSm9pbnR1cmVcIiB8IGxvY2FsaXplIH19XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvcC10b29sYmFyPlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gIDxkaXYgKmJ1c3k9XCJpc0xvYWRpbmcgfHwgaGFzQWN0aXZlUmVxdWVzdHNcIj48L2Rpdj5cclxuXHJcbiAgPGZpZWxkc2V0IFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhcmQgbXJcIj5cclxuICAgICAgPHAtdGFiVmlldz5cclxuXHJcbiAgICAgICAgPHAtdGFiUGFuZWwgaGVhZGVyPVwiXCIgXHJcbiAgICAgICAgW2hlYWRlclN0eWxlXT1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID09PSAwICYmICFjYW5TaG93Rm9ybXNcclxuICAgICAgPyB7IGRpc3BsYXk6ICdub25lJyB9IFxyXG4gICAgICA6IG51bGxcIj5cclxuXHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1ob21lIG1yLTJcIj48L2k+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1haW4tdGFiLXRleHRcIj57eyAnc2hhcmVkX2Zvcm1fbWFpbnRhYlRpdGxlJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgICAgIDwvcC10YWJQYW5lbD5cclxuXHJcbiAgICAgICAgPCEtLSBEeW5hbWljIHRhYnMgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbG9ubmVzUGVyc29ubmFsaXNlZUdyb3VwZWQubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgPHAtdGFiUGFuZWwgKm5nRm9yPVwibGV0IGdycCBvZiBjb2xvbm5lc1BlcnNvbm5hbGlzZWVHcm91cGVkXCIgW2hlYWRlcl09XCJncnAuZ3JvdXBlXCI+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2R5bmFtaWNUb29sYmFyQ29udGFpbmVyPjwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZ3JpZCBmb3JtLXJvd1wiICpuZ0Zvcj1cImxldCBjb2wgb2YgZ3JwLmNvbG9ubmVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgZm9ybS1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLUxhYmVsIFtsYWJlbFZhbHVlXT1cImNvbC5ub21cIj48L1RzaS1MYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gU3RyaW5nIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5zdHJpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVRleHQtQm94IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyU3RyaW5nXCI+PC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTggZm9ybS1pbnB1dFwiICpuZ0lmPVwiY29sLnR5cGUgPT09IGZvcm1UeXBlLmludFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckludFwiPjwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBEZWNpbWFsIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5kZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFsoaW5wdXRGaWVsZCldPVwiY29sLmRhdGEudmFsZXVyRGVjaW1hbFwiPjwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCb29sZWFuIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC04IGZvcm0taW5wdXRcIiAqbmdJZj1cImNvbC50eXBlID09PSBmb3JtVHlwZS5ib29sZWFuXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaXNCaW5hcnldPVwiZmFsc2VcIiBbKGlucHV0RmllbGQpXT1cImNvbC5kYXRhLnZhbGV1ckJvb2xlYW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEJpbmFyeSAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtOCBmb3JtLWlucHV0XCIgKm5nSWY9XCJjb2wudHlwZSA9PT0gZm9ybVR5cGUuYmluYXJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgIGJpbmFyeSBpbnB1dCAobm90IGhhbmRsZWQgeWV0KVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZHluYW1pY0Zvb3RlckNvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9wLXRhYlBhbmVsPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FuU2hvd0Zvcm1zXCI+XHJcbiAgICAgICAgICA8cC10YWJQYW5lbCBbaGVhZGVyXT1cIidzaGFyZWRfZm9ybV9keW5hbWljRm9ybXNUYWJfVGl0bGUnIHwgbG9jYWxpemVcIj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICA8c2hhcmVkLWR5bmFtaWMtZm9ybS1saXN0XHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZV09XCJpZFwiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZUJ1c2luZXNzQ2xhc3NdPVwiYnVzaW5lc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgW29jY3VyZW5jZURpc2NyaW1pbmF0b3JWYWx1ZV09XCJkZXNjcmltaW5hdG9yVmFsdWVcIlxyXG4gICAgICAgICAgICAgIFtpZ25vcmVEaWFsb2dDb25maWddPVwidHJ1ZVwiIC8+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L3AtdGFiUGFuZWw+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L3AtdGFiVmlldz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZmllbGRzZXQ+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCIoYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0Lmxlbmd0aCA+IDApIHx8XHJcbiAgICAgICAgd29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHxcclxuICAgICAgICB3b3JrZmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmlzRGVzZ2luTW9kZUZyb21Xb3JrZmxvd1wiIGNsYXNzPVwibXgtNCBweC0yIG15LTEgc2hhcmVkLWZvb3Rlci1iYXJcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzaW5lc3NDbGFzcyAmJiBlbnRpdHlTdGF0dXNMaXN0ICYmIGVudGl0eVN0YXR1c0xpc3QubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIiBwcmVzZW50YXRpb25EZXNpZ25lcj1cInNoYXJlZF9jcnVkX3N0YXR1c1wiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ3NoYXJlZF9jcnVkX3N0YXR1cydcIj48L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbaWQtZmllbGRdPVwiJ2tleSdcIiBbbGFiZWwtZmllbGRdPVwiJ3ZhbHVlJ1wiIFtkYXRhc291cmNlXT1cImVudGl0eVN0YXR1c0xpc3RcIiBbKGJpbmQpXT1cInN0YXR1c1wiXHJcbiAgICAgICAgICBbY29tYm9UeXBlXT1cIidzdGF0dXMnXCIgW3N0YXR1c01ldGFkYXRhXT1cInN0YXR1c01ldGFkYXRhQ29tYm9TdGF0dXNcIiBbaW5wdXROYW1lXT1cInN0YXR1c0NvbHVtbk5hbWVcIlxyXG4gICAgICAgICAgW3Nob3dBZGRCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgW3Nob3dTZWFyY2hCdXR0b25dPVwiZmFsc2VcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwid29ya2Zsb3dJbmZvcm1hdGlvbj8ud29ya2Zsb3dVaWQgfHwgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3dcIlxyXG4gICAgICBjbGFzcz1cImZsZXggY29sLTEwXCI+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJzaGFyZWRfd29ya2Zsb3dOYW1lXCIgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93J3wgbG9jYWxpemVcIj5cclxuICAgICAgICA8L1RzaS1MYWJlbD5cclxuICAgICAgICA8VHNpLVRleHQtQm94IFtkaXNhYmxlZF09XCJ0cnVlXCIgW2lucHV0TmFtZV09XCInd29ya2Zsb3dOYW1lJ1wiIFsoaW5wdXRGaWVsZCldPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd05hbWVcIj5cclxuICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19jdXJyZW50X3N0YXR1c1wiXHJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMiBjb2wtNFwiPlxyXG4gICAgICAgIDxUc2ktTGFiZWwgW2xhYmVsVmFsdWVdPVwiJ2FkbWluaXN0cmF0aW9uX3dvcmtmbG93X3dvcmtmbG93X2N1cnJlbnRfc3RhdHVzJ1wiPjwvVHNpLUxhYmVsPlxyXG4gICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIGNsYXNzPVwidy03XCIgW2Rpc2FibGVkXT1cInRydWVcIiBpZC1maWVsZD1cImtleVwiIGxhYmVsLWZpZWxkPVwidmFsdWVcIlxyXG4gICAgICAgICAgW2JpbmRdPVwid29ya2Zsb3dJbmZvcm1hdGlvbi53b3JrZmxvd0V0YXRcIiBbaXNGaWx0ZXJlZF09XCJ0cnVlXCIgW2lucHV0TmFtZV09XCInV29ya2Zsb3dFdGF0J1wiXHJcbiAgICAgICAgICBbZWxlbWVudFNvdXJjZVVybF09XCJnZXRXb3JrZmxvd0V0YXRBc0tleVZhbHVlUGFpclwiIFtsaXN0U291cmNlVXJsXT1cImdldFdvcmtmbG93RXRhdFN1aXZhbnRBc0tleVZhbHVlUGFpclwiXHJcbiAgICAgICAgICBbc2hvd0FkZEJ1dHRvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJmYWxzZVwiPlxyXG4gICAgICAgIDwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJtb2RlICE9IGZvcm1Nb2Rlcy5jcmVhdGUgfHwgd29ya2Zsb3dDb25maWd1cmF0aW9uU2VydmljZS5pc0Rlc2dpbk1vZGVGcm9tV29ya2Zsb3dcIlxyXG4gICAgICAgICAgcHJlc2VudGF0aW9uRGVzaWduZXI9XCJhZG1pbmlzdHJhdGlvbl93b3JrZmxvd193b3JrZmxvd19uZXh0X3N0YXR1c1wiXHJcbiAgICAgICAgICBjbGFzcz1cImZsZXggZ2FwLTIgYWxpZ24taXRlbXMtY2VudGVyIG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgPFRzaS1MYWJlbCBbbGFiZWxWYWx1ZV09XCInYWRtaW5pc3RyYXRpb25fd29ya2Zsb3dfd29ya2Zsb3dfbmV4dF9zdGF0dXMnXCI+PC9Uc2ktTGFiZWw+XHJcbiAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBjbGFzcz1cInctN1wiIGlkLWZpZWxkPVwia2V5XCIgbGFiZWwtZmllbGQ9XCJ2YWx1ZVwiIFsoYmluZCldPVwic2VsZWN0ZWRXb3JrZmxvd0V0YXRVaWRcIlxyXG4gICAgICAgICAgICBbaXNGaWx0ZXJlZF09XCJ0cnVlXCIgW2VsZW1lbnRTb3VyY2VVcmxdPVwiZ2V0V29ya2Zsb3dFdGF0QXNLZXlWYWx1ZVBhaXJcIiBbaW5wdXROYW1lXT1cIidXb3JrZmxvd0V0YXQnXCJcclxuICAgICAgICAgICAgW2xpc3RTb3VyY2VVcmxdPVwiZ2V0V29ya2Zsb3dFdGF0U3VpdmFudEFzS2V5VmFsdWVQYWlyXCIgKGJpbmRDaGFuZ2UpPVwiY29uZmlybVVwZGF0ZVdvcmtmbG93RXRhdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW3Nob3dBZGRCdXR0b25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJmYWxzZVwiPlxyXG4gICAgICAgICAgPC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+Il19