@microsoft/windows-admin-center-sdk
Version:
Microsoft - Windows Admin Center Shell
290 lines • 33.3 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, EventEmitter, Injector, Input, Output } from '@angular/core';
import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators';
import { SmeInternalFormFieldComponent } from '../form-field.component';
import * as i0 from "@angular/core";
import * as i1 from "../../../../directives/autofocus/autofocus.directive";
import * as i2 from "@angular/common";
import * as i3 from "@angular/forms";
import * as i4 from "../../../../directives/disabled/disabled.directive";
import * as i5 from "../../../tooltip/tooltip.directive";
import * as i6 from "../../validation-alert/validation-alert.component";
import * as i7 from "../../form-field-layout/form-field-layout.component";
const _c0 = ["type", "search"];
function SearchFormFieldComponent_ng_container_3_button_1_Template(rf, ctx) { if (rf & 1) {
const _r7 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 9);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_3_button_1_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r7); const ctx_r6 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r6.executeDeliberateSearch()); });
i0.ɵɵelement(1, "span", 10);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r4 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("smeDisabled", ctx_r4.loadingOrDisabled)("title", ctx_r4.searchButtonText);
i0.ɵɵattribute("aria-label", ctx_r4.searchButtonText);
} }
function SearchFormFieldComponent_ng_container_3_button_2_Template(rf, ctx) { if (rf & 1) {
const _r9 = i0.ɵɵgetCurrentView();
i0.ɵɵelementStart(0, "button", 11);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_3_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r8.executeDeliberateSearch()); });
i0.ɵɵelement(1, "span", 12);
i0.ɵɵelementStart(2, "span");
i0.ɵɵtext(3);
i0.ɵɵelementEnd()();
} if (rf & 2) {
const ctx_r5 = i0.ɵɵnextContext(2);
i0.ɵɵproperty("smeDisabled", ctx_r5.loadingOrDisabled);
i0.ɵɵadvance(3);
i0.ɵɵtextInterpolate(ctx_r5.searchButtonText);
} }
function SearchFormFieldComponent_ng_container_3_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementContainerStart(0);
i0.ɵɵtemplate(1, SearchFormFieldComponent_ng_container_3_button_1_Template, 2, 3, "button", 7);
i0.ɵɵtemplate(2, SearchFormFieldComponent_ng_container_3_button_2_Template, 4, 2, "button", 8);
i0.ɵɵelementContainerEnd();
} if (rf & 2) {
const ctx_r0 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx_r0.emphasizeSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx_r0.emphasizeSearchButton);
} }
function SearchFormFieldComponent_ng_container_4_Template(rf, ctx) { if (rf & 1) {
const _r11 = i0.ɵɵgetCurrentView();
i0.ɵɵelementContainerStart(0);
i0.ɵɵelementStart(1, "span", 13);
i0.ɵɵlistener("click", function SearchFormFieldComponent_ng_container_4_Template_span_click_1_listener($event) { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r10.iconClick($event)); });
i0.ɵɵelementEnd();
i0.ɵɵelementContainerEnd();
} }
function SearchFormFieldComponent_span_8_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 14);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r2 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r2.count ? ctx_r2.strings.MsftSmeShell.Angular.Form.SearchField.count.format(ctx_r2.count) : ctx_r2.strings.MsftSmeShell.Angular.Form.SearchField.count.format(0), " ");
} }
function SearchFormFieldComponent_span_9_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "span", 14);
i0.ɵɵtext(1);
i0.ɵɵelementEnd();
} if (rf & 2) {
const ctx_r3 = i0.ɵɵnextContext();
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate1(" ", ctx_r3.strings.MsftSmeShell.Angular.Form.SearchField.Searching.label, " ");
} }
/**
* Accessible search field implementation of .sme-searchbox
*/
export class SearchFormFieldComponent extends SmeInternalFormFieldComponent {
/**
* Initializes a new instance of the SearchFormFieldComponent
*/
constructor(injector) {
super(injector);
/**
* Input binding for whether the user is currently searching in the field. Defaults to false
*/
this.searching = false;
/**
* Input binding for whether to trim leading/trailing whitespace in a search. Defaults to true.
*/
this.trimSearch = true;
/**
* Input binding for whether to emphasize the search button. Defaults to false.
*/
this.emphasizeSearchButton = false;
/**
* Input binding for whether to disable the button and not handle clicks on it.
*/
this.disableSearchButton = false;
/**
* Output binding for the event emitted from typing into the search field, or executing a deliberate search
*/
this.search = new EventEmitter();
/**
* Output binding for event emitted on key press on the search box
*/
this.keyDownEvent = new EventEmitter();
/**
* Output binding for event emitted when focus leaves search box
*/
this.blurEvent = new EventEmitter();
/**
* Output binding for the event emitted from hitting the search button or the enter key
*/
this.deliberateSearch = new EventEmitter();
this.hideHeader = true;
this.searchButtonText = this.strings.MsftSmeShell.Angular.Common.search;
}
/**
* The source name to use for logging
*/
get logSourceName() {
return 'SearchFormFieldComponent';
}
/**
* Implementation of angular OnInit interface
*/
ngOnInit() {
super.ngOnInit();
this.setAttribute('role', 'search');
}
/**
* Emits the updated search value, after a default debounce time
*/
executeSearch() {
if (this.trimSearch) {
this.search.emit(this.value ? this.value.trim() : this.value);
}
else {
this.search.emit(this.value);
}
}
/**
* Emits the updated deliberate search value, after a default debounce time
*/
executeDeliberateSearch() {
if (this.trimSearch) {
this.deliberateSearch.emit(this.value ? this.value.trim() : this.value);
}
else {
this.deliberateSearch.emit(this.value);
}
}
/**
* Emits events on key press and while focus is on the search box
*/
onKeyDown(event) {
if (MsftSme.isEmpty(this.value) && (event.key === 'Backspace' || event.key === 'Delete')) {
// This check allows for search to execute when deleting keypresses are sent after the value has been cleared out
this.executeSearch();
}
this.keyDownEvent.emit(event);
}
/**
* Emits event when focus leaves the search box
*/
onBlur(event) {
this.blurEvent.emit(event);
}
/**
* Handles the enter key on the search input
*/
onEnterKeyDown($event) {
$event.preventDefault();
$event.stopPropagation();
this.executeSearch();
this.executeDeliberateSearch();
return false;
}
/**
* Handles the click event for the search icon.
*/
iconClick($event) {
$event.preventDefault();
$event.stopPropagation();
}
/**
* Creates the idBag used by this component to store unique element ids.
* id values will be assigned be the @see BaseComponent super class.
*/
createIdBag() {
return {
labelSpan: '',
countSpan: '',
detailsSpan: ''
};
}
}
/** @nocollapse */ SearchFormFieldComponent.ɵfac = function SearchFormFieldComponent_Factory(t) { return new (t || SearchFormFieldComponent)(i0.ɵɵdirectiveInject(i0.Injector)); };
/** @nocollapse */ SearchFormFieldComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: SearchFormFieldComponent, selectors: [["sme-form-field", "type", "search"]], inputs: { count: "count", searching: "searching", trimSearch: "trimSearch", emphasizeSearchButton: "emphasizeSearchButton", searchButtonText: "searchButtonText", disableSearchButton: "disableSearchButton" }, outputs: { search: "search", keyDownEvent: "keyDownEvent", blurEvent: "blurEvent", deliberateSearch: "deliberateSearch" }, features: [i0.ɵɵInheritDefinitionFeature], attrs: _c0, decls: 11, vars: 17, consts: [[3, "formField"], [1, "sme-searchbox", "sme-searchbox-button-icon"], ["type", "search", 3, "required", "autofocus", "disabled", "ngModel", "placeholder", "ngModelChange", "keydown.Enter", "keydown", "blur"], [4, "ngIf"], [1, "sme-screen-reader", 3, "id"], ["aria-live", "polite", "aria-relevant", "all", 4, "ngIf"], [3, "alert"], ["type", "button", "class", "sme-button-trigger sme-button-auto-width sme-form-field-height", "data-uta-id", "search-button", 3, "smeDisabled", "title", "click", 4, "ngIf"], ["type", "button", "class", "sme-button-primary sme-button-auto-width sme-form-field-height", "data-uta-id", "search-button", 3, "smeDisabled", "click", 4, "ngIf"], ["type", "button", "data-uta-id", "search-button", 1, "sme-button-trigger", "sme-button-auto-width", "sme-form-field-height", 3, "smeDisabled", "title", "click"], [1, "sme-icon", "sme-icon-search", "sme-icon-size-xxs"], ["type", "button", "data-uta-id", "search-button", 1, "sme-button-primary", "sme-button-auto-width", "sme-form-field-height", 3, "smeDisabled", "click"], [1, "sme-icon", "sme-icon-search", "sme-margin-right-xs", "sme-icon-size-xxs"], [1, "sme-icon", "sme-icon-search", "sme-margin-right-xs", "sme-icon-size-xxs", 3, "click"], ["aria-live", "polite", "aria-relevant", "all"]], template: function SearchFormFieldComponent_Template(rf, ctx) { if (rf & 1) {
i0.ɵɵelementStart(0, "sme-form-field-layout", 0)(1, "div", 1)(2, "input", 2);
i0.ɵɵlistener("ngModelChange", function SearchFormFieldComponent_Template_input_ngModelChange_2_listener($event) { return ctx.value = $event; })("ngModelChange", function SearchFormFieldComponent_Template_input_ngModelChange_2_listener() { return ctx.executeSearch(); })("keydown.Enter", function SearchFormFieldComponent_Template_input_keydown_Enter_2_listener($event) { return ctx.onEnterKeyDown($event); })("keydown", function SearchFormFieldComponent_Template_input_keydown_2_listener($event) { return ctx.onKeyDown($event); })("blur", function SearchFormFieldComponent_Template_input_blur_2_listener($event) { return ctx.onBlur($event); });
i0.ɵɵelementEnd();
i0.ɵɵtemplate(3, SearchFormFieldComponent_ng_container_3_Template, 3, 2, "ng-container", 3);
i0.ɵɵtemplate(4, SearchFormFieldComponent_ng_container_4_Template, 2, 0, "ng-container", 3);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(5, "span", 4);
i0.ɵɵtext(6);
i0.ɵɵelementEnd();
i0.ɵɵelementStart(7, "span", 4);
i0.ɵɵtemplate(8, SearchFormFieldComponent_span_8_Template, 2, 1, "span", 5);
i0.ɵɵtemplate(9, SearchFormFieldComponent_span_9_Template, 2, 1, "span", 5);
i0.ɵɵelementEnd();
i0.ɵɵelement(10, "sme-validation-alert", 6);
i0.ɵɵelementEnd();
} if (rf & 2) {
i0.ɵɵproperty("formField", ctx);
i0.ɵɵadvance(1);
i0.ɵɵclassProp("sme-disabled", ctx.loadingOrDisabled);
i0.ɵɵadvance(1);
i0.ɵɵproperty("required", ctx.required)("autofocus", ctx.autofocus)("disabled", ctx.loadingOrDisabled)("ngModel", ctx.value)("placeholder", ctx.placeholder);
i0.ɵɵattribute("aria-labelledby", ctx.idBag.labelSpan);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx.disableSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.disableSearchButton);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx.idBag.labelSpan);
i0.ɵɵadvance(1);
i0.ɵɵtextInterpolate(ctx.label);
i0.ɵɵadvance(1);
i0.ɵɵproperty("id", ctx.idBag.countSpan);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", !ctx.searching);
i0.ɵɵadvance(1);
i0.ɵɵproperty("ngIf", ctx.searching);
i0.ɵɵadvance(1);
i0.ɵɵproperty("alert", ctx.alert);
} }, dependencies: [i1.AutofocusDirective, i2.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.RequiredValidator, i3.NgModel, i4.DisabledDirective, i5.TooltipDirective, i6.ValidationAlertComponent, i7.FormFieldLayoutComponent], encapsulation: 2 });
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "executeSearch", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", []),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "executeDeliberateSearch", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "onKeyDown", null);
__decorate([
Debounce(),
__metadata("design:type", Function),
__metadata("design:paramtypes", [FocusEvent]),
__metadata("design:returntype", void 0)
], SearchFormFieldComponent.prototype, "onBlur", null);
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SearchFormFieldComponent, [{
type: Component,
args: [{ selector: 'sme-form-field[type="search"]', template: "<sme-form-field-layout [formField]=\"this\">\r\n <div class=\"sme-searchbox sme-searchbox-button-icon\" [class.sme-disabled]=\"loadingOrDisabled\">\r\n <input type=\"search\" [attr.aria-labelledby]=\"idBag.labelSpan\" [required]=\"required\" [autofocus]=\"autofocus\"\r\n [disabled]=\"loadingOrDisabled\" [(ngModel)]=\"value\" [placeholder]=\"placeholder\" (ngModelChange)=\"executeSearch()\"\r\n (keydown.Enter)=\"onEnterKeyDown($event)\" (keydown)=\"onKeyDown($event)\" (blur)=\"onBlur($event)\">\r\n <ng-container *ngIf=\"!disableSearchButton\">\r\n <button *ngIf=\"!emphasizeSearchButton\" type=\"button\"\r\n class=\"sme-button-trigger sme-button-auto-width sme-form-field-height\" (click)=\"executeDeliberateSearch()\"\r\n [smeDisabled]=\"loadingOrDisabled\" [attr.aria-label]=\"searchButtonText\" [title]=\"searchButtonText\"\r\n data-uta-id=\"search-button\">\r\n <span class=\"sme-icon sme-icon-search sme-icon-size-xxs\"></span>\r\n </button>\r\n <button *ngIf=\"emphasizeSearchButton\" type=\"button\"\r\n class=\"sme-button-primary sme-button-auto-width sme-form-field-height\" (click)=\"executeDeliberateSearch()\"\r\n [smeDisabled]=\"loadingOrDisabled\" data-uta-id=\"search-button\">\r\n <span class=\"sme-icon sme-icon-search sme-margin-right-xs sme-icon-size-xxs\"></span>\r\n <span>{{searchButtonText}}</span>\r\n </button>\r\n </ng-container>\r\n <ng-container *ngIf=\"disableSearchButton\">\r\n <span class=\"sme-icon sme-icon-search sme-margin-right-xs sme-icon-size-xxs\" (click)=\"iconClick($event)\"></span>\r\n </ng-container>\r\n </div>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.labelSpan\">{{label}}</span>\r\n <span class=\"sme-screen-reader\" [id]=\"idBag.countSpan\">\r\n <span *ngIf=\"!searching\" aria-live=\"polite\" aria-relevant=\"all\">\r\n {{ count ? strings.MsftSmeShell.Angular.Form.SearchField.count.format(count) :\r\n strings.MsftSmeShell.Angular.Form.SearchField.count.format(0) }}\r\n </span>\r\n <span *ngIf=\"searching\" aria-live=\"polite\" aria-relevant=\"all\">\r\n {{strings.MsftSmeShell.Angular.Form.SearchField.Searching.label}}\r\n </span>\r\n </span>\r\n\r\n <sme-validation-alert [alert]=\"alert\"></sme-validation-alert>\r\n</sme-form-field-layout>\r\n" }]
}], function () { return [{ type: i0.Injector }]; }, { count: [{
type: Input
}], searching: [{
type: Input
}], trimSearch: [{
type: Input
}], emphasizeSearchButton: [{
type: Input
}], searchButtonText: [{
type: Input
}], disableSearchButton: [{
type: Input
}], search: [{
type: Output
}], keyDownEvent: [{
type: Output
}], blurEvent: [{
type: Output
}], deliberateSearch: [{
type: Output
}], executeSearch: [], executeDeliberateSearch: [], onKeyDown: [], onBlur: [] }); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWZvcm0tZmllbGQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZm9ybS9mb3JtLWZpZWxkL3NlYXJjaC9zZWFyY2gtZm9ybS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9hbmd1bGFyL3NyYy9jb250cm9scy9mb3JtL2Zvcm0tZmllbGQvc2VhcmNoL3NlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEVBQThFLENBQUM7QUFDeEcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7Ozs7OztJQ0lsRSxpQ0FHOEI7SUFGMkMsd0xBQVMsZUFBQSxnQ0FBeUIsQ0FBQSxJQUFDO0lBRzFHLDJCQUFnRTtJQUNsRSxpQkFBUzs7O0lBSFAsc0RBQWlDLGtDQUFBO0lBQUMscURBQW9DOzs7O0lBSXhFLGtDQUVnRTtJQURTLHdMQUFTLGVBQUEsZ0NBQXlCLENBQUEsSUFBQztJQUUxRywyQkFBb0Y7SUFDcEYsNEJBQU07SUFBQSxZQUFvQjtJQUFBLGlCQUFPLEVBQUE7OztJQUZqQyxzREFBaUM7SUFFM0IsZUFBb0I7SUFBcEIsNkNBQW9COzs7SUFYOUIsNkJBQTJDO0lBQ3pDLDhGQUtTO0lBQ1QsOEZBS1M7SUFDWCwwQkFBZTs7O0lBWkosZUFBNEI7SUFBNUIsb0RBQTRCO0lBTTVCLGVBQTJCO0lBQTNCLG1EQUEyQjs7OztJQU90Qyw2QkFBMEM7SUFDeEMsZ0NBQXlHO0lBQTVCLG9MQUFTLGVBQUEseUJBQWlCLENB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Qix3Q0FBc0I7UUFBQyxlQUFTO1FBQVQsK0JBQVM7UUFDaEMsZUFBc0I7UUFBdEIsd0NBQXNCO1FBQzdDLGVBQWdCO1FBQWhCLHFDQUFnQjtRQUloQixlQUFlO1FBQWYsb0NBQWU7UUFLRixlQUFlO1FBQWYsaUNBQWU7O0FEb0VuQztJQUFDLFFBQVEsRUFBRTs7Ozs2REFPVjtBQUtEO0lBQUMsUUFBUSxFQUFFOzs7O3VFQU9WO0FBS0Q7SUFBQyxRQUFRLEVBQUU7O3FDQUNhLGFBQWE7O3lEQU1wQztBQUtEO0lBQUMsUUFBUSxFQUFFOztxQ0FDVSxVQUFVOztzREFFOUI7dUZBbElRLHdCQUF3QjtjQUpwQyxTQUFTOzJCQUNJLCtCQUErQjsyREFnQmxDLEtBQUs7a0JBRFgsS0FBSztZQU9DLFNBQVM7a0JBRGYsS0FBSztZQU9DLFVBQVU7a0JBRGhCLEtBQUs7WUFPQyxxQkFBcUI7a0JBRDNCLEtBQUs7WUFPQyxnQkFBZ0I7a0JBRHRCLEtBQUs7WUFPQyxtQkFBbUI7a0JBRHpCLEtBQUs7WUFPQyxNQUFNO2tCQURaLE1BQU07WUFPQSxZQUFZO2tCQURsQixNQUFNO1lBT0EsU0FBUztrQkFEZixNQUFNO1lBT0EsZ0JBQWdCO2tCQUR0QixNQUFNO1lBMEJBLGFBQWEsTUFZYix1QkFBdUIsTUFZdkIsU0FBUyxNQVlULE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEZWJvdW5jZSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvYmFzZS9kZWNvcmF0b3JzL2RlYm91bmNlLmRlY29yYXRvcnMnO1xyXG5pbXBvcnQgeyBTbWVJbnRlcm5hbEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0tZmllbGQuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBBY2Nlc3NpYmxlIHNlYXJjaCBmaWVsZCBpbXBsZW1lbnRhdGlvbiBvZiAuc21lLXNlYXJjaGJveFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ3NtZS1mb3JtLWZpZWxkW3R5cGU9XCJzZWFyY2hcIl0nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC1mb3JtLWZpZWxkLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50IGV4dGVuZHMgU21lSW50ZXJuYWxGb3JtRmllbGRDb21wb25lbnQ8YW55PiBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgc291cmNlIG5hbWUgdG8gdXNlIGZvciBsb2dnaW5nXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBnZXQgbG9nU291cmNlTmFtZSgpIHtcclxuICAgICAgICByZXR1cm4gJ1NlYXJjaEZvcm1GaWVsZENvbXBvbmVudCc7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3IgdGhlIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyBmb3VuZFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIGNvdW50PzogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIElucHV0IGJpbmRpbmcgZm9yIHdoZXRoZXIgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlYXJjaGluZyBpbiB0aGUgZmllbGQuIERlZmF1bHRzIHRvIGZhbHNlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2VhcmNoaW5nID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3Igd2hldGhlciB0byB0cmltIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiBhIHNlYXJjaC4gRGVmYXVsdHMgdG8gdHJ1ZS5cclxuICAgICAqL1xyXG4gICAgQElucHV0KClcclxuICAgIHB1YmxpYyB0cmltU2VhcmNoID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciB3aGV0aGVyIHRvIGVtcGhhc2l6ZSB0aGUgc2VhcmNoIGJ1dHRvbi4gRGVmYXVsdHMgdG8gZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZW1waGFzaXplU2VhcmNoQnV0dG9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgSW5wdXQgYmluZGluZyBmb3IgdGhlIHNlYXJjaCBidXR0b24gdGV4dFxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKVxyXG4gICAgcHVibGljIHNlYXJjaEJ1dHRvblRleHQ6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqICBJbnB1dCBiaW5kaW5nIGZvciB3aGV0aGVyIHRvIGRpc2FibGUgdGhlIGJ1dHRvbiBhbmQgbm90IGhhbmRsZSBjbGlja3Mgb24gaXQuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgZGlzYWJsZVNlYXJjaEJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogIE91dHB1dCBiaW5kaW5nIGZvciB0aGUgZXZlbnQgZW1pdHRlZCBmcm9tIHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggZmllbGQsIG9yIGV4ZWN1dGluZyBhIGRlbGliZXJhdGUgc2VhcmNoXHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIHNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE91dHB1dCBiaW5kaW5nIGZvciBldmVudCBlbWl0dGVkIG9uIGtleSBwcmVzcyBvbiB0aGUgc2VhcmNoIGJveFxyXG4gICAgICovXHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyBrZXlEb3duRXZlbnQ6IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIE91dHB1dCBiaW5kaW5nIGZvciBldmVudCBlbWl0dGVkIHdoZW4gZm9jdXMgbGVhdmVzIHNlYXJjaCBib3hcclxuICAgICAqL1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgYmx1ckV2ZW50OiBFdmVudEVtaXR0ZXI8Rm9jdXNFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEZvY3VzRXZlbnQ+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiAgT3V0cHV0IGJpbmRpbmcgZm9yIHRoZSBldmVudCBlbWl0dGVkIGZyb20gaGl0dGluZyB0aGUgc2VhcmNoIGJ1dHRvbiBvciB0aGUgZW50ZXIga2V5XHJcbiAgICAgKi9cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgcHVibGljIGRlbGliZXJhdGVTZWFyY2g6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU2VhcmNoRm9ybUZpZWxkQ29tcG9uZW50XHJcbiAgICAgKi9cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvclxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VwZXIoaW5qZWN0b3IpO1xyXG4gICAgICAgIHRoaXMuaGlkZUhlYWRlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZWFyY2hCdXR0b25UZXh0ID0gdGhpcy5zdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkNvbW1vbi5zZWFyY2g7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmd1bGFyIE9uSW5pdCBpbnRlcmZhY2VcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnc2VhcmNoJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyB0aGUgdXBkYXRlZCBzZWFyY2ggdmFsdWUsIGFmdGVyIGEgZGVmYXVsdCBkZWJvdW5jZSB0aW1lXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgZXhlY3V0ZVNlYXJjaCgpIHtcclxuICAgICAgICBpZiAodGhpcy50cmltU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoLmVtaXQodGhpcy52YWx1ZSA/IHRoaXMudmFsdWUudHJpbSgpIDogdGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWFyY2guZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyB0aGUgdXBkYXRlZCBkZWxpYmVyYXRlIHNlYXJjaCB2YWx1ZSwgYWZ0ZXIgYSBkZWZhdWx0IGRlYm91bmNlIHRpbWVcclxuICAgICAqL1xyXG4gICAgQERlYm91bmNlKClcclxuICAgIHB1YmxpYyBleGVjdXRlRGVsaWJlcmF0ZVNlYXJjaCgpIHtcclxuICAgICAgICBpZiAodGhpcy50cmltU2VhcmNoKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsaWJlcmF0ZVNlYXJjaC5lbWl0KHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLnRyaW0oKSA6IHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVsaWJlcmF0ZVNlYXJjaC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEVtaXRzIGV2ZW50cyBvbiBrZXkgcHJlc3MgYW5kIHdoaWxlIGZvY3VzIGlzIG9uIHRoZSBzZWFyY2ggYm94XHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgpXHJcbiAgICBwdWJsaWMgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKE1zZnRTbWUuaXNFbXB0eSh0aGlzLnZhbHVlKSAmJiAoZXZlbnQua2V5ID09PSAnQmFja3NwYWNlJyB8fCBldmVudC5rZXkgPT09ICdEZWxldGUnKSkge1xyXG4gICAgICAgICAgICAvLyBUaGlzIGNoZWNrIGFsbG93cyBmb3Igc2VhcmNoIHRvIGV4ZWN1dGUgd2hlbiBkZWxldGluZyBrZXlwcmVzc2VzIGFyZSBzZW50IGFmdGVyIHRoZSB2YWx1ZSBoYXMgYmVlbiBjbGVhcmVkIG91dFxyXG4gICAgICAgICAgICB0aGlzLmV4ZWN1dGVTZWFyY2goKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5rZXlEb3duRXZlbnQuZW1pdChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbWl0cyBldmVudCB3aGVuIGZvY3VzIGxlYXZlcyB0aGUgc2VhcmNoIGJveFxyXG4gICAgICovXHJcbiAgICBARGVib3VuY2UoKVxyXG4gICAgcHVibGljIG9uQmx1cihldmVudDogRm9jdXNFdmVudCkge1xyXG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGFuZGxlcyB0aGUgZW50ZXIga2V5IG9uIHRoZSBzZWFyY2ggaW5wdXRcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRW50ZXJLZXlEb3duKCRldmVudDogRXZlbnQpIHtcclxuICAgICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlU2VhcmNoKCk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlRGVsaWJlcmF0ZVNlYXJjaCgpO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhhbmRsZXMgdGhlIGNsaWNrIGV2ZW50IGZvciB0aGUgc2VhcmNoIGljb24uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpY29uQ2xpY2soJGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyB0aGUgaWRCYWcgdXNlZCBieSB0aGlzIGNvbXBvbmVudCB0byBzdG9yZSB1bmlxdWUgZWxlbWVudCBpZHMuXHJcbiAgICAgKiBpZCB2YWx1ZXMgd2lsbCBiZSBhc3NpZ25lZCBiZSB0aGUgQHNlZSBCYXNlQ29tcG9uZW50IHN1cGVyIGNsYXNzLlxyXG4gICAgICovXHJcbiAgICBwcm90ZWN0ZWQgY3JlYXRlSWRCYWcoKTogTXNmdFNtZS5TdHJpbmdNYXA8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGFiZWxTcGFuOiAnJyxcclxuICAgICAgICAgICAgY291bnRTcGFuOiAnJyxcclxuICAgICAgICAgICAgZGV0YWlsc1NwYW46ICcnXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iLCI8c21lLWZvcm0tZmllbGQtbGF5b3V0IFtmb3JtRmllbGRdPVwidGhpc1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWUtc2VhcmNoYm94IHNtZS1zZWFyY2hib3gtYnV0dG9uLWljb25cIiBbY2xhc3Muc21lLWRpc2FibGVkXT1cImxvYWRpbmdPckRpc2FibGVkXCI+XHJcbiAgICA8aW5wdXQgdHlwZT1cInNlYXJjaFwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJpZEJhZy5sYWJlbFNwYW5cIiBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIiBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nT3JEaXNhYmxlZFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiAobmdNb2RlbENoYW5nZSk9XCJleGVjdXRlU2VhcmNoKClcIlxyXG4gICAgICAoa2V5ZG93bi5FbnRlcik9XCJvbkVudGVyS2V5RG93bigkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlU2VhcmNoQnV0dG9uXCI+XHJcbiAgICAgIDxidXR0b24gKm5nSWY9XCIhZW1waGFzaXplU2VhcmNoQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtYnV0dG9uLXRyaWdnZXIgc21lLWJ1dHRvbi1hdXRvLXdpZHRoIHNtZS1mb3JtLWZpZWxkLWhlaWdodFwiIChjbGljayk9XCJleGVjdXRlRGVsaWJlcmF0ZVNlYXJjaCgpXCJcclxuICAgICAgICBbc21lRGlzYWJsZWRdPVwibG9hZGluZ09yRGlzYWJsZWRcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInNlYXJjaEJ1dHRvblRleHRcIiBbdGl0bGVdPVwic2VhcmNoQnV0dG9uVGV4dFwiXHJcbiAgICAgICAgZGF0YS11dGEtaWQ9XCJzZWFyY2gtYnV0dG9uXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zZWFyY2ggc21lLWljb24tc2l6ZS14eHNcIj48L3NwYW4+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiZW1waGFzaXplU2VhcmNoQnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgY2xhc3M9XCJzbWUtYnV0dG9uLXByaW1hcnkgc21lLWJ1dHRvbi1hdXRvLXdpZHRoIHNtZS1mb3JtLWZpZWxkLWhlaWdodFwiIChjbGljayk9XCJleGVjdXRlRGVsaWJlcmF0ZVNlYXJjaCgpXCJcclxuICAgICAgICBbc21lRGlzYWJsZWRdPVwibG9hZGluZ09yRGlzYWJsZWRcIiBkYXRhLXV0YS1pZD1cInNlYXJjaC1idXR0b25cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInNtZS1pY29uIHNtZS1pY29uLXNlYXJjaCBzbWUtbWFyZ2luLXJpZ2h0LXhzIHNtZS1pY29uLXNpemUteHhzXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuPnt7c2VhcmNoQnV0dG9uVGV4dH19PC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc2FibGVTZWFyY2hCdXR0b25cIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzbWUtaWNvbiBzbWUtaWNvbi1zZWFyY2ggc21lLW1hcmdpbi1yaWdodC14cyBzbWUtaWNvbi1zaXplLXh4c1wiIChjbGljayk9XCJpY29uQ2xpY2soJGV2ZW50KVwiPjwvc3Bhbj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG4gIDxzcGFuIGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXJcIiBbaWRdPVwiaWRCYWcubGFiZWxTcGFuXCI+e3tsYWJlbH19PC9zcGFuPlxyXG4gIDxzcGFuIGNsYXNzPVwic21lLXNjcmVlbi1yZWFkZXJcIiBbaWRdPVwiaWRCYWcuY291bnRTcGFuXCI+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFzZWFyY2hpbmdcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLXJlbGV2YW50PVwiYWxsXCI+XHJcbiAgICAgIHt7IGNvdW50ID8gc3RyaW5ncy5Nc2Z0U21lU2hlbGwuQW5ndWxhci5Gb3JtLlNlYXJjaEZpZWxkLmNvdW50LmZvcm1hdChjb3VudCkgOlxyXG4gICAgICBzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uU2VhcmNoRmllbGQuY291bnQuZm9ybWF0KDApIH19XHJcbiAgICA8L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cInNlYXJjaGluZ1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtcmVsZXZhbnQ9XCJhbGxcIj5cclxuICAgICAge3tzdHJpbmdzLk1zZnRTbWVTaGVsbC5Bbmd1bGFyLkZvcm0uU2VhcmNoRmllbGQuU2VhcmNoaW5nLmxhYmVsfX1cclxuICAgIDwvc3Bhbj5cclxuICA8L3NwYW4+XHJcblxyXG4gIDxzbWUtdmFsaWRhdGlvbi1hbGVydCBbYWxlcnRdPVwiYWxlcnRcIj48L3NtZS12YWxpZGF0aW9uLWFsZXJ0PlxyXG48L3NtZS1mb3JtLWZpZWxkLWxheW91dD5cclxuIl19