angular2-tinymce
Version:
Angular component for TinyMCE MCE WYSIWYG editor
421 lines (413 loc) • 34.3 kB
JavaScript
import { Injectable, NgModule, Component, forwardRef, NgZone, Inject, Input, EventEmitter, Output, defineInjectable } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import 'tinymce/tinymce.min';
import 'tinymce/themes/modern/theme';
import 'tinymce/plugins/link/plugin.js';
import 'tinymce/plugins/paste/plugin.js';
import 'tinymce/plugins/table/plugin.js';
import 'tinymce/plugins/advlist/plugin.js';
import 'tinymce/plugins/autoresize/plugin.js';
import 'tinymce/plugins/lists/plugin.js';
import 'tinymce/plugins/code/plugin.js';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var Angular2TinymceLibService = /** @class */ (function () {
function Angular2TinymceLibService() {
}
Angular2TinymceLibService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
Angular2TinymceLibService.ctorParameters = function () { return []; };
/** @nocollapse */ Angular2TinymceLibService.ngInjectableDef = defineInjectable({ factory: function Angular2TinymceLibService_Factory() { return new Angular2TinymceLibService(); }, token: Angular2TinymceLibService, providedIn: "root" });
return Angular2TinymceLibService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var TinymceDefaultOptions = /** @class */ (function () {
function TinymceDefaultOptions() {
this.plugins = [
'link',
'paste',
'table',
'advlist',
'autoresize',
'lists',
'code'
];
this.skin_url = '/assets/tinymce/skins/lightgray';
this.baseURL = '/assets/tinymce';
this.auto_focus = true;
}
return TinymceDefaultOptions;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/** @type {?} */
var noop = function () {
};
var TinymceComponent = /** @class */ (function () {
function TinymceComponent(zone, globalOptions) {
this.zone = zone;
this.globalOptions = globalOptions;
this.click = new EventEmitter();
this.dblclick = new EventEmitter();
this.mousedown = new EventEmitter();
this.mouseup = new EventEmitter();
this.mousemove = new EventEmitter();
this.mouseover = new EventEmitter();
this.mouseout = new EventEmitter();
this.mouseenter = new EventEmitter();
this.mouseleave = new EventEmitter();
this.keydown = new EventEmitter();
this.keypress = new EventEmitter();
this.keyup = new EventEmitter();
this.contextmenu = new EventEmitter();
this.paste = new EventEmitter();
this.init = new EventEmitter();
this.focus = new EventEmitter();
this.blur = new EventEmitter();
this.beforeSetContent = new EventEmitter();
this.setContent = new EventEmitter();
this.getContent = new EventEmitter();
this.preProcess = new EventEmitter();
this.postProcess = new EventEmitter();
this.nodeChange = new EventEmitter();
this.undo = new EventEmitter();
this.redo = new EventEmitter();
this.change = new EventEmitter();
this.dirty = new EventEmitter();
this.remove = new EventEmitter();
this.execCommand = new EventEmitter();
this.pastePreProcess = new EventEmitter();
this.pastePostProcess = new EventEmitter();
this.elementId = 'tiny-' + Math.random().toString(36).substring(2);
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
}
/**
* @return {?}
*/
TinymceComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var _this = this;
this.options = Object.assign(new TinymceDefaultOptions(), this.globalOptions, this.optionsOverride);
this.options.selector = '#' + this.elementId;
this.options.setup = function (editor) {
_this.setupEvents(editor);
};
this.options.init_instance_callback = function (editor) {
if (editor && _this.value) {
editor.setContent(_this.value);
}
_this.editor = editor;
};
};
/**
* @return {?}
*/
TinymceComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
if (this.options.baseURL) {
tinymce.baseURL = this.options.baseURL;
}
tinymce.init(this.options);
};
/**
* @return {?}
*/
TinymceComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
tinymce.remove(this.editor);
};
Object.defineProperty(TinymceComponent.prototype, "value", {
// get accessor
get: /**
* @return {?}
*/
function () {
return this.innerValue;
},
// set accessor including call the onchange callback
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
var _this = this;
if (v !== this.innerValue) {
this.innerValue = v;
this.zone.run(function () {
_this.onChangeCallback(v);
});
}
},
enumerable: true,
configurable: true
});
// From ControlValueAccessor interface
/**
* @param {?} value
* @return {?}
*/
TinymceComponent.prototype.writeValue = /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this.innerValue) {
this.innerValue = value;
if (!value) {
value = '';
}
if (this.editor && this.editor.initialized) {
this.editor.setContent(value);
}
}
};
/**
* @param {?} fn
* @return {?}
*/
TinymceComponent.prototype.registerOnChange = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* @param {?} fn
* @return {?}
*/
TinymceComponent.prototype.registerOnTouched = /**
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* @param {?} editor
* @return {?}
*/
TinymceComponent.prototype.setupEvents = /**
* @param {?} editor
* @return {?}
*/
function (editor) {
var _this = this;
editor.on('change keyup', function () {
/** @type {?} */
var content = editor.getContent();
_this.value = content;
});
editor.on('click', function (e) {
_this.click.emit(e);
});
editor.on('dblclick', function (e) {
_this.dblclick.emit(e);
});
editor.on('mousedown', function (e) {
_this.mousedown.emit(e);
});
editor.on('mouseup', function (e) {
_this.mouseup.emit(e);
});
editor.on('mousemove', function (e) {
_this.mousemove.emit(e);
});
editor.on('mouseover', function (e) {
_this.mouseover.emit(e);
});
editor.on('mouseout', function (e) {
_this.mouseout.emit(e);
});
editor.on('mouseenter', function (e) {
_this.mouseenter.emit(e);
});
editor.on('mouseleave', function (e) {
_this.mouseleave.emit(e);
});
editor.on('keydown', function (e) {
_this.keydown.emit(e);
});
editor.on('keypress', function (e) {
_this.keypress.emit(e);
});
editor.on('keyup', function (e) {
_this.keyup.emit(e);
});
editor.on('contextmenu', function (e) {
_this.contextmenu.emit(e);
});
editor.on('paste', function (e) {
_this.paste.emit(e);
});
editor.on('init', function (e) {
_this.init.emit(e);
});
editor.on('focus', function (e) {
_this.focus.emit(e);
});
editor.on('blur', function (e) {
_this.blur.emit(e);
});
editor.on('BeforeSetContent', function (e) {
_this.beforeSetContent.emit(e);
});
editor.on('SetContent', function (e) {
_this.setContent.emit(e);
});
editor.on('GetContent', function (e) {
_this.getContent.emit(e);
});
editor.on('PreProcess', function (e) {
_this.preProcess.emit(e);
});
editor.on('PostProcess', function (e) {
_this.postProcess.emit(e);
});
editor.on('NodeChange', function (e) {
_this.nodeChange.emit(e);
});
editor.on('Undo', function (e) {
_this.undo.emit(e);
});
editor.on('Redo', function (e) {
_this.redo.emit(e);
});
editor.on('Change', function (e) {
_this.change.emit(e);
});
editor.on('Dirty', function (e) {
_this.dirty.emit(e);
});
editor.on('Remove', function (e) {
_this.remove.emit(e);
});
editor.on('ExecCommand', function (e) {
_this.execCommand.emit(e);
});
editor.on('PastePreProcess', function (e) {
_this.pastePreProcess.emit(e);
});
editor.on('PastePostProcess', function (e) {
_this.pastePostProcess.emit(e);
});
};
TinymceComponent.decorators = [
{ type: Component, args: [{
selector: 'app-tinymce',
template: '<div id="{{elementId}}"></div>',
exportAs: 'tinymce',
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return TinymceComponent; }),
multi: true
}
]
}] }
];
/** @nocollapse */
TinymceComponent.ctorParameters = function () { return [
{ type: NgZone },
{ type: undefined, decorators: [{ type: Inject, args: ['TINYMCE_CONFIG',] }] }
]; };
TinymceComponent.propDecorators = {
optionsOverride: [{ type: Input, args: ['options',] }],
click: [{ type: Output }],
dblclick: [{ type: Output }],
mousedown: [{ type: Output }],
mouseup: [{ type: Output }],
mousemove: [{ type: Output }],
mouseover: [{ type: Output }],
mouseout: [{ type: Output }],
mouseenter: [{ type: Output }],
mouseleave: [{ type: Output }],
keydown: [{ type: Output }],
keypress: [{ type: Output }],
keyup: [{ type: Output }],
contextmenu: [{ type: Output }],
paste: [{ type: Output }],
init: [{ type: Output }],
focus: [{ type: Output }],
blur: [{ type: Output }],
beforeSetContent: [{ type: Output }],
setContent: [{ type: Output }],
getContent: [{ type: Output }],
preProcess: [{ type: Output }],
postProcess: [{ type: Output }],
nodeChange: [{ type: Output }],
undo: [{ type: Output }],
redo: [{ type: Output }],
change: [{ type: Output }],
dirty: [{ type: Output }],
remove: [{ type: Output }],
execCommand: [{ type: Output }],
pastePreProcess: [{ type: Output }],
pastePostProcess: [{ type: Output }]
};
return TinymceComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var TinymceModule = /** @class */ (function () {
function TinymceModule() {
}
/**
* @param {?=} userConfig
* @return {?}
*/
TinymceModule.withConfig = /**
* @param {?=} userConfig
* @return {?}
*/
function (userConfig) {
if (userConfig === void 0) { userConfig = {}; }
return {
ngModule: TinymceModule,
providers: [
{ provide: 'TINYMCE_CONFIG', useValue: userConfig }
]
};
};
TinymceModule.decorators = [
{ type: NgModule, args: [{
imports: [],
declarations: [TinymceComponent],
exports: [TinymceComponent],
providers: [
{ provide: 'TINYMCE_CONFIG', useClass: TinymceDefaultOptions }
]
},] }
];
return TinymceModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
export { Angular2TinymceLibService, TinymceComponent, TinymceModule, TinymceDefaultOptions as ɵb };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhcjItdGlueW1jZS5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vYW5ndWxhcjItdGlueW1jZS9saWIvYW5ndWxhcjItdGlueW1jZS1saWIuc2VydmljZS50cyIsIm5nOi8vYW5ndWxhcjItdGlueW1jZS9saWIvYW5ndWxhcjItdGlueW1jZS1saWIuZGVmYXVsdC50cyIsIm5nOi8vYW5ndWxhcjItdGlueW1jZS9saWIvYW5ndWxhcjItdGlueW1jZS1saWIuY29tcG9uZW50LnRzIiwibmc6Ly9hbmd1bGFyMi10aW55bWNlL2xpYi9hbmd1bGFyMi10aW55bWNlLWxpYi5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5ASW5qZWN0YWJsZSh7XG5cdHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBbmd1bGFyMlRpbnltY2VMaWJTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRpbnltY2VPcHRpb25zIH0gZnJvbSAnLi9hbmd1bGFyMi10aW55bWNlLWxpYi5jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFRpbnltY2VEZWZhdWx0T3B0aW9ucyBpbXBsZW1lbnRzIFRpbnltY2VPcHRpb25zIHtcblx0cGx1Z2lucyA9IFtcblx0XHQnbGluaycsXG5cdFx0J3Bhc3RlJyxcblx0XHQndGFibGUnLFxuXHRcdCdhZHZsaXN0Jyxcblx0XHQnYXV0b3Jlc2l6ZScsXG5cdFx0J2xpc3RzJyxcblx0XHQnY29kZSdcblx0XTtcblx0c2tpbl91cmwgPSAnL2Fzc2V0cy90aW55bWNlL3NraW5zL2xpZ2h0Z3JheSc7XG5cdGJhc2VVUkwgPSAnL2Fzc2V0cy90aW55bWNlJztcblx0YXV0b19mb2N1cyA9IHRydWU7XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgZm9yd2FyZFJlZiwgTmdab25lLCBJbmplY3QsIElucHV0LCBPbkluaXQsIEV2ZW50RW1pdHRlciwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUaW55bWNlRGVmYXVsdE9wdGlvbnMgfSBmcm9tICcuL2FuZ3VsYXIyLXRpbnltY2UtbGliLmRlZmF1bHQnO1xuaW1wb3J0IHsgVGlueW1jZU9wdGlvbnMgfSBmcm9tICcuL2FuZ3VsYXIyLXRpbnltY2UtbGliLmNvbmZpZy5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgJ3RpbnltY2UvdGlueW1jZS5taW4nO1xuXG5kZWNsYXJlIHZhciB0aW55bWNlOiBhbnk7XG5cbmltcG9ydCAndGlueW1jZS90aGVtZXMvbW9kZXJuL3RoZW1lJztcbmltcG9ydCAndGlueW1jZS9wbHVnaW5zL2xpbmsvcGx1Z2luLmpzJztcbmltcG9ydCAndGlueW1jZS9wbHVnaW5zL3Bhc3RlL3BsdWdpbi5qcyc7XG5pbXBvcnQgJ3RpbnltY2UvcGx1Z2lucy90YWJsZS9wbHVnaW4uanMnO1xuaW1wb3J0ICd0aW55bWNlL3BsdWdpbnMvYWR2bGlzdC9wbHVnaW4uanMnO1xuaW1wb3J0ICd0aW55bWNlL3BsdWdpbnMvYXV0b3Jlc2l6ZS9wbHVnaW4uanMnO1xuaW1wb3J0ICd0aW55bWNlL3BsdWdpbnMvbGlzdHMvcGx1Z2luLmpzJztcbmltcG9ydCAndGlueW1jZS9wbHVnaW5zL2NvZGUvcGx1Z2luLmpzJztcblxuY29uc3Qgbm9vcCA9ICgpID0+IHtcbn07XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2FwcC10aW55bWNlJyxcblx0dGVtcGxhdGU6ICc8ZGl2IGlkPVwie3tlbGVtZW50SWR9fVwiPjwvZGl2PicsXG5cdGV4cG9ydEFzOiAndGlueW1jZScsXG5cdHByb3ZpZGVyczogW1xuXHRcdHtcblx0XHRcdHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuXHRcdFx0dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGlueW1jZUNvbXBvbmVudCksXG5cdFx0XHRtdWx0aTogdHJ1ZVxuXHRcdH1cblx0XVxufSlcbmV4cG9ydCBjbGFzcyBUaW55bWNlQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uSW5pdCwgT25EZXN0cm95IHtcblx0QElucHV0KCdvcHRpb25zJykgb3B0aW9uc092ZXJyaWRlOiBUaW55bWNlT3B0aW9ucztcblxuXHRAT3V0cHV0KCkgY2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBkYmxjbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIG1vdXNlZG93biA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIG1vdXNldXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBtb3VzZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBtb3VzZW92ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBtb3VzZW91dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIG1vdXNlZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBtb3VzZWxlYXZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkga2V5ZG93biA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGtleXByZXNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkga2V5dXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBjb250ZXh0bWVudSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHBhc3RlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgaW5pdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgYmx1ciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGJlZm9yZVNldENvbnRlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBzZXRDb250ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgZ2V0Q29udGVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIHByZVByb2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwb3N0UHJvY2VzcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIG5vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSB1bmRvID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcmVkbyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblx0QE91dHB1dCgpIGRpcnR5ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgcmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXHRAT3V0cHV0KCkgZXhlY0NvbW1hbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwYXN0ZVByZVByb2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cdEBPdXRwdXQoKSBwYXN0ZVBvc3RQcm9jZXNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdHB1YmxpYyBlbGVtZW50SWQ6IHN0cmluZyA9ICd0aW55LScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMik7XG5cdHB1YmxpYyBlZGl0b3I6IGFueTtcblxuXHRwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcblx0cHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcblx0cHJpdmF0ZSBpbm5lclZhbHVlOiBzdHJpbmc7XG5cblx0cHJpdmF0ZSBvcHRpb25zOiBUaW55bWNlT3B0aW9ucztcblxuXHRjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHpvbmU6IE5nWm9uZSxcblx0XHRASW5qZWN0KCdUSU5ZTUNFX0NPTkZJRycpIHByaXZhdGUgZ2xvYmFsT3B0aW9uczogVGlueW1jZU9wdGlvbnNcblx0KSB7XG5cblx0fVxuXG5cdG5nT25Jbml0KCkge1xuXHRcdHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24obmV3IFRpbnltY2VEZWZhdWx0T3B0aW9ucygpLCB0aGlzLmdsb2JhbE9wdGlvbnMsIHRoaXMub3B0aW9uc092ZXJyaWRlKTtcblx0XHR0aGlzLm9wdGlvbnMuc2VsZWN0b3IgPSAnIycgKyB0aGlzLmVsZW1lbnRJZDtcblx0XHR0aGlzLm9wdGlvbnMuc2V0dXAgPSBlZGl0b3IgPT4ge1xuXHRcdFx0dGhpcy5zZXR1cEV2ZW50cyhlZGl0b3IpO1xuXHRcdH07XG5cdFx0dGhpcy5vcHRpb25zLmluaXRfaW5zdGFuY2VfY2FsbGJhY2sgPSBlZGl0b3IgPT4ge1xuXHRcdFx0aWYgKGVkaXRvciAmJiB0aGlzLnZhbHVlKSB7XG5cdFx0XHRcdGVkaXRvci5zZXRDb250ZW50KHRoaXMudmFsdWUpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5lZGl0b3IgPSBlZGl0b3I7XG5cdFx0fTtcblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLmJhc2VVUkwpIHtcblx0XHRcdHRpbnltY2UuYmFzZVVSTCA9IHRoaXMub3B0aW9ucy5iYXNlVVJMO1xuXHRcdH1cblx0XHR0aW55bWNlLmluaXQodGhpcy5vcHRpb25zKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHRpbnltY2UucmVtb3ZlKHRoaXMuZWRpdG9yKTtcblx0fVxuXG5cdC8vIGdldCBhY2Nlc3NvclxuXHRnZXQgdmFsdWUoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5pbm5lclZhbHVlO1xuXHR9XG5cblx0Ly8gc2V0IGFjY2Vzc29yIGluY2x1ZGluZyBjYWxsIHRoZSBvbmNoYW5nZSBjYWxsYmFja1xuXHRzZXQgdmFsdWUodjogYW55KSB7XG5cdFx0aWYgKHYgIT09IHRoaXMuaW5uZXJWYWx1ZSkge1xuXHRcdFx0dGhpcy5pbm5lclZhbHVlID0gdjtcblx0XHRcdHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodik7XG5cdFx0XHR9KTtcblxuXHRcdH1cblx0fVxuXG5cdC8vIEZyb20gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlXG5cdHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuXHRcdGlmICh2YWx1ZSAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG5cdFx0XHR0aGlzLmlubmVyVmFsdWUgPSB2YWx1ZTtcblx0XHRcdGlmICghdmFsdWUpIHtcblx0XHRcdFx0dmFsdWUgPSAnJztcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5pbml0aWFsaXplZCkge1xuXHRcdFx0XHR0aGlzLmVkaXRvci5zZXRDb250ZW50KHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcblx0fVxuXG5cdHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcblx0XHR0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG5cdH1cblxuXHRzZXR1cEV2ZW50cyhlZGl0b3IpIHtcblx0XHRlZGl0b3Iub24oJ2NoYW5nZSBrZXl1cCcsICgpID0+IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBlZGl0b3IuZ2V0Q29udGVudCgpO1xuXHRcdFx0dGhpcy52YWx1ZSA9IGNvbnRlbnQ7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdjbGljaycsIGUgPT4ge1xuXHRcdFx0dGhpcy5jbGljay5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignZGJsY2xpY2snLCBlID0+IHtcblx0XHRcdHRoaXMuZGJsY2xpY2suZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ21vdXNlZG93bicsIGUgPT4ge1xuXHRcdFx0dGhpcy5tb3VzZWRvd24uZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ21vdXNldXAnLCBlID0+IHtcblx0XHRcdHRoaXMubW91c2V1cC5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignbW91c2Vtb3ZlJywgZSA9PiB7XG5cdFx0XHR0aGlzLm1vdXNlbW92ZS5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignbW91c2VvdmVyJywgZSA9PiB7XG5cdFx0XHR0aGlzLm1vdXNlb3Zlci5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignbW91c2VvdXQnLCBlID0+IHtcblx0XHRcdHRoaXMubW91c2VvdXQuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ21vdXNlZW50ZXInLCBlID0+IHtcblx0XHRcdHRoaXMubW91c2VlbnRlci5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignbW91c2VsZWF2ZScsIGUgPT4ge1xuXHRcdFx0dGhpcy5tb3VzZWxlYXZlLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdrZXlkb3duJywgZSA9PiB7XG5cdFx0XHR0aGlzLmtleWRvd24uZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ2tleXByZXNzJywgZSA9PiB7XG5cdFx0XHR0aGlzLmtleXByZXNzLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdrZXl1cCcsIGUgPT4ge1xuXHRcdFx0dGhpcy5rZXl1cC5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignY29udGV4dG1lbnUnLCBlID0+IHtcblx0XHRcdHRoaXMuY29udGV4dG1lbnUuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ3Bhc3RlJywgZSA9PiB7XG5cdFx0XHR0aGlzLnBhc3RlLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdpbml0JywgZSA9PiB7XG5cdFx0XHR0aGlzLmluaXQuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ2ZvY3VzJywgZSA9PiB7XG5cdFx0XHR0aGlzLmZvY3VzLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdibHVyJywgZSA9PiB7XG5cdFx0XHR0aGlzLmJsdXIuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ0JlZm9yZVNldENvbnRlbnQnLCBlID0+IHtcblx0XHRcdHRoaXMuYmVmb3JlU2V0Q29udGVudC5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignU2V0Q29udGVudCcsIGUgPT4ge1xuXHRcdFx0dGhpcy5zZXRDb250ZW50LmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdHZXRDb250ZW50JywgZSA9PiB7XG5cdFx0XHR0aGlzLmdldENvbnRlbnQuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ1ByZVByb2Nlc3MnLCBlID0+IHtcblx0XHRcdHRoaXMucHJlUHJvY2Vzcy5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignUG9zdFByb2Nlc3MnLCBlID0+IHtcblx0XHRcdHRoaXMucG9zdFByb2Nlc3MuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ05vZGVDaGFuZ2UnLCBlID0+IHtcblx0XHRcdHRoaXMubm9kZUNoYW5nZS5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignVW5kbycsIGUgPT4ge1xuXHRcdFx0dGhpcy51bmRvLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdSZWRvJywgZSA9PiB7XG5cdFx0XHR0aGlzLnJlZG8uZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ0NoYW5nZScsIGUgPT4ge1xuXHRcdFx0dGhpcy5jaGFuZ2UuZW1pdChlKTtcblx0XHR9KTtcblx0XHRlZGl0b3Iub24oJ0RpcnR5JywgZSA9PiB7XG5cdFx0XHR0aGlzLmRpcnR5LmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdSZW1vdmUnLCBlID0+IHtcblx0XHRcdHRoaXMucmVtb3ZlLmVtaXQoZSk7XG5cdFx0fSk7XG5cdFx0ZWRpdG9yLm9uKCdFeGVjQ29tbWFuZCcsIGUgPT4ge1xuXHRcdFx0dGhpcy5leGVjQ29tbWFuZC5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignUGFzdGVQcmVQcm9jZXNzJywgZSA9PiB7XG5cdFx0XHR0aGlzLnBhc3RlUHJlUHJvY2Vzcy5lbWl0KGUpO1xuXHRcdH0pO1xuXHRcdGVkaXRvci5vbignUGFzdGVQb3N0UHJvY2VzcycsIGUgPT4ge1xuXHRcdFx0dGhpcy5wYXN0ZVBvc3RQcm9jZXNzLmVtaXQoZSk7XG5cdFx0fSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaW55bWNlQ29tcG9uZW50IH0gZnJvbSAnLi9hbmd1bGFyMi10aW55bWNlLWxpYi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGlueW1jZU9wdGlvbnMgfSBmcm9tICcuL2FuZ3VsYXIyLXRpbnltY2UtbGliLmNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgVGlueW1jZURlZmF1bHRPcHRpb25zIH0gZnJvbSAnLi9hbmd1bGFyMi10aW55bWNlLWxpYi5kZWZhdWx0JztcblxuQE5nTW9kdWxlKHtcblx0aW1wb3J0czogW10sXG5cdGRlY2xhcmF0aW9uczogW1RpbnltY2VDb21wb25lbnRdLFxuXHRleHBvcnRzOiBbVGlueW1jZUNvbXBvbmVudF0sXG5cdHByb3ZpZGVyczogW1xuXHRcdHsgcHJvdmlkZTogJ1RJTllNQ0VfQ09ORklHJywgdXNlQ2xhc3M6IFRpbnltY2VEZWZhdWx0T3B0aW9ucyB9XG5cdF1cbn0pXG5leHBvcnQgY2xhc3MgVGlueW1jZU1vZHVsZSB7XG5cdHN0YXRpYyB3aXRoQ29uZmlnKHVzZXJDb25maWc6IFRpbnltY2VPcHRpb25zID0ge30pOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bmdNb2R1bGU6IFRpbnltY2VNb2R1bGUsXG5cdFx0XHRwcm92aWRlcnM6IFtcblx0XHRcdFx0eyBwcm92aWRlOiAnVElOWU1DRV9DT05GSUcnLCB1c2VWYWx1ZTogdXNlckNvbmZpZyB9XG5cdFx0XHRdXG5cdFx0fTtcblx0fVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtJQU1DO0tBQ0M7O2dCQUxELFVBQVUsU0FBQztvQkFDWCxVQUFVLEVBQUUsTUFBTTtpQkFDbEI7Ozs7O29DQUpEOzs7Ozs7O0FDRUEsSUFBQTs7dUJBQ1c7WUFDVCxNQUFNO1lBQ04sT0FBTztZQUNQLE9BQU87WUFDUCxTQUFTO1lBQ1QsWUFBWTtZQUNaLE9BQU87WUFDUCxNQUFNO1NBQ047d0JBQ1UsaUNBQWlDO3VCQUNsQyxpQkFBaUI7MEJBQ2QsSUFBSTs7Z0NBZGxCO0lBZUM7Ozs7OztBQ2ZEO0FBa0JBLElBQU0sSUFBSSxHQUFHO0NBQ1osQ0FBQzs7SUEwREQsMEJBQ1MsTUFDMEIsYUFBNkI7UUFEdkQsU0FBSSxHQUFKLElBQUk7UUFDc0Isa0JBQWEsR0FBYixhQUFhLENBQWdCO3FCQTNDOUMsSUFBSSxZQUFZLEVBQUU7d0JBQ2YsSUFBSSxZQUFZLEVBQUU7eUJBQ2pCLElBQUksWUFBWSxFQUFFO3VCQUNwQixJQUFJLFlBQVksRUFBRTt5QkFDaEIsSUFBSSxZQUFZLEVBQUU7eUJBQ2xCLElBQUksWUFBWSxFQUFFO3dCQUNuQixJQUFJLFlBQVksRUFBRTswQkFDaEIsSUFBSSxZQUFZLEVBQUU7MEJBQ2xCLElBQUksWUFBWSxF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