@smarterplan/ngx-smarterplan-admin 0.1.41 → 0.1.42

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.
@@ -33,6 +33,7 @@ export class TemplateComponent {
33
33
  this.availableHashtags = [];
34
34
  this.addedHashtags = [];
35
35
  this.dateError = false;
36
+ this.errorForm = false;
36
37
  this.userService.isChanged.subscribe(() => {
37
38
  this.updateUserInfo();
38
39
  });
@@ -47,10 +48,12 @@ export class TemplateComponent {
47
48
  this.locales = enumToArray(Locale);
48
49
  }
49
50
  async setup() {
51
+ console.log('SETUP');
50
52
  // respect the order of functions here !!
51
53
  if (this.zoneID) {
52
54
  this.inputZone = await this.zoneService.getZone(this.zoneID);
53
55
  await this.setHashtags(this.inputZone.spaceID);
56
+ console.log(this.inputZone);
54
57
  }
55
58
  this.initForm();
56
59
  if (this.editTemplate) {
@@ -111,30 +114,24 @@ export class TemplateComponent {
111
114
  startDate: [startDate, [floatValidator(), Validators.required]],
112
115
  endDate: [endDate, [floatValidator(), Validators.required]],
113
116
  });
117
+ console.log(this.form.value);
114
118
  }
115
119
  }
