UNPKG

@netgrif/components-core

Version:

Netgrif Application engine frontend core Angular library

490 lines 73.6 kB
import { Component, Inject, Optional, ViewChild } from "@angular/core"; import { FilePreviewType } from "../models/file-field"; import { BehaviorSubject } from "rxjs"; import { ProgressType } from "../../../resources/resource-provider.service"; import { HttpParams } from "@angular/common/http"; import { take } from "rxjs/operators"; import { DATA_FIELD_PORTAL_DATA } from "../../models/data-field-portal-data-injection-token"; import { FILE_FIELD_HEIGHT, FILE_FIELD_PADDING, PREVIEW, PREVIEW_BUTTON } from '../models/file-field-constants'; import { AbstractFileFieldDefaultComponent } from '../../models/abstract-file-field-default-component'; import * as i0 from "@angular/core"; import * as i1 from "../../../resources/engine-endpoint/task-resource.service"; import * as i2 from "../../../logger/services/logger.service"; import * as i3 from "../../../snack-bar/services/snack-bar.service"; import * as i4 from "@ngx-translate/core"; import * as i5 from "../../../event/services/event.service"; import * as i6 from "@angular/platform-browser"; export class AbstractFileDefaultFieldComponent extends AbstractFileFieldDefaultComponent { _taskResourceService; _log; _snackbar; _translate; _eventService; _sanitizer; /** * The width of the default file preview border in pixels. The `px` string is appended in the code. */ static DEFAULT_PREVIEW_BORDER_WIDTH = 0; /** * The CSS style attribute of the default file preview border. */ static DEFAULT_PREVIEW_BORDER_STYLE = 'none'; /** * The CSS color string of the default file preview border. */ static DEFAULT_PREVIEW_BORDER_COLOR = 'black'; state; /** * Image field view element reference from component template that is initialized after view init. */ imageEl; imageDivEl; /** * If file type can be displayed */ isDisplayable = false; /** * Max height of preview */ maxHeight; /** * Store file for preview */ fileForPreview; /** * Url of preview file */ previewSource; /** * Store file to show/download */ fileForDownload; /** * Full size file url */ fullSource; /** * Extension of file to preview */ previewExtension; /** * Form control subscription */ updatedFieldSubscription; isFilePreview = false; isFilePreviewButton = false; /** * Only inject services. * @param _taskResourceService Provides to download a file from the backend * @param _log Logger service * @param _snackbar Snackbar service to notify user * @param _translate Translate service for I18N * @param _eventService used for parsing of backend response * Option injected trough `NAE_INFORM_ABOUT_INVALID_DATA` InjectionToken * @param _sanitizer Sanitize url of image preview * @param dataFieldPortalData Field and form control data if field is provided with portal */ constructor(_taskResourceService, _log, _snackbar, _translate, _eventService, _sanitizer, dataFieldPortalData) { super(_log, _snackbar, _translate, dataFieldPortalData); this._taskResourceService = _taskResourceService; this._log = _log; this._snackbar = _snackbar; this._translate = _translate; this._eventService = _eventService; this._sanitizer = _sanitizer; this.state = this.defaultState; this.fullSource = new BehaviorSubject(null); this.taskId = dataFieldPortalData.additionalFieldProperties.taskId; } /** * Set : * - File field to [FileFieldService]{@link FileFieldService} * - Display name */ ngOnInit() { this.isFilePreview = this.dataField?.component?.name === PREVIEW; this.isFilePreviewButton = this.dataField?.component?.name === PREVIEW_BUTTON; } ngAfterViewInit() { if (this.fileUploadEl) { this.fileUploadEl.nativeElement.onchange = () => { this.upload(); }; } if (this.isFilePreview) { if (!!this.imageDivEl) { if (!this.isEmpty()) { this.initializePreviewIfDisplayable(); } } } if (this.isFilePreviewButton) { if (!this.isEmpty()) { this.initializePreviewIfDisplayable(); } } this.updatedFieldSubscription = this.dataField.updated.subscribe(() => { this.previewSource = undefined; if (!!this.isFilePreview && !!this.dataField?.value?.name) { this.fileForDownload = undefined; this.fileForPreview = undefined; this.initializePreviewIfDisplayable(); } if (!!this.isFilePreviewButton && !!this.dataField?.value?.name) { this.fileForDownload = undefined; this.fileForPreview = undefined; this.initializePreviewIfDisplayable(); } }); } ngOnDestroy() { super.ngOnDestroy(); this.fullSource.complete(); this.updatedFieldSubscription.unsubscribe(); } chooseFile() { if (this.state.uploading || this.formControlRef.disabled) { return; } this.fileUploadEl.nativeElement.click(); } /** * Call after click on file field. * * If file field has no file uploaded * [FilesUploadComponent]{@link AbstractFilesUploadComponent} via [SideMenu]{@link SideMenuService} opens. * * Otherwise opens a file picker from which the user can select files. */ upload() { if (!this.fileUploadEl.nativeElement.files || this.fileUploadEl.nativeElement.files.length === 0) { return; } if (!this.taskId) { this._log.error('File cannot be uploaded. No task is set to the field.'); return; } if (this.dataField.value?.name && this.fileUploadEl.nativeElement.files.item(0).name === this.dataField.value?.name) { this._log.error('User chose the same file. Uploading skipped'); this._snackbar.openErrorSnackBar(this._translate.instant('dataField.snackBar.wontUploadSameFile')); this.fileUploadEl.nativeElement.value = ''; return; } if (this.dataField.maxUploadSizeInBytes && this.dataField.maxUploadSizeInBytes < this.fileUploadEl.nativeElement.files.item(0).size) { this._log.error('File cannot be uploaded. Maximum size of file exceeded.'); this.resolveMaxSizeMessage(); this.fileUploadEl.nativeElement.value = ''; return; } if (!this.checkAllowedTypes()) { return; } this.state = this.defaultState; this.state.uploading = true; const fileFormData = new FormData(); const fileToUpload = this.fileUploadEl.nativeElement.files.item(0); fileFormData.append('file', fileToUpload); fileFormData.append('data', new Blob([JSON.stringify(this.createRequestBody())], { type: 'application/json' })); this._taskResourceService.uploadFile(this.taskId, fileFormData, false) .subscribe((response) => { if (response.type && response.type === ProgressType.UPLOAD) { this.state.progress = response.progress; } else { this.state.completed = true; this.state.uploading = false; this.state.progress = 0; if (response.error) { this.state.error = true; this._log.error(`File [${this.dataField.stringId}] ${this.fileUploadEl.nativeElement.files.item(0)} uploading has failed!`, response.error); if (response.error) { this._snackbar.openErrorSnackBar(this._translate.instant(response.error)); } else { this._snackbar.openErrorSnackBar(this._translate.instant('dataField.snackBar.fileUploadFailed')); } } else { const changedFieldsMap = this._eventService.parseChangedFieldsFromOutcomeTree(response.outcome); this.dataField.emitChangedFields(changedFieldsMap); this._log.debug(`File [${this.dataField.stringId}] ${this.fileUploadEl.nativeElement.files.item(0).name} was successfully uploaded`); this.state.error = false; this.dataField.downloaded = false; this.dataField.value.name = fileToUpload.name; if (this.isFilePreview) { this.initializePreviewIfDisplayable(); } this.fullSource.next(undefined); this.fileForDownload = undefined; this.formControlRef.setValue(this.dataField.value.name); } this.dataField.touch = true; this.dataField.update(); this.fileUploadEl.nativeElement.value = ''; } }, error => { this.state.completed = true; this.state.error = true; this.state.uploading = false; this.state.progress = 0; this._log.error(`File [${this.dataField.stringId}] ${this.fileUploadEl.nativeElement.files.item(0)} uploading has failed!`, error); if (error?.error?.message) { this._snackbar.openErrorSnackBar(this._translate.instant(error.error.message)); } else { this._snackbar.openErrorSnackBar(this._translate.instant('dataField.snackBar.fileUploadFailed')); } this.dataField.touch = true; this.dataField.update(); this.fileUploadEl.nativeElement.value = ''; }); } download() { if (!this.checkFileBeforeDownload()) { return; } if (!!this.fileForDownload) { this.downloadViaAnchor(this.fileForDownload); return; } this.state = this.defaultState; this.state.downloading = true; let params = new HttpParams(); params = params.set("fieldId", this.dataField.stringId); this._taskResourceService.downloadFile(this.resolveParentTaskId(), params).subscribe(response => { if (!response.type || response.type !== ProgressType.DOWNLOAD) { this._log.debug(`File [${this.dataField.stringId}] ${this.dataField.value.name} was successfully downloaded`); this.downloadViaAnchor(response); if (this.isFilePreview) { this.initDownloadFile(response); } this.state.downloading = false; this.state.progress = 0; this.dataField.downloaded = true; } }, error => { this._log.error(`Downloading file [${this.dataField.stringId}] ${this.dataField.value.name} has failed!`, error); this._snackbar.openErrorSnackBar(this.dataField.value.name + ' ' + this._translate.instant('dataField.snackBar.downloadFail')); this.state.downloading = false; this.state.progress = 0; }); } initDownloadFile(response) { if (response instanceof Blob) { if (this.previewExtension === FilePreviewType.pdf) { this.fileForDownload = new Blob([response], { type: 'application/pdf' }); this.fullSource.next(this._sanitizer.bypassSecurityTrustResourceUrl(URL.createObjectURL(this.fileForDownload))); } else { this.fileForDownload = new Blob([response], { type: 'application/octet-stream' }); this.fullSource.next(this._sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(this.fileForDownload))); } } } downloadViaAnchor(blob) { const a = document.createElement('a'); document.body.appendChild(a); a.setAttribute('style', 'display: none'); if (!this.fileForDownload) { blob = new Blob([blob], { type: 'application/octet-stream' }); } const url = window.URL.createObjectURL(!!this.fileForDownload ? this.fileForDownload : blob); a.href = url; a.download = this.dataField.value.name; a.click(); window.URL.revokeObjectURL(url); document.body.removeChild(a); } deleteFile() { if (!this.dataField.value?.name) { return; } if (!this.taskId) { this._log.error('File cannot be deleted. No task is set to the field.'); return; } this._taskResourceService.deleteFile(this.taskId, this.createRequestBody()).pipe(take(1)).subscribe(response => { if (response.success) { const filename = this.dataField.value.name; this.dataField.value = {}; this.formControlRef.setValue(''); this.dataField.update(); this.dataField.downloaded = false; this.fullSource.next(undefined); this.fileForDownload = undefined; this.previewSource = undefined; this.fileForPreview = undefined; this._log.debug(`File [${this.dataField.stringId}] ${filename} was successfully deleted`); this.formControlRef.markAsTouched(); } else { this._log.error(`Deleting file [${this.dataField.stringId}] ${this.dataField.value.name} has failed!`, response.error); this._snackbar.openErrorSnackBar(this.dataField.value.name + ' ' + this._translate.instant('dataField.snackBar.fileDeleteFailed')); } }); } isEmpty() { return !this.dataField.value?.name; } createRequestBody() { return { parentTaskId: this.resolveParentTaskId(), fieldId: this.dataField.stringId }; } get defaultState() { return { progress: 0, completed: false, error: false, uploading: false, downloading: false }; } /** * Construct display name. */ constructDisplayName() { if (!!this.dataField) { if (!!this.dataField.value && !!this.dataField.value.name) { return this.dataField.value.name; } else if (!!this.dataField.placeholder) { return this.dataField.placeholder; } } return this._translate.instant('dataField.file.noFile'); } /** * Initialize file field image from backend if it is image type. */ initFileFieldImage() { if (!this.checkFileBeforeDownload()) { return; } this.state.downloading = true; let params = new HttpParams(); params = params.set("fieldId", this.dataField.stringId); this._taskResourceService.downloadFilePreview(this.resolveParentTaskId(), params).subscribe(response => { if (response instanceof Blob) { this._log.debug(`Preview of file [${this.dataField.stringId}] ${this.dataField.value.name} was successfully downloaded`); this.fileForPreview = new Blob([response], { type: 'application/octet-stream' }); this.previewSource = this._sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(this.fileForPreview)); } if (response == null || response instanceof Blob) { this.state.downloading = false; } }, error => { this._log.error(`Downloading file [${this.dataField.stringId}] ${this.dataField.value.name} has failed!`, error); this._snackbar.openErrorSnackBar(this.dataField.value.name + ' ' + this._translate.instant('dataField.snackBar.downloadFail')); this.state.downloading = false; this.state.progress = 0; }); } checkFileBeforeDownload() { if (this.isEmpty()) { return false; } if (!this.taskId) { this._log.error('File cannot be downloaded. No task is set to the field.'); return false; } return true; } showPreviewDialog() { if (!this.checkFileBeforeDownload()) { return; } let params = new HttpParams(); params = params.set("fieldId", this.dataField.stringId); this._taskResourceService.downloadFile(this.resolveParentTaskId(), params).subscribe(response => { if (!response.type || response.type !== ProgressType.DOWNLOAD) { this._log.debug(`File [${this.dataField.stringId}] ${this.dataField.value.name} was successfully downloaded`); this.initDownloadFile(response); } }, error => { this._log.error(`Downloading file [${this.dataField.stringId}] ${this.dataField.value.name} has failed!`, error); this._snackbar.openErrorSnackBar(this.dataField.value.name + ' ' + this._translate.instant('dataField.snackBar.downloadFail')); this.state.progress = 0; }); } changeMaxWidth(event) { if (!!this.imageEl) { this.imageEl.nativeElement.style.maxWidth = event.newRect.width + 'px'; } } initializePreviewIfDisplayable() { const extension = this.dataField.value.name.split('.').reverse()[0]; this.isDisplayable = Object.values(FilePreviewType).includes(extension); if (this.isDisplayable) { this.previewExtension = FilePreviewType[extension]; this.initFileFieldImage(); } } getHeight() { return this.dataField.layout?.rows && this.dataField.layout?.rows !== 1 ? (this.dataField.layout.rows) * FILE_FIELD_HEIGHT - FILE_FIELD_PADDING : FILE_FIELD_HEIGHT - FILE_FIELD_PADDING; } getPreviewBorderWidth() { if (this.borderPropertyEnabled('borderWidth')) { return this.dataField.component.properties.borderWidth + 'px'; } return `${AbstractFileDefaultFieldComponent.DEFAULT_PREVIEW_BORDER_WIDTH}px`; } getPreviewBorderStyle() { if (this.borderPropertyEnabled('borderStyle')) { return this.dataField.component.properties.borderStyle; } return AbstractFileDefaultFieldComponent.DEFAULT_PREVIEW_BORDER_STYLE; } getPreviewBorderColor() { if (this.borderPropertyEnabled('borderColor')) { return this.dataField.component.properties.borderColor; } return AbstractFileDefaultFieldComponent.DEFAULT_PREVIEW_BORDER_COLOR; } isBorderLGBTQ() { if (this.borderPropertyEnabled('borderLGBTQ')) { return this.dataField.component.properties.borderLGBTQ === 'true'; } return false; } isBorderDefault() { if (this.borderPropertyEnabled('borderEnabled')) { return this.dataField.component.properties.borderEnabled === 'true'; } return false; } borderPropertyEnabled(property) { return !!this.dataField.component && !!this.dataField.component.properties && property in this.dataField.component.properties; } hasTitle() { return this.dataField.title !== undefined && this.dataField.title !== ''; } hasHint() { return this.dataField.description !== undefined && this.dataField.description !== ''; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractFileDefaultFieldComponent, deps: [{ token: i1.TaskResourceService }, { token: i2.LoggerService }, { token: i3.SnackBarService }, { token: i4.TranslateService }, { token: i5.EventService }, { token: i6.DomSanitizer }, { token: DATA_FIELD_PORTAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AbstractFileDefaultFieldComponent, selector: "ncc-abstract-file-default-fied", viewQueries: [{ propertyName: "imageEl", first: true, predicate: ["imageEl"], descendants: true }, { propertyName: "imageDivEl", first: true, predicate: ["imageDiv"], descendants: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractFileDefaultFieldComponent, decorators: [{ type: Component, args: [{ selector: 'ncc-abstract-file-default-fied', template: '' }] }], ctorParameters: () => [{ type: i1.TaskResourceService }, { type: i2.LoggerService }, { type: i3.SnackBarService }, { type: i4.TranslateService }, { type: i5.EventService }, { type: i6.DomSanitizer }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DATA_FIELD_PORTAL_DATA] }] }], propDecorators: { imageEl: [{ type: ViewChild, args: ['imageEl'] }], imageDivEl: [{ type: ViewChild, args: ['imageDiv'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtZmlsZS1kZWZhdWx0LWZpZWxkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvZGF0YS1maWVsZHMvZmlsZS1maWVsZC9maWxlLWRlZmF1bHQtZmllbGQvYWJzdHJhY3QtZmlsZS1kZWZhdWx0LWZpZWxkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsU0FBUyxFQUVULE1BQU0sRUFHTixRQUFRLEVBQ1IsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBWSxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRSxPQUFPLEVBQUMsZUFBZSxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBT25ELE9BQU8sRUFBQyxZQUFZLEVBQW1CLE1BQU0sOENBQThDLENBQUM7QUFFNUYsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwQyxPQUFPLEVBQUMsc0JBQXNCLEVBQXNCLE1BQU0scURBQXFELENBQUM7QUFDaEgsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUU5RyxPQUFPLEVBQUMsaUNBQWlDLEVBQUMsTUFBTSxvREFBb0QsQ0FBQzs7Ozs7Ozs7QUFjckcsTUFBTSxPQUFnQixpQ0FBa0MsU0FBUSxpQ0FBNEM7SUFxRXhFO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXpFaEM7O09BRUc7SUFDSSxNQUFNLENBQVUsNEJBQTRCLEdBQUcsQ0FBQyxDQUFDO0lBQ3hEOztPQUVHO0lBQ0ksTUFBTSxDQUFVLDRCQUE0QixHQUFHLE1BQU0sQ0FBQztJQUM3RDs7T0FFRztJQUNJLE1BQU0sQ0FBVSw0QkFBNEIsR0FBRyxPQUFPLENBQUM7SUFFdkQsS0FBSyxDQUFZO0lBRXhCOztPQUVHO0lBQzBCLE9BQU8sQ0FBYTtJQUVuQixVQUFVLENBQWE7SUFDckQ7O09BRUc7SUFDSSxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQzdCOztPQUVHO0lBQ0ssU0FBUyxDQUFTO0lBQzFCOztPQUVHO0lBQ0ssY0FBYyxDQUFPO0lBQzdCOztPQUVHO0lBQ0ksYUFBYSxDQUFVO0lBQzlCOztPQUVHO0lBQ0ssZUFBZSxDQUFPO0lBQzlCOztPQUVHO0lBQ0ksVUFBVSxDQUEyQjtJQUM1Qzs7T0FFRztJQUNJLGdCQUFnQixDQUFrQjtJQUN6Qzs7T0FFRztJQUNLLHdCQUF3QixDQUFlO0lBRXhDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0lBRW5DOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUFnQyxvQkFBeUMsRUFDekMsSUFBbUIsRUFDbkIsU0FBMEIsRUFDMUIsVUFBNEIsRUFDNUIsYUFBMkIsRUFDM0IsVUFBd0IsRUFDVSxtQkFBbUQ7UUFDakgsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFQNUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFxQjtRQUN6QyxTQUFJLEdBQUosSUFBSSxDQUFlO1FBQ25CLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzFCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQzVCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLGVBQVUsR0FBVixVQUFVLENBQWM7UUFHcEQsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyx5QkFBeUIsQ0FBQyxNQUFnQixDQUFDO0lBQ2pGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUTtRQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxLQUFLLE9BQU8sQ0FBQztRQUNqRSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxLQUFLLGNBQWMsQ0FBQztJQUNsRixDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDO1NBQ0w7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRTtvQkFDakIsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7aUJBQ3pDO2FBQ0o7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxDQUFDO2FBQ3pDO1NBQ0o7UUFDRCxJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNsRSxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztZQUMvQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Z0JBQ3ZELElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztnQkFDaEMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7YUFDekM7WUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQkFDN0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO2dCQUNoQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQzthQUN6QztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELFdBQVc7UUFDUCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsd0JBQXdCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVNLFVBQVU7UUFDYixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFO1lBQ3RELE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksTUFBTTtRQUNULElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDOUYsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO1lBQ3pFLE9BQU87U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSTtZQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDbkYsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUMsQ0FBQztZQUNuRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzNDLE9BQU87U0FDVjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0I7WUFDbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtZQUMxRixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDM0MsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQzNCLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxDQUFDO1FBQzNFLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzFDLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLENBQUM7YUFDakUsU0FBUyxDQUFDLENBQUMsUUFBcUMsRUFBRSxFQUFFO1lBQ2pELElBQUssUUFBNkIsQ0FBQyxJQUFJLElBQUssUUFBNkIsQ0FBQyxJQUFJLEtBQUssWUFBWSxDQUFDLE1BQU0sRUFBRTtnQkFDcEcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUksUUFBNkIsQ0FBQyxRQUFRLENBQUM7YUFDakU7aUJBQU07Z0JBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztnQkFFeEIsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO29CQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUNYLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FDN0gsQ0FBQztvQkFDRixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7d0JBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUJBQzdFO3lCQUFNO3dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO3FCQUNwRztpQkFDSjtxQkFBTTtvQkFDSCxNQUFNLGdCQUFnQixHQUFxQixJQUFJLENBQUMsYUFBYSxDQUFDLGlDQUFpQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDbEgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDWCxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSw0QkFBNEIsQ0FDdEgsQ0FBQztvQkFDRixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUM7b0JBQzlDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDcEIsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7cUJBQ3pDO29CQUNELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLFNBQVMsQ0FBQztvQkFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzNEO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQzthQUM5QztRQUNMLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FDWCxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FDcEgsQ0FBQztZQUNGLElBQUksS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ2xGO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BHO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFTSxRQUFRO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxFQUFFO1lBQ2pDLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksTUFBTSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDNUYsSUFBSSxDQUFFLFFBQTZCLENBQUMsSUFBSSxJQUFLLFFBQTZCLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM5RyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBZ0IsQ0FBQyxDQUFDO2dCQUN6QyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDbkM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUNwQztRQUNMLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRTtZQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNqSCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixDQUM1QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLENBQy9GLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFFBQWlDO1FBQ3RELElBQUksUUFBUSxZQUFZLElBQUksRUFBRTtZQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsS0FBSyxlQUFlLENBQUMsR0FBRyxFQUFFO2dCQUMvQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUMsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNuSDtpQkFBTTtnQkFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUMsQ0FBQyxDQUFDO2dCQUNoRixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMzRztTQUNKO0lBQ0wsQ0FBQztJQUVTLGlCQUFpQixDQUFDLElBQVU7UUFDbEMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN2QixJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBQyxDQUFDLENBQUM7U0FDL0Q7UUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0YsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU0sVUFBVTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDN0IsT0FBTztTQUNWO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQ3hFLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0csSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFO2dCQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssUUFBUSwyQkFBMkIsQ0FBQyxDQUFDO2dCQUMxRixJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO2FBQ3ZDO2lCQUFNO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLGNBQWMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZILElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FDbkcsQ0FBQzthQUNMO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsT0FBTztRQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7SUFDdkMsQ0FBQztJQUVTLGlCQUFpQjtRQUN2QixPQUFPO1lBQ0gsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUN4QyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1NBQ25DLENBQUM7SUFDTixDQUFDO0lBRUQsSUFBYyxZQUFZO1FBQ3RCLE9BQU87WUFDSCxRQUFRLEVBQUUsQ0FBQztZQUNYLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLEtBQUssRUFBRSxLQUFLO1lBQ1osU0FBUyxFQUFFLEtBQUs7WUFDaEIsV0FBVyxFQUFFLEtBQUs7U0FDckIsQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNJLG9CQUFvQjtRQUN2QixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO2FBQ3BDO2lCQUFNLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDO2FBQ3JDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTtZQUNqQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQTtRQUM3QixNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQWMsSUFBSSxRQUFRLFlBQVksSUFBSSxFQUFFO2dCQUMzSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO2dCQUN6SCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBQyxJQUFJLEVBQUUsMEJBQTBCLEVBQUMsQ0FBQyxDQUFDO2dCQUMvRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzthQUN6RztZQUNELElBQUksUUFBUSxJQUFJLElBQUksSUFBSSxRQUFRLFlBQVksSUFBSSxFQUFFO2dCQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7YUFDbEM7UUFDTCxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUMvRixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFUyx1QkFBdUI7UUFDN0IsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEIsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7WUFDM0UsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU0saUJBQWlCO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFBRTtZQUNqQyxPQUFPO1NBQ1Y7UUFDRCxJQUFJLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQWMsSUFBSSxDQUFFLFFBQTZCLENBQUMsSUFBSSxJQUFLLFFBQTZCLENBQUMsSUFBSSxLQUFLLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2pOLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO2dCQUM5RyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbkM7UUFDTCxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDakgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUMvRixDQUFDO1lBQ0YsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLGNBQWMsQ0FBQyxLQUFtQjtRQUNyQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQzFFO0lBQ0wsQ0FBQztJQUVTLDhCQUE4QjtRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBZ0IsQ0FBQyxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1NBQzdCO0lBQ0wsQ0FBQztJQUVNLFNBQVM7UUFDWixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEdBQUcsa0JBQWtCLENBQUM7SUFDdkgsQ0FBQztJQUVNLHFCQUFxQjtRQUN4QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ2pFO1FBQ0QsT0FBTyxHQUFHLGlDQUFpQyxDQUFDLDRCQUE0QixJQUFJLENBQUM7SUFDakYsQ0FBQztJQUVNLHFCQUFxQjtRQUN4QixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7U0FDMUQ7UUFDRCxPQUFPLGlDQUFpQyxDQUFDLDRCQUE0QixDQUFDO0lBQzFFLENBQUM7SUFFTSxxQkFBcUI7UUFDeEIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDM0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDO1NBQzFEO1FBQ0QsT0FBTyxpQ0FBaUMsQ0FBQyw0QkFBNEIsQ0FBQztJQUMxRSxDQUFDO0lBRU0sYUFBYTtRQUNoQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUMzQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDO1NBQ3JFO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVNLGVBQWU7UUFDbEIsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQztTQUN2RTtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxRQUFnQjtRQUN6QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUM7SUFDbEksQ0FBQztJQUVNLFFBQVE7UUFDWCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7SUFDN0UsQ0FBQztJQUVNLE9BQU87UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsS0FBSyxFQUFFLENBQUM7SUFDekYsQ0FBQzt3R0FwZWlCLGlDQUFpQyx5TUEyRVQsc0JBQXNCOzRGQTNFOUMsaUNBQWlDLDBSQUZ6QyxFQUFFOzs0RkFFTSxpQ0FBaUM7a0JBSnRELFNBQVM7bUJBQUM7b0JBQ1AsUUFBUSxFQUFFLGdDQUFnQztvQkFDMUMsUUFBUSxFQUFFLEVBQUU7aUJBQ2Y7OzBCQTRFMEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxzQkFBc0I7eUNBeERuQyxPQUFPO3NCQUFuQyxTQUFTO3VCQUFDLFNBQVM7Z0JBRVUsVUFBVTtzQkFBdkMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtGaWxlRmllbGQsIEZpbGVQcmV2aWV3VHlwZX0gZnJvbSBcIi4uL21vZGVscy9maWxlLWZpZWxkXCI7XG5pbXBvcnQge0RvbVNhbml0aXplciwgU2FmZVVybH0gZnJvbSBcIkBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJcIjtcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1Rhc2tSZXNvdXJjZVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZXMvZW5naW5lLWVuZHBvaW50L3Rhc2stcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHtMb2dnZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vbG9nZ2VyL3NlcnZpY2VzL2xvZ2dlci5zZXJ2aWNlXCI7XG5pbXBvcnQge1NuYWNrQmFyU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NuYWNrLWJhci9zZXJ2aWNlcy9zbmFjay1iYXIuc2VydmljZVwiO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xuaW1wb3J0IHtFdmVudFNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9ldmVudC9zZXJ2aWNlcy9ldmVudC5zZXJ2aWNlXCI7XG5pbXBvcnQge0V2ZW50T3V0Y29tZU1lc3NhZ2VSZXNvdXJjZX0gZnJvbSBcIi4uLy4uLy4uL3Jlc291cmNlcy9pbnRlcmZhY2UvbWVzc2FnZS1yZXNvdXJjZVwiO1xuaW1wb3J0IHtQcm9ncmVzc1R5cGUsIFByb3ZpZGVyUHJvZ3Jlc3N9IGZyb20gXCIuLi8uLi8uLi9yZXNvdXJjZXMvcmVzb3VyY2UtcHJvdmlkZXIuc2VydmljZVwiO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzTWFwfSBmcm9tIFwiLi4vLi4vLi4vZXZlbnQvc2VydmljZXMvaW50ZXJmYWNlcy9jaGFuZ2VkLWZpZWxkcy1tYXBcIjtcbmltcG9ydCB7SHR0cFBhcmFtc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XG5pbXBvcnQge3Rha2V9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuaW1wb3J0IHtSZXNpemVkRXZlbnR9IGZyb20gXCJhbmd1bGFyLXJlc2l6ZS1ldmVudFwiO1xuaW1wb3J0IHtEQVRBX0ZJRUxEX1BPUlRBTF9EQVRBLCBEYXRhRmllbGRQb3J0YWxEYXRhfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEtZmllbGQtcG9ydGFsLWRhdGEtaW5qZWN0aW9uLXRva2VuXCI7XG5pbXBvcnQge0ZJTEVfRklFTERfSEVJR0hULCBGSUxFX0ZJRUxEX1BBRERJTkcsIFBSRVZJRVcsIFBSRVZJRVdfQlVUVE9OfSBmcm9tICcuLi9tb2RlbHMvZmlsZS1maWVsZC1jb25zdGFudHMnO1xuaW1wb3J0IHtGaWxlRmllbGRSZXF1ZXN0fSBmcm9tIFwiLi4vLi4vLi4vcmVzb3VyY2VzL2ludGVyZmFjZS9maWxlLWZpZWxkLXJlcXVlc3QtYm9keVwiO1xuaW1wb3J0IHtBYnN0cmFjdEZpbGVGaWVsZERlZmF1bHRDb21wb25lbnR9IGZyb20gJy4uLy4uL21vZGVscy9hYnN0cmFjdC1maWxlLWZpZWxkLWRlZmF1bHQtY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlU3RhdGUge1xuICAgIHByb2dyZXNzOiBudW1iZXI7XG4gICAgdXBsb2FkaW5nOiBib29sZWFuO1xuICAgIGRvd25sb2FkaW5nOiBib29sZWFuO1xuICAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAgICBlcnJvcjogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICduY2MtYWJzdHJhY3QtZmlsZS1kZWZhdWx0LWZpZWQnLFxuICAgIHRlbXBsYXRlOiAnJ1xufSlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZpbGVEZWZhdWx0RmllbGRDb21wb25lbnQgZXh0ZW5kcyBBYnN0cmFjdEZpbGVGaWVsZERlZmF1bHRDb21wb25lbnQ8RmlsZUZpZWxkPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGRlZmF1bHQgZmlsZSBwcmV2aWV3IGJvcmRlciBpbiBwaXhlbHMuIFRoZSBgcHhgIHN0cmluZyBpcyBhcHBlbmRlZCBpbiB0aGUgY29kZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfUFJFVklFV19CT1JERVJfV0lEVEggPSAwO1xuICAgIC8qKlxuICAgICAqIFRoZSBDU1Mgc3R5bGUgYXR0cmlidXRlIG9mIHRoZSBkZWZhdWx0IGZpbGUgcHJldmlldyBib3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BSRVZJRVdfQk9SREVSX1NUWUxFID0gJ25vbmUnO1xuICAgIC8qKlxuICAgICAqIFRoZSBDU1MgY29sb3Igc3RyaW5nIG9mIHRoZSBkZWZhdWx0IGZpbGUgcHJldmlldyBib3JkZXIuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1BSRVZJRVdfQk9SREVSX0NPTE9SID0gJ2JsYWNrJztcblxuICAgIHB1YmxpYyBzdGF0ZTogRmlsZVN0YXRlO1xuXG4gICAgLyoqXG4gICAgICogSW1hZ2UgZmllbGQgdmlldyBlbGVtZW50IHJlZmVyZW5jZSBmcm9tIGNvbXBvbmVudCB0ZW1wbGF0ZSB0aGF0IGlzIGluaXRpYWxpemVkIGFmdGVyIHZpZXcgaW5pdC5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdpbWFnZUVsJykgcHVibGljIGltYWdlRWw6IEVsZW1lbnRSZWY7XG5cbiAgICBAVmlld0NoaWxkKCdpbWFnZURpdicpIHB1YmxpYyBpbWFnZURpdkVsOiBFbGVtZW50UmVmO1xuICAgIC8qKlxuICAgICAqIElmIGZpbGUgdHlwZSBjYW4gYmUgZGlzcGxheWVkXG4gICAgICovXG4gICAgcHVibGljIGlzRGlzcGxheWFibGUgPSBmYWxzZTtcbiAgICAvKipcbiAgICAgKiBNYXggaGVpZ2h0IG9mIHByZXZpZXdcbiAgICAgKi9cbiAgICBwcml2YXRlIG1heEhlaWdodDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGUgZm9yIHByZXZpZXdcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbGVGb3JQcmV2aWV3OiBCbG9iO1xuICAgIC8qKlxuICAgICAqIFVybCBvZiBwcmV2aWV3IGZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlld1NvdXJjZTogU2FmZVVybDtcbiAgICAvKipcbiAgICAgKiBTdG9yZSBmaWxlIHRvIHNob3cvZG93bmxvYWRcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbGVGb3JEb3dubG9hZDogQmxvYjtcbiAgICAvKipcbiAgICAgKiBGdWxsIHNpemUgZmlsZSB1cmxcbiAgICAgKi9cbiAgICBwdWJsaWMgZnVsbFNvdXJjZTogQmVoYXZpb3JTdWJqZWN0PFNhZmVVcmw+O1xuICAgIC8qKlxuICAgICAqIEV4dGVuc2lvbiBvZiBmaWxlIHRvIHByZXZpZXdcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlld0V4dGVuc2lvbjogRmlsZVByZXZpZXdUeXBlO1xuICAgIC8qKlxuICAgICAqIEZvcm0gY29udHJvbCBzdWJzY3JpcHRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZWRGaWVsZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gICAgcHVibGljIGlzRmlsZVByZXZpZXcgPSBmYWxzZTtcbiAgICBwdWJsaWMgaXNGaWxlUHJldmlld0J1dHRvbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogT25seSBpbmplY3Qgc2VydmljZXMuXG4gICAgICogQHBhcmFtIF90YXNrUmVzb3VyY2VTZXJ2aWNlIFByb3ZpZGVzIHRvIGRvd25sb2FkIGEgZmlsZSBmcm9tIHRoZSBiYWNrZW5kXG4gICAgICogQHBhcmFtIF9sb2cgTG9nZ2VyIHNlcnZpY2VcbiAgICAgKiBAcGFyYW0gX3NuYWNrYmFyIFNuYWNrYmFyIHNlcnZpY2UgdG8gbm90aWZ5IHVzZXJcbiAgICAgKiBAcGFyYW0gX3RyYW5zbGF0ZSBUcmFuc2xhdGUgc2VydmljZSBmb3IgSTE4TlxuICAgICAqIEBwYXJhbSBfZXZlbnRTZXJ2aWNlIHVzZWQgZm9yIHBhcnNpbmcgb2YgYmFja2VuZCByZXNwb25zZVxuICAgICAqIE9wdGlvbiBpbmplY3RlZCB0cm91Z2ggYE5BRV9JTkZPUk1fQUJPVVRfSU5WQUxJRF9EQVRBYCBJbmplY3Rpb25Ub2tlblxuICAgICAqIEBwYXJhbSBfc2FuaXRpemVyIFNhbml0aXplIHVybCBvZiBpbWFnZSBwcmV2aWV3XG4gICAgICogQHBhcmFtIGRhdGFGaWVsZFBvcnRhbERhdGEgRmllbGQgYW5kIGZvcm0gY29udHJvbCBkYXRhIGlmIGZpZWxkIGlzIHByb3ZpZGVkIHdpdGggcG9ydGFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfdGFza1Jlc291cmNlU2VydmljZTogVGFza1Jlc291cmNlU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF9sb2c6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfc25hY2tiYXI6IFNuYWNrQmFyU2VydmljZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfZXZlbnRTZXJ2aWNlOiBFdmVudFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBfc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoREFUQV9GSUVMRF9QT1JUQUxfREFUQSkgZGF0YUZpZWxkUG9ydGFsRGF0YTogRGF0YUZpZWxkUG9ydGFsRGF0YTxGaWxlRmllbGQ+KSB7XG4gICAgICAgIHN1cGVyKF9sb2csIF9zbmFja2JhciwgX3RyYW5zbGF0ZSwgZGF0YUZpZWxkUG9ydGFsRGF0YSk