ngx-typed-js
Version:
An Angular integration for [Typed.js](https://github.com/mattboldt/typed.js/).
161 lines • 19.2 kB
JavaScript
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=