UNPKG

angular-l10n

Version:

Angular library to translate texts, dates and numbers

165 lines 21.3 kB
import { Directive, Input, ElementRef, Renderer2, inject } from '@angular/core'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { getTargetNode } from './bfs'; import { L10nTranslationService } from '../services/l10n-translation.service'; import * as i0 from "@angular/core"; export class L10nDirective { constructor() { this.el = inject(ElementRef); this.renderer = inject(Renderer2); this.translation = inject(L10nTranslationService); this.attributes = []; this.destroy = new Subject(); } set innerHTML(content) { // Handle TrustedHTML this.content = content.toString(); } ngAfterViewInit() { if (this.el && this.el.nativeElement) { this.element = this.el.nativeElement; this.renderNode = getTargetNode(this.el.nativeElement); this.text = this.getText(); this.attributes = this.getAttributes(); this.addTextListener(); if (this.language) { this.replaceText(); this.replaceAttributes(); } else { this.addTranslationListener(); } } } ngOnChanges() { if (this.text) { if (this.nodeValue == null || this.nodeValue === '') { if (this.value) { this.text = this.value; } else if (this.content) { this.text = this.content; } } this.replaceText(); } if (this.attributes && this.attributes.length > 0) { this.replaceAttributes(); } } ngOnDestroy() { this.destroy.next(true); this.removeTextListener(); } getText() { let text = ''; if (this.element && this.element.childNodes.length > 0) { text = this.getNodeValue(); } else if (this.value) { text = this.value; } else if (this.content) { text = this.content; } return text; } getNodeValue() { this.nodeValue = this.renderNode != null && this.renderNode.nodeValue != null ? this.renderNode.nodeValue : ''; return this.nodeValue ? this.nodeValue.trim() : ''; } getAttributes() { const attributes = []; if (this.element && this.element.attributes) { for (const attr of Array.from(this.element.attributes)) { if (attr && attr.name) { const [, name = ''] = attr.name.match(/^l10n-(.+)$/) || []; if (name) { const targetAttr = Array.from(this.element.attributes).find(a => a.name === name); if (targetAttr) attributes.push({ name: targetAttr.name, value: targetAttr.value }); } } } } return attributes; } addTextListener() { if (typeof MutationObserver !== 'undefined') { this.textObserver = new MutationObserver(() => { if (this.element) { this.renderNode = getTargetNode(this.element); this.text = this.getText(); this.replaceText(); } }); if (this.renderNode) { this.textObserver.observe(this.renderNode, { subtree: true, characterData: true }); } } } removeTextListener() { if (this.textObserver) { this.textObserver.disconnect(); } } addTranslationListener() { this.translation.onChange().pipe(takeUntil(this.destroy)).subscribe({ next: () => { this.replaceText(); this.replaceAttributes(); } }); } replaceText() { if (this.text) { this.setText(this.getValue(this.text)); } } replaceAttributes() { if (this.attributes.length > 0) { this.setAttributes(this.getAttributesValues()); } } setText(value) { if (value) { if (this.nodeValue && this.text) { this.removeTextListener(); this.renderer.setValue(this.renderNode, this.nodeValue.replace(this.text, value)); this.addTextListener(); } else if (this.value) { this.renderer.setAttribute(this.element, 'value', value); } else if (this.content) { this.renderer.setProperty(this.element, 'innerHTML', value); } } } setAttributes(data) { for (const attr of this.attributes) { this.renderer.setAttribute(this.element, attr.name, data[attr.value]); } } getAttributesValues() { const values = this.attributes.map(attr => attr.value); const data = {}; for (const value of values) { data[value] = this.getValue(value); } return data; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: L10nDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.4", type: L10nDirective, inputs: { value: "value", innerHTML: "innerHTML", language: "language" }, usesOnChanges: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.4", ngImport: i0, type: L10nDirective, decorators: [{ type: Directive }], propDecorators: { value: [{ type: Input }], innerHTML: [{ type: Input }], language: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibDEwbi1kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWwxMG4vc3JjL2xpYi9tb2RlbHMvbDEwbi1kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXVDLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDdEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7O0FBRzlFLE1BQU0sT0FBZ0IsYUFBYTtJQURuQztRQVljLE9BQUUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEIsYUFBUSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QixnQkFBVyxHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBSy9DLGVBQVUsR0FBVSxFQUFFLENBQUM7UUFRdkIsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7S0FrSjVDO0lBeEtHLElBQWEsU0FBUyxDQUFDLE9BQVk7UUFDL0IscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFxQk0sZUFBZTtRQUNsQixJQUFJLElBQUksQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUU7WUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxHQUFHLGFBQWEsQ0FB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TyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUM1RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO2FBQy9EO1NBQ0o7SUFDTCxDQUFDO0lBRU8sYUFBYSxDQUFDLElBQVM7UUFDM0IsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2hDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDekU7SUFDTCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3ZCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sSUFBSSxHQUFRLEVBQUUsQ0FBQztRQUNyQixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7OEdBMUtpQixhQUFhO2tHQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBRGxDLFNBQVM7OEJBR1UsS0FBSztzQkFBcEIsS0FBSztnQkFFTyxTQUFTO3NCQUFyQixLQUFLO2dCQUtVLFFBQVE7c0JBQXZCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBnZXRUYXJnZXROb2RlIH0gZnJvbSAnLi9iZnMnO1xyXG5pbXBvcnQgeyBMMTBuVHJhbnNsYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbDEwbi10cmFuc2xhdGlvbi5zZXJ2aWNlJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTDEwbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgdmFsdWU/OiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgc2V0IGlubmVySFRNTChjb250ZW50OiBhbnkpIHtcclxuICAgICAgICAvLyBIYW5kbGUgVHJ1c3RlZEhUTUxcclxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50LnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGxhbmd1YWdlPzogc3RyaW5nO1xyXG5cclxuICAgIHByb3RlY3RlZCBlbCA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICAgIHByb3RlY3RlZCByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xyXG4gICAgcHJvdGVjdGVkIHRyYW5zbGF0aW9uID0gaW5qZWN0KEwxMG5UcmFuc2xhdGlvblNlcnZpY2UpO1xyXG5cclxuICAgIHByaXZhdGUgY29udGVudD86IHN0cmluZztcclxuXHJcbiAgICBwcml2YXRlIHRleHQ/OiBzdHJpbmc7XHJcbiAgICBwcml2YXRlIGF0dHJpYnV0ZXM6IGFueVtdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBlbGVtZW50PzogSFRNTEVsZW1lbnQ7XHJcbiAgICBwcml2YXRlIHJlbmRlck5vZGU/OiBIVE1MRWxlbWVudDtcclxuICAgIHByaXZhdGUgbm9kZVZhbHVlPzogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgdGV4dE9ic2VydmVyPzogTXV0YXRpb25PYnNlcnZlcjtcclxuXHJcbiAgICBwcml2YXRlIGRlc3Ryb3kgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuZWwgJiYgdGhpcy5lbC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuZWwubmF0aXZlRWxlbWVudDtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJOb2RlID0gZ2V0VGFyZ2V0Tm9kZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLmdldFRleHQoKTtcclxuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkVGV4dExpc3RlbmVyKCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlVGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQXR0cmlidXRlcygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUcmFuc2xhdGlvbkxpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnRleHQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMubm9kZVZhbHVlID09IG51bGwgfHwgdGhpcy5ub2RlVmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGV4dCA9IHRoaXMuY29udGVudDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnJlcGxhY2VUZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgJiYgdGhpcy5hdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5yZXBsYWNlQXR0cmlidXRlcygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5yZW1vdmVUZXh0TGlzdGVuZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0VmFsdWUodGV4dDogc3RyaW5nKTogc3RyaW5nO1xyXG5cclxuICAgIHByaXZhdGUgZ2V0VGV4dCgpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRleHQgPSB0aGlzLmdldE5vZGVWYWx1ZSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy52YWx1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCkge1xyXG4gICAgICAgICAgICB0ZXh0ID0gdGhpcy5jb250ZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE5vZGVWYWx1ZSgpOiBzdHJpbmcge1xyXG4gICAgICAgIHRoaXMubm9kZVZhbHVlID0gdGhpcy5yZW5kZXJOb2RlICE9IG51bGwgJiYgdGhpcy5yZW5kZXJOb2RlLm5vZGVWYWx1ZSAhPSBudWxsID8gdGhpcy5yZW5kZXJOb2RlLm5vZGVWYWx1ZSA6ICcnO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm5vZGVWYWx1ZSA/IHRoaXMubm9kZVZhbHVlLnRyaW0oKSA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0QXR0cmlidXRlcygpOiBhbnlbXSB7XHJcbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogYW55W10gPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5lbGVtZW50ICYmIHRoaXMuZWxlbWVudC5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBBcnJheS5mcm9tKHRoaXMuZWxlbWVudC5hdHRyaWJ1dGVzKSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGF0dHIgJiYgYXR0ci5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgbmFtZSA9ICcnXSA9IGF0dHIubmFtZS5tYXRjaCgvXmwxMG4tKC4rKSQvKSB8fCBbXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRBdHRyID0gQXJyYXkuZnJvbSh0aGlzLmVsZW1lbnQuYXR0cmlidXRlcykuZmluZChhID0+IGEubmFtZSA9PT0gbmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXRBdHRyKSBhdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiB0YXJnZXRBdHRyLm5hbWUsIHZhbHVlOiB0YXJnZXRBdHRyLnZhbHVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFRleHRMaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMudGV4dE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTm9kZSA9IGdldFRhcmdldE5vZGUodGhpcy5lbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0aGlzLmdldFRleHQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VUZXh0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZW5kZXJOb2RlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRPYnNlcnZlci5vYnNlcnZlKHRoaXMucmVuZGVyTm9kZSwgeyBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVtb3ZlVGV4dExpc3RlbmVyKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnRleHRPYnNlcnZlcikge1xyXG4gICAgICAgICAgICB0aGlzLnRleHRPYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkVHJhbnNsYXRpb25MaXN0ZW5lcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnRyYW5zbGF0aW9uLm9uQ2hhbmdlKCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95KSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlVGV4dCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlQXR0cmlidXRlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXBsYWNlVGV4dCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0VGV4dCh0aGlzLmdldFZhbHVlKHRoaXMudGV4dCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlcGxhY2VBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZXModGhpcy5nZXRBdHRyaWJ1dGVzVmFsdWVzKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldFRleHQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5ub2RlVmFsdWUgJiYgdGhpcy50ZXh0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZVRleHRMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRWYWx1ZSh0aGlzLnJlbmRlck5vZGUsIHRoaXMubm9kZVZhbHVlLnJlcGxhY2UodGhpcy50ZXh0LCB2YWx1ZSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRUZXh0TGlzdGVuZXIoKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEF0dHJpYnV0ZSh0aGlzLmVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5lbGVtZW50LCAnaW5uZXJIVE1MJywgdmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0QXR0cmlidXRlcyhkYXRhOiBhbnkpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgdGhpcy5hdHRyaWJ1dGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgYXR0ci5uYW1lLCBkYXRhW2F0dHIudmFsdWVdKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBdHRyaWJ1dGVzVmFsdWVzKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5hdHRyaWJ1dGVzLm1hcChhdHRyID0+IGF0dHIudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHt9O1xyXG4gICAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGRhdGFbdmFsdWVdID0gdGhpcy5nZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=