UNPKG

@kushki/ng-suka

Version:

<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>

365 lines (363 loc) 22.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, EventEmitter, Output, HostBinding, ElementRef, HostListener, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; // tslint:disable-next-line: component-class-suffix export class Search { /** * Creates an instance of `Search`. * @param {?} elementRef */ constructor(elementRef) { this.elementRef = elementRef; /** * Set to `true` for a disabled search input. */ this.disabled = false; /** * Set to `true` for a toolbar search component. */ this.toolbar = false; /** * Set to `true` for a loading search component. */ this.skeleton = false; /** * Set to `true` to expand the toolbar search component. */ this.active = false; /** * Specifies whether the search component is used in the table toolbar. */ this.tableSearch = false; /** * The unique id for the search component. */ this.id = `search-${Search.searchCount}`; /** * Sets the value attribute on the `input` element. */ this.value = ''; /** * Sets the autocomplete attribute on the `input` element. * For reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values */ this.autocomplete = 'on'; /** * Sets the text inside the `label` tag. */ this.label = 'Búsqueda'; // TODO: i18n // TODO: i18n /** * Sets the placeholder attribute on the `input` element. */ this.placeholder = 'Buscar'; // TODO: i18n // TODO: i18n /** * Used to set the `title` attribute of the clear button. */ this.clearButtonTitle = 'Limpiar'; // TODO: i18n // TODO: i18n /** * Emits an event when value is changed. */ this.valueChange = new EventEmitter(); /** * Emits an event when the clear button is clicked. */ this.clear = new EventEmitter(); /** * Called when search input is blurred. Needed to properly implement `ControlValueAccessor`. */ this.onTouched = (/** * @return {?} */ () => { }); /** * Method set in `registerOnChange` to propagate changes back to the form. */ this.propagateChange = (/** * @param {?} _ * @return {?} */ (_) => { }); Search.searchCount++; } /** * @return {?} */ get containerClass() { return !this.toolbar; } /** * This is the initial value set to the component * @param {?} value The input value. * @return {?} */ writeValue(value) { this.value = value; } /** * Sets a method in order to propagate changes back to the form. * @param {?} fn * @return {?} */ registerOnChange(fn) { this.propagateChange = fn; } /** * Registers a callback to be triggered when the control has been touched. * @param {?} fn Callback to be triggered when the search input is touched. * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Called when text is written in the input. * @param {?} search The input text. * @return {?} */ onSearch(search) { this.value = search; this.doValueChange(); } /** * Called when clear button is clicked. * @return {?} */ clearSearch() { this.value = ''; this.clear.emit(); this.propagateChange(this.value); } /** * @return {?} */ doValueChange() { this.valueChange.emit(this.value); this.propagateChange(this.value); } /** * @return {?} */ openSearch() { this.active = true; setTimeout((/** * @return {?} */ () => this.inputRef.nativeElement.focus())); } /** * @param {?} event * @return {?} */ keyDown(event) { if (this.toolbar) { if (event.key === 'Escape') { this.active = false; } else if (event.key === 'Enter') { this.openSearch(); } } } /** * @param {?} event * @return {?} */ focusOut(event) { if (this.toolbar && this.inputRef.nativeElement.value === '' && event.relatedTarget === null) { this.active = false; } } } /** * Variable used for creating unique ids for search components. */ Search.searchCount = 0; Search.decorators = [ { type: Component, args: [{ selector: 'suka-search', template: ` <div class="search" [ngClass]="{ 'skeleton': skeleton, 'toolbar-search': toolbar, 'toolbar-search--active': toolbar && active }" role="search" > <label class="label" [for]="id">{{label}}</label> <div *ngIf="skeleton; else enableInput" class="search-input"></div> <ng-template #enableInput> <input #input *ngIf="!toolbar || active || value !== ''" class="search-input" [type]="tableSearch || !toolbar ? 'text' : 'search'" role="search" [id]="id" [value]="value" [autocomplete]="autocomplete" [placeholder]="placeholder" [disabled]="disabled" [required]="required" (input)="onSearch($event.target.value)"/> <button *ngIf="!tableSearch && toolbar" class="toolbar-search__btn" (click)="openSearch()"> <suka-icon icon="search"></suka-icon> </button> <suka-icon icon="search" *ngIf="tableSearch || !toolbar" (click)="openSearch()" class="search-magnifier"></suka-icon> </ng-template> <button *ngIf="tableSearch || !toolbar" class="search-close" [ngClass]="{ 'search-close--hidden': !value || value.length === 0 }" [title]="clearButtonTitle" [attr.aria-label]="clearButtonTitle" (click)="clearSearch()" > <suka-icon icon="x-circle"></suka-icon> </button> </div> `, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: Search, multi: true } ] }] } ]; /** @nocollapse */ Search.ctorParameters = () => [ { type: ElementRef } ]; Search.propDecorators = { containerClass: [{ type: HostBinding, args: ['class.form-item',] }], disabled: [{ type: Input }], toolbar: [{ type: Input }], skeleton: [{ type: Input }], active: [{ type: Input }], tableSearch: [{ type: Input }], name: [{ type: Input }], id: [{ type: Input }], required: [{ type: Input }], value: [{ type: Input }], autocomplete: [{ type: Input }], label: [{ type: Input }], placeholder: [{ type: Input }], clearButtonTitle: [{ type: Input }], valueChange: [{ type: Output }], clear: [{ type: Output }], inputRef: [{ type: ViewChild, args: ['input', { static: false },] }], keyDown: [{ type: HostListener, args: ['keydown', ['$event'],] }], focusOut: [{ type: HostListener, args: ['focusout', ['$event'],] }] }; if (false) { /** * Variable used for creating unique ids for search components. * @type {?} */ Search.searchCount; /** * Set to `true` for a disabled search input. * @type {?} */ Search.prototype.disabled; /** * Set to `true` for a toolbar search component. * @type {?} */ Search.prototype.toolbar; /** * Set to `true` for a loading search component. * @type {?} */ Search.prototype.skeleton; /** * Set to `true` to expand the toolbar search component. * @type {?} */ Search.prototype.active; /** * Specifies whether the search component is used in the table toolbar. * @type {?} */ Search.prototype.tableSearch; /** * Sets the name attribute on the `input` element. * @type {?} */ Search.prototype.name; /** * The unique id for the search component. * @type {?} */ Search.prototype.id; /** * Reflects the required attribute of the `input` element. * @type {?} */ Search.prototype.required; /** * Sets the value attribute on the `input` element. * @type {?} */ Search.prototype.value; /** * Sets the autocomplete attribute on the `input` element. * For reference: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete#Values * @type {?} */ Search.prototype.autocomplete; /** * Sets the text inside the `label` tag. * @type {?} */ Search.prototype.label; /** * Sets the placeholder attribute on the `input` element. * @type {?} */ Search.prototype.placeholder; /** * Used to set the `title` attribute of the clear button. * @type {?} */ Search.prototype.clearButtonTitle; /** * Emits an event when value is changed. * @type {?} */ Search.prototype.valueChange; /** * Emits an event when the clear button is clicked. * @type {?} */ Search.prototype.clear; /** @type {?} */ Search.prototype.inputRef; /** * Called when search input is blurred. Needed to properly implement `ControlValueAccessor`. * @type {?} */ Search.prototype.onTouched; /** * Method set in `registerOnChange` to propagate changes back to the form. * @type {?} */ Search.prototype.propagateChange; /** * @type {?} * @protected */ Search.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BrdXNoa2kvbmctc3VrYS8iLCJzb3VyY2VzIjpbImxpYi9zZWFyY2gvc2VhcmNoLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixXQUFXLEVBQ1gsVUFBVSxFQUNWLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBMkR6RSxtREFBbUQ7QUFDbkQsTUFBTSxPQUFPLE1BQU07Ozs7O0lBMkVqQixZQUFzQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZOzs7O1FBaEVuQyxhQUFRLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWpCLFlBQU8sR0FBRyxLQUFLLENBQUM7Ozs7UUFJaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQUlqQixXQUFNLEdBQUcsS0FBSyxDQUFDOzs7O1FBSWYsZ0JBQVcsR0FBRyxLQUFLLENBQUM7Ozs7UUFRcEIsT0FBRSxHQUFHLFVBQVUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7O1FBUXBDLFVBQUssR0FBRyxFQUFFLENBQUM7Ozs7O1FBS1gsaUJBQVksR0FBRyxJQUFJLENBQUM7Ozs7UUFJcEIsVUFBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLGFBQWE7Ozs7O1FBSWpDLGdCQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJckMscUJBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUMsYUFBYTs7Ozs7UUFJMUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSXpDLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOzs7O1FBcUNyQyxjQUFTOzs7UUFBYyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUM7Ozs7UUFL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QyxPQUFPLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO3NCQXNFbEMsWUFBWSxTQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQzt1QkFXbEMsWUFBWSxTQUFDLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7Ozs7OztJQW5KcEMsbUJBQXVCOzs7OztJQU92QiwwQkFBMEI7Ozs7O0lBSTFCLHlCQUF5Qjs7Ozs7SUFJekIsMEJBQTBCOzs7OztJQUkxQix3QkFBd0I7Ozs7O0lBSXhCLDZCQUE2Qjs7Ozs7SUFJN0Isc0JBQXNCOzs7OztJQUl0QixvQkFBNkM7Ozs7O0lBSTdDLDBCQUEyQjs7Ozs7SUFJM0IsdUJBQW9COzs7Ozs7SUFLcEIsOEJBQTZCOzs7OztJQUk3Qix1QkFBNEI7Ozs7O0lBSTVCLDZCQUFnQzs7Ozs7SUFJaEMsa0NBQXNDOzs7OztJQUl0Qyw2QkFBbUQ7Ozs7O0lBSW5ELHVCQUFxQzs7SUFFckMsMEJBQTBEOzs7OztJQW1DMUQsMkJBQWlDOzs7OztJQUtqQyxpQ0FBa0M7Ozs7O0lBbkN0Qiw0QkFBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE91dHB1dCxcbiAgSG9zdEJpbmRpbmcsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdWthLXNlYXJjaCcsXG4gIHRlbXBsYXRlOiBgXG4gIDxkaXZcbiAgICBjbGFzcz1cInNlYXJjaFwiXG4gICAgW25nQ2xhc3NdPVwie1xuICAgICAgJ3NrZWxldG9uJzogc2tlbGV0b24sXG4gICAgICAndG9vbGJhci1zZWFyY2gnOiB0b29sYmFyLFxuICAgICAgJ3Rvb2xiYXItc2VhcmNoLS1hY3RpdmUnOiB0b29sYmFyICYmIGFjdGl2ZVxuICAgIH1cIlxuICAgIHJvbGU9XCJzZWFyY2hcIlxuICA+XG4gICAgPGxhYmVsIGNsYXNzPVwibGFiZWxcIiBbZm9yXT1cImlkXCI+e3tsYWJlbH19PC9sYWJlbD5cblxuICAgIDxkaXYgKm5nSWY9XCJza2VsZXRvbjsgZWxzZSBlbmFibGVJbnB1dFwiIGNsYXNzPVwic2VhcmNoLWlucHV0XCI+PC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNlbmFibGVJbnB1dD5cbiAgICAgIDxpbnB1dFxuICAgICAgICAjaW5wdXRcbiAgICAgICAgKm5nSWY9XCIhdG9vbGJhciB8fCBhY3RpdmUgfHwgdmFsdWUgIT09ICcnXCJcbiAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICBbdHlwZV09XCJ0YWJsZVNlYXJjaCB8fCAhdG9vbGJhciA/ICd0ZXh0JyA6ICdzZWFyY2gnXCJcbiAgICAgICAgcm9sZT1cInNlYXJjaFwiXG4gICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgIFthdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcbiAgICAgICAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoKCRldmVudC50YXJnZXQudmFsdWUpXCIvPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiF0YWJsZVNlYXJjaCAmJiB0b29sYmFyXCIgY2xhc3M9XCJ0b29sYmFyLXNlYXJjaF9fYnRuXCIgKGNsaWNrKT1cIm9wZW5TZWFyY2goKVwiPlxuICAgICAgICA8c3VrYS1pY29uIGljb249XCJzZWFyY2hcIj48L3N1a2EtaWNvbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPHN1a2EtaWNvbiBpY29uPVwic2VhcmNoXCIgICpuZ0lmPVwidGFibGVTZWFyY2ggfHwgIXRvb2xiYXJcIiAoY2xpY2spPVwib3BlblNlYXJjaCgpXCIgY2xhc3M9XCJzZWFyY2gtbWFnbmlmaWVyXCI+PC9zdWthLWljb24+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwidGFibGVTZWFyY2ggfHwgIXRvb2xiYXJcIlxuICAgICAgY2xhc3M9XCJzZWFyY2gtY2xvc2VcIlxuICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAnc2VhcmNoLWNsb3NlLS1oaWRkZW4nOiAhdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09PSAwXG4gICAgICB9XCJcbiAgICAgIFt0aXRsZV09XCJjbGVhckJ1dHRvblRpdGxlXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xlYXJCdXR0b25UaXRsZVwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJTZWFyY2goKVwiXG4gICAgPlxuICAgICAgPHN1a2EtaWNvbiBpY29uPVwieC1jaXJjbGVcIj48L3N1a2EtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IFNlYXJjaCxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtY2xhc3Mtc3VmZml4XG5leHBvcnQgY2xhc3MgU2VhcmNoIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogVmFyaWFibGUgdXNlZCBmb3IgY3JlYXRpbmcgdW5pcXVlIGlkcyBmb3Igc2VhcmNoIGNvbXBvbmVudHMuXG4gICAqL1xuICBzdGF0aWMgc2VhcmNoQ291bnQgPSAwO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9ybS1pdGVtJykgZ2V0IGNvbnRhaW5lckNsYXNzKCkgeyByZXR1cm4gIXRoaXMudG9vbGJhcjsgfVxuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGRpc2FibGVkIHNlYXJjaCBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIHRvb2xiYXIgc2VhcmNoIGNvbXBvbmVudC5cbiAgICovXG4gIEBJbnB1dCgpIHRvb2xiYXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgZm9yIGEgbG9hZGluZyBzZWFyY2ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgc2tlbGV0b24gPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNldCB0byBgdHJ1ZWAgdG8gZXhwYW5kIHRoZSB0b29sYmFyIHNlYXJjaCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmUgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZWFyY2ggY29tcG9uZW50IGlzIHVzZWQgaW4gdGhlIHRhYmxlIHRvb2xiYXIuXG4gICAqL1xuICBASW5wdXQoKSB0YWJsZVNlYXJjaCA9IGZhbHNlO1xuICAvKipcbiAgICogU2V0cyB0aGUgbmFtZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgaWQgZm9yIHRoZSBzZWFyY2ggY29tcG9uZW50LlxuICAgKi9cbiAgQElucHV0KCkgaWQgPSBgc2VhcmNoLSR7U2VhcmNoLnNlYXJjaENvdW50fWA7XG4gIC8qKlxuICAgKiBSZWZsZWN0cyB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIG9mIHRoZSBgaW5wdXRgIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGF0dHJpYnV0ZSBvbiB0aGUgYGlucHV0YCBlbGVtZW50LlxuICAgKi9cbiAgQElucHV0KCkgdmFsdWUgPSAnJztcbiAgLyoqXG4gICAqIFNldHMgdGhlIGF1dG9jb21wbGV0ZSBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICogRm9yIHJlZmVyZW5jZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9BdHRyaWJ1dGVzL2F1dG9jb21wbGV0ZSNWYWx1ZXNcbiAgICovXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZSA9ICdvbic7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSB0ZXh0IGluc2lkZSB0aGUgYGxhYmVsYCB0YWcuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbCA9ICdCw7pzcXVlZGEnOyAvLyBUT0RPOiBpMThuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGUgb24gdGhlIGBpbnB1dGAgZWxlbWVudC5cbiAgICovXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ0J1c2Nhcic7IC8vIFRPRE86IGkxOG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2V0IHRoZSBgdGl0bGVgIGF0dHJpYnV0ZSBvZiB0aGUgY2xlYXIgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgY2xlYXJCdXR0b25UaXRsZSA9ICdMaW1waWFyJzsgLy8gVE9ETzogaTE4blxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIHRoZSBjbGVhciBidXR0b24gaXMgY2xpY2tlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBjbGVhciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSkgaW5wdXRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYFNlYXJjaGAuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIFNlYXJjaC5zZWFyY2hDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgdmFsdWUgc2V0IHRvIHRoZSBjb21wb25lbnRcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBpbnB1dCB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIG1ldGhvZCBpbiBvcmRlciB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbnRyb2wgaGFzIGJlZW4gdG91Y2hlZC5cbiAgICogQHBhcmFtIGZuIENhbGxiYWNrIHRvIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaXMgdG91Y2hlZC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBzZWFyY2ggaW5wdXQgaXMgYmx1cnJlZC4gTmVlZGVkIHRvIHByb3Blcmx5IGltcGxlbWVudCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgLlxuICAgKi9cbiAgb25Ub3VjaGVkOiAoKSA9PiBhbnkgPSAoKSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBzZXQgaW4gYHJlZ2lzdGVyT25DaGFuZ2VgIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRleHQgaXMgd3JpdHRlbiBpbiB0aGUgaW5wdXQuXG4gICAqIEBwYXJhbSBzZWFyY2ggVGhlIGlucHV0IHRleHQuXG4gICAqL1xuICBvblNlYXJjaChzZWFyY2g6IHN0cmluZykge1xuICAgIHRoaXMudmFsdWUgPSBzZWFyY2g7XG4gICAgdGhpcy5kb1ZhbHVlQ2hhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gY2xlYXIgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqL1xuICBjbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgdGhpcy5jbGVhci5lbWl0KCk7XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBkb1ZhbHVlQ2hhbmdlKCkge1xuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9wZW5TZWFyY2goKSB7XG4gICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCkpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy50b29sYmFyKSB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgICAgdGhpcy5vcGVuU2VhcmNoKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXNvdXQnLCBbJyRldmVudCddKVxuICBmb2N1c091dChldmVudCkge1xuICAgIGlmICh0aGlzLnRvb2xiYXIgJiZcbiAgICAgIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9PT0gJycgJiZcbiAgICAgIGV2ZW50LnJlbGF0ZWRUYXJnZXQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=