UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

290 lines 33.3 kB
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