@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
128 lines • 21.8 kB
JavaScript
import { CommonModule } from '@angular/common';
import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, EventEmitter, forwardRef, inject, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';
import { EngieTemplateDirective } from '../../directives/engie-template.directive';
import { sizeVariantToCSS } from '../../models/size-variant.model';
import { Utils } from '../../utils/utils.util';
import { IconButtonComponent } from '../icon-button/icon-button.component';
import { IconComponent } from '../icon/icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
export class SearchComponent {
constructor() {
this.defaultInputId = Utils.getUID('nj-search-input');
this.cdr = inject(ChangeDetectorRef);
this.isDisabledByForm = false;
this.onChange = null;
this.value = null;
this.onTouched = null;
/**
* Specifies whether the element is disabled or not.
*/
this.disabled = false;
/**
* Input keyboard keydown events.
*/
this.enterKeydown = new EventEmitter();
}
ngAfterContentInit() {
if (this.element?.selector === 'action') {
this.actionTemplate = this.element.templateRef;
}
}
get classes() {
const classes = ['nj-search'];
if (this.scale) {
classes.push(`nj-search--${sizeVariantToCSS(this.scale)}`);
}
return classes;
}
get isDisabled() {
return this.disabled || this.isDisabledByForm;
}
get finalInputId() {
return this.inputId || this.defaultInputId;
}
valueChange(value) {
this.value = value;
this.onChange?.(value);
}
onClearValue() {
this.value = null;
this.onChange?.(this.value);
this.searchInputElement?.nativeElement.focus();
}
//<editor-fold desc="ControlValueAccessor implementation">
/**
* @ignore
*/
writeValue(value) {
if (this.value === value) {
return;
}
this.value = value;
this.cdr.markForCheck();
}
/**
* @ignore
*/
registerOnChange(onChange) {
this.onChange = onChange;
}
/**
* @ignore
*/
registerOnTouched(onTouched) {
this.onTouched = onTouched;
}
/**
* @ignore
*/
setDisabledState(isDisabled) {
this.isDisabledByForm = isDisabled;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "16.1.0", version: "16.2.12", type: SearchComponent, isStandalone: true, selector: "nj-search", inputs: { disabled: ["disabled", "disabled", booleanAttribute], inputId: "inputId", placeholder: "placeholder", scale: "scale", altResetButtonLabel: "altResetButtonLabel", altLabel: "altLabel" }, outputs: { enterKeydown: "enterKeydown" }, host: { properties: { "class": "classes" } }, providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchComponent),
multi: true
}], queries: [{ propertyName: "element", first: true, predicate: EngieTemplateDirective, descendants: true }], viewQueries: [{ propertyName: "searchInputElement", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "<div class=\"nj-search__field-wrapper\">\n <nj-icon name=\"search\" ariaLabel=\"search icon\" class=\"nj-search__icon\"></nj-icon>\n <label *ngIf=\"altLabel\" [for]=\"finalInputId\" class=\"nj-sr-only\" aria-hidden=\"true\">\n {{ altLabel }}\n </label>\n <input\n #searchInput\n type=\"search\"\n class=\"nj-search__field\"\n [id]=\"finalInputId\"\n [ngModel]=\"value\"\n [attr.placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n (focus)=\"onTouched?.()\"\n (keydown.enter)=\"enterKeydown.next()\"\n (ngModelChange)=\"valueChange($event)\">\n <nj-icon-button\n *ngIf=\"value?.length > 0\"\n icon=\"cancel\"\n class=\"nj-search__clear-button\"\n [label]=\"altResetButtonLabel\"\n [isDisabled]=\"isDisabled\"\n (buttonClick)=\"onClearValue()\"></nj-icon-button>\n</div>\n<ng-container *ngIf=\"actionTemplate\" [ngTemplateOutlet]=\"actionTemplate\"></ng-container>\n", styles: ["nj-icon.nj-search__icon{position:absolute;top:50%;left:var(--nj-semantic-size-spacing-16);transform:translateY(-50%)}nj-icon.nj-search__icon .nj-icon-material{--nj-material-icon-color: var(--nj-semantic-color-icon-neutral-tertiary-default)}nj-icon-button.nj-search__clear-button{position:absolute;top:50%;right:var(--nj-semantic-size-spacing-16);transform:translateY(-50%)}nj-icon-button.nj-search__clear-button .nj-icon-btn{--nj-icon-btn-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-default);--nj-icon-btn-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-hovered-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-hovered);--nj-icon-btn-hovered-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-focused-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-focused);--nj-icon-btn-focused-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-pressed-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-pressed);--nj-icon-btn-pressed-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-padding: var(--nj-semantic-size-spacing-4);--nj-icon-btn-icon-size: var(--nj-semantic-size-icon-md)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: IconComponent, selector: "nj-icon", inputs: ["size", "variant"] }, { kind: "component", type: IconButtonComponent, selector: "nj-icon-button", inputs: ["type", "ariaPressed", "ariaDescribedby", "isDisabled", "tabIndex", "variant", "size", "hasCustomIcon", "icon", "label", "additionalClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SearchComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-search', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SearchComponent),
multi: true
}], imports: [
CommonModule,
IconComponent,
IconButtonComponent,
FormsModule,
], host: {
'[class]': 'classes'
}, template: "<div class=\"nj-search__field-wrapper\">\n <nj-icon name=\"search\" ariaLabel=\"search icon\" class=\"nj-search__icon\"></nj-icon>\n <label *ngIf=\"altLabel\" [for]=\"finalInputId\" class=\"nj-sr-only\" aria-hidden=\"true\">\n {{ altLabel }}\n </label>\n <input\n #searchInput\n type=\"search\"\n class=\"nj-search__field\"\n [id]=\"finalInputId\"\n [ngModel]=\"value\"\n [attr.placeholder]=\"placeholder\"\n [disabled]=\"isDisabled\"\n (focus)=\"onTouched?.()\"\n (keydown.enter)=\"enterKeydown.next()\"\n (ngModelChange)=\"valueChange($event)\">\n <nj-icon-button\n *ngIf=\"value?.length > 0\"\n icon=\"cancel\"\n class=\"nj-search__clear-button\"\n [label]=\"altResetButtonLabel\"\n [isDisabled]=\"isDisabled\"\n (buttonClick)=\"onClearValue()\"></nj-icon-button>\n</div>\n<ng-container *ngIf=\"actionTemplate\" [ngTemplateOutlet]=\"actionTemplate\"></ng-container>\n", styles: ["nj-icon.nj-search__icon{position:absolute;top:50%;left:var(--nj-semantic-size-spacing-16);transform:translateY(-50%)}nj-icon.nj-search__icon .nj-icon-material{--nj-material-icon-color: var(--nj-semantic-color-icon-neutral-tertiary-default)}nj-icon-button.nj-search__clear-button{position:absolute;top:50%;right:var(--nj-semantic-size-spacing-16);transform:translateY(-50%)}nj-icon-button.nj-search__clear-button .nj-icon-btn{--nj-icon-btn-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-default);--nj-icon-btn-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-hovered-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-hovered);--nj-icon-btn-hovered-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-focused-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-focused);--nj-icon-btn-focused-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-pressed-bg-color: var(--nj-semantic-color-background-neutral-primary-translucent-pressed);--nj-icon-btn-pressed-color: var(--nj-semantic-color-icon-neutral-tertiary-default);--nj-icon-btn-padding: var(--nj-semantic-size-spacing-4);--nj-icon-btn-icon-size: var(--nj-semantic-size-icon-md)}\n"] }]
}], propDecorators: { searchInputElement: [{
type: ViewChild,
args: ['searchInput']
}], disabled: [{
type: Input,
args: [{ transform: booleanAttribute }]
}], inputId: [{
type: Input
}], placeholder: [{
type: Input
}], scale: [{
type: Input
}], altResetButtonLabel: [{
type: Input
}], altLabel: [{
type: Input
}], enterKeydown: [{
type: Output
}], element: [{
type: ContentChild,
args: [EngieTemplateDirective]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3NlYXJjaC9zZWFyY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2VhcmNoL3NlYXJjaC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBRVosWUFBWSxFQUNaLFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFFTixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsV0FBVyxFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEYsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDakYsT0FBTyxFQUFDLGdCQUFnQixFQUFnQixNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN6RSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUF3QnJELE1BQU0sT0FBTyxlQUFlO0lBdEI1QjtRQXVCbUIsbUJBQWMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUQsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixhQUFRLEdBQTRDLElBQUksQ0FBQztRQUV2RCxVQUFLLEdBQWtCLElBQUksQ0FB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QUNiLG1CQUFtQjt3QkFDbkIsV0FBVztxQkFDWixRQUNLO3dCQUNKLFNBQVMsRUFBRSxTQUFTO3FCQUNyQjs4QkFZaUMsa0JBQWtCO3NCQUFuRCxTQUFTO3VCQUFDLGFBQWE7Z0JBS2MsUUFBUTtzQkFBN0MsS0FBSzt1QkFBQyxFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBQztnQkFLM0IsT0FBTztzQkFBZixLQUFLO2dCQUtHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBS0csS0FBSztzQkFBYixLQUFLO2dCQUtHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtJLFlBQVk7c0JBQXJCLE1BQU07Z0JBRXlDLE9BQU87c0JBQXRELFlBQVk7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21tb25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBib29sZWFuQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3Jtc01vZHVsZSwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7RW5naWVUZW1wbGF0ZURpcmVjdGl2ZX0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9lbmdpZS10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtzaXplVmFyaWFudFRvQ1NTLCBUU2l6ZVZhcmlhbnRzfSBmcm9tICcuLi8uLi9tb2RlbHMvc2l6ZS12YXJpYW50Lm1vZGVsJztcbmltcG9ydCB7VXRpbHN9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzLnV0aWwnO1xuaW1wb3J0IHtJY29uQnV0dG9uQ29tcG9uZW50fSBmcm9tICcuLi9pY29uLWJ1dHRvbi9pY29uLWJ1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtJY29uQ29tcG9uZW50fSBmcm9tICcuLi9pY29uL2ljb24uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmotc2VhcmNoJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3NlYXJjaC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlYXJjaENvbXBvbmVudCksXG4gICAgbXVsdGk6IHRydWVcbiAgfV0sXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgSWNvbkNvbXBvbmVudCxcbiAgICBJY29uQnV0dG9uQ29tcG9uZW50LFxuICAgIEZvcm1zTW9kdWxlLFxuICBdLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzc10nOiAnY2xhc3NlcydcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdElucHV0SWQgPSBVdGlscy5nZXRVSUQoJ25qLXNlYXJjaC1pbnB1dCcpO1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByaXZhdGUgaXNEaXNhYmxlZEJ5Rm9ybSA9IGZhbHNlO1xuICBwcml2YXRlIG9uQ2hhbmdlOiAoKHZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHByb3RlY3RlZCB2YWx1ZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBvblRvdWNoZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgYWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICBAVmlld0NoaWxkKCdzZWFyY2hJbnB1dCcpIHByaXZhdGUgc2VhcmNoSW5wdXRFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgZGlzYWJsZWQgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KSBkaXNhYmxlZD0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEhUTUwgaW5wdXQgaWRcbiAgICovXG4gIEBJbnB1dCgpIGlucHV0SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBsYWNlaG9sZGVyIGlucHV0IHRleHQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHNlYXJjaCBjb21wb25lbnQuXG4gICAqL1xuICBASW5wdXQoKSBzY2FsZT86IEV4dHJhY3Q8VFNpemVWYXJpYW50cywgJ3NtJyB8ICdtZCcgfCAnbGcnIHwgJ3hsJz47XG5cbiAgLyoqXG4gICAqIFJlc2V0IGJ1dHRvbiBhbHRlcm5hdGl2ZSBsYWJlbCBmb3IgYXNzaXN0aXZlIHRlY2hub2xvZ2llc1xuICAgKi9cbiAgQElucHV0KCkgYWx0UmVzZXRCdXR0b25MYWJlbD86IHN0cmluZztcblxuICAvKipcbiAgICogQWx0ZXJuYXRpdmUgbGFiZWwgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXNcbiAgICovXG4gIEBJbnB1dCgpIGFsdExhYmVsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnB1dCBrZXlib2FyZCBrZXlkb3duIGV2ZW50cy5cbiAgICovXG4gIEBPdXRwdXQoKSBlbnRlcktleWRvd24gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQENvbnRlbnRDaGlsZChFbmdpZVRlbXBsYXRlRGlyZWN0aXZlKSBwcm90ZWN0ZWQgZWxlbWVudD86IEVuZ2llVGVtcGxhdGVEaXJlY3RpdmU7XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgIGlmICh0aGlzLmVsZW1lbnQ/LnNlbGVjdG9yID09PSAnYWN0aW9uJykge1xuICAgICAgdGhpcy5hY3Rpb25UZW1wbGF0ZSA9IHRoaXMuZWxlbWVudC50ZW1wbGF0ZVJlZjtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGNsYXNzZXMoKSB7XG4gICAgY29uc3QgY2xhc3NlcyA9IFsnbmotc2VhcmNoJ107XG4gICAgaWYgKHRoaXMuc2NhbGUpIHtcbiAgICAgIGNsYXNzZXMucHVzaChgbmotc2VhcmNoLS0ke3NpemVWYXJpYW50VG9DU1ModGhpcy5zY2FsZSl9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzZXM7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGlzRGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc0Rpc2FibGVkQnlGb3JtO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBmaW5hbElucHV0SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5wdXRJZCB8fCB0aGlzLmRlZmF1bHRJbnB1dElkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbHVlQ2hhbmdlKHZhbHVlOiBzdHJpbmcpICB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2U/Lih2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25DbGVhclZhbHVlKCkgIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLm9uQ2hhbmdlPy4odGhpcy52YWx1ZSk7XG4gICAgdGhpcy5zZWFyY2hJbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIC8vPGVkaXRvci1mb2xkIGRlc2M9XCJDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblwiPlxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiAodmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkQnlGb3JtID0gaXNEaXNhYmxlZDtcbiAgfVxuICAvLzwvZWRpdG9yLWZvbGQ+XG59XG4iLCI8ZGl2IGNsYXNzPVwibmotc2VhcmNoX19maWVsZC13cmFwcGVyXCI+XG4gIDxuai1pY29uIG5hbWU9XCJzZWFyY2hcIiBhcmlhTGFiZWw9XCJzZWFyY2ggaWNvblwiIGNsYXNzPVwibmotc2VhcmNoX19pY29uXCI+PC9uai1pY29uPlxuICA8bGFiZWwgKm5nSWY9XCJhbHRMYWJlbFwiIFtmb3JdPVwiZmluYWxJbnB1dElkXCIgY2xhc3M9XCJuai1zci1vbmx5XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAge3sgYWx0TGFiZWwgfX1cbiAgPC9sYWJlbD5cbiAgPGlucHV0XG4gICAgI3NlYXJjaElucHV0XG4gICAgdHlwZT1cInNlYXJjaFwiXG4gICAgY2xhc3M9XCJuai1zZWFyY2hfX2ZpZWxkXCJcbiAgICBbaWRdPVwiZmluYWxJbnB1dElkXCJcbiAgICBbbmdNb2RlbF09XCJ2YWx1ZVwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFtkaXNhYmxlZF09XCJpc0Rpc2FibGVkXCJcbiAgICAoZm9jdXMpPVwib25Ub3VjaGVkPy4oKVwiXG4gICAgKGtleWRvd24uZW50ZXIpPVwiZW50ZXJLZXlkb3duLm5leHQoKVwiXG4gICAgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWVDaGFuZ2UoJGV2ZW50KVwiPlxuICA8bmotaWNvbi1idXR0b25cbiAgICAqbmdJZj1cInZhbHVlPy5sZW5ndGggPiAwXCJcbiAgICBpY29uPVwiY2FuY2VsXCJcbiAgICBjbGFzcz1cIm5qLXNlYXJjaF9fY2xlYXItYnV0dG9uXCJcbiAgICBbbGFiZWxdPVwiYWx0UmVzZXRCdXR0b25MYWJlbFwiXG4gICAgW2lzRGlzYWJsZWRdPVwiaXNEaXNhYmxlZFwiXG4gICAgKGJ1dHRvbkNsaWNrKT1cIm9uQ2xlYXJWYWx1ZSgpXCI+PC9uai1pY29uLWJ1dHRvbj5cbjwvZGl2PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGlvblRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiYWN0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiJdfQ==