@versatiledatakit/shared
Version:
Versatile Data Kit Shared library enables reusability of shared features like: NgRx Redux, Error Handlers, Utils, Generic Components, etc.
209 lines • 31.3 kB
JavaScript
/*
* Copyright 2023-2025 Broadcom
* SPDX-License-Identifier: Apache-2.0
*/
/* eslint-disable */
import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { FormControl } from '@angular/forms';
import { BehaviorSubject, combineLatest } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
const _c0 = ["searchButton"];
function VdkSearchComponent_ng_container_3_button_1_Template(rf, ctx) { if (rf & 1) {
const _r6 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 7);
i0.ɵɵlistener("click", function VdkSearchComponent_ng_container_3_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return ctx_r5.clearSearch(); });
i0.ɵɵelement(1, "cds-icon", 8);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("title", ctx_r2.clearSearchTitle);
i0.ɵɵattribute("aria-label", ctx_r2.clearSearchTitle);
} }
function VdkSearchComponent_ng_container_3_ng_template_2_Template(rf, ctx) { if (rf & 1) {
const _r9 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 9, 10);
i0.ɵɵlistener("click", function VdkSearchComponent_ng_container_3_ng_template_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(2); return ctx_r8.triggerSearch(); });
i0.ɵɵtext(2);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵattribute("disabled", +(ctx_r4.searchQueryValue == null ? null : ctx_r4.searchQueryValue.length) < ctx_r4.searchTermMinimalLength ? "" : null)("aria-label", ctx_r4.searchButtonAriaLabelText || null);
i0.ɵɵadvance(2);
i0.ɵɵtextInterpolate1(" ", ctx_r4.searchButtonText, " ");
} }
function VdkSearchComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, VdkSearchComponent_ng_container_3_button_1_Template, 2, 2, "button", 5);
i0.ɵɵtemplate(2, VdkSearchComponent_ng_container_3_ng_template_2_Template, 3, 3, "ng-template", null, 6, i0.ɵɵtemplateRefExtractor);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const _r3 = i0.ɵɵreference(3);
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r0.showSearchButton || !ctx_r0.isSeachButtonVisible)("ngIfElse", _r3);
} }
function VdkSearchComponent_clr_control_helper_4_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "clr-control-helper", 11);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r1 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx_r1.helperText);
} }
const defaultSearchInputPadding = 24;
export class VdkSearchComponent {
constructor() {
this.searchInputPaddingRight = `${defaultSearchInputPadding}px`;
this._disabled = false;
this.searchQueryValue = '';
this.clearSearchTitle = 'Clear Search';
this.helperText = '';
this.debounceTime = 100;
this.searchTermMinimalLength = 2;
this.showSearchButton = false;
this.searchButtonText = 'Search';
this.searchButtonAriaLabelText = 'Search';
this.search = new EventEmitter();
this.triggerSearch$ = new BehaviorSubject(undefined);
this.focused = false;
this.finalPlaceholder = 'Search';
}
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = value;
if (value) {
this.searchQuery?.disable({ emitEvent: false });
}
else {
this.searchQuery?.enable({ emitEvent: false });
}
}
set placeholder(pass) {
this.finalPlaceholder = pass ? pass : 'Search';
}
ngOnInit() {
this.searchQuery = new FormControl(this.searchQueryValue);
this.searchQuerySub = combineLatest([this.searchQuery.valueChanges, this.triggerSearch$])
.pipe(debounceTime(this.debounceTime))
.subscribe(([query]) => {
const queryLength = query.length;
query = query.trim();
this.searchQueryValue = query;
// not emit search event if it hasn't been inputted something different from whitespace
if (this.searchQueryValue.length === 0 && queryLength !== 0) {
return;
}
// Make sure that the 'Search' button will be visible in 'Manual Search' mode upon every change.
this.isSeachButtonVisible = this.showSearchButton;
const shouldNotifyForQueryChange = !this.showSearchButton || this.hasSearchBeenTriggeredManually;
const inputHasMinLengthOrIsCleared = this.searchQueryValue.length >= this.searchTermMinimalLength || this.searchQueryValue.length === 0;
if (shouldNotifyForQueryChange && inputHasMinLengthOrIsCleared) {
// If we are about to notify that the search term has changed replace 'Search' button with the `X` one.
this.isSeachButtonVisible = false;
this.search.emit(query);
}
this.hasSearchBeenTriggeredManually = false;
this.computeSearchInputPadding();
});
}
ngOnDestroy() {
if (this.searchQuerySub) {
this.searchQuerySub.unsubscribe();
}
}
clearSearch() {
this.searchQuery.setValue('');
if (this.showSearchButton) {
this.triggerSearch();
}
}
handleKeyDown(event) {
if (event.key === 'Enter') {
this.triggerSearch();
}
}
triggerSearch() {
this.hasSearchBeenTriggeredManually = true;
this.triggerSearch$.next();
}
computeSearchInputPadding() {
if (this.showSearchButton && this.isSeachButtonVisible) {
// Wait for the search button to be rendered as changes 'shouldShowSearchButton' might not be applied in the template.
// Useful especially after the first rendering.
setTimeout(() => {
this.searchInputPaddingRight = Math.round(this.searchButton?.nativeElement.clientWidth || defaultSearchInputPadding) + 'px';
});
}
else {
this.searchInputPaddingRight = `${defaultSearchInputPadding}px`;
}
}
}
VdkSearchComponent.ɵfac = function VdkSearchComponent_Factory(t) { return new (t || VdkSearchComponent)(); };
VdkSearchComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VdkSearchComponent, selectors: [["vdk-search"]], viewQuery: function VdkSearchComponent_Query(rf, ctx) { if (rf & 1) {
i0.ɵɵviewQuery(_c0, 5, ElementRef);
} if (rf & 2) {
let _t;
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchButton = _t.first);
} }, inputs: { disabled: "disabled", searchQueryValue: "searchQueryValue", clearSearchTitle: "clearSearchTitle", placeholder: "placeholder", helperText: "helperText", debounceTime: "debounceTime", searchTermMinimalLength: "searchTermMinimalLength", showSearchButton: "showSearchButton", searchButtonText: "searchButtonText", searchButtonAriaLabelText: "searchButtonAriaLabelText", searchAriaLabelText: "searchAriaLabelText" }, outputs: { search: "search" }, decls: 5, vars: 13, consts: [[1, "search-container"], ["shape", "search", "size", "18", "data-test-id", "search-icon"], ["type", "text", "data-test-id", "search-input", 1, "clr-input", 3, "value", "formControl", "placeholder", "focus", "blur", "keydown"], [4, "ngIf"], ["data-test-id", "search-results-text", 4, "ngIf"], ["class", "clear-search-btn", "data-test-id", "clear-search-btn", "type", "button", 3, "title", "click", 4, "ngIf", "ngIfElse"], ["searchButtonSection", ""], ["data-test-id", "clear-search-btn", "type", "button", 1, "clear-search-btn", 3, "title", "click"], ["shape", "times-circle", "size", "16"], ["data-test-id", "search-button", 1, "btn", "btn-link", 3, "click"], ["searchButton", ""], ["data-test-id", "search-results-text"]], template: function VdkSearchComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "div", 0);
i0.ɵɵelement(1, "cds-icon", 1);
i0.ɵɵelementStart(2, "input", 2);
i0.ɵɵlistener("focus", function VdkSearchComponent_Template_input_focus_2_listener() { return ctx.focused = true; })("blur", function VdkSearchComponent_Template_input_blur_2_listener() { return ctx.focused = false; })("keydown", function VdkSearchComponent_Template_input_keydown_2_listener($event) { return ctx.handleKeyDown($event); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, VdkSearchComponent_ng_container_3_Template, 4, 2, "ng-container", 3);
i0.ɵɵtemplate(4, VdkSearchComponent_clr_control_helper_4_Template, 2, 1, "clr-control-helper", 4);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵclassProp("disabled", ctx.disabled)("focused", ctx.focused);
i0.ɵɵadvance(1);
i0.ɵɵattribute("class", ctx.searchQueryValue ? "is-highlight" : "");
i0.ɵɵadvance(1);
i0.ɵɵstyleProp("padding-right", ctx.searchInputPaddingRight);
i0.ɵɵproperty("value", ctx.searchQueryValue)("formControl", ctx.searchQuery)("placeholder", ctx.finalPlaceholder);
i0.ɵɵattribute("aria-label", ctx.searchAriaLabelText || ctx.finalPlaceholder);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.searchQueryValue);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.helperText);
} }, directives: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.FormControlDirective, i2.NgIf], styles: ["[_nghost-%COMP%]{width:200px;display:block}.search-container[_ngcontent-%COMP%]{display:flex;flex-direction:column;position:relative;width:100%;margin-bottom:0;margin:.5rem 0}.search-container.disabled[_ngcontent-%COMP%]{cursor:not-allowed}.search-container.disabled[_ngcontent-%COMP%] *[_ngcontent-%COMP%]{pointer-events:none}.search-container.disabled[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{color:#888}.search-container.disabled[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{fill:#888}.search-container.disabled[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#888}.search-container[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{height:18px;position:absolute;top:3px;left:0}.search-container.focused[_ngcontent-%COMP%] cds-icon[shape=search][_ngcontent-%COMP%]{fill:var(--clr-forms-focused-color);stroke:var(--clr-forms-focused-color);stroke-width:.75px}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%]{position:absolute;top:-1px;right:0;padding:0;border:transparent;background-color:transparent}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#565656;opacity:.8}.search-container[_ngcontent-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]:hover{cursor:pointer;opacity:1}.search-container[_ngcontent-%COMP%] .btn-link[_ngcontent-%COMP%]{position:absolute;right:0;top:-6px;margin:0}.search-container[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{padding:0 24px;flex:1 1 24px}.dark[_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%], .dark [_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%]{color:#d3d3d3}.dark[_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%], .dark [_nghost-%COMP%] .clear-search-btn[_ngcontent-%COMP%] cds-icon[shape=times-circle][_ngcontent-%COMP%]{fill:#acbac3}"] });
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VdkSearchComponent, [{
type: Component,
args: [{ selector: 'vdk-search', template: "<!--\n ~ Copyright 2023-2025 Broadcom\n ~ SPDX-License-Identifier: Apache-2.0\n -->\n\n<div\n class=\"search-container\"\n [class.disabled]=\"disabled\"\n [class.focused]=\"focused\"\n>\n <cds-icon\n shape=\"search\"\n size=\"18\"\n [attr.class]=\"searchQueryValue ? 'is-highlight' : ''\"\n data-test-id=\"search-icon\"\n >\n </cds-icon>\n\n <input\n type=\"text\"\n (focus)=\"focused = true\"\n (blur)=\"focused = false\"\n (keydown)=\"handleKeyDown($event)\"\n class=\"clr-input\"\n [attr.aria-label]=\"searchAriaLabelText || finalPlaceholder\"\n [value]=\"searchQueryValue\"\n [formControl]=\"searchQuery\"\n [placeholder]=\"finalPlaceholder\"\n [style.padding-right]=\"searchInputPaddingRight\"\n data-test-id=\"search-input\"\n />\n\n <ng-container *ngIf=\"searchQueryValue\">\n <button\n *ngIf=\"!showSearchButton || !isSeachButtonVisible; else searchButtonSection\"\n class=\"clear-search-btn\"\n [title]=\"clearSearchTitle\"\n [attr.aria-label]=\"clearSearchTitle\"\n (click)=\"clearSearch()\"\n data-test-id=\"clear-search-btn\"\n type=\"button\"\n >\n <cds-icon shape=\"times-circle\" size=\"16\"> </cds-icon>\n </button>\n\n <ng-template #searchButtonSection>\n <button\n class=\"btn btn-link\"\n #searchButton\n data-test-id=\"search-button\"\n [attr.disabled]=\"+searchQueryValue?.length < searchTermMinimalLength ? '': null\"\n [attr.aria-label]=\"searchButtonAriaLabelText || null\"\n (click)=\"triggerSearch()\"\n >\n {{ searchButtonText }}\n </button>\n </ng-template>\n </ng-container>\n\n <clr-control-helper *ngIf=\"helperText\" data-test-id=\"search-results-text\"\n >{{helperText}}</clr-control-helper\n >\n</div>\n", styles: ["/*!\n * Copyright 2023-2025 Broadcom\n * SPDX-License-Identifier: Apache-2.0\n */:host{width:200px;display:block}.search-container{display:flex;flex-direction:column;position:relative;width:100%;margin-bottom:0;margin:.5rem 0}.search-container.disabled{cursor:not-allowed}.search-container.disabled *{pointer-events:none}.search-container.disabled input{color:#888}.search-container.disabled cds-icon[shape=search]{fill:#888}.search-container.disabled .clear-search-btn cds-icon[shape=times-circle]{fill:#888}.search-container cds-icon[shape=search]{height:18px;position:absolute;top:3px;left:0}.search-container.focused cds-icon[shape=search]{fill:var(--clr-forms-focused-color);stroke:var(--clr-forms-focused-color);stroke-width:.75px}.search-container .clear-search-btn{position:absolute;top:-1px;right:0;padding:0;border:transparent;background-color:transparent}.search-container .clear-search-btn cds-icon[shape=times-circle]{fill:#565656;opacity:.8}.search-container .clear-search-btn cds-icon[shape=times-circle]:hover{cursor:pointer;opacity:1}.search-container .btn-link{position:absolute;right:0;top:-6px;margin:0}.search-container input{padding:0 24px;flex:1 1 24px}:host-context(.dark) .clear-search-btn{color:#d3d3d3}:host-context(.dark) .clear-search-btn cds-icon[shape=times-circle]{fill:#acbac3}\n"] }]
}], null, { disabled: [{
type: Input,
args: ['disabled']
}], searchQueryValue: [{
type: Input
}], clearSearchTitle: [{
type: Input
}], placeholder: [{
type: Input,
args: ['placeholder']
}], helperText: [{
type: Input
}], debounceTime: [{
type: Input
}], searchTermMinimalLength: [{
type: Input
}], showSearchButton: [{
type: Input
}], searchButtonText: [{
type: Input
}], searchButtonAriaLabelText: [{
type: Input
}], searchAriaLabelText: [{
type: Input
}], search: [{
type: Output
}], searchButton: [{
type: ViewChild,
args: ['searchButton', { read: ElementRef }]
}] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NoYXJlZC9zcmMvbGliL2NvbW1vbnMvbmd4LWNvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaGFyZWQvc3JjL2xpYi9jb21tb25zL25neC1jb21wb25lbnRzL3NlYXJjaC9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsb0JBQW9CO0FBRXBCLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQXlCLE1BQU0sTUFBTSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7OztJQ3NCdEMsaUNBUUM7SUFIRyxrTEFBUyxvQkFBYSxJQUFDO0lBSXZCLDhCQUFxRDtJQUN6RCxpQkFBUzs7O0lBUEwsK0NBQTBCO0lBQzFCLHFEQUFvQzs7OztJQVNwQyxxQ0FPQztJQURHLHVMQUFTLHNCQUFlLElBQUM7SUFFekIsWUFDSjtJQUFBLGlCQUFTOzs7SUFMTCxtSkFBZ0Ysd0RBQUE7SUFJaEYsZUFDSjtJQURJLHdEQUNKOzs7SUF2QlIsNkJBQXVDO0lBQ25DLHdGQVVTO0lBRVQsbUlBV2M7SUFDbEIsMEJBQWU7Ozs7SUF2Qk4sZUFBa0Q7SUFBbEQsK0VBQWtELGlCQUFBOzs7SUF5QjNELDhDQUNLO0lBQUEsWUFBYztJQUFBLGlCQUNsQjs7O0lBREksZUFBYztJQUFkLHVDQUFjOztBRC9DdkIsTUFBTSx5QkFBeUIs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USxVQUFVOzs7OztRQ2xEakQsOEJBSUM7UUFDRyw4QkFNVztRQUVYLGdDQVlFO1FBVkUsNEdBQW1CLElBQUksSUFBQyw2RkFDTixLQUFLLElBREMsMkZBRWIseUJBQXFCLElBRlI7UUFGNUIsaUJBWUU7UUFFRixxRkF5QmU7UUFFZixpR0FFQztRQUNMLGlCQUFNOztRQXZERix3Q0FBMkIsd0JBQUE7UUFNdkIsZUFBcUQ7UUFBckQsbUVBQXFEO1FBZXJELGVBQStDO1FBQS9DLDREQUErQztRQUgvQyw0Q0FBMEIsZ0NBQUEscUNBQUE7UUFEMUIsNkVBQTJEO1FBUWhELGVBQXNCO1FBQXRCLDJDQUFzQjtRQTJCaEIsZUFBZ0I7UUFBaEIscUNBQWdCOzt1RkR2QzVCLGtCQUFrQjtjQUw5QixTQUFTOzJCQUNJLFlBQVk7Z0JBWVgsUUFBUTtrQkFEbEIsS0FBSzttQkFBQyxVQUFVO1lBV1IsZ0JBQWdCO2tCQUF4QixLQUFLO1lBQ0csZ0JBQWdCO2tCQUF4QixLQUFLO1lBRUYsV0FBVztrQkFEZCxLQUFLO21CQUFDLGFBQWE7WUFLWCxVQUFVO2tCQUFsQixLQUFLO1lBQ0csWUFBWTtrQkFBcEIsS0FBSztZQUNHLHVCQUF1QjtrQkFBL0IsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLGdCQUFnQjtrQkFBeEIsS0FBSztZQUNHLHlCQUF5QjtrQkFBakMsS0FBSztZQUNHLG1CQUFtQjtrQkFBM0IsS0FBSztZQUVJLE1BQU07a0JBQWYsTUFBTTtZQUdQLFlBQVk7a0JBRFgsU0FBUzttQkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDIzLTIwMjUgQnJvYWRjb21cbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmNvbnN0IGRlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmcgPSAyNDtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd2ZGstc2VhcmNoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VhcmNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9zZWFyY2guY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWZGtTZWFyY2hDb21wb25lbnQge1xuICAgIHNlYXJjaElucHV0UGFkZGluZ1JpZ2h0ID0gYCR7ZGVmYXVsdFNlYXJjaElucHV0UGFkZGluZ31weGA7XG5cbiAgICBwcml2YXRlIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG4gICAgQElucHV0KCdkaXNhYmxlZCcpXG4gICAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IHZhbHVlO1xuXG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeT8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5Py5lbmFibGUoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2VhcmNoUXVlcnlWYWx1ZTogc3RyaW5nID0gJyc7XG4gICAgQElucHV0KCkgY2xlYXJTZWFyY2hUaXRsZTogc3RyaW5nID0gJ0NsZWFyIFNlYXJjaCc7XG4gICAgQElucHV0KCdwbGFjZWhvbGRlcicpXG4gICAgc2V0IHBsYWNlaG9sZGVyKHBhc3M6IHN0cmluZykge1xuICAgICAgICB0aGlzLmZpbmFsUGxhY2Vob2xkZXIgPSBwYXNzID8gcGFzcyA6ICdTZWFyY2gnO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIGhlbHBlclRleHQ6IHN0cmluZyA9ICcnO1xuICAgIEBJbnB1dCgpIGRlYm91bmNlVGltZTogbnVtYmVyID0gMTAwO1xuICAgIEBJbnB1dCgpIHNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoOiBudW1iZXIgPSAyO1xuICAgIEBJbnB1dCgpIHNob3dTZWFyY2hCdXR0b24gPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzZWFyY2hCdXR0b25UZXh0OiBzdHJpbmcgPSAnU2VhcmNoJztcbiAgICBASW5wdXQoKSBzZWFyY2hCdXR0b25BcmlhTGFiZWxUZXh0OiBzdHJpbmcgPSAnU2VhcmNoJztcbiAgICBASW5wdXQoKSBzZWFyY2hBcmlhTGFiZWxUZXh0OiBzdHJpbmc7XG5cbiAgICBAT3V0cHV0KCkgc2VhcmNoOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBWaWV3Q2hpbGQoJ3NlYXJjaEJ1dHRvbicsIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIHNlYXJjaEJ1dHRvbj86IEVsZW1lbnRSZWY7XG4gICAgaXNTZWFjaEJ1dHRvblZpc2libGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIHRyaWdnZXJTZWFyY2gkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx2b2lkPih1bmRlZmluZWQpO1xuICAgIHByaXZhdGUgaGFzU2VhcmNoQmVlblRyaWdnZXJlZE1hbnVhbGx5OiBib29sZWFuO1xuXG4gICAgcHVibGljIHNlYXJjaFF1ZXJ5OiBGb3JtQ29udHJvbDtcbiAgICBwdWJsaWMgc2VhcmNoUXVlcnlTdWI6IFN1YnNjcmlwdGlvbjtcbiAgICBwdWJsaWMgZm9jdXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBmaW5hbFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnU2VhcmNoJztcblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5ID0gbmV3IEZvcm1Db250cm9sKHRoaXMuc2VhcmNoUXVlcnlWYWx1ZSk7XG5cbiAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVN1YiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2VhcmNoUXVlcnkudmFsdWVDaGFuZ2VzLCB0aGlzLnRyaWdnZXJTZWFyY2gkXSlcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbcXVlcnldKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcXVlcnlMZW5ndGggPSBxdWVyeS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgcXVlcnkgPSBxdWVyeS50cmltKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVZhbHVlID0gcXVlcnk7XG5cbiAgICAgICAgICAgICAgICAvLyBub3QgZW1pdCBzZWFyY2ggZXZlbnQgaWYgaXQgaGFzbid0IGJlZW4gaW5wdXR0ZWQgc29tZXRoaW5nIGRpZmZlcmVudCBmcm9tIHdoaXRlc3BhY2VcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hRdWVyeVZhbHVlLmxlbmd0aCA9PT0gMCAmJiBxdWVyeUxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlICdTZWFyY2gnIGJ1dHRvbiB3aWxsIGJlIHZpc2libGUgaW4gJ01hbnVhbCBTZWFyY2gnIG1vZGUgdXBvbiBldmVyeSBjaGFuZ2UuXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NlYWNoQnV0dG9uVmlzaWJsZSA9IHRoaXMuc2hvd1NlYXJjaEJ1dHRvbjtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZE5vdGlmeUZvclF1ZXJ5Q2hhbmdlID0gIXRoaXMuc2hvd1NlYXJjaEJ1dHRvbiB8fCB0aGlzLmhhc1NlYXJjaEJlZW5UcmlnZ2VyZWRNYW51YWxseTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEhhc01pbkxlbmd0aE9ySXNDbGVhcmVkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hRdWVyeVZhbHVlLmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoIHx8IHRoaXMuc2VhcmNoUXVlcnlWYWx1ZS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICAgICAgaWYgKHNob3VsZE5vdGlmeUZvclF1ZXJ5Q2hhbmdlICYmIGlucHV0SGFzTWluTGVuZ3RoT3JJc0NsZWFyZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGFib3V0IHRvIG5vdGlmeSB0aGF0IHRoZSBzZWFyY2ggdGVybSBoYXMgY2hhbmdlZCByZXBsYWNlICdTZWFyY2gnIGJ1dHRvbiB3aXRoIHRoZSBgWGAgb25lLlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2VhY2hCdXR0b25WaXNpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoLmVtaXQocXVlcnkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuaGFzU2VhcmNoQmVlblRyaWdnZXJlZE1hbnVhbGx5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wdXRlU2VhcmNoSW5wdXRQYWRkaW5nKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VhcmNoUXVlcnlTdWIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUXVlcnlTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyU2VhcmNoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlYXJjaFF1ZXJ5LnNldFZhbHVlKCcnKTtcbiAgICAgICAgaWYgKHRoaXMuc2hvd1NlYXJjaEJ1dHRvbikge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyU2VhcmNoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlclNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHJpZ2dlclNlYXJjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNTZWFyY2hCZWVuVHJpZ2dlcmVkTWFudWFsbHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnRyaWdnZXJTZWFyY2gkLm5leHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVTZWFyY2hJbnB1dFBhZGRpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnNob3dTZWFyY2hCdXR0b24gJiYgdGhpcy5pc1NlYWNoQnV0dG9uVmlzaWJsZSkge1xuICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhlIHNlYXJjaCBidXR0b24gdG8gYmUgcmVuZGVyZWQgYXMgY2hhbmdlcyAnc2hvdWxkU2hvd1NlYXJjaEJ1dHRvbicgbWlnaHQgbm90IGJlIGFwcGxpZWQgaW4gdGhlIHRlbXBsYXRlLlxuICAgICAgICAgICAgLy8gVXNlZnVsIGVzcGVjaWFsbHkgYWZ0ZXIgdGhlIGZpcnN0IHJlbmRlcmluZy5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXRQYWRkaW5nUmlnaHQgPSBNYXRoLnJvdW5kKHRoaXMuc2VhcmNoQnV0dG9uPy5uYXRpdmVFbGVtZW50LmNsaWVudFdpZHRoIHx8IGRlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmcpICsgJ3B4JztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hJbnB1dFBhZGRpbmdSaWdodCA9IGAke2RlZmF1bHRTZWFyY2hJbnB1dFBhZGRpbmd9cHhgO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPCEtLVxuICAgfiBDb3B5cmlnaHQgMjAyMy0yMDI1IEJyb2FkY29tXG4gICB+IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gIC0tPlxuXG48ZGl2XG4gICAgY2xhc3M9XCJzZWFyY2gtY29udGFpbmVyXCJcbiAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIFtjbGFzcy5mb2N1c2VkXT1cImZvY3VzZWRcIlxuPlxuICAgIDxjZHMtaWNvblxuICAgICAgICBzaGFwZT1cInNlYXJjaFwiXG4gICAgICAgIHNpemU9XCIxOFwiXG4gICAgICAgIFthdHRyLmNsYXNzXT1cInNlYXJjaFF1ZXJ5VmFsdWUgPyAnaXMtaGlnaGxpZ2h0JyA6ICcnXCJcbiAgICAgICAgZGF0YS10ZXN0LWlkPVwic2VhcmNoLWljb25cIlxuICAgID5cbiAgICA8L2Nkcy1pY29uPlxuXG4gICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgKGZvY3VzKT1cImZvY3VzZWQgPSB0cnVlXCJcbiAgICAgICAgKGJsdXIpPVwiZm9jdXNlZCA9IGZhbHNlXCJcbiAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQpXCJcbiAgICAgICAgY2xhc3M9XCJjbHItaW5wdXRcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNlYXJjaEFyaWFMYWJlbFRleHQgfHwgZmluYWxQbGFjZWhvbGRlclwiXG4gICAgICAgIFt2YWx1ZV09XCJzZWFyY2hRdWVyeVZhbHVlXCJcbiAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFF1ZXJ5XCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cImZpbmFsUGxhY2Vob2xkZXJcIlxuICAgICAgICBbc3R5bGUucGFkZGluZy1yaWdodF09XCJzZWFyY2hJbnB1dFBhZGRpbmdSaWdodFwiXG4gICAgICAgIGRhdGEtdGVzdC1pZD1cInNlYXJjaC1pbnB1dFwiXG4gICAgLz5cblxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hRdWVyeVZhbHVlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiIXNob3dTZWFyY2hCdXR0b24gfHwgIWlzU2VhY2hCdXR0b25WaXNpYmxlOyBlbHNlIHNlYXJjaEJ1dHRvblNlY3Rpb25cIlxuICAgICAgICAgICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJjbGVhclNlYXJjaFRpdGxlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xlYXJTZWFyY2hUaXRsZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXG4gICAgICAgICAgICBkYXRhLXRlc3QtaWQ9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8Y2RzLWljb24gc2hhcGU9XCJ0aW1lcy1jaXJjbGVcIiBzaXplPVwiMTZcIj4gPC9jZHMtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNzZWFyY2hCdXR0b25TZWN0aW9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAgICAgICAgICAgICAjc2VhcmNoQnV0dG9uXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0LWlkPVwic2VhcmNoLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwiK3NlYXJjaFF1ZXJ5VmFsdWU/Lmxlbmd0aCA8IHNlYXJjaFRlcm1NaW5pbWFsTGVuZ3RoID8gJyc6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2VhcmNoQnV0dG9uQXJpYUxhYmVsVGV4dCB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidHJpZ2dlclNlYXJjaCgpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBzZWFyY2hCdXR0b25UZXh0IH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxjbHItY29udHJvbC1oZWxwZXIgKm5nSWY9XCJoZWxwZXJUZXh0XCIgZGF0YS10ZXN0LWlkPVwic2VhcmNoLXJlc3VsdHMtdGV4dFwiXG4gICAgICAgID57e2hlbHBlclRleHR9fTwvY2xyLWNvbnRyb2wtaGVscGVyXG4gICAgPlxuPC9kaXY+XG4iXX0=