@hmcts/media-viewer
Version:
72 lines • 22.6 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { select } from '@ngrx/store';
import * as fromTagSelectors from '../../../store/selectors/tag.selectors';
import * as fromAnnoSelector from '../../../store/selectors/annotation.selectors';
import { combineLatest } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@ngrx/store";
import * as i2 from "../comment/comment.service";
import * as i3 from "../../../toolbar/toolbar-event.service";
import * as i4 from "../../../toolbar/icp-event.service";
import * as i5 from "@angular/common";
import * as i6 from "@angular/router";
import * as i7 from "./comment-search/comment-search.component";
import * as i8 from "../comment-navigate/comments-navigate.component";
import * as i9 from "./comment-filter/comment-filter.component";
export class CommentSetHeaderComponent {
constructor(store, commentService, toolbarEvents, icpEventService) {
this.store = store;
this.commentService = commentService;
this.toolbarEvents = toolbarEvents;
this.icpEventService = icpEventService;
this.showCommentSummaryDialog = new EventEmitter();
this.tabs = [];
this.tabSelected = '';
}
ngOnInit() {
const tagFilter$ = this.store.pipe(select(fromTagSelectors.getTagFilters));
const filteredAnnotation$ = this.store.pipe(select(fromAnnoSelector.getFilteredAnnotations));
this.$subscriptions = combineLatest([tagFilter$, filteredAnnotation$]).subscribe(([formData, filteredAnno]) => {
this.navigationList = filteredAnno;
this.tabs = this.navigationList.length > 0 ?
[{ label: 'comments' }, { label: 'filter' }, { label: 'search' }] : [{ label: 'comments' }];
this.isFiltered = !formData.length;
this.tabs = [...this.tabs].map((tab) => {
return !this.isFiltered && tab.label === 'filter' ? { ...tab, isFiltered: true } : { ...tab, isFiltered: false };
});
});
}
toggleCommentsSummary() {
this.showCommentSummaryDialog.emit();
}
selectTab(tab) {
this.tabSelected = tab !== this.tabSelected ? tab : undefined;
if (this.tabSelected) {
this.marginToComment = true;
this.commentService.createMarginToCommentEvent(this.marginToComment);
}
else {
this.marginToComment = false;
this.commentService.createMarginToCommentEvent(this.marginToComment);
}
}
toggleCommentsPanel() {
this.toolbarEvents.toggleCommentsPanel(!this.toolbarEvents.commentsPanelVisible.getValue());
}
ngOnDestroy() {
this.$subscriptions.unsubscribe();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentSetHeaderComponent, deps: [{ token: i1.Store }, { token: i2.CommentService }, { token: i3.ToolbarEventService }, { token: i4.IcpEventService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CommentSetHeaderComponent, selector: "mv-comment-set-header", inputs: { showCommentSummary: "showCommentSummary", isHidden: "isHidden" }, outputs: { showCommentSummaryDialog: "showCommentSummaryDialog" }, ngImport: i0, template: "<div class=\"govuk-tabs commentSummaryHeader\" [ngClass]=\"{'icp-mode': icpEventService.enabled | async}\" data-module=\"govuk-tabs\">\n <ul class=\"govuk-tabs__list\">\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"govuk-tabs__list-item govuk-tabs__list-item\"\n [ngClass]=\"{'govuk-tabs__list-item--selected': tabSelected === tab.label}\">\n <a id=\"commentSubPane{{ i }}\" (click)=\"selectTab(tab.label)\" [routerLink]=\"[]\" [ngClass]=\"{'govuk-tabs__list-item--filtered': tab.isFiltered}\"\n class=\"govuk-tabs__tab\" [hidden]=\"isHidden\">\n {{ tab.label | titlecase }}\n </a>\n </li>\n <li>\n <button id=\"mvCloseBtn\" #mvCloseBtn class=\"mv-button commentSummaryHeader-button--close\"\n title=\"Close Comments\" (click)=\"toggleCommentsPanel()\" [hidden]=\"isHidden\">\n </button>\n </li>\n </ul>\n <div class=\"govuk-tabs__panel\" [hidden]=\"!tabSelected\">\n <ng-container *ngIf=\"tabSelected === 'comments'\">\n <div style=\"width: 100%\">\n <div class=\"hmcts-banner\" *ngIf=\"navigationList?.length === 0\">\n <svg alt=\"\" class=\"hmcts-banner__icon\" fill=\"currentColor\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" height=\"25\" width=\"25\">\n <path d=\"M13.7,18.5h-2.4v-2.4h2.4V18.5z M12.5,13.7c-0.7,0-1.2-0.5-1.2-1.2V7.7c0-0.7,0.5-1.2,1.2-1.2s1.2,0.5,1.2,1.2v4.8\nC13.7,13.2,13.2,13.7,12.5,13.7z M12.5,0.5c-6.6,0-12,5.4-12,12s5.4,12,12,12s12-5.4,12-12S19.1,0.5,12.5,0.5z\" /></svg>\n <div class=\"hmcts-banner__message\">\n <span class=\"hmcts-banner__assistive\">information</span>\n Select text to add a comment or highlight.\n </div>\n </div>\n <button type=\"button\" class=\"govuk-button\"\n id=\"commentSummary\" tabindex=\"0\"\n data-l10n-id=\"commentSummary\"\n title=\"Open collate summary\"\n (click)=\"toggleCommentsSummary()\">Collate comments</button>\n </div>\n <ng-container *ngIf=\"navigationList?.length > 0\">\n <mv-comments-navigate\n [annotationList]=\"navigationList\">\n </mv-comments-navigate>\n </ng-container>\n <p class=\"aui-comment__private-text\">\n <span class=\"aui-comment__private\">private</span>\n All comments can only be seen by you\n </p>\n </ng-container>\n <div [hidden]=\"tabSelected !== 'filter'\">\n <div class=\"govuk-tabs__panel--container\">\n <mv-comment-filter></mv-comment-filter>\n <mv-comments-navigate\n *ngIf=\"navigationList?.length > 0\"\n [annotationList]=\"navigationList\">\n </mv-comments-navigate>\n </div>\n </div>\n\n <div [hidden]=\"tabSelected !== 'search'\">\n <mv-comment-search [annotations]=\"navigationList\"></mv-comment-search>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i7.CommentSearchComponent, selector: "mv-comment-search", inputs: ["annotations"] }, { kind: "component", type: i8.CommentsNavigateComponent, selector: "mv-comments-navigate", inputs: ["annotationList", "autoSelect"] }, { kind: "component", type: i9.CommentFilterComponent, selector: "mv-comment-filter" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TitleCasePipe, name: "titlecase" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CommentSetHeaderComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-comment-set-header', encapsulation: ViewEncapsulation.None, template: "<div class=\"govuk-tabs commentSummaryHeader\" [ngClass]=\"{'icp-mode': icpEventService.enabled | async}\" data-module=\"govuk-tabs\">\n <ul class=\"govuk-tabs__list\">\n <li *ngFor=\"let tab of tabs; let i = index\" class=\"govuk-tabs__list-item govuk-tabs__list-item\"\n [ngClass]=\"{'govuk-tabs__list-item--selected': tabSelected === tab.label}\">\n <a id=\"commentSubPane{{ i }}\" (click)=\"selectTab(tab.label)\" [routerLink]=\"[]\" [ngClass]=\"{'govuk-tabs__list-item--filtered': tab.isFiltered}\"\n class=\"govuk-tabs__tab\" [hidden]=\"isHidden\">\n {{ tab.label | titlecase }}\n </a>\n </li>\n <li>\n <button id=\"mvCloseBtn\" #mvCloseBtn class=\"mv-button commentSummaryHeader-button--close\"\n title=\"Close Comments\" (click)=\"toggleCommentsPanel()\" [hidden]=\"isHidden\">\n </button>\n </li>\n </ul>\n <div class=\"govuk-tabs__panel\" [hidden]=\"!tabSelected\">\n <ng-container *ngIf=\"tabSelected === 'comments'\">\n <div style=\"width: 100%\">\n <div class=\"hmcts-banner\" *ngIf=\"navigationList?.length === 0\">\n <svg alt=\"\" class=\"hmcts-banner__icon\" fill=\"currentColor\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 25 25\" height=\"25\" width=\"25\">\n <path d=\"M13.7,18.5h-2.4v-2.4h2.4V18.5z M12.5,13.7c-0.7,0-1.2-0.5-1.2-1.2V7.7c0-0.7,0.5-1.2,1.2-1.2s1.2,0.5,1.2,1.2v4.8\nC13.7,13.2,13.2,13.7,12.5,13.7z M12.5,0.5c-6.6,0-12,5.4-12,12s5.4,12,12,12s12-5.4,12-12S19.1,0.5,12.5,0.5z\" /></svg>\n <div class=\"hmcts-banner__message\">\n <span class=\"hmcts-banner__assistive\">information</span>\n Select text to add a comment or highlight.\n </div>\n </div>\n <button type=\"button\" class=\"govuk-button\"\n id=\"commentSummary\" tabindex=\"0\"\n data-l10n-id=\"commentSummary\"\n title=\"Open collate summary\"\n (click)=\"toggleCommentsSummary()\">Collate comments</button>\n </div>\n <ng-container *ngIf=\"navigationList?.length > 0\">\n <mv-comments-navigate\n [annotationList]=\"navigationList\">\n </mv-comments-navigate>\n </ng-container>\n <p class=\"aui-comment__private-text\">\n <span class=\"aui-comment__private\">private</span>\n All comments can only be seen by you\n </p>\n </ng-container>\n <div [hidden]=\"tabSelected !== 'filter'\">\n <div class=\"govuk-tabs__panel--container\">\n <mv-comment-filter></mv-comment-filter>\n <mv-comments-navigate\n *ngIf=\"navigationList?.length > 0\"\n [annotationList]=\"navigationList\">\n </mv-comments-navigate>\n </div>\n </div>\n\n <div [hidden]=\"tabSelected !== 'search'\">\n <mv-comment-search [annotations]=\"navigationList\"></mv-comment-search>\n </div>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.Store }, { type: i2.CommentService }, { type: i3.ToolbarEventService }, { type: i4.IcpEventService }], propDecorators: { showCommentSummary: [{
type: Input
}], isHidden: [{
type: Input
}], showCommentSummaryDialog: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC1zZXQtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL21lZGlhLXZpZXdlci9zcmMvbGliL2Fubm90YXRpb25zL2NvbW1lbnQtc2V0L2NvbW1lbnQtc2V0LWhlYWRlci9jb21tZW50LXNldC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWVkaWEtdmlld2VyL3NyYy9saWIvYW5ub3RhdGlvbnMvY29tbWVudC1zZXQvY29tbWVudC1zZXQtaGVhZGVyL2NvbW1lbnQtc2V0LWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RyxPQUFPLEVBQUUsTUFBTSxFQUFTLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSx3Q0FBd0MsQ0FBQztBQUMzRSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sK0NBQStDLENBQUM7QUFDbEYsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBVW5ELE1BQU0sT0FBTyx5QkFBeUI7SUFhcEMsWUFBb0IsS0FBNkIsRUFDN0IsY0FBOEIsRUFDL0IsYUFBa0MsRUFDekIsZUFBZ0M7UUFIeEMsVUFBSyxHQUFMLEtBQUssQ0FBd0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQy9CLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQUN6QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFabEMsNkJBQXdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUd4RSxTQUFJLEdBQTRDLEVBQUUsQ0FBQztRQUNuRCxnQkFBVyxHQUFHLEVBQUUsQ0FBQztJQVE4QyxDQUFDO0lBRWhFLFFBQVE7UUFDTixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7UUFFN0YsSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxVQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDNUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxZQUFZLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBQyxHQUFHLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsR0FBRyxHQUFHLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO1lBQy9HLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0scUJBQXFCO1FBQzFCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsU0FBUyxDQUFDLEdBQVc7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDOUQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RSxDQUFDO0lBQ0gsQ0FBQztJQUVNLG1CQUFtQjtRQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNwQyxDQUFDO2tJQXREVSx5QkFBeUI7c0hBQXpCLHlCQUF5Qiw0TUNoQnRDLHkzRkEwREE7OzRGRDFDYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0UsdUJBQXVCLGlCQUVsQixpQkFBaUIsQ0FBQyxJQUFJO3VLQUlyQixrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDb0Isd0JBQXdCO3NCQUFqRCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5ub3RhdGlvbiB9IGZyb20gJy4uLy4uL2Fubm90YXRpb24tc2V0L2Fubm90YXRpb24tdmlldy9hbm5vdGF0aW9uLm1vZGVsJztcbmltcG9ydCB7IHNlbGVjdCwgU3RvcmUgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgKiBhcyBmcm9tU3RvcmUgZnJvbSAnLi4vLi4vLi4vc3RvcmUvcmVkdWNlcnMvcmVkdWNlcnMnO1xuaW1wb3J0ICogYXMgZnJvbVRhZ1NlbGVjdG9ycyBmcm9tICcuLi8uLi8uLi9zdG9yZS9zZWxlY3RvcnMvdGFnLnNlbGVjdG9ycyc7XG5pbXBvcnQgKiBhcyBmcm9tQW5ub1NlbGVjdG9yIGZyb20gJy4uLy4uLy4uL3N0b3JlL3NlbGVjdG9ycy9hbm5vdGF0aW9uLnNlbGVjdG9ycyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRvb2xiYXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi90b29sYmFyL3Rvb2xiYXItZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDb21tZW50U2VydmljZSB9IGZyb20gJy4uL2NvbW1lbnQvY29tbWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEljcEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3Rvb2xiYXIvaWNwLWV2ZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtdi1jb21tZW50LXNldC1oZWFkZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC1zZXQtaGVhZGVyLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQ29tbWVudFNldEhlYWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd0NvbW1lbnRTdW1tYXJ5OiBib29sZWFuO1xuICBASW5wdXQoKSBwdWJsaWMgaXNIaWRkZW46IGJvb2xlYW47XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVhZG9ubHkgc2hvd0NvbW1lbnRTdW1tYXJ5RGlhbG9nID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIG1hcmdpblRvQ29tbWVudDogYm9vbGVhbjtcbiAgdGFiczoge2lzRmlsdGVyZWQ/OiBib29sZWFuOyBsYWJlbDogc3RyaW5nfVtdID0gW107XG4gIHRhYlNlbGVjdGVkID0gJyc7XG4gIGlzRmlsdGVyZWQ6IGJvb2xlYW47XG4gIG5hdmlnYXRpb25MaXN0OiBBbm5vdGF0aW9uW107XG4gICRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzdG9yZTogU3RvcmU8ZnJvbVN0b3JlLlN0YXRlPixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjb21tZW50U2VydmljZTogQ29tbWVudFNlcnZpY2UsXG4gICAgICAgICAgICAgIHB1YmxpYyB0b29sYmFyRXZlbnRzOiBUb29sYmFyRXZlbnRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVhZG9ubHkgaWNwRXZlbnRTZXJ2aWNlOiBJY3BFdmVudFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgdGFnRmlsdGVyJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZnJvbVRhZ1NlbGVjdG9ycy5nZXRUYWdGaWx0ZXJzKSk7XG4gICAgY29uc3QgZmlsdGVyZWRBbm5vdGF0aW9uJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZnJvbUFubm9TZWxlY3Rvci5nZXRGaWx0ZXJlZEFubm90YXRpb25zKSk7XG5cbiAgICB0aGlzLiRzdWJzY3JpcHRpb25zID0gY29tYmluZUxhdGVzdChbdGFnRmlsdGVyJCwgZmlsdGVyZWRBbm5vdGF0aW9uJF0pLnN1YnNjcmliZSgoW2Zvcm1EYXRhLCBmaWx0ZXJlZEFubm9dKSA9PiB7XG4gICAgICB0aGlzLm5hdmlnYXRpb25MaXN0ID0gZmlsdGVyZWRBbm5vO1xuICAgICAgdGhpcy50YWJzID0gdGhpcy5uYXZpZ2F0aW9uTGlzdC5sZW5ndGggPiAwID9cbiAgICAgICAgW3tsYWJlbDogJ2NvbW1lbnRzJ30sIHtsYWJlbDogJ2ZpbHRlcid9LCB7bGFiZWw6ICdzZWFyY2gnfV0gOiBbe2xhYmVsOiAnY29tbWVudHMnfV07XG4gICAgICB0aGlzLmlzRmlsdGVyZWQgPSAhZm9ybURhdGEubGVuZ3RoO1xuICAgICAgdGhpcy50YWJzID0gWy4uLnRoaXMudGFic10ubWFwKCh0YWIpID0+IHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzRmlsdGVyZWQgJiYgdGFiLmxhYmVsID09PSAnZmlsdGVyJyA/IHsuLi50YWIsIGlzRmlsdGVyZWQ6IHRydWV9IDogey4uLnRhYiwgaXNGaWx0ZXJlZDogZmFsc2V9O1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQ29tbWVudHNTdW1tYXJ5KCk6IHZvaWQge1xuICAgIHRoaXMuc2hvd0NvbW1lbnRTdW1tYXJ5RGlhbG9nLmVtaXQoKTtcbiAgfVxuXG4gIHNlbGVjdFRhYih0YWI6IHN0cmluZykge1xuICAgIHRoaXMudGFiU2VsZWN0ZWQgPSB0YWIgIT09IHRoaXMudGFiU2VsZWN0ZWQgPyB0YWIgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMudGFiU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMubWFyZ2luVG9Db21tZW50ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY29tbWVudFNlcnZpY2UuY3JlYXRlTWFyZ2luVG9Db21tZW50RXZlbnQodGhpcy5tYXJnaW5Ub0NvbW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcmdpblRvQ29tbWVudCA9IGZhbHNlO1xuICAgICAgdGhpcy5jb21tZW50U2VydmljZS5jcmVhdGVNYXJnaW5Ub0NvbW1lbnRFdmVudCh0aGlzLm1hcmdpblRvQ29tbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZUNvbW1lbnRzUGFuZWwoKSB7XG4gICAgdGhpcy50b29sYmFyRXZlbnRzLnRvZ2dsZUNvbW1lbnRzUGFuZWwoIXRoaXMudG9vbGJhckV2ZW50cy5jb21tZW50c1BhbmVsVmlzaWJsZS5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuJHN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImdvdnVrLXRhYnMgY29tbWVudFN1bW1hcnlIZWFkZXJcIiBbbmdDbGFzc109XCJ7J2ljcC1tb2RlJzogaWNwRXZlbnRTZXJ2aWNlLmVuYWJsZWQgfCBhc3luY31cIiBkYXRhLW1vZHVsZT1cImdvdnVrLXRhYnNcIj5cbiAgPHVsIGNsYXNzPVwiZ292dWstdGFic19fbGlzdFwiPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgdGFiIG9mIHRhYnM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImdvdnVrLXRhYnNfX2xpc3QtaXRlbSBnb3Z1ay10YWJzX19saXN0LWl0ZW1cIlxuICAgICAgICBbbmdDbGFzc109XCJ7J2dvdnVrLXRhYnNfX2xpc3QtaXRlbS0tc2VsZWN0ZWQnOiB0YWJTZWxlY3RlZCA9PT0gdGFiLmxhYmVsfVwiPlxuICAgICAgPGEgaWQ9XCJjb21tZW50U3ViUGFuZXt7IGkgfX1cIiAoY2xpY2spPVwic2VsZWN0VGFiKHRhYi5sYWJlbClcIiBbcm91dGVyTGlua109XCJbXVwiIFtuZ0NsYXNzXT1cInsnZ292dWstdGFic19fbGlzdC1pdGVtLS1maWx0ZXJlZCc6IHRhYi5pc0ZpbHRlcmVkfVwiXG4gICAgICAgICBjbGFzcz1cImdvdnVrLXRhYnNfX3RhYlwiIFtoaWRkZW5dPVwiaXNIaWRkZW5cIj5cbiAgICAgICAge3sgdGFiLmxhYmVsIHwgdGl0bGVjYXNlIH19XG4gICAgICA8L2E+XG4gICAgPC9saT5cbiAgICA8bGk+XG4gICAgICA8YnV0dG9uIGlkPVwibXZDbG9zZUJ0blwiICNtdkNsb3NlQnRuIGNsYXNzPVwibXYtYnV0dG9uIGNvbW1lbnRTdW1tYXJ5SGVhZGVyLWJ1dHRvbi0tY2xvc2VcIlxuICAgICAgICB0aXRsZT1cIkNsb3NlIENvbW1lbnRzXCIgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzUGFuZWwoKVwiIFtoaWRkZW5dPVwiaXNIaWRkZW5cIj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvbGk+XG4gIDwvdWw+XG4gIDxkaXYgY2xhc3M9XCJnb3Z1ay10YWJzX19wYW5lbFwiIFtoaWRkZW5dPVwiIXRhYlNlbGVjdGVkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRhYlNlbGVjdGVkID09PSAnY29tbWVudHMnXCI+XG4gICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhtY3RzLWJhbm5lclwiICpuZ0lmPVwibmF2aWdhdGlvbkxpc3Q/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDxzdmcgYWx0PVwiXCIgY2xhc3M9XCJobWN0cy1iYW5uZXJfX2ljb25cIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZm9jdXNhYmxlPVwiZmFsc2VcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGhlaWdodD1cIjI1XCIgd2lkdGg9XCIyNVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0xMy43LDE4LjVoLTIuNHYtMi40aDIuNFYxOC41eiBNMTIuNSwxMy43Yy0wLjcsMC0xLjItMC41LTEuMi0xLjJWNy43YzAtMC43LDAuNS0xLjIsMS4yLTEuMnMxLjIsMC41LDEuMiwxLjJ2NC44XG5DMTMuNywxMy4yLDEzLjIsMTMuNywxMi41LDEzLjd6IE0xMi41LDAuNWMtNi42LDAtMTIsNS40LTEyLDEyczUuNCwxMiwxMiwxMnMxMi01LjQsMTItMTJTMTkuMSwwLjUsMTIuNSwwLjV6XCIgLz48L3N2Zz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG1jdHMtYmFubmVyX19tZXNzYWdlXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImhtY3RzLWJhbm5lcl9fYXNzaXN0aXZlXCI+aW5mb3JtYXRpb248L3NwYW4+XG4gICAgICAgICAgICBTZWxlY3QgdGV4dCB0byBhZGQgYSBjb21tZW50IG9yIGhpZ2hsaWdodC5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZ292dWstYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBpZD1cImNvbW1lbnRTdW1tYXJ5XCIgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJjb21tZW50U3VtbWFyeVwiXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJPcGVuIGNvbGxhdGUgc3VtbWFyeVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNvbW1lbnRzU3VtbWFyeSgpXCI+Q29sbGF0ZSBjb21tZW50czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibmF2aWdhdGlvbkxpc3Q/Lmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPG12LWNvbW1lbnRzLW5hdmlnYXRlXG4gICAgICAgICAgW2Fubm90YXRpb25MaXN0XT1cIm5hdmlnYXRpb25MaXN0XCI+XG4gICAgICAgIDwvbXYtY29tbWVudHMtbmF2aWdhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxwIGNsYXNzPVwiYXVpLWNvbW1lbnRfX3ByaXZhdGUtdGV4dFwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImF1aS1jb21tZW50X19wcml2YXRlXCI+cHJpdmF0ZTwvc3Bhbj5cbiAgICAgICAgQWxsIGNvbW1lbnRzIGNhbiBvbmx5IGJlIHNlZW4gYnkgeW91XG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBbaGlkZGVuXT1cInRhYlNlbGVjdGVkICE9PSAnZmlsdGVyJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLXRhYnNfX3BhbmVsLS1jb250YWluZXJcIj5cbiAgICAgICAgPG12LWNvbW1lbnQtZmlsdGVyPjwvbXYtY29tbWVudC1maWx0ZXI+XG4gICAgICAgIDxtdi1jb21tZW50cy1uYXZpZ2F0ZVxuICAgICAgICAgICpuZ0lmPVwibmF2aWdhdGlvbkxpc3Q/Lmxlbmd0aCA+IDBcIlxuICAgICAgICAgIFthbm5vdGF0aW9uTGlzdF09XCJuYXZpZ2F0aW9uTGlzdFwiPlxuICAgICAgICA8L212LWNvbW1lbnRzLW5hdmlnYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IFtoaWRkZW5dPVwidGFiU2VsZWN0ZWQgIT09ICdzZWFyY2gnXCI+XG4gICAgICA8bXYtY29tbWVudC1zZWFyY2ggW2Fubm90YXRpb25zXT1cIm5hdmlnYXRpb25MaXN0XCI+PC9tdi1jb21tZW50LXNlYXJjaD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==