@hmcts/media-viewer
Version:
109 lines • 32.2 kB
JavaScript
import { Component, HostListener, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "../toolbar-button-visibility.service";
import * as i2 from "../toolbar-event.service";
import * as i3 from "@angular/common";
import * as i4 from "@angular/forms";
import * as i5 from "@angular/router";
import * as i6 from "rpx-xui-translation";
export class SearchBarComponent {
constructor(toolbarButtons, toolbarEvents) {
this.toolbarButtons = toolbarButtons;
this.toolbarEvents = toolbarEvents;
this.highlightAll = true;
this.matchCase = false;
this.wholeWord = false;
this.resultsText = '';
this.searchText = '';
this.resultCount = 0;
this.subscriptions = [];
this.advancedSearchVisible = false;
}
ngOnInit() {
this.subscriptions.push(this.toolbarEvents.searchResultsCountSubject.subscribe(results => this.setSearchResultsCount(results)));
}
ngAfterViewInit() {
this.findInput.nativeElement.focus();
}
ngOnDestroy() {
for (const subscription of this.subscriptions) {
subscription.unsubscribe();
}
}
onWindowKeyDown(e) {
if (e.code === 'F3' || (e.ctrlKey && e.code === 'KeyF')) {
e.preventDefault();
this.toolbarEvents.searchBarHidden.next(false);
setTimeout(() => this.findInput.nativeElement.focus(), 200);
}
}
searchNext() {
this.toolbarEvents.search({
searchTerm: this.searchText,
highlightAll: this.highlightAll,
matchCase: this.matchCase,
wholeWord: this.wholeWord,
previous: false,
reset: false
});
}
searchPrev() {
this.toolbarEvents.search({
searchTerm: this.searchText,
highlightAll: this.highlightAll,
matchCase: this.matchCase,
wholeWord: this.wholeWord,
previous: true,
reset: false
});
}
search() {
this.toolbarEvents.search({
searchTerm: this.searchText,
highlightAll: this.highlightAll,
matchCase: this.matchCase,
wholeWord: this.wholeWord,
previous: false,
reset: true
});
}
setSearchResultsCount(results) {
this.resultCount = results.total;
this.resultsText = this.resultCount > 0
? `Found ${results.current} of ${results.total}`
: 'No results found';
if (this.resultCount && this.resultCount > 0 && !results.isPrevious) {
setTimeout(() => {
this.findNext.nativeElement.focus();
}, 1000);
}
}
onEscapeKeyPress(e) {
this.toolbarEvents.searchBarHidden.next(true);
}
onEnterKeyPress(e) {
this.search();
}
toggleAdvancedSearch() {
this.advancedSearchVisible = !this.advancedSearchVisible;
}
toggleSearchBar() {
this.toolbarEvents.searchBarHidden.next(!this.toolbarEvents.searchBarHidden.getValue());
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchBarComponent, deps: [{ token: i1.ToolbarButtonVisibilityService }, { token: i2.ToolbarEventService }], target: i0.ɵɵFactoryTarget.Component }); }
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchBarComponent, selector: "mv-search-bar", host: { listeners: { "window:keydown": "onWindowKeyDown($event)" } }, viewQueries: [{ propertyName: "findInput", first: true, predicate: ["findInput"], descendants: true, static: true }, { propertyName: "findNext", first: true, predicate: ["findNext"], descendants: true }], ngImport: i0, template: "<div\n class=\"searchbar govuk-!-padding-3\"\n [hidden]=\"toolbarEvents.searchBarHidden | async\"\n>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <input\n class=\"govuk-input govuk-!-display-inline-block govuk-!-width-three-quarters govuk-!-margin-bottom-5 govuk-!-margin-top-5\"\n type=\"text\"\n aria-label=\"Search document\"\n #findInput\n [(ngModel)]=\"searchText\"\n (keydown.escape)=\"onEscapeKeyPress($event)\"\n (keydown.enter)=\"onEnterKeyPress($event)\"\n title=\"Search document\"\n placeholder=\"Search document for\u2026\"\n tabindex=\"0\"\n data-l10n-id=\"find_input\"\n />\n <button\n class=\"govuk-button govuk-!-display-inline-block govuk-!-margin-bottom-4\"\n data-module=\"govuk-button\"\n (click)=\"search()\"\n style=\"position: absolute; top: 40px; right: 10px\"\n >\n Search\n </button>\n </div>\n </div>\n\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-three-quarters\">\n <span\n id=\"findResultsCount\"\n class=\"govuk-!-display-inline-block govuk-!-margin-right-4\"\n role=\"status\"\n >{{ resultsText }}</span\n >\n <a\n *ngIf=\"resultCount > 0\"\n id=\"findPrevious\"\n [routerLink]=\"[]\"\n role=\"button\"\n class=\"govuk-link govuk-link--no-visited-state govuk-!-margin-right-2\"\n (click)=\"searchPrev()\"\n title=\"Find the previous occurrence of the phrase\"\n data-l10n-id=\"find_previous\"\n >{{ \"Prev\" | rpxTranslate }}</a\n >\n <a\n *ngIf=\"resultCount > 0\"\n id=\"findNext\"\n #findNext\n [routerLink]=\"[]\"\n role=\"button\"\n class=\"govuk-link govuk-link--no-visited-state\"\n (click)=\"searchNext()\"\n title=\"Find the next occurrence of the phrase\"\n data-l10n-id=\"find_next\"\n >{{ \"Next\" | rpxTranslate }}</a\n >\n </div>\n <div class=\"govuk-grid-column-one-quarter\">\n <a\n [routerLink]=\"[]\"\n class=\"govuk-link govuk-link--no-visited-state\"\n role=\"button\"\n (click)=\"toggleAdvancedSearch()\"\n title=\"Advanced\"\n [attr.aria-expanded]=\"advancedSearchVisible\"\n aria-controls=\"advancedSearchVisible\"\n data-l10n-id=\"find_advanced\"\n style=\"position: absolute; top: 95px; right: 15px\"\n >{{ \"Advanced\" | rpxTranslate }}</a\n >\n </div>\n </div>\n\n <div\n id=\"advancedSearchVisible\"\n class=\"govuk-grid-row\"\n *ngIf=\"advancedSearchVisible\"\n >\n <div class=\"govuk-grid-column-full\">\n <div\n class=\"govuk-form-group govuk-!-margin-top-3 govuk-!-margin-bottom-1\"\n >\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"advanced\">\n <div class=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findHighlightAll\"\n name=\"findHighlightAll\"\n type=\"checkbox\"\n (change)=\"highlightAll = !highlightAll; search()\"\n [checked]=\"highlightAll\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findHighlightAll\"\n data-l10n-id=\"find_highlight\"\n >\n {{ \"Highlight all\" | rpxTranslate }}\n </label>\n </div>\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findMatchCase\"\n name=\"findMatchCase\"\n type=\"checkbox\"\n (change)=\"matchCase = !matchCase; search()\"\n [checked]=\"matchCase\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findMatchCase\"\n data-l10n-id=\"find_match_case_label\"\n >\n {{ \"Match text (exact case)\" | rpxTranslate }}\n </label>\n </div>\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findEntireWord\"\n name=\"findMatchCase\"\n type=\"checkbox\"\n (change)=\"wholeWord = !wholeWord; search()\"\n [checked]=\"wholeWord\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findEntireWord\"\n data-l10n-id=\"find_entire_word_label\"\n >\n {{ \"Match whole words or sentences\" | rpxTranslate }}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div>\n <button\n id=\"mvCloseBtn\"\n #mvCloseBtn\n class=\"mv-button searchbar-button--close\"\n title=\"Close Search\"\n data-l10n-id=\"mvRedactBtn\"\n (click)=\"toggleSearchBar()\"\n ></button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i6.RpxTranslatePipe, name: "rpxTranslate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchBarComponent, decorators: [{
type: Component,
args: [{ selector: 'mv-search-bar', template: "<div\n class=\"searchbar govuk-!-padding-3\"\n [hidden]=\"toolbarEvents.searchBarHidden | async\"\n>\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-full\">\n <input\n class=\"govuk-input govuk-!-display-inline-block govuk-!-width-three-quarters govuk-!-margin-bottom-5 govuk-!-margin-top-5\"\n type=\"text\"\n aria-label=\"Search document\"\n #findInput\n [(ngModel)]=\"searchText\"\n (keydown.escape)=\"onEscapeKeyPress($event)\"\n (keydown.enter)=\"onEnterKeyPress($event)\"\n title=\"Search document\"\n placeholder=\"Search document for\u2026\"\n tabindex=\"0\"\n data-l10n-id=\"find_input\"\n />\n <button\n class=\"govuk-button govuk-!-display-inline-block govuk-!-margin-bottom-4\"\n data-module=\"govuk-button\"\n (click)=\"search()\"\n style=\"position: absolute; top: 40px; right: 10px\"\n >\n Search\n </button>\n </div>\n </div>\n\n <div class=\"govuk-grid-row\">\n <div class=\"govuk-grid-column-three-quarters\">\n <span\n id=\"findResultsCount\"\n class=\"govuk-!-display-inline-block govuk-!-margin-right-4\"\n role=\"status\"\n >{{ resultsText }}</span\n >\n <a\n *ngIf=\"resultCount > 0\"\n id=\"findPrevious\"\n [routerLink]=\"[]\"\n role=\"button\"\n class=\"govuk-link govuk-link--no-visited-state govuk-!-margin-right-2\"\n (click)=\"searchPrev()\"\n title=\"Find the previous occurrence of the phrase\"\n data-l10n-id=\"find_previous\"\n >{{ \"Prev\" | rpxTranslate }}</a\n >\n <a\n *ngIf=\"resultCount > 0\"\n id=\"findNext\"\n #findNext\n [routerLink]=\"[]\"\n role=\"button\"\n class=\"govuk-link govuk-link--no-visited-state\"\n (click)=\"searchNext()\"\n title=\"Find the next occurrence of the phrase\"\n data-l10n-id=\"find_next\"\n >{{ \"Next\" | rpxTranslate }}</a\n >\n </div>\n <div class=\"govuk-grid-column-one-quarter\">\n <a\n [routerLink]=\"[]\"\n class=\"govuk-link govuk-link--no-visited-state\"\n role=\"button\"\n (click)=\"toggleAdvancedSearch()\"\n title=\"Advanced\"\n [attr.aria-expanded]=\"advancedSearchVisible\"\n aria-controls=\"advancedSearchVisible\"\n data-l10n-id=\"find_advanced\"\n style=\"position: absolute; top: 95px; right: 15px\"\n >{{ \"Advanced\" | rpxTranslate }}</a\n >\n </div>\n </div>\n\n <div\n id=\"advancedSearchVisible\"\n class=\"govuk-grid-row\"\n *ngIf=\"advancedSearchVisible\"\n >\n <div class=\"govuk-grid-column-full\">\n <div\n class=\"govuk-form-group govuk-!-margin-top-3 govuk-!-margin-bottom-1\"\n >\n <fieldset class=\"govuk-fieldset\" aria-describedby=\"advanced\">\n <div class=\"govuk-checkboxes\">\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findHighlightAll\"\n name=\"findHighlightAll\"\n type=\"checkbox\"\n (change)=\"highlightAll = !highlightAll; search()\"\n [checked]=\"highlightAll\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findHighlightAll\"\n data-l10n-id=\"find_highlight\"\n >\n {{ \"Highlight all\" | rpxTranslate }}\n </label>\n </div>\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findMatchCase\"\n name=\"findMatchCase\"\n type=\"checkbox\"\n (change)=\"matchCase = !matchCase; search()\"\n [checked]=\"matchCase\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findMatchCase\"\n data-l10n-id=\"find_match_case_label\"\n >\n {{ \"Match text (exact case)\" | rpxTranslate }}\n </label>\n </div>\n <div class=\"govuk-checkboxes__item\">\n <input\n class=\"govuk-checkboxes__input\"\n id=\"findEntireWord\"\n name=\"findMatchCase\"\n type=\"checkbox\"\n (change)=\"wholeWord = !wholeWord; search()\"\n [checked]=\"wholeWord\"\n />\n <label\n class=\"govuk-label govuk-checkboxes__label\"\n for=\"findEntireWord\"\n data-l10n-id=\"find_entire_word_label\"\n >\n {{ \"Match whole words or sentences\" | rpxTranslate }}\n </label>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div>\n <button\n id=\"mvCloseBtn\"\n #mvCloseBtn\n class=\"mv-button searchbar-button--close\"\n title=\"Close Search\"\n data-l10n-id=\"mvRedactBtn\"\n (click)=\"toggleSearchBar()\"\n ></button>\n </div>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.ToolbarButtonVisibilityService }, { type: i2.ToolbarEventService }], propDecorators: { findInput: [{
type: ViewChild,
args: ['findInput', { static: true }]
}], findNext: [{
type: ViewChild,
args: ['findNext', { static: false }]
}], onWindowKeyDown: [{
type: HostListener,
args: ['window:keydown', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYS12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9tZWRpYS12aWV3ZXIvc3JjL2xpYi90b29sYmFyL3NlYXJjaC1iYXIvc2VhcmNoLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBVSxTQUFTLEVBQTRCLE1BQU0sZUFBZSxDQUFDOzs7Ozs7OztBQVNqSCxNQUFNLE9BQU8sa0JBQWtCO0lBZ0I3QixZQUNrQixjQUE4QyxFQUM5QyxhQUFrQztRQURsQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0M7UUFDOUMsa0JBQWEsR0FBYixhQUFhLENBQXFCO1FBYnBELGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRVIsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBRXBDLDBCQUFxQixHQUFHLEtBQUssQ0FBQztJQUtqQyxDQUFDO0lBRUUsUUFBUTtRQUNiLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUN2RyxDQUFDO0lBQ0osQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxL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QUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUMzRCxDQUFDO0lBRU0sZUFBZTtRQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7a0lBM0dVLGtCQUFrQjtzSEFBbEIsa0JBQWtCLHdVQ1QvQixrdEtBNEpBOzs0RkRuSmEsa0JBQWtCO2tCQUo5QixTQUFTOytCQUNFLGVBQWU7cUlBS2lCLFNBQVM7c0JBQWxELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDRSxRQUFRO3NCQUFqRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBbUNqQyxlQUFlO3NCQURyQixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIE9uSW5pdCwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRvb2xiYXJCdXR0b25WaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL3Rvb2xiYXItYnV0dG9uLXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBTZWFyY2hSZXN1bHRzQ291bnQsIFRvb2xiYXJFdmVudFNlcnZpY2UgfSBmcm9tICcuLi90b29sYmFyLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ212LXNlYXJjaC1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLWJhci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoQmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG4gIEBWaWV3Q2hpbGQoJ2ZpbmRJbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbmRJbnB1dDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnZmluZE5leHQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZmluZE5leHQ6IEVsZW1lbnRSZWY8SFRNTEFuY2hvckVsZW1lbnQ+O1xuXG4gIGhpZ2hsaWdodEFsbCA9IHRydWU7XG4gIG1hdGNoQ2FzZSA9IGZhbHNlO1xuICB3aG9sZVdvcmQgPSBmYWxzZTtcbiAgcmVzdWx0c1RleHQgPSAnJztcbiAgc2VhcmNoVGV4dCA9ICcnO1xuICByZXN1bHRDb3VudCA9IDA7XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHB1YmxpYyBhZHZhbmNlZFNlYXJjaFZpc2libGUgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgdG9vbGJhckJ1dHRvbnM6IFRvb2xiYXJCdXR0b25WaXNpYmlsaXR5U2VydmljZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgdG9vbGJhckV2ZW50czogVG9vbGJhckV2ZW50U2VydmljZVxuICApIHsgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudG9vbGJhckV2ZW50cy5zZWFyY2hSZXN1bHRzQ291bnRTdWJqZWN0LnN1YnNjcmliZShyZXN1bHRzID0+IHRoaXMuc2V0U2VhcmNoUmVzdWx0c0NvdW50KHJlc3VsdHMpKVxuICAgICk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5maW5kSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy5zdWJzY3JpcHRpb25zKSB7XG4gICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbldpbmRvd0tleURvd24oZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmNvZGUgPT09ICdGMycgfHwgKGUuY3RybEtleSAmJiBlLmNvZGUgPT09ICdLZXlGJykpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdGhpcy50b29sYmFyRXZlbnRzLnNlYXJjaEJhckhpZGRlbi5uZXh0KGZhbHNlKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5maW5kSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpLCAyMDApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWFyY2hOZXh0KCk6IHZvaWQge1xuICAgIHRoaXMudG9vbGJhckV2ZW50cy5zZWFyY2goe1xuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXh0LFxuICAgICAgaGlnaGxpZ2h0QWxsOiB0aGlzLmhpZ2hsaWdodEFsbCxcbiAgICAgIG1hdGNoQ2FzZTogdGhpcy5tYXRjaENhc2UsXG4gICAgICB3aG9sZVdvcmQ6IHRoaXMud2hvbGVXb3JkLFxuICAgICAgcHJldmlvdXM6IGZhbHNlLFxuICAgICAgcmVzZXQ6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoUHJldigpOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xiYXJFdmVudHMuc2VhcmNoKHtcbiAgICAgIHNlYXJjaFRlcm06IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIGhpZ2hsaWdodEFsbDogdGhpcy5oaWdobGlnaHRBbGwsXG4gICAgICBtYXRjaENhc2U6IHRoaXMubWF0Y2hDYXNlLFxuICAgICAgd2hvbGVXb3JkOiB0aGlzLndob2xlV29yZCxcbiAgICAgIHByZXZpb3VzOiB0cnVlLFxuICAgICAgcmVzZXQ6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMudG9vbGJhckV2ZW50cy5zZWFyY2goe1xuICAgICAgc2VhcmNoVGVybTogdGhpcy5zZWFyY2hUZXh0LFxuICAgICAgaGlnaGxpZ2h0QWxsOiB0aGlzLmhpZ2hsaWdodEFsbCxcbiAgICAgIG1hdGNoQ2FzZTogdGhpcy5tYXRjaENhc2UsXG4gICAgICB3aG9sZVdvcmQ6IHRoaXMud2hvbGVXb3JkLFxuICAgICAgcHJldmlvdXM6IGZhbHNlLFxuICAgICAgcmVzZXQ6IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2VhcmNoUmVzdWx0c0NvdW50KHJlc3VsdHM6IFNlYXJjaFJlc3VsdHNDb3VudCk6IHZvaWQge1xuICAgIHRoaXMucmVzdWx0Q291bnQgPSByZXN1bHRzLnRvdGFsO1xuICAgIHRoaXMucmVzdWx0c1RleHQgPSB0aGlzLnJlc3VsdENvdW50ID4gMFxuICAgICAgPyBgRm91bmQgJHtyZXN1bHRzLmN1cnJlbnR9IG9mICR7cmVzdWx0cy50b3RhbH1gXG4gICAgICA6ICdObyByZXN1bHRzIGZvdW5kJztcbiAgICBpZiAodGhpcy5yZXN1bHRDb3VudCAmJiB0aGlzLnJlc3VsdENvdW50ID4gMCAmJiAhcmVzdWx0cy5pc1ByZXZpb3VzKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5maW5kTmV4dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9LCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25Fc2NhcGVLZXlQcmVzcyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy50b29sYmFyRXZlbnRzLnNlYXJjaEJhckhpZGRlbi5uZXh0KHRydWUpO1xuICB9XG5cbiAgcHVibGljIG9uRW50ZXJLZXlQcmVzcyhlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2goKTtcbiAgfVxuXG5cbiAgcHVibGljIHRvZ2dsZUFkdmFuY2VkU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuYWR2YW5jZWRTZWFyY2hWaXNpYmxlID0gIXRoaXMuYWR2YW5jZWRTZWFyY2hWaXNpYmxlO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlYXJjaEJhcigpIHtcbiAgICB0aGlzLnRvb2xiYXJFdmVudHMuc2VhcmNoQmFySGlkZGVuLm5leHQoIXRoaXMudG9vbGJhckV2ZW50cy5zZWFyY2hCYXJIaWRkZW4uZ2V0VmFsdWUoKSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJzZWFyY2hiYXIgZ292dWstIS1wYWRkaW5nLTNcIlxuICBbaGlkZGVuXT1cInRvb2xiYXJFdmVudHMuc2VhcmNoQmFySGlkZGVuIHwgYXN5bmNcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1yb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1jb2x1bW4tZnVsbFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZ292dWstaW5wdXQgZ292dWstIS1kaXNwbGF5LWlubGluZS1ibG9jayBnb3Z1ay0hLXdpZHRoLXRocmVlLXF1YXJ0ZXJzIGdvdnVrLSEtbWFyZ2luLWJvdHRvbS01IGdvdnVrLSEtbWFyZ2luLXRvcC01XCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIGRvY3VtZW50XCJcbiAgICAgICAgI2ZpbmRJbnB1dFxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAoa2V5ZG93bi5lc2NhcGUpPVwib25Fc2NhcGVLZXlQcmVzcygkZXZlbnQpXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25FbnRlcktleVByZXNzKCRldmVudClcIlxuICAgICAgICB0aXRsZT1cIlNlYXJjaCBkb2N1bWVudFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGRvY3VtZW50IGZvcuKAplwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIGRhdGEtbDEwbi1pZD1cImZpbmRfaW5wdXRcIlxuICAgICAgLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJnb3Z1ay1idXR0b24gZ292dWstIS1kaXNwbGF5LWlubGluZS1ibG9jayBnb3Z1ay0hLW1hcmdpbi1ib3R0b20tNFwiXG4gICAgICAgIGRhdGEtbW9kdWxlPVwiZ292dWstYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInNlYXJjaCgpXCJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNDBweDsgcmlnaHQ6IDEwcHhcIlxuICAgICAgPlxuICAgICAgICBTZWFyY2hcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1yb3dcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ292dWstZ3JpZC1jb2x1bW4tdGhyZWUtcXVhcnRlcnNcIj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGlkPVwiZmluZFJlc3VsdHNDb3VudFwiXG4gICAgICAgIGNsYXNzPVwiZ292dWstIS1kaXNwbGF5LWlubGluZS1ibG9jayBnb3Z1ay0hLW1hcmdpbi1yaWdodC00XCJcbiAgICAgICAgcm9sZT1cInN0YXR1c1wiXG4gICAgICAgID57eyByZXN1bHRzVGV4dCB9fTwvc3BhblxuICAgICAgPlxuICAgICAgPGFcbiAgICAgICAgKm5nSWY9XCJyZXN1bHRDb3VudCA+IDBcIlxuICAgICAgICBpZD1cImZpbmRQcmV2aW91c1wiXG4gICAgICAgIFtyb3V0ZXJMaW5rXT1cIltdXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiZ292dWstbGluayBnb3Z1ay1saW5rLS1uby12aXNpdGVkLXN0YXRlIGdvdnVrLSEtbWFyZ2luLXJpZ2h0LTJcIlxuICAgICAgICAoY2xpY2spPVwic2VhcmNoUHJldigpXCJcbiAgICAgICAgdGl0bGU9XCJGaW5kIHRoZSBwcmV2aW91cyBvY2N1cnJlbmNlIG9mIHRoZSBwaHJhc2VcIlxuICAgICAgICBkYXRhLWwxMG4taWQ9XCJmaW5kX3ByZXZpb3VzXCJcbiAgICAgICAgPnt7IFwiUHJldlwiIHwgcnB4VHJhbnNsYXRlIH19PC9hXG4gICAgICA+XG4gICAgICA8YVxuICAgICAgICAqbmdJZj1cInJlc3VsdENvdW50ID4gMFwiXG4gICAgICAgIGlkPVwiZmluZE5leHRcIlxuICAgICAgICAjZmluZE5leHRcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiW11cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgY2xhc3M9XCJnb3Z1ay1saW5rIGdvdnVrLWxpbmstLW5vLXZpc2l0ZWQtc3RhdGVcIlxuICAgICAgICAoY2xpY2spPVwic2VhcmNoTmV4dCgpXCJcbiAgICAgICAgdGl0bGU9XCJGaW5kIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YgdGhlIHBocmFzZVwiXG4gICAgICAgIGRhdGEtbDEwbi1pZD1cImZpbmRfbmV4dFwiXG4gICAgICAgID57eyBcIk5leHRcIiB8IHJweFRyYW5zbGF0ZSB9fTwvYVxuICAgICAgPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJnb3Z1ay1ncmlkLWNvbHVtbi1vbmUtcXVhcnRlclwiPlxuICAgICAgPGFcbiAgICAgICAgW3JvdXRlckxpbmtdPVwiW11cIlxuICAgICAgICBjbGFzcz1cImdvdnVrLWxpbmsgZ292dWstbGluay0tbm8tdmlzaXRlZC1zdGF0ZVwiXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlQWR2YW5jZWRTZWFyY2goKVwiXG4gICAgICAgIHRpdGxlPVwiQWR2YW5jZWRcIlxuICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImFkdmFuY2VkU2VhcmNoVmlzaWJsZVwiXG4gICAgICAgIGFyaWEtY29udHJvbHM9XCJhZHZhbmNlZFNlYXJjaFZpc2libGVcIlxuICAgICAgICBkYXRhLWwxMG4taWQ9XCJmaW5kX2FkdmFuY2VkXCJcbiAgICAgICAgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogOTVweDsgcmlnaHQ6IDE1cHhcIlxuICAgICAgICA+e3sgXCJBZHZhbmNlZFwiIHwgcnB4VHJhbnNsYXRlIH19PC9hXG4gICAgICA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICBpZD1cImFkdmFuY2VkU2VhcmNoVmlzaWJsZVwiXG4gICAgY2xhc3M9XCJnb3Z1ay1ncmlkLXJvd1wiXG4gICAgKm5nSWY9XCJhZHZhbmNlZFNlYXJjaFZpc2libGVcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImdvdnVrLWdyaWQtY29sdW1uLWZ1bGxcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJnb3Z1ay1mb3JtLWdyb3VwIGdvdnVrLSEtbWFyZ2luLXRvcC0zIGdvdnVrLSEtbWFyZ2luLWJvdHRvbS0xXCJcbiAgICAgID5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwiZ292dWstZmllbGRzZXRcIiBhcmlhLWRlc2NyaWJlZGJ5PVwiYWR2YW5jZWRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstY2hlY2tib3hlc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXNfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJnb3Z1ay1jaGVja2JveGVzX19pbnB1dFwiXG4gICAgICAgICAgICAgICAgaWQ9XCJmaW5kSGlnaGxpZ2h0QWxsXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwiZmluZEhpZ2hsaWdodEFsbFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImhpZ2hsaWdodEFsbCA9ICFoaWdobGlnaHRBbGw7IHNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJoaWdobGlnaHRBbGxcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdvdnVrLWxhYmVsIGdvdnVrLWNoZWNrYm94ZXNfX2xhYmVsXCJcbiAgICAgICAgICAgICAgICBmb3I9XCJmaW5kSGlnaGxpZ2h0QWxsXCJcbiAgICAgICAgICAgICAgICBkYXRhLWwxMG4taWQ9XCJmaW5kX2hpZ2hsaWdodFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBcIkhpZ2hsaWdodCBhbGxcIiB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ292dWstY2hlY2tib3hlc19faXRlbVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXNfX2lucHV0XCJcbiAgICAgICAgICAgICAgICBpZD1cImZpbmRNYXRjaENhc2VcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJmaW5kTWF0Y2hDYXNlXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwibWF0Y2hDYXNlID0gIW1hdGNoQ2FzZTsgc2VhcmNoKClcIlxuICAgICAgICAgICAgICAgIFtjaGVja2VkXT1cIm1hdGNoQ2FzZVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZ292dWstbGFiZWwgZ292dWstY2hlY2tib3hlc19fbGFiZWxcIlxuICAgICAgICAgICAgICAgIGZvcj1cImZpbmRNYXRjaENhc2VcIlxuICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cImZpbmRfbWF0Y2hfY2FzZV9sYWJlbFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBcIk1hdGNoIHRleHQgKGV4YWN0IGNhc2UpXCIgfCBycHhUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImdvdnVrLWNoZWNrYm94ZXNfX2l0ZW1cIj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJnb3Z1ay1jaGVja2JveGVzX19pbnB1dFwiXG4gICAgICAgICAgICAgICAgaWQ9XCJmaW5kRW50aXJlV29yZFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImZpbmRNYXRjaENhc2VcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJ3aG9sZVdvcmQgPSAhd2hvbGVXb3JkOyBzZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwid2hvbGVXb3JkXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJnb3Z1ay1sYWJlbCBnb3Z1ay1jaGVja2JveGVzX19sYWJlbFwiXG4gICAgICAgICAgICAgICAgZm9yPVwiZmluZEVudGlyZVdvcmRcIlxuICAgICAgICAgICAgICAgIGRhdGEtbDEwbi1pZD1cImZpbmRfZW50aXJlX3dvcmRfbGFiZWxcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3sgXCJNYXRjaCB3aG9sZSB3b3JkcyBvciBzZW50ZW5jZXNcIiB8IHJweFRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXY+XG4gICAgPGJ1dHRvblxuICAgICAgaWQ9XCJtdkNsb3NlQnRuXCJcbiAgICAgICNtdkNsb3NlQnRuXG4gICAgICBjbGFzcz1cIm12LWJ1dHRvbiBzZWFyY2hiYXItYnV0dG9uLS1jbG9zZVwiXG4gICAgICB0aXRsZT1cIkNsb3NlIFNlYXJjaFwiXG4gICAgICBkYXRhLWwxMG4taWQ9XCJtdlJlZGFjdEJ0blwiXG4gICAgICAoY2xpY2spPVwidG9nZ2xlU2VhcmNoQmFyKClcIlxuICAgID48L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==