UNPKG

ngx-typed-js

Version:

An Angular integration for [Typed.js](https://github.com/mattboldt/typed.js/).

161 lines 19.2 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import Typed from 'typed.js'; import * as i0 from "@angular/core"; export class NgxTypedJsComponent { constructor() { this.typeSpeed = 30; this.completed = new EventEmitter(); this.preStringTyped = new EventEmitter(); this.stringTyped = new EventEmitter(); this.lastStringBackspaced = new EventEmitter(); this.typingPaused = new EventEmitter(); this.typingResumed = new EventEmitter(); this.reset = new EventEmitter(); this.stopped = new EventEmitter(); this.started = new EventEmitter(); this.destroyed = new EventEmitter(); } ngAfterViewInit() { this.typed = new Typed(this.content.nativeElement.querySelector('.typing'), this.options); if (this.showCursor !== false) { this.updateCursorStyle(); } } toggle() { this.typed.toggle(); } stop() { this.typed.stop(); } start() { this.typed.start(); } destroy() { this.typed.destroy(); } doReset(restart) { this.typed.reset(restart); } get options() { const emit = (emitter) => () => emitter.emit(); const emitIndex = (emitter) => (index) => emitter.emit(index); const opts = { strings: this.strings ?? [''], stringsElement: this.stringsElement, typeSpeed: this.typeSpeed, startDelay: this.startDelay, backSpeed: this.backSpeed, smartBackspace: this.smartBackspace, shuffle: this.shuffle, backDelay: this.backDelay, fadeOut: this.fadeOut, fadeOutClass: this.fadeOutClass, fadeOutDelay: this.fadeOutDelay, loop: this.loop, loopCount: this.loopCount, showCursor: this.showCursor, autoInsertCss: this.autoInsertCss, attr: this.attr, bindInputFocusEvents: this.bindInputFocusEvents, contentType: this.contentType, onComplete: emit(this.completed), preStringTyped: emitIndex(this.preStringTyped), onStringTyped: emitIndex(this.stringTyped), onLastStringBackspaced: emit(this.lastStringBackspaced), onTypingPaused: emitIndex(this.typingPaused), onTypingResumed: emitIndex(this.typingResumed), onReset: emit(this.reset), onStop: emitIndex(this.stopped), onStart: emitIndex(this.started), onDestroy: emit(this.destroyed), }; Object.keys(opts).forEach(key => { if (opts[key] === undefined) { delete opts[key]; } }); return opts; } updateCursorStyle() { const textElementStyle = getComputedStyle(this.content.nativeElement.querySelector('.typing')); const cursorElementStyle = this.content.nativeElement.querySelector('.typed-cursor').style; cursorElementStyle.fontSize = textElementStyle.fontSize; cursorElementStyle.color = this.cursorColor || textElementStyle.color; } ngOnChanges(changes) { if (this.typed) { this.typed.destroy(); this.ngAfterViewInit(); } } } NgxTypedJsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxTypedJsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); NgxTypedJsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: NgxTypedJsComponent, selector: "ngx-typed-js", inputs: { cursorColor: "cursorColor", strings: "strings", stringsElement: "stringsElement", typeSpeed: "typeSpeed", startDelay: "startDelay", backSpeed: "backSpeed", smartBackspace: "smartBackspace", shuffle: "shuffle", backDelay: "backDelay", fadeOut: "fadeOut", fadeOutClass: "fadeOutClass", fadeOutDelay: "fadeOutDelay", loop: "loop", loopCount: "loopCount", showCursor: "showCursor", cursorChar: "cursorChar", autoInsertCss: "autoInsertCss", attr: "attr", bindInputFocusEvents: "bindInputFocusEvents", contentType: "contentType" }, outputs: { completed: "completed", preStringTyped: "preStringTyped", stringTyped: "stringTyped", lastStringBackspaced: "lastStringBackspaced", typingPaused: "typingPaused", typingResumed: "typingResumed", reset: "reset", stopped: "stopped", started: "started", destroyed: "destroyed" }, viewQueries: [{ propertyName: "content", first: true, predicate: ["wrapper"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #wrapper>\n <ng-content></ng-content>\n</div>\n", styles: [":host>.typing{display:inline}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: NgxTypedJsComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-typed-js', template: "<div #wrapper>\n <ng-content></ng-content>\n</div>\n", styles: [":host>.typing{display:inline}\n"] }] }], propDecorators: { cursorColor: [{ type: Input }], strings: [{ type: Input }], stringsElement: [{ type: Input }], typeSpeed: [{ type: Input }], startDelay: [{ type: Input }], backSpeed: [{ type: Input }], smartBackspace: [{ type: Input }], shuffle: [{ type: Input }], backDelay: [{ type: Input }], fadeOut: [{ type: Input }], fadeOutClass: [{ type: Input }], fadeOutDelay: [{ type: Input }], loop: [{ type: Input }], loopCount: [{ type: Input }], showCursor: [{ type: Input }], cursorChar: [{ type: Input }], autoInsertCss: [{ type: Input }], attr: [{ type: Input }], bindInputFocusEvents: [{ type: Input }], contentType: [{ type: Input }], completed: [{ type: Output }], preStringTyped: [{ type: Output }], stringTyped: [{ type: Output }], lastStringBackspaced: [{ type: Output }], typingPaused: [{ type: Output }], typingResumed: [{ type: Output }], reset: [{ type: Output }], stopped: [{ type: Output }], started: [{ type: Output }], destroyed: [{ type: Output }], content: [{ type: ViewChild, args: ['wrapper', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXR5cGVkLWpzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC10eXBlZC1qcy9zcmMvbGliL25neC10eXBlZC1qcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdHlwZWQtanMvc3JjL2xpYi9uZ3gtdHlwZWQtanMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzSCxPQUFPLEtBQXVCLE1BQU0sVUFBVSxDQUFDOztBQU8vQyxNQUFNLE9BQU8sbUJBQW1CO0lBTGhDO1FBVWtCLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFrQmIsY0FBUyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3pELG1CQUFjLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbEUsZ0JBQVcsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMvRCx5QkFBb0IsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUNwRSxpQkFBWSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ2hFLGtCQUFhLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDakUsVUFBSyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JELFlBQU8sR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUMzRCxZQUFPLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDM0QsY0FBUyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO0tBaUc1RTtJQTVGQyxlQUFlO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUNu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LEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUVZLFNBQVM7c0JBQTFCLE1BQU07Z0JBQ1csY0FBYztzQkFBL0IsTUFBTTtnQkFDVyxXQUFXO3NCQUE1QixNQUFNO2dCQUNXLG9CQUFvQjtzQkFBckMsTUFBTTtnQkFDVyxZQUFZO3NCQUE3QixNQUFNO2dCQUNXLGFBQWE7c0JBQTlCLE1BQU07Z0JBQ1csS0FBSztzQkFBdEIsTUFBTTtnQkFDVyxPQUFPO3NCQUF4QixNQUFNO2dCQUNXLE9BQU87c0JBQXhCLE1BQU07Z0JBQ1csU0FBUztzQkFBMUIsTUFBTTtnQkFHeUMsT0FBTztzQkFBdEQsU0FBUzt1QkFBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgVHlwZWQsIHsgVHlwZWRPcHRpb25zIH0gZnJvbSAndHlwZWQuanMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtdHlwZWQtanMnLFxuICB0ZW1wbGF0ZVVybDogJ25neC10eXBlZC1qcy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWyduZ3gtdHlwZWQtanMuY29tcG9uZW50LmNzcyddXG59KVxuZXhwb3J0IGNsYXNzIE5neFR5cGVkSnNDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBwdWJsaWMgY3Vyc29yQ29sb3I/OiBzdHJpbmc7XG5cbiAgQElucHV0KCkgcHVibGljIHN0cmluZ3M6IHN0cmluZ1tdO1xuICBASW5wdXQoKSBwdWJsaWMgc3RyaW5nc0VsZW1lbnQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyB0eXBlU3BlZWQgPSAzMDtcbiAgQElucHV0KCkgcHVibGljIHN0YXJ0RGVsYXk/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBiYWNrU3BlZWQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBzbWFydEJhY2tzcGFjZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBzaHVmZmxlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGJhY2tEZWxheT86IG51bWJlcjtcbiAgQElucHV0KCkgcHVibGljIGZhZGVPdXQ/OiBib29sZWFuO1xuICBASW5wdXQoKSBwdWJsaWMgZmFkZU91dENsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgZmFkZU91dERlbGF5PzogbnVtYmVyO1xuICBASW5wdXQoKSBwdWJsaWMgbG9vcD86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBsb29wQ291bnQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93Q3Vyc29yPzogYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGN1cnNvckNoYXI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBhdXRvSW5zZXJ0Q3NzPzogYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGF0dHI/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBiaW5kSW5wdXRGb2N1c0V2ZW50cz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50VHlwZT86IHN0cmluZztcblxuICBAT3V0cHV0KCkgcHJpdmF0ZSBjb21wbGV0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIHByaXZhdGUgcHJlU3RyaW5nVHlwZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIHN0cmluZ1R5cGVkOiBFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgcHJpdmF0ZSBsYXN0U3RyaW5nQmFja3NwYWNlZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcHJpdmF0ZSB0eXBpbmdQYXVzZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIHR5cGluZ1Jlc3VtZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIHJlc2V0OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIHN0b3BwZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIHN0YXJ0ZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBwcml2YXRlIGRlc3Ryb3llZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHByaXZhdGUgdHlwZWQ6IFR5cGVkO1xuICBAVmlld0NoaWxkKCd3cmFwcGVyJywgeyBzdGF0aWM6IHRydWUgfSkgcHJpdmF0ZSBjb250ZW50O1xuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGVkID0gbmV3IFR5cGVkKFxuICAgICAgdGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnR5cGluZycpLFxuICAgICAgdGhpcy5vcHRpb25zLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5zaG93Q3Vyc29yICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy51cGRhdGVDdXJzb3JTdHlsZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy50eXBlZC50b2dnbGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzdG9wKCk6IHZvaWQge1xuICAgIHRoaXMudHlwZWQuc3RvcCgpO1xuICB9XG5cbiAgcHVibGljIHN0YXJ0KCk6IHZvaWQge1xuICAgIHRoaXMudHlwZWQuc3RhcnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBkZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudHlwZWQuZGVzdHJveSgpO1xuICB9XG5cbiAgcHVibGljIGRvUmVzZXQocmVzdGFydD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnR5cGVkLnJlc2V0KHJlc3RhcnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgb3B0aW9ucygpOiBUeXBlZE9wdGlvbnMge1xuICAgIGNvbnN0IGVtaXQ6IChlbWl0dGVyOiBFdmVudEVtaXR0ZXI8dm9pZD4pID0+IChzZWxmOiBUeXBlZCkgPT4gdm9pZFxuICAgICAgPSAoZW1pdHRlcjogRXZlbnRFbWl0dGVyPHZvaWQ+KSA9PiAoKSA9PiBlbWl0dGVyLmVtaXQoKTtcblxuICAgIGNvbnN0IGVtaXRJbmRleDogKGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+KSA9PiAoaW5kZXg6IG51bWJlciwgc2VsZjogVHlwZWQpID0+IHZvaWRcbiAgICAgID0gKGVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxudW1iZXI+KSA9PiAoaW5kZXg6IG51bWJlcikgPT4gZW1pdHRlci5lbWl0KGluZGV4KTtcblxuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICBzdHJpbmdzOiB0aGlzLnN0cmluZ3MgPz8gWycnXSxcbiAgICAgIHN0cmluZ3NFbGVtZW50OiB0aGlzLnN0cmluZ3NFbGVtZW50LFxuICAgICAgdHlwZVNwZWVkOiB0aGlzLnR5cGVTcGVlZCxcbiAgICAgIHN0YXJ0RGVsYXk6IHRoaXMuc3RhcnREZWxheSxcbiAgICAgIGJhY2tTcGVlZDogdGhpcy5iYWNrU3BlZWQsXG4gICAgICBzbWFydEJhY2tzcGFjZTogdGhpcy5zbWFydEJhY2tzcGFjZSxcbiAgICAgIHNodWZmbGU6IHRoaXMuc2h1ZmZsZSxcbiAgICAgIGJhY2tEZWxheTogdGhpcy5iYWNrRGVsYXksXG4gICAgICBmYWRlT3V0OiB0aGlzLmZhZGVPdXQsXG4gICAgICBmYWRlT3V0Q2xhc3M6IHRoaXMuZmFkZU91dENsYXNzLFxuICAgICAgZmFkZU91dERlbGF5OiB0aGlzLmZhZGVPdXREZWxheSxcbiAgICAgIGxvb3A6IHRoaXMubG9vcCxcbiAgICAgIGxvb3BDb3VudDogdGhpcy5sb29wQ291bnQsXG4gICAgICBzaG93Q3Vyc29yOiB0aGlzLnNob3dDdXJzb3IsXG4gICAgICBhdXRvSW5zZXJ0Q3NzOiB0aGlzLmF1dG9JbnNlcnRDc3MsXG4gICAgICBhdHRyOiB0aGlzLmF0dHIsXG4gICAgICBiaW5kSW5wdXRGb2N1c0V2ZW50czogdGhpcy5iaW5kSW5wdXRGb2N1c0V2ZW50cyxcbiAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnRUeXBlLFxuICAgICAgb25Db21wbGV0ZTogZW1pdCh0aGlzLmNvbXBsZXRlZCksXG4gICAgICBwcmVTdHJpbmdUeXBlZDogZW1pdEluZGV4KHRoaXMucHJlU3RyaW5nVHlwZWQpLFxuICAgICAgb25TdHJpbmdUeXBlZDogZW1pdEluZGV4KHRoaXMuc3RyaW5nVHlwZWQpLFxuICAgICAgb25MYXN0U3RyaW5nQmFja3NwYWNlZDogZW1pdCh0aGlzLmxhc3RTdHJpbmdCYWNrc3BhY2VkKSxcbiAgICAgIG9uVHlwaW5nUGF1c2VkOiBlbWl0SW5kZXgodGhpcy50eXBpbmdQYXVzZWQpLFxuICAgICAgb25UeXBpbmdSZXN1bWVkOiBlbWl0SW5kZXgodGhpcy50eXBpbmdSZXN1bWVkKSxcbiAgICAgIG9uUmVzZXQ6IGVtaXQodGhpcy5yZXNldCksXG4gICAgICBvblN0b3A6IGVtaXRJbmRleCh0aGlzLnN0b3BwZWQpLFxuICAgICAgb25TdGFydDogZW1pdEluZGV4KHRoaXMuc3RhcnRlZCksXG4gICAgICBvbkRlc3Ryb3k6IGVtaXQodGhpcy5kZXN0cm95ZWQpLFxuICAgIH0gYXMgVHlwZWRPcHRpb25zO1xuXG4gICAgT2JqZWN0LmtleXMob3B0cykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYgKG9wdHNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRlbGV0ZSBvcHRzW2tleV07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb3B0cztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ3Vyc29yU3R5bGUoKTogdm9pZCB7XG4gICAgY29uc3QgdGV4dEVsZW1lbnRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnR5cGluZycpKTtcbiAgICBjb25zdCBjdXJzb3JFbGVtZW50U3R5bGUgPSB0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudHlwZWQtY3Vyc29yJykuc3R5bGU7XG5cbiAgICBjdXJzb3JFbGVtZW50U3R5bGUuZm9udFNpemUgPSB0ZXh0RWxlbWVudFN0eWxlLmZvbnRTaXplO1xuICAgIGN1cnNvckVsZW1lbnRTdHlsZS5jb2xvciA9IHRoaXMuY3Vyc29yQ29sb3IgfHwgdGV4dEVsZW1lbnRTdHlsZS5jb2xvcjtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50eXBlZCkge1xuICAgICAgdGhpcy50eXBlZC5kZXN0cm95KCk7XG4gICAgICB0aGlzLm5nQWZ0ZXJWaWV3SW5pdCgpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiAjd3JhcHBlcj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG4iXX0=