UNPKG

@engie-group/fluid-design-system-angular

Version:

Fluid Design System Angular

169 lines 19.4 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import { Subject, takeUntil } from 'rxjs'; import { Utils } from '../../utils/utils.util'; import { SegmentedControlButtonComponent } from '../segmented-control-button/segmented-control-button.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class SegmentedControlComponent { /** * Selected value */ set value(value) { this._value = value; this.setActive(value); } get value() { return this._value; } /** * Overrides disabled state on all buttons */ set isDisabled(value) { this._isDisabled = value; this.setButtonsIsDisabled(); } get isDisabled() { return this._isDisabled; } constructor(cdr) { this.cdr = cdr; this.segmentedControlClass = 'nj-segmented-control'; /** * @ignore */ this.unsubscribe = new Subject(); /** * @ignore */ this._onChange = (_) => { }; /** * @ignore */ this._onTouched = () => { }; /** * Segmented Control size */ this.size = 'md'; /** * Output that emits value change */ this.valueChange = new EventEmitter(); } ngAfterViewInit() { // A render is being done after view init so setTimeout allows us to delay any attribute modification // in the call stack, so it can be taken account on next render only setTimeout(() => { this.segmentedButtons = this.segmentedButtonsList?.toArray(); this.setButtonsIsDisabled(); this.initializeClickListener(); if (this.value) { this.setActive(this.value); } }); } setButtonsIsDisabled() { if (!Utils.isUndefinedOrNull(this.isDisabled) && this.segmentedButtons) { for (const segmentedButton of this.segmentedButtons) { segmentedButton.setIsDisabled(this.isDisabled); } } } ngOnDestroy() { this.unsubscribe.next(); this.unsubscribe.complete(); } /** * @ignore */ initializeClickListener() { if (Utils.isUndefinedOrNull(this.segmentedButtons)) { return; } this.segmentedButtons.forEach((button, value) => { button.buttonClick.pipe(takeUntil(this.unsubscribe)).subscribe((_) => { button.isSelected = true; this.writeValue(button.value); }); }); } setActive(buttonValue) { if (!this.segmentedButtons) { return; } for (const button of this.segmentedButtons) { if (button?.value === buttonValue) { button.setIsSelected(true); const selectedBoundingRect = button.getClientBoundingRect(); const segmentedControlBoundingRect = this.segmentedControl.nativeElement.getBoundingClientRect(); const segmentedControlStyle = this.segmentedControl?.nativeElement?.style; segmentedControlStyle.setProperty('--nj-sc-btn-selected-width', `${selectedBoundingRect.width}px`); segmentedControlStyle.setProperty('--nj-sc-btn-selected-right', `${segmentedControlBoundingRect.right - selectedBoundingRect.right}px`); } else { button.setIsSelected(false); } } } /** * @ignore */ getSizeClass() { if (!this.size || this.size === 'md') { return; } return `${this.segmentedControlClass}--${this.size}`; } /** * @ignore */ writeValue(value) { if (value === this.value) { return; } this.setActive(value); this.value = value; } /** * @ignore */ registerOnChange(fn) { this._onChange = fn; } /** * @ignore */ registerOnTouched(fn) { this._onTouched = fn; } /** * @ignore */ setDisabledState(isDisabled) { this.isDisabled = isDisabled; this.cdr.markForCheck(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SegmentedControlComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SegmentedControlComponent, isStandalone: true, selector: "nj-segmented-control", inputs: { value: "value", ariaLabel: "ariaLabel", isDisabled: "isDisabled", size: "size" }, outputs: { valueChange: "valueChange" }, queries: [{ propertyName: "segmentedButtonsList", predicate: SegmentedControlButtonComponent }], viewQueries: [{ propertyName: "segmentedControl", first: true, predicate: ["segmentedControl"], descendants: true }], ngImport: i0, template: "<div class=\"nj-segmented-control\" role=\"group\" [attr.aria-label]=\"ariaLabel\" [ngClass]=\"getSizeClass()\"\n #segmentedControl>\n <ng-content></ng-content>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SegmentedControlComponent, decorators: [{ type: Component, args: [{ selector: 'nj-segmented-control', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [SegmentedControlButtonComponent, CommonModule], template: "<div class=\"nj-segmented-control\" role=\"group\" [attr.aria-label]=\"ariaLabel\" [ngClass]=\"getSizeClass()\"\n #segmentedControl>\n <ng-content></ng-content>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { value: [{ type: Input }], ariaLabel: [{ type: Input }], isDisabled: [{ type: Input }], size: [{ type: Input }], segmentedButtonsList: [{ type: ContentChildren, args: [SegmentedControlButtonComponent] }], segmentedControl: [{ type: ViewChild, args: ['segmentedControl'] }], valueChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudGVkLWNvbnRyb2wuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2VnbWVudGVkLWNvbnRyb2wvc2VnbWVudGVkLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQy9DLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLGdFQUFnRSxDQUFDOzs7QUFVakgsTUFBTSxPQUFPLHlCQUF5QjtJQWlDcEM7O09BRUc7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBT0Q7O09BRUc7SUFDSCxJQUNJLFVBQVUsQ0FBQyxLQUFjO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUks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O21HQUF6Qix5QkFBeUIsMFBBd0VuQiwrQkFBK0IsbUpDcEdsRCxpTEFJQSwyQ0RzQjZDLFlBQVk7OzRGQUU1Qyx5QkFBeUI7a0JBUHJDLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUVmLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsK0JBQStCLEVBQUUsWUFBWSxDQUFDO3dHQXVDcEQsS0FBSztzQkFEUixLQUFLO2dCQWFHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUYsVUFBVTtzQkFEYixLQUFLO2dCQWFHLElBQUk7c0JBQVosS0FBSztnQkFLNEMsb0JBQW9CO3NCQUFyRSxlQUFlO3VCQUFDLCtCQUErQjtnQkFLakIsZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFLbkIsV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi91dGlscy91dGlscy51dGlsJztcbmltcG9ydCB7IFNlZ21lbnRlZENvbnRyb2xCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9zZWdtZW50ZWQtY29udHJvbC1idXR0b24vc2VnbWVudGVkLWNvbnRyb2wtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWdtZW50ZWRDb250cm9sU2l6ZSB9IGZyb20gJy4vc2VnbWVudGVkLWNvbnRyb2wubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduai1zZWdtZW50ZWQtY29udHJvbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWdtZW50ZWQtY29udHJvbC5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbU2VnbWVudGVkQ29udHJvbEJ1dHRvbkNvbXBvbmVudCwgQ29tbW9uTW9kdWxlXVxufSlcbmV4cG9ydCBjbGFzcyBTZWdtZW50ZWRDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VnbWVudGVkQ29udHJvbENsYXNzID0gJ25qLXNlZ21lbnRlZC1jb250cm9sJztcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZTogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX29uQ2hhbmdlID0gKF86IGFueSk6IHZvaWQgPT4ge307XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX29uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIF9pc0Rpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBwdWJsaWMgc2VnbWVudGVkQnV0dG9uczogU2VnbWVudGVkQ29udHJvbEJ1dHRvbkNvbXBvbmVudFtdO1xuXG4gIC8qKlxuICAgKiBTZWxlY3RlZCB2YWx1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0QWN0aXZlKHZhbHVlKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RlZCBhcmlhIGxhYmVsXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGRpc2FibGVkIHN0YXRlIG9uIGFsbCBidXR0b25zXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgaXNEaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLnNldEJ1dHRvbnNJc0Rpc2FibGVkKCk7XG4gIH1cblxuICBnZXQgaXNEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXNhYmxlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWdtZW50ZWQgQ29udHJvbCBzaXplXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiBTZWdtZW50ZWRDb250cm9sU2l6ZSA9ICdtZCc7XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oU2VnbWVudGVkQ29udHJvbEJ1dHRvbkNvbXBvbmVudCkgc2VnbWVudGVkQnV0dG9uc0xpc3Q6IFF1ZXJ5TGlzdDxTZWdtZW50ZWRDb250cm9sQnV0dG9uQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnc2VnbWVudGVkQ29udHJvbCcpIHNlZ21lbnRlZENvbnRyb2w6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiBPdXRwdXQgdGhhdCBlbWl0cyB2YWx1ZSBjaGFuZ2VcbiAgICovXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIC8vIEEgcmVuZGVyIGlzIGJlaW5nIGRvbmUgYWZ0ZXIgdmlldyBpbml0IHNvIHNldFRpbWVvdXQgYWxsb3dzIHVzIHRvIGRlbGF5IGFueSBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uXG4gICAgLy8gaW4gdGhlIGNhbGwgc3RhY2ssIHNvIGl0IGNhbiBiZSB0YWtlbiBhY2NvdW50IG9uIG5leHQgcmVuZGVyIG9ubHlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuc2VnbWVudGVkQnV0dG9ucyA9IHRoaXMuc2VnbWVudGVkQnV0dG9uc0xpc3Q/LnRvQXJyYXkoKTtcbiAgICAgIHRoaXMuc2V0QnV0dG9uc0lzRGlzYWJsZWQoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUNsaWNrTGlzdGVuZXIoKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlKHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRCdXR0b25zSXNEaXNhYmxlZCgpIHtcbiAgICBpZiAoIVV0aWxzLmlzVW5kZWZpbmVkT3JOdWxsKHRoaXMuaXNEaXNhYmxlZCkgJiYgdGhpcy5zZWdtZW50ZWRCdXR0b25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHNlZ21lbnRlZEJ1dHRvbiBvZiB0aGlzLnNlZ21lbnRlZEJ1dHRvbnMpIHtcbiAgICAgICAgc2VnbWVudGVkQnV0dG9uLnNldElzRGlzYWJsZWQodGhpcy5pc0Rpc2FibGVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2xpY2tMaXN0ZW5lcigpIHtcbiAgICBpZiAoVXRpbHMuaXNVbmRlZmluZWRPck51bGwodGhpcy5zZWdtZW50ZWRCdXR0b25zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlZ21lbnRlZEJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uLCB2YWx1ZSkgPT4ge1xuICAgICAgYnV0dG9uLmJ1dHRvbkNsaWNrLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKF8pID0+IHtcbiAgICAgICAgYnV0dG9uLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLndyaXRlVmFsdWUoYnV0dG9uLnZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRBY3RpdmUoYnV0dG9uVmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5zZWdtZW50ZWRCdXR0b25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgYnV0dG9uIG9mIHRoaXMuc2VnbWVudGVkQnV0dG9ucykge1xuICAgICAgaWYgKGJ1dHRvbj8udmFsdWUgPT09IGJ1dHRvblZhbHVlKSB7XG4gICAgICAgIGJ1dHRvbi5zZXRJc1NlbGVjdGVkKHRydWUpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEJvdW5kaW5nUmVjdCA9IGJ1dHRvbi5nZXRDbGllbnRCb3VuZGluZ1JlY3QoKTtcbiAgICAgICAgY29uc3Qgc2VnbWVudGVkQ29udHJvbEJvdW5kaW5nUmVjdCA9IHRoaXMuc2VnbWVudGVkQ29udHJvbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBzZWdtZW50ZWRDb250cm9sU3R5bGUgPSB0aGlzLnNlZ21lbnRlZENvbnRyb2w/Lm5hdGl2ZUVsZW1lbnQ/LnN0eWxlO1xuICAgICAgICBzZWdtZW50ZWRDb250cm9sU3R5bGUuc2V0UHJvcGVydHkoJy0tbmotc2MtYnRuLXNlbGVjdGVkLXdpZHRoJywgYCR7c2VsZWN0ZWRCb3VuZGluZ1JlY3Qud2lkdGh9cHhgKTtcbiAgICAgICAgc2VnbWVudGVkQ29udHJvbFN0eWxlLnNldFByb3BlcnR5KFxuICAgICAgICAgICctLW5qLXNjLWJ0bi1zZWxlY3RlZC1yaWdodCcsXG4gICAgICAgICAgYCR7c2VnbWVudGVkQ29udHJvbEJvdW5kaW5nUmVjdC5yaWdodCAtIHNlbGVjdGVkQm91bmRpbmdSZWN0LnJpZ2h0fXB4YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnV0dG9uLnNldElzU2VsZWN0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBnZXRTaXplQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2l6ZSB8fCB0aGlzLnNpemUgPT09ICdtZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuc2VnbWVudGVkQ29udHJvbENsYXNzfS0tJHt0aGlzLnNpemV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRBY3RpdmUodmFsdWUpO1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc0Rpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cIm5qLXNlZ21lbnRlZC1jb250cm9sXCIgcm9sZT1cImdyb3VwXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIiBbbmdDbGFzc109XCJnZXRTaXplQ2xhc3MoKVwiXG4gICAgICNzZWdtZW50ZWRDb250cm9sPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L2Rpdj5cbiJdfQ==