116
120
  async onSubmit() {
117
- // this.working = true;
118
- const formValue = this.form.getRawValue();
119
- let startDateString;
120
- let endDateString;
121
- if (formValue.startDate) {
122
- const dateHourStartNumber = formValue.startDate + this.missionTimeStart;
123
- const startDate = DateTime.fromMillis(dateHourStartNumber);
124
- startDateString = startDate.toISO();
125
- }
126
- if (formValue.endDate) {
127
- const dateHourEndNumber = formValue.endDate + this.missionTimeEnd;
128
- const endDate = DateTime.fromMillis(dateHourEndNumber);
129
- endDateString = endDate.toISO();
130
- }
131
- if (endDateString > startDateString) {
132
- this.dateError = false;
121
+ this.working = true;
122
+ if (!this.form.valid) {
123
+ this.errorForm = true;
124
+ this.working = false;
125
+ return;
133
126
  }
134
- else {
127
+ const datesValues = await this.onVerifDate();
128
+ if (datesValues.error) {
135
129
  this.dateError = true;
130
+ this.errorForm = true;
131
+ this.working = false;
136
132
  return;
137
133
  }
134
+ const formValue = this.form.getRawValue();
138
135
  try {
139
136
  if (this.editTemplate) {
140
137
  // update
@@ -144,8 +141,8 @@ export class TemplateComponent {
144
141
  level: formValue.level,
145
142
  description: formValue.description,
146
143
  organisationID: formValue.organisationID,
147
- startDateTime: startDateString,
148
- endDateTime: endDateString,
144
+ startDateTime: datesValues.startDateString,
145
+ endDateTime: datesValues.endDateString,
149
146
  hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
150
147
  locale: formValue.locale,
151
148
  };
@@ -165,8 +162,8 @@ export class TemplateComponent {
165
162
  organisationID: this.currentOrg.id,
166
163
  level: formValue.level,
167
164
  description: formValue.description,
168
- startDateTime: startDateString,
169
- endDateTime: endDateString,
165
+ startDateTime: datesValues.startDateString,
166
+ endDateTime: datesValues.endDateString,
170
167
  hashtags: this.addedHashtags.map((hashtag) => hashtag.id),
171
168
  locale: formValue.locale,
172
169
  };
@@ -179,6 +176,7 @@ export class TemplateComponent {
179
176
  this.createdTemplate.emit(template);
180
177
  }
181
178
  }
179
+ this.working = false;
182
180
  }
183
181
  catch (error) {
184
182
  console.error(error);
@@ -217,12 +215,41 @@ export class TemplateComponent {
217
215
  async setHashtags(spaceID) {
218
216
  this.availableHashtags = await this.hashtagService.getHashtagsForSpace(spaceID);
219
217
  }
218
+ isFormError(control) {
219
+ return control && control.invalid && this.errorForm;
220
+ }
221
+ onVerifDate() {
222
+ return new Promise((resolve) => {
223
+ const formValue = this.form.getRawValue();
224
+ let startDateString;
225
+ let endDateString;
226
+ if (formValue.startDate) {
227
+ const dateHourStartNumber = formValue.startDate + this.missionTimeStart;
228
+ const startDate = DateTime.fromMillis(dateHourStartNumber);
229
+ startDateString = startDate.toISO();
230
+ }
231
+ if (formValue.endDate) {
232
+ const dateHourEndNumber = formValue.endDate + this.missionTimeEnd;
233
+ const endDate = DateTime.fromMillis(dateHourEndNumber);
234
+ endDateString = endDate.toISO();
235
+ }
236
+ if (endDateString && startDateString &&
237
+ endDateString <= startDateString) {
238
+ this.dateError = true;
239
+ resolve({ error: true });
240
+ }
241
+ else {
242
+ this.dateError = false;
243
+ resolve({ startDateString, endDateString });
244
+ }
245
+ });
246
+ }
220
247
  }
221
248
  TemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.BaseUserService }, { token: i3.SpaceService }, { token: i3.ZoneService }, { token: i4.Location }, { token: i3.HashtagService }, { token: i5.TranslateService }, { token: i3.TemplateService }, { token: i3.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
222
- TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate']) || dateError\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\"\r\n [translate]=\"'errorForm.date_start_end'\"\r\n *ngIf=\"dateError\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate']) || dateError\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\">\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
249
+ TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\" formControlName=\"title\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['title'])|| isFormError(form.controls['title'])} \"\r\n data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-title-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['title']) \r\n || isFormError(form.controls['title'])\">\r\n {{validatorsService.getError(form.controls['title']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['description'])|| isFormError(form.controls['description'])} \"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-description-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description']) \r\n || isFormError(form.controls['description'])\">\r\n {{validatorsService.getError(form.controls['description']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['space'])|| isFormError(form.controls['space'])} \">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['space']) \r\n || isFormError(form.controls['space'])\">\r\n {{validatorsService.getError(form.controls['space']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['zone'])|| isFormError(form.controls['zone'])} \"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-zone-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['zone']) \r\n || isFormError(form.controls['zone'])\">\r\n {{validatorsService.getError(form.controls['zone']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['startDate'])|| isFormError(form.controls['startDate'])|| dateError} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-startDate-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate']) \r\n || isFormError(form.controls['startDate'])\">\r\n {{validatorsService.getError(form.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-template-startDate-invalid-verif\" [dismissible]=\"false\"\r\n type=\"danger\" *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['endDate'])|| isFormError(form.controls['endDate'])|| dateError} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-endDate-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate']) \r\n || isFormError(form.controls['endDate'])\">\r\n {{validatorsService.getError(form.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-template-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [ngClass]=\"{'is-invalid' : errorForm }\" [disabled]=\"this.working \"\r\n data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-template-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i6.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
223
250
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, decorators: [{
224
251
  type: Component,
225
- args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate']) || dateError\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\"\r\n [translate]=\"'errorForm.date_start_end'\"\r\n *ngIf=\"dateError\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate']) || dateError\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\">\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
252
+ args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\" formControlName=\"title\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['title'])|| isFormError(form.controls['title'])} \"\r\n data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-title-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['title']) \r\n || isFormError(form.controls['title'])\">\r\n {{validatorsService.getError(form.controls['title']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['description'])|| isFormError(form.controls['description'])} \"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-description-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description']) \r\n || isFormError(form.controls['description'])\">\r\n {{validatorsService.getError(form.controls['description']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['space'])|| isFormError(form.controls['space'])} \">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['space']) \r\n || isFormError(form.controls['space'])\">\r\n {{validatorsService.getError(form.controls['space']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['zone'])|| isFormError(form.controls['zone'])} \"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-zone-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(form.controls['zone']) \r\n || isFormError(form.controls['zone'])\">\r\n {{validatorsService.getError(form.controls['zone']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['startDate'])|| isFormError(form.controls['startDate'])|| dateError} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-startDate-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate']) \r\n || isFormError(form.controls['startDate'])\">\r\n {{validatorsService.getError(form.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-template-startDate-invalid-verif\" [dismissible]=\"false\"\r\n type=\"danger\" *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['endDate'])|| isFormError(form.controls['endDate'])|| dateError} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-template-endDate-invalid\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate']) \r\n || isFormError(form.controls['endDate'])\">\r\n {{validatorsService.getError(form.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-template-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [ngClass]=\"{'is-invalid' : errorForm }\" [disabled]=\"this.working \"\r\n data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-template-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
226
253
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.BaseUserService }, { type: i3.SpaceService }, { type: i3.ZoneService }, { type: i4.Location }, { type: i3.HashtagService }, { type: i5.TranslateService }, { type: i3.TemplateService }, { type: i3.ValidatorsService }]; }, propDecorators: { currentOrg: [{
227
254
  type: Input
228
255
  }], editTemplate: [{
@@ -234,4 +261,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
234
261
  }], createdTemplate: [{
235
262
  type: Output
236
263
  }] } });
237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci90ZW1wbGF0ZS90ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFHckYsT0FBTyxFQUFxQixhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkgsT0FBTyxFQUFnQixXQUFXLEVBQXdCLE1BQU0sRUFBOEMsa0JBQWtCLEVBQUUsV0FBVyxFQUFjLHdCQUF3QixFQUEyRCxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hSLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBUTdDLE1BQU0sT0FBTyxpQkFBaUI7SUFzQzFCLFlBQ1ksS0FBcUIsRUFDckIsRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFNBQTJCLEVBQzNCLGVBQWdDLEVBQ2pDLGlCQUFvQztRQVRuQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixPQUFFLEdBQUYsRUFB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UzsrQkFDSSxjQUFjO21XQUtmLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUs7Z0JBRUksZUFBZTtzQkFBeEIsTUFBTTtnQkFFRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGZsb2F0VmFsaWRhdG9yIH0gZnJvbSBcIkBzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZVwiO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIExldmVsU3RhdHVzLCBab25lLCBTcGFjZSwgSGFzaHRhZywgTG9jYWxlLCBCYXNlVXNlclNlcnZpY2UsIFNwYWNlU2VydmljZSwgWm9uZVNlcnZpY2UsIHN0cmluZ0xvY2FsZVRvRW51bSwgZW51bVRvQXJyYXksIFJvbGVTdGF0dXMsIHNvcnRBbHBoYWJldGljYWxseU9uTmFtZSwgSGFzaHRhZ1NlcnZpY2UsIE1pc3Npb24sIFZpc2l0VGVtcGxhdGUsIFRlbXBsYXRlU2VydmljZSB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSBcImx1eG9uXCI7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBkYXRlVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9kYXRlLmRpcmVjdGl2ZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLXRlbXBsYXRlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgZWRpdFRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlO1xyXG5cclxuICAgIEBJbnB1dCgpIHpvbmVJRDogc3RyaW5nO1xyXG5cclxuICAgIEBPdXRwdXQoKSB1cGRhdGVkVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFZpc2l0VGVtcGxhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpIGNyZWF0ZWRUZW1wbGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VmlzaXRUZW1wbGF0ZT4oKTtcclxuXHJcbiAgICBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHpvbmVzRm9yU3BhY2U6IFpvbmVbXTtcclxuXHJcbiAgICBhdmFpbGFibGVMZXZlbHM6IExldmVsU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlU3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgaW5wdXRab25lOiBab25lO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBhZGRlZEhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBjdXJyZW50TG9jYWxlOiBMb2NhbGU7XHJcblxyXG4gICAgbG9jYWxlczogc3RyaW5nW107XHJcblxyXG4gICAgZGF0ZUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgaGFzaHRhZ1NlcnZpY2U6IEhhc2h0YWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckluZm8oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldHVwKCk7XHJcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmdcclxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZS5kZWZhdWx0TGFuZztcclxuXHJcbiAgICAgICAgLyoqIFRyYW5zZm9ybWUgJ19mcicgdG8gJ2ZyJyAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHN0cmluZ0xvY2FsZVRvRW51bShsYW5nLnNsaWNlKDEpKTsgLy8gdG8gbWF0Y2ggZW51bSBMb2NhbGVcclxuICAgICAgICB0aGlzLmxvY2FsZXMgPSBlbnVtVG9BcnJheShMb2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldHVwKCkge1xyXG4gICAgICAgIC8vIHJlc3BlY3QgdGhlIG9yZGVyIG9mIGZ1bmN0aW9ucyBoZXJlICEhXHJcbiAgICAgICAgaWYgKHRoaXMuem9uZUlEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5wdXRab25lID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lKHRoaXMuem9uZUlEKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyh0aGlzLmlucHV0Wm9uZS5zcGFjZUlEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAvLyB3ZSBhcmUgZWRpdGluZyBhIHRlbXBsYXRlXHJcbiAgICAgICAgICAgIHRoaXMub25TcGFjZUNsaWNrKHRoaXMuZWRpdFRlbXBsYXRlLnNwYWNlSUQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbmZvKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZVVzZXJJbmZvKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmN1KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGV2ZWxzID1cclxuICAgICAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0QXZhbGFibGVMZXZlbHNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVTcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCkge1xyXG4gICAgICAgIGxldCBzdGFydERhdGU6IGFueSA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVuZERhdGU6IGFueSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUuZW5kRGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHRoaXMuZWRpdFRlbXBsYXRlLmVuZERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVFbmQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogW3RoaXMuZWRpdFRlbXBsYXRlLnRpdGxlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBbdGhpcy5lZGl0VGVtcGxhdGUubGV2ZWxdLFxyXG4gICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IFt0aGlzLmVkaXRUZW1wbGF0ZS5vcmdhbmlzYXRpb25JRF0sXHJcbiAgICAgICAgICAgICAgICBzcGFjZTogW3RoaXMuZWRpdFRlbXBsYXRlLnNwYWNlSUQsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFt0aGlzLmVkaXRUZW1wbGF0ZS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICB6b25lOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcGxhdGUuem9uZUlELFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5lZGl0VGVtcGxhdGUubG9jYWxlXSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFtlbmREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFtMZXZlbFN0YXR1cy5NSU5JTVVNXSxcclxuICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICAgICBzcGFjZTogW3RoaXMuaW5wdXRab25lID8gdGhpcy5pbnB1dFpvbmUuc3BhY2VJRCA6IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFsnJywgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICB6b25lOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFpvbmUgPyB0aGlzLmlucHV0Wm9uZS5pZCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBsb2NhbGU6IFt0aGlzLmN1cnJlbnRMb2NhbGVdLFxyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBbc3RhcnREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpLCBWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgICBsZXQgc3RhcnREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGVuZERhdGVTdHJpbmc6IHN0cmluZztcclxuXHJcbiAgICAgICAgaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJTdGFydE51bWJlciA9IGZvcm1WYWx1ZS5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmREYXRlU3RyaW5nID4gc3RhcnREYXRlU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIHVwZGF0ZVxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuZWRpdFRlbXBsYXRlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGZvcm1WYWx1ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBmb3JtVmFsdWUub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogc3RhcnREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiBlbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgIGhhc2h0YWdzOiB0aGlzLmFkZGVkSGFzaHRhZ3MubWFwKChoYXNodGFnKSA9PiBoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGZvcm1WYWx1ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS5zcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS56b25lSUQgPSBmb3JtVmFsdWUuem9uZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlZFRlbXBsYXRlLmVtaXQodGVtcGxhdGUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9jcmVhdGVcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmN1cnJlbnRPcmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudE9yZy5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6IGZvcm1WYWx1ZS5sZXZlbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogc3RhcnREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogZW5kRGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzaHRhZ3M6IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGhhc2h0YWcpID0+IGhhc2h0YWcuaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGU6IGZvcm1WYWx1ZS5sb2NhbGUsXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnNwYWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS56b25lSUQgPSBmb3JtVmFsdWUuem9uZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVkVGVtcGxhdGUuZW1pdCh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVkVGVtcGxhdGUuZW1pdChudWxsKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZWRUZW1wbGF0ZS5lbWl0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgdGl0bGUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmdldChcInRpdGxlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJzcGFjZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNwYWNlQ2xpY2soc3BhY2VJRDogc3RyaW5nID0gbnVsbCkge1xyXG4gICAgICAgIGxldCBpbnB1dFNwYWNlSUQgPSBzcGFjZUlEID8gc3BhY2VJRCA6IHRoaXMuc3BhY2VJRC52YWx1ZTtcclxuICAgICAgICBjb25zdCB6b25lcyA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuZ2V0Wm9uZXNCeVNwYWNlKFxyXG4gICAgICAgICAgICBpbnB1dFNwYWNlSUQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBtdXNldW1ab25lcyA9IHpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5pc011c2V1bVZpc2l0Wm9uZSk7XHJcbiAgICAgICAgdGhpcy56b25lc0ZvclNwYWNlID0gc29ydEFscGhhYmV0aWNhbGx5T25OYW1lKG11c2V1bVpvbmVzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKGlucHV0U3BhY2VJRCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25IYXNodGFnQ2xpY2soaGFzaHRhZzogSGFzaHRhZykge1xyXG4gICAgICAgIGlmICghdGhpcy5hZGRlZEhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5wdXNoKGhhc2h0YWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXRIYXNodGFncyhzcGFjZUlEOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZUhhc2h0YWdzID0gYXdhaXQgdGhpcy5oYXNodGFnU2VydmljZS5nZXRIYXNodGFnc0ZvclNwYWNlKFxyXG4gICAgICAgICAgICBzcGFjZUlELFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgKm5nSWY9XCJmb3JtXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxoND57eyAnVmlzaXQgVGVtcGxhdGUnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snVmlzaXQgVGl0bGUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRWR2YXJkIE11bmNoIC0gwqsgVW4gcG/DqG1lIGTigJlhbW91ciwgZGUgdmllIGV0IGRlIG1vcnQgwrtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd0aXRsZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInRpdGxlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXRpdGxlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWyd0aXRsZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd0aXRsZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgc3R5bGU9XCJoZWlnaHQ6MjAwcHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1kZXNjcmlwdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQ2V0dGUgdmlzaXRlIGTigJkxaDMwIHZvdXMgcHLDqXNlbnRlcmEgbGVzIMWTdXZyZXMgZW1ibMOpbWF0aXF1ZXMgZHUgY8OpbMOoYnJlIHBlaW50cmUgbm9ydsOpZ2llbiBFZHZhcmQgTXVuY2ggKDE4NjMtMTk0NCkuLi5cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1kZXNjcmlwdGlvbi1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxvY2FsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eydOb3QgYXBwbGljYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsb2NhbGUgb2YgbG9jYWxlc1wiIFtuZ1ZhbHVlXT1cImxvY2FsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xldmVsJyB8IHRyYW5zbGF0ZX19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGV2ZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbGV2ZWwgb2YgYXZhaWxhYmxlTGV2ZWxzXCIgW25nVmFsdWVdPVwibGV2ZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxldmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJhdmFpbGFibGVTcGFjZXMgJiYgIWlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJzcGFjZVwiIChjaGFuZ2UpPVwib25TcGFjZUNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3BhY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzcGFjZSBvZiBhdmFpbGFibGVTcGFjZXNcIiBbbmdWYWx1ZV09XCJzcGFjZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BhY2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3BhY2UtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3NwYWNlJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3NwYWNlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFhdmFpbGFibGVTcGFjZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyAnTm8gbG9jYXRpb25zIGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5zcGFjZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgem9uZScgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiem9uZXNGb3JTcGFjZSAmJiB6b25lc0ZvclNwYWNlLmxlbmd0aCA+IDAgJiYgIWlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS16b25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHpvbmUgb2Ygem9uZXNGb3JTcGFjZVwiIFtuZ1ZhbHVlXT1cInpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtem9uZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd6b25lJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2UgJiYgem9uZXNGb3JTcGFjZS5sZW5ndGggPT09IDAgJiYgIWlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwid2FybmluZyBjb2wtZm9ybS1sYWJlbFwiPnt7XCJObyBNdXNldW0gWm9uZXMgZm91bmQgZm9yIHRoaXMgbG9jYXRpb25cInwgdHJhbnNsYXRlfX08L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiaW5wdXRab25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbdmFsdWVdPVwiaW5wdXRab25lLm5hbWVcIiBkaXNhYmxlZD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydIYXNodGFncycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj57eydBdmFpbGFibGUgaGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3snTm8gaGFzaHRhZ3MgY3JlYXRlZCBmb3IgdGhpcyBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBbY2xhc3NdPVwiYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSA/ICdrZXl3b3Jkc0l0ZW0gYWRkZWQnIDogJ2tleXdvcmRzSXRlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiIChjbGljayk9XCJvbkhhc2h0YWdDbGljayhoYXNodGFnKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJ7e2FkZGVkSGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZykgPyAoJ1JlbW92ZSd8dHJhbnNsYXRlKSA6ICgnQWRkJ3x0cmFuc2xhdGUpIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzaHRhZy5uYW1lfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiPnt7J0FkZGVkIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCIgKm5nSWY9XCJhZGRlZEhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtleXdvcmRzSXRlbVwiICpuZ0Zvcj1cImxldCBoYXNodGFnIG9mIGFkZGVkSGFzaHRhZ3NcIj57eyBoYXNodGFnLm5hbWUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiIXNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydTdGFydCBEYXRlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3RhcnREYXRlXCIgI2QxPVwibmdiRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKSB8fCBkYXRlRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQxLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdGFydERhdGUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3RhcnREYXRlLWludmFsaWQtdmVyaWZcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCInZXJyb3JGb3JtLmRhdGVfc3RhcnRfZW5kJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVFcnJvclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydTdGFydCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lU3RhcnRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItdGltZXBpY2tlcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydFbmQgRGF0ZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICNkMj1cIm5nYkRhdGVwaWNrZXJcIiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZW5kRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSkgfHwgZGF0ZUVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMi50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZW5kRGF0ZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+PC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU9XCJlcnJvckZvcm0uZGF0ZV9lbmRfc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VuZCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lRW5kXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udHJvbC1kaXYgYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nIHx8IGZvcm0uaW52YWxpZFwiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdWJtaXQtYnRuXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWNhbmNlbC1idG5cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
264
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci90ZW1wbGF0ZS90ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFHckYsT0FBTyxFQUFxQixhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkgsT0FBTyxFQUFnQixXQUFXLEVBQXdCLE1BQU0sRUFBOEMsa0JBQWtCLEVBQUUsV0FBVyxFQUFjLHdCQUF3QixFQUEyRCxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hSLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyxpQkFBaUI7SUF3QzFCLFlBQ1ksS0FBcUIsRUFDckIsRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFNBQTJCLEVBQzNCLGVBQWdDLEVBQ2pDLGlCQUFvQztRQVRuQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixPQUFFLEdBQUYsRUFB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Q0FBQzs7OEdBL1JRLGlCQUFpQjtrR0FBakIsaUJBQWlCLCtOQ2pCOUIsOGlkQXVPTTsyRkR0Tk8saUJBQWlCO2tCQUw3QixTQUFTOytCQUNJLGNBQWM7bVdBS2YsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVHLE1BQU07c0JBQWQsS0FBSztnQkFFSSxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGVBQWU7c0JBQXhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XHJcbmltcG9ydCB7IE9yZ2FuaXNhdGlvbiwgTGV2ZWxTdGF0dXMsIFpvbmUsIFNwYWNlLCBIYXNodGFnLCBMb2NhbGUsIEJhc2VVc2VyU2VydmljZSwgU3BhY2VTZXJ2aWNlLCBab25lU2VydmljZSwgc3RyaW5nTG9jYWxlVG9FbnVtLCBlbnVtVG9BcnJheSwgUm9sZVN0YXR1cywgc29ydEFscGhhYmV0aWNhbGx5T25OYW1lLCBIYXNodGFnU2VydmljZSwgTWlzc2lvbiwgVmlzaXRUZW1wbGF0ZSwgVGVtcGxhdGVTZXJ2aWNlIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLXRlbXBsYXRlJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi90ZW1wbGF0ZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi90ZW1wbGF0ZS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgICBASW5wdXQoKSBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgQElucHV0KCkgZWRpdFRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlO1xyXG5cclxuICAgIEBJbnB1dCgpIHpvbmVJRDogc3RyaW5nO1xyXG5cclxuICAgIEBPdXRwdXQoKSB1cGRhdGVkVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFZpc2l0VGVtcGxhdGU+KCk7XHJcblxyXG4gICAgQE91dHB1dCgpIGNyZWF0ZWRUZW1wbGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VmlzaXRUZW1wbGF0ZT4oKTtcclxuXHJcbiAgICBmb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIHpvbmVzRm9yU3BhY2U6IFpvbmVbXTtcclxuXHJcbiAgICBhdmFpbGFibGVMZXZlbHM6IExldmVsU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlU3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgaW5wdXRab25lOiBab25lO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBhZGRlZEhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBjdXJyZW50TG9jYWxlOiBMb2NhbGU7XHJcblxyXG4gICAgbG9jYWxlczogc3RyaW5nW107XHJcblxyXG4gICAgZGF0ZUVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgZXJyb3JGb3JtOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgICAgIHByaXZhdGUgaGFzaHRhZ1NlcnZpY2U6IEhhc2h0YWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVTZXJ2aWNlOiBUZW1wbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG5cclxuICAgICkge1xyXG4gICAgICAgIHRoaXMudXNlclNlcnZpY2UuaXNDaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXNlckluZm8oKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnNldHVwKCk7XHJcbiAgICAgICAgY29uc3QgbGFuZyA9IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmdcclxuICAgICAgICAgICAgOiB0aGlzLnRyYW5zbGF0ZS5kZWZhdWx0TGFuZztcclxuXHJcbiAgICAgICAgLyoqIFRyYW5zZm9ybWUgJ19mcicgdG8gJ2ZyJyAqL1xyXG4gICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHN0cmluZ0xvY2FsZVRvRW51bShsYW5nLnNsaWNlKDEpKTsgLy8gdG8gbWF0Y2ggZW51bSBMb2NhbGVcclxuICAgICAgICB0aGlzLmxvY2FsZXMgPSBlbnVtVG9BcnJheShMb2NhbGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldHVwKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdTRVRVUCcpXHJcbiAgICAgICAgLy8gcmVzcGVjdCB0aGUgb3JkZXIgb2YgZnVuY3Rpb25zIGhlcmUgISFcclxuICAgICAgICBpZiAodGhpcy56b25lSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFpvbmUgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmUodGhpcy56b25lSUQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuaW5wdXRab25lLnNwYWNlSUQpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmlucHV0Wm9uZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAvLyB3ZSBhcmUgZWRpdGluZyBhIHRlbXBsYXRlXHJcbiAgICAgICAgICAgIHRoaXMub25TcGFjZUNsaWNrKHRoaXMuZWRpdFRlbXBsYXRlLnNwYWNlSUQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZVVzZXJJbmZvKCk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZVVzZXJJbmZvKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnVzZXJTZXJ2aWNlLmN1KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlTGV2ZWxzID1cclxuICAgICAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0QXZhbGFibGVMZXZlbHNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRPcmcgPSB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRPcmdhbmlzYXRpb24oKTtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVTcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRGb3JtKCkge1xyXG4gICAgICAgIGxldCBzdGFydERhdGU6IGFueSA9IG51bGw7XHJcbiAgICAgICAgbGV0IGVuZERhdGU6IGFueSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVkaXRUZW1wbGF0ZS5zdGFydERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUuZW5kRGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHRoaXMuZWRpdFRlbXBsYXRlLmVuZERhdGVUaW1lKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVFbmQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogW3RoaXMuZWRpdFRlbXBsYXRlLnRpdGxlLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBbdGhpcy5lZGl0VGVtcGxhdGUubGV2ZWxdLFxyXG4gICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IFt0aGlzLmVkaXRUZW1wbGF0ZS5vcmdhbmlzYXRpb25JRF0sXHJcbiAgICAgICAgICAgICAgICBzcGFjZTogW3RoaXMuZWRpdFRlbXBsYXRlLnNwYWNlSUQsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFt0aGlzLmVkaXRUZW1wbGF0ZS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICB6b25lOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0VGVtcGxhdGUuem9uZUlELFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5lZGl0VGVtcGxhdGUubG9jYWxlXSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFtlbmREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogW251bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgbGV2ZWw6IFtMZXZlbFN0YXR1cy5NSU5JTVVNXSxcclxuICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICAgICBzcGFjZTogW3RoaXMuaW5wdXRab25lID8gdGhpcy5pbnB1dFpvbmUuc3BhY2VJRCA6IG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IFsnJywgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICB6b25lOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnB1dFpvbmUgPyB0aGlzLmlucHV0Wm9uZS5pZCA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBsb2NhbGU6IFt0aGlzLmN1cnJlbnRMb2NhbGVdLFxyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlOiBbc3RhcnREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpLCBWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcblxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKHRoaXMuZm9ybS52YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGRhdGVzVmFsdWVzID0gYXdhaXQgdGhpcy5vblZlcmlmRGF0ZSgpO1xyXG4gICAgICAgIGlmKGRhdGVzVmFsdWVzLmVycm9yKXtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZSA9IHtcclxuICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5lZGl0VGVtcGxhdGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGZvcm1WYWx1ZS50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICBsZXZlbDogZm9ybVZhbHVlLmxldmVsLFxyXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5zdGFydERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IGRhdGVzVmFsdWVzLmVuZERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaHRhZ3M6IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGhhc2h0YWcpID0+IGhhc2h0YWcuaWQpLFxyXG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnNwYWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuc3BhY2VJRCA9IGZvcm1WYWx1ZS5zcGFjZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnpvbmVJRCA9IGZvcm1WYWx1ZS56b25lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVkVGVtcGxhdGUuZW1pdCh0ZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL2NyZWF0ZVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudE9yZykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9ybVZhbHVlLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5jdXJyZW50T3JnLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogZm9ybVZhbHVlLmxldmVsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5zdGFydERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5lbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGhpcy5hZGRlZEhhc2h0YWdzLm1hcCgoaGFzaHRhZykgPT4gaGFzaHRhZy5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuc3BhY2VJRCA9IGZvcm1WYWx1ZS5zcGFjZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS56b25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLnpvbmVJRCA9IGZvcm1WYWx1ZS56b25lO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZWRUZW1wbGF0ZS5lbWl0KHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZFRlbXBsYXRlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkVGVtcGxhdGUuZW1pdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpdGxlKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJ0aXRsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3BhY2VJRCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TcGFjZUNsaWNrKHNwYWNlSUQ6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBsZXQgaW5wdXRTcGFjZUlEID0gc3BhY2VJRCA/IHNwYWNlSUQgOiB0aGlzLnNwYWNlSUQudmFsdWU7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgaW5wdXRTcGFjZUlELFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbXVzZXVtWm9uZXMgPSB6b25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuaXNNdXNldW1WaXNpdFpvbmUpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZShtdXNldW1ab25lcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyhpbnB1dFNwYWNlSUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGlzRm9ybUVycm9yKGNvbnRyb2wpIHtcclxuICAgICAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5lcnJvckZvcm07XHJcbiAgICB9XHJcblxyXG4gICAgb25WZXJpZkRhdGUoKTogUHJvbWlzZTx7IHN0YXJ0RGF0ZVN0cmluZz86IHN0cmluZywgZW5kRGF0ZVN0cmluZz86IHN0cmluZywgZXJyb3I/OiBib29sZWFuIH0+IHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgICAgIGxldCBzdGFydERhdGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICAgICAgbGV0IGVuZERhdGVTdHJpbmc6IHN0cmluZztcclxuXHJcblxyXG4gICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJTdGFydE51bWJlciA9IGZvcm1WYWx1ZS5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgc3RhcnREYXRlU3RyaW5nID0gc3RhcnREYXRlLnRvSVNPKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS5lbmREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlSG91ckVuZE51bWJlciA9IGZvcm1WYWx1ZS5lbmREYXRlICsgdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAgICAgICAgIGVuZERhdGVTdHJpbmcgPSBlbmREYXRlLnRvSVNPKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChlbmREYXRlU3RyaW5nICYmIHN0YXJ0RGF0ZVN0cmluZyAmJlxyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA8PSBzdGFydERhdGVTdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoeyBlcnJvcjogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZUVycm9yID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKHsgc3RhcnREYXRlU3RyaW5nLCBlbmREYXRlU3RyaW5nIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbmVyXCIgKm5nSWY9XCJmb3JtXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxoND57eyAnVmlzaXQgVGVtcGxhdGUnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snVmlzaXQgVGl0bGUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRWR2YXJkIE11bmNoIC0gwqsgVW4gcG/DqG1lIGTigJlhbW91ciwgZGUgdmllIGV0IGRlIG1vcnQgwrtcIiBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd0aXRsZSddKXx8IGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ3RpdGxlJ10pfSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS10aXRsZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3RpdGxlJ10pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ3RpdGxlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3RpdGxlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIiBzdHlsZT1cImhlaWdodDoyMDBweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKXx8IGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pfSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNldHRlIHZpc2l0ZSBk4oCZMWgzMCB2b3VzIHByw6lzZW50ZXJhIGxlcyDFk3V2cmVzIGVtYmzDqW1hdGlxdWVzIGR1IGPDqWzDqGJyZSBwZWludHJlIG5vcnbDqWdpZW4gRWR2YXJkIE11bmNoICgxODYzLTE5NDQpLi4uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1kZXNjcmlwdGlvbi1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7J05vdCBhcHBsaWNhYmxlJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvY2FsZSBvZiBsb2NhbGVzXCIgW25nVmFsdWVdPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsb2NhbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGV2ZWwnIHwgdHJhbnNsYXRlfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsZXZlbCBvZiBhdmFpbGFibGVMZXZlbHNcIiBbbmdWYWx1ZV09XCJsZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbGV2ZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgbG9jYXRpb24nIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImF2YWlsYWJsZVNwYWNlcyAmJiAhaW5wdXRab25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInNwYWNlXCIgKGNoYW5nZSk9XCJvblNwYWNlQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zcGFjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKXx8IGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ3NwYWNlJ10pfSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3BhY2UtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCIhYXZhaWxhYmxlU3BhY2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJpbnB1dFpvbmUuc3BhY2UubmFtZVwiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2UgJiYgem9uZXNGb3JTcGFjZS5sZW5ndGggPiAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd6b25lJ10pfHwgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKX0gXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB6b25lc0ZvclNwYWNlXCIgW25nVmFsdWVdPVwiem9uZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgem9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXpvbmUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWyd6b25lJ10pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ3pvbmUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlICYmIHpvbmVzRm9yU3BhY2UubGVuZ3RoID09PSAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIndhcm5pbmcgY29sLWZvcm0tbGFiZWxcIj57e1wiTm8gTXVzZXVtIFpvbmVzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCJ8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+e3snQXZhaWxhYmxlIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheSBuby1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzXT1cImFkZGVkSGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZykgPyAna2V5d29yZHNJdGVtIGFkZGVkJyA6ICdrZXl3b3Jkc0l0ZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYXZhaWxhYmxlSGFzaHRhZ3NcIiAoY2xpY2spPVwib25IYXNodGFnQ2xpY2soaGFzaHRhZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3thZGRlZEhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc2h0YWcubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydBZGRlZCBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiICpuZ0lmPVwiYWRkZWRIYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhZGRlZEhhc2h0YWdzXCI+e3sgaGFzaHRhZy5uYW1lIH19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0RGF0ZVwiIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXN0YXJ0RGF0ZVwiICNkMT1cIm5nYkRhdGVwaWNrZXJcIiAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKXx8IGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKXx8IGRhdGVFcnJvcn0gIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDEudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3RhcnREYXRlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3RhcnREYXRlLWludmFsaWQtdmVyaWZcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiZGF0ZUVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uZGF0ZV9zdGFydF9lbmQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydTdGFydCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lU3RhcnRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW5kIERhdGUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAjZDI9XCJuZ2JEYXRlcGlja2VyXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGVcIiAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSl8fCBpc0Zvcm1FcnJvcihmb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pfHwgZGF0ZUVycm9yfSBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQyLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2Vycm9yRm9ybS5kYXRlX2VuZF9zdGFydCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVFbmRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udHJvbC1kaXYgYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogZXJyb3JGb3JtIH1cIiBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nIFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3VibWl0LWJ0blwiPnt7J1NhdmUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cInRoaXMud29ya2luZ1wiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1jYW5jZWwtYnRuXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZXJyb3JGb3JtXCI+XHJcbiAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uaW5mb0J0bicgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19