UNPKG

ngx-tiptap-editor

Version:

[![Build and Publish](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml/badge.svg)](https://github.com/HuiiBuh/ngx-tiptap-editor/actions/workflows/publish.yml) [![Deploy to Github Pages](https://github.com/HuiiBuh/ngx-tiptap-edito

123 lines 16.5 kB
import { Directive, isDevMode, ViewChild, ViewChildren } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { fromEditorEvent } from '../../helpers'; import { OptionComponent, SelectComponent } from '../select/select.component'; import * as i0 from "@angular/core"; export class BaseControl { constructor() { this._editor = null; } get editor() { return this._editor; } setEditor(editor) { this._editor = editor; this.onEditorReady && this.onEditorReady(editor); } } // tslint:disable-next-line:directive-class-suffix export class ExtendedBaseControl extends BaseControl { constructor() { super(...arguments); this.destroy$ = new Subject(); } ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); } setEditor(editor) { super.setEditor(editor); fromEditorEvent(editor, 'destroy', true).pipe(takeUntil(this.destroy$)) .subscribe(() => this.onEditorDestroy && this.onEditorDestroy()); } isEditable() { return !!this.editor?.isEditable; } } ExtendedBaseControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ExtendedBaseControl, deps: null, target: i0.ɵɵFactoryTarget.Directive }); ExtendedBaseControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: ExtendedBaseControl, usesInheritance: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ExtendedBaseControl, decorators: [{ type: Directive }] }); // tslint:disable-next-line:directive-class-suffix export class ButtonBaseControl extends ExtendedBaseControl { constructor() { super(...arguments); this.updateEvent = 'transaction'; } ngAfterViewInit() { if (!this.button && isDevMode()) { console.warn(`The button element in your control could not be found in ${this.constructor.name}\nPlease add #button to your control button element`); } } setEditor(editor) { super.setEditor(editor); fromEditorEvent(editor, this.updateEvent).pipe(takeUntil(this.destroy$)) .subscribe(() => this.updateButton()); this.updateButton(); } async updateButton() { if (!this.button) return; const activeAction = (await this.isActive()) ? 'add' : 'remove'; this.button.nativeElement.classList[activeAction]('tip-active'); if (await this.can() && this.isEditable()) { this.button.nativeElement.removeAttribute('disabled'); } else { this.button.nativeElement.setAttribute('disabled', 'true'); } } } ButtonBaseControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ButtonBaseControl, deps: null, target: i0.ɵɵFactoryTarget.Directive }); ButtonBaseControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: ButtonBaseControl, viewQueries: [{ propertyName: "button", first: true, predicate: ["button"], descendants: true }], usesInheritance: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: ButtonBaseControl, decorators: [{ type: Directive }], propDecorators: { button: [{ type: ViewChild, args: ['button'] }] } }); // tslint:disable-next-line:directive-class-suffix export class SelectBaseControl extends ExtendedBaseControl { ngOnInit() { this.eventService.update$.pipe(takeUntil(this.destroy$)).subscribe(() => { this.updateSelectValue(); this.updateDisabledValue(); }); } ngAfterViewInit() { if (!isDevMode() && !this.select) { console.warn(`The select element in your control could not be found in ${this.constructor.name}\nPlease make sure you have a tip-select in your component`); } } setEditor(editor) { super.setEditor(editor); this.updateSelectValue(); this.updateDisabledValue(); } async updateSelectValue() { this.select.value = await this.currentActive(); } async updateDisabledValue() { const optionsList = this.options.toArray(); for (const [index, param] of this.canStyleParams.entries()) { const option = optionsList[index]; if (!option) continue; option.disabled = !(await this.canStyle(param) && this.isEditable()); } } } SelectBaseControl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: SelectBaseControl, deps: null, target: i0.ɵɵFactoryTarget.Directive }); SelectBaseControl.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.1.1", type: SelectBaseControl, viewQueries: [{ propertyName: "select", first: true, predicate: SelectComponent, descendants: true }, { propertyName: "options", predicate: OptionComponent, descendants: true }], usesInheritance: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: SelectBaseControl, decorators: [{ type: Directive }], propDecorators: { select: [{ type: ViewChild, args: [SelectComponent] }], options: [{ type: ViewChildren, args: [OptionComponent] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRpcHRhcC1lZGl0b3Ivc3JjL2xpYi9jb21wb25lbnRzL2NvbnRyb2xzL2Jhc2UtY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUVULFNBQVMsRUFJVCxTQUFTLEVBQ1QsWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFROUUsTUFBTSxPQUFnQixXQUFXO0lBQWpDO1FBQ1UsWUFBTyxHQUFrQixJQUFJLENBQUM7SUFVeEMsQ0FBQztJQVJDLElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRU0sU0FBUyxDQUFDLE1BQWM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELENBQUM7Q0FDRjtBQUlELGtEQUFrRDtBQUNsRCxNQUFNLE9BQWdCLG1CQUFvQixTQUFRLFdBQVc7SUFGN0Q7O1FBR1ksYUFBUSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7S0FnQjdDO0lBZFEsV0FBVztRQUNoQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTSxTQUFT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QUFXLENBQUMsSUFBSSw0REFBNEQsQ0FBQyxDQUFDO1NBQzdKO0lBQ0gsQ0FBQztJQUVNLFNBQVMsQ0FBQyxNQUFjO1FBQzdCLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDN0IsQ0FBQztJQU1PLEtBQUssQ0FBQyxpQkFBaUI7UUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUI7UUFDL0IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMxRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE1BQU07Z0JBQUUsU0FBUztZQUV0QixNQUFNLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDdEU7SUFDSCxDQUFDOzs4R0E1Q21CLGlCQUFpQjtrR0FBakIsaUJBQWlCLGtFQUkxQixlQUFlLDZEQUNaLGVBQWU7MkZBTFQsaUJBQWlCO2tCQUZ0QyxTQUFTOzhCQU04QixNQUFNO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWU7Z0JBQ2UsT0FBTztzQkFBL0MsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBpc0Rldk1vZGUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBRdWVyeUxpc3QsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBFZGl0b3IgfSBmcm9tICdAdGlwdGFwL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZnJvbUVkaXRvckV2ZW50IH0gZnJvbSAnLi4vLi4vaGVscGVycyc7XG5pbXBvcnQgeyBFZGl0b3JFdmVudCB9IGZyb20gJy4uLy4uL21vZGVscy90eXBlcyc7XG5pbXBvcnQgeyBUaXB0YXBFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aXB0YXAtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBPcHRpb25Db21wb25lbnQsIFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3NlbGVjdC9zZWxlY3QuY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29udHJvbCB7XG4gIG9uRWRpdG9yUmVhZHk/KGVkaXRvcjogRWRpdG9yKTogdm9pZDtcblxuICBvbkVkaXRvckRlc3Ryb3k/KCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udHJvbCB7XG4gIHByaXZhdGUgX2VkaXRvcjogRWRpdG9yIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIGdldCBlZGl0b3IoKTogRWRpdG9yIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRFZGl0b3IoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLl9lZGl0b3IgPSBlZGl0b3I7XG4gICAgdGhpcy5vbkVkaXRvclJlYWR5ICYmIHRoaXMub25FZGl0b3JSZWFkeShlZGl0b3IpO1xuICB9XG59XG5cblxuQERpcmVjdGl2ZSgpXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6ZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEV4dGVuZGVkQmFzZUNvbnRyb2wgZXh0ZW5kcyBCYXNlQ29udHJvbCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0RWRpdG9yKGVkaXRvcjogRWRpdG9yKTogdm9pZCB7XG4gICAgc3VwZXIuc2V0RWRpdG9yKGVkaXRvcik7XG4gICAgZnJvbUVkaXRvckV2ZW50KGVkaXRvciwgJ2Rlc3Ryb3knLCB0cnVlKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkVkaXRvckRlc3Ryb3kgJiYgdGhpcy5vbkVkaXRvckRlc3Ryb3koKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNFZGl0YWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLmVkaXRvcj8uaXNFZGl0YWJsZTtcbiAgfVxufVxuXG5ARGlyZWN0aXZlKClcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtY2xhc3Mtc3VmZml4XG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnV0dG9uQmFzZUNvbnRyb2wgZXh0ZW5kcyBFeHRlbmRlZEJhc2VDb250cm9sIGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZCgnYnV0dG9uJykgcHJvdGVjdGVkIGJ1dHRvbjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCB1bmRlZmluZWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGV2ZW50U2VydmljZTogVGlwdGFwRXZlbnRTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdXBkYXRlRXZlbnQ6IEVkaXRvckV2ZW50ID0gJ3RyYW5zYWN0aW9uJztcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5idXR0b24gJiYgaXNEZXZNb2RlKCkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgVGhlIGJ1dHRvbiBlbGVtZW50IGluIHlvdXIgY29udHJvbCBjb3VsZCBub3QgYmUgZm91bmQgaW4gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9XFxuUGxlYXNlIGFkZCAjYnV0dG9uIHRvIHlvdXIgY29udHJvbCBidXR0b24gZWxlbWVudGApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRFZGl0b3IoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTtcbiAgICBmcm9tRWRpdG9yRXZlbnQoZWRpdG9yLCB0aGlzLnVwZGF0ZUV2ZW50KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVCdXR0b24oKSk7XG4gICAgdGhpcy51cGRhdGVCdXR0b24oKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBpc0FjdGl2ZSguLi5hcmdzOiBhbnkpOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2FuKC4uLmFyZ3M6IGFueSk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQnV0dG9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5idXR0b24pIHJldHVybjtcblxuICAgIGNvbnN0IGFjdGl2ZUFjdGlvbiA9IChhd2FpdCB0aGlzLmlzQWN0aXZlKCkpID8gJ2FkZCcgOiAncmVtb3ZlJztcbiAgICB0aGlzLmJ1dHRvbi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdFthY3RpdmVBY3Rpb25dKCd0aXAtYWN0aXZlJyk7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5jYW4oKSAmJiB0aGlzLmlzRWRpdGFibGUoKSkge1xuICAgICAgdGhpcy5idXR0b24ubmF0aXZlRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnV0dG9uLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoKVxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmRpcmVjdGl2ZS1jbGFzcy1zdWZmaXhcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTZWxlY3RCYXNlQ29udHJvbCBleHRlbmRzIEV4dGVuZGVkQmFzZUNvbnRyb2wgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHByb3RlY3RlZCBhYnN0cmFjdCBldmVudFNlcnZpY2U6IFRpcHRhcEV2ZW50U2VydmljZTtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNhblN0eWxlUGFyYW1zOiBhbnlbXTtcblxuICBAVmlld0NoaWxkKFNlbGVjdENvbXBvbmVudCkgcHJvdGVjdGVkIHNlbGVjdCE6IFNlbGVjdENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZHJlbihPcHRpb25Db21wb25lbnQpIHByb3RlY3RlZCBvcHRpb25zITogUXVlcnlMaXN0PE9wdGlvbkNvbXBvbmVudD47XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnVwZGF0ZSQucGlwZShcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlU2VsZWN0VmFsdWUoKTtcbiAgICAgIHRoaXMudXBkYXRlRGlzYWJsZWRWYWx1ZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIWlzRGV2TW9kZSgpICYmICF0aGlzLnNlbGVjdCkge1xuICAgICAgY29uc29sZS53YXJuKGBUaGUgc2VsZWN0IGVsZW1lbnQgaW4geW91ciBjb250cm9sIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX1cXG5QbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGEgdGlwLXNlbGVjdCBpbiB5b3VyIGNvbXBvbmVudGApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRFZGl0b3IoZWRpdG9yOiBFZGl0b3IpOiB2b2lkIHtcbiAgICBzdXBlci5zZXRFZGl0b3IoZWRpdG9yKTtcbiAgICB0aGlzLnVwZGF0ZVNlbGVjdFZhbHVlKCk7XG4gICAgdGhpcy51cGRhdGVEaXNhYmxlZFZhbHVlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2FuU3R5bGUoLi4uYXJnczogYW55W10pOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3VycmVudEFjdGl2ZSgpOiBhbnkgfCBQcm9taXNlPGFueT47XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVTZWxlY3RWYWx1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNlbGVjdC52YWx1ZSA9IGF3YWl0IHRoaXMuY3VycmVudEFjdGl2ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVEaXNhYmxlZFZhbHVlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9wdGlvbnNMaXN0ID0gdGhpcy5vcHRpb25zLnRvQXJyYXkoKTtcbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGFyYW1dIG9mIHRoaXMuY2FuU3R5bGVQYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zTGlzdFtpbmRleF07XG4gICAgICBpZiAoIW9wdGlvbikgY29udGludWU7XG5cbiAgICAgIG9wdGlvbi5kaXNhYmxlZCA9ICEoYXdhaXQgdGhpcy5jYW5TdHlsZShwYXJhbSkgJiYgdGhpcy5pc0VkaXRhYmxlKCkpO1xuICAgIH1cbiAgfVxufVxuIl19