UNPKG

ngx-firebase-cms

Version:

Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)

417 lines 40 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, EventEmitter, Output, ViewChild, ElementRef, Renderer2, Inject } from '@angular/core'; import { EditorService } from '../../service/editor.service'; import { DOCUMENT } from '@angular/common'; import { NzMessageService } from 'ng-zorro-antd'; import { AngularFireStorage } from '@angular/fire/storage'; var EditorToolbarComponent = /** @class */ (function () { function EditorToolbarComponent(storage, message, _renderer, editorService, _document) { this.storage = storage; this.message = message; this._renderer = _renderer; this.editorService = editorService; this._document = _document; this.id = ''; this.htmlMode = false; this.showToolbar = true; this.block = 'default'; this.fontId = 0; this.fontSize = '5'; this.customClassId = -1; this.tagMap = { BLOCKQUOTE: "indent", A: "link" }; this.select = ["H1", "H2", "H3", "H4", "H5", "H6", "P", "PRE", "DIV"]; this.buttons = ["bold", "italic", "underline", "strikeThrough", "subscript", "superscript", "justifyLeft", "justifyCenter", "justifyRight", "justifyFull", "indent", "outdent", "insertUnorderedList", "insertOrderedList", "link"]; this.execute = new EventEmitter(); } /** * @return {?} */ EditorToolbarComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @param {?} command * @return {?} */ EditorToolbarComponent.prototype.triggerCommand = /** * @param {?} command * @return {?} */ function (command) { this.execute.emit(command); }; /** * @return {?} */ EditorToolbarComponent.prototype.triggerButtons = /** * @return {?} */ function () { var _this = this; if (!this.showToolbar) { return; } this.buttons.forEach((/** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var result = _this._document.queryCommandState(e); /** @type {?} */ var elementById = _this._document.getElementById(e + '-' + _this.id); if (result) { _this._renderer.addClass(elementById, "active"); } else { _this._renderer.removeClass(elementById, "active"); } })); }; /** * @param {?} nodes * @return {?} */ EditorToolbarComponent.prototype.triggerBlocks = /** * @param {?} nodes * @return {?} */ function (nodes) { var _this = this; if (!this.showToolbar) { return; } /** @type {?} */ var found = false; this.select.forEach((/** * @param {?} y * @return {?} */ function (y) { /** @type {?} */ var node = nodes.find((/** * @param {?} x * @return {?} */ function (x) { return x.nodeName === y; })); if (node !== undefined && y === node.nodeName) { if (found === false) { _this.block = node.nodeName.toLowerCase(); found = true; } } else if (found === false) { _this.block = 'default'; } })); found = false; if (this.fonts) { this.fonts.forEach((/** * @param {?} y * @param {?} index * @return {?} */ function (y, index) { /** @type {?} */ var node = nodes.find((/** * @param {?} x * @return {?} */ function (x) { if (x instanceof HTMLFontElement) { return x.face === y.name; } })); if (node !== undefined) { if (found === false) { _this.fontId = index; found = true; } } else if (found === false) { _this.fontId = _this.defaultFontId; } })); } found = false; if (this.customClasses) { this.customClasses.forEach((/** * @param {?} y * @param {?} index * @return {?} */ function (y, index) { /** @type {?} */ var node = nodes.find((/** * @param {?} x * @return {?} */ function (x) { if (x instanceof Element) { return x.className === y.class; } })); if (node !== undefined) { if (found === false) { _this.customClassId = index; found = true; } } else if (found === false) { _this.customClassId = -1; } })); } Object.keys(this.tagMap).map((/** * @param {?} e * @return {?} */ function (e) { /** @type {?} */ var elementById = _this._document.getElementById(_this.tagMap[e] + '-' + _this.id); /** @type {?} */ var node = nodes.find((/** * @param {?} x * @return {?} */ function (x) { return x.nodeName === e; })); if (node !== undefined && e === node.nodeName) { _this._renderer.addClass(elementById, "active"); } else { _this._renderer.removeClass(elementById, "active"); } })); }; /** * @return {?} */ EditorToolbarComponent.prototype.insertUrl = /** * @return {?} */ function () { /** @type {?} */ var url = prompt("Insert URL link", 'http:\/\/'); if (url && url !== '' && url !== 'http://') { this.editorService.createLink(url); } }; /** * @param {?} color * @param {?} where * @return {?} */ EditorToolbarComponent.prototype.insertColor = /** * @param {?} color * @param {?} where * @return {?} */ function (color, where) { this.editorService.insertColor(color, where); this.execute.emit(""); }; /** * @param {?} fontId * @return {?} */ EditorToolbarComponent.prototype.setFontName = /** * @param {?} fontId * @return {?} */ function (fontId) { this.editorService.setFontName(this.fonts[fontId].name); this.execute.emit(""); }; /** * @param {?} fontSize * @return {?} */ EditorToolbarComponent.prototype.setFontSize = /** * @param {?} fontSize * @return {?} */ function (fontSize) { this.editorService.setFontSize(fontSize); this.execute.emit(""); }; /** * @param {?} m * @return {?} */ EditorToolbarComponent.prototype.setEditorMode = /** * @param {?} m * @return {?} */ function (m) { /** @type {?} */ var toggleEditorModeButton = this._document.getElementById("toggleEditorMode" + '-' + this.id); if (m) { this._renderer.addClass(toggleEditorModeButton, "active"); } else { this._renderer.removeClass(toggleEditorModeButton, "active"); } this.htmlMode = m; }; /** * @param {?} event * @return {?} */ EditorToolbarComponent.prototype.onFileChanged = /** * @param {?} event * @return {?} */ function (event) { var _this = this; /** @type {?} */ var file = event.target.files[0]; console.log(file.type); if (file.type !== "image/jpeg") { this.message.error("File type should be JPEG"); this.fileReset(); return false; } else if (file.size / 1024 / 1024 > 1) { this.message.error("File size should be less than 1 Mb"); this.fileReset(); return false; } else { /** @type {?} */ var timestamp = new Date().valueOf(); /** @type {?} */ var filePath_1 = "/media/" + timestamp + ".jpeg"; this.storage.upload(filePath_1, file) .then((/** * @param {?} res * @return {?} */ function (res) { return _this.storage.ref(filePath_1).getDownloadURL().toPromise(); })) .then((/** * @param {?} url * @return {?} */ function (url) { _this.message.success("Image uploaded"); _this.editorService.insertImage(url); _this.fileReset(); })) .catch((/** * @param {?} err * @return {?} */ function (err) { _this.message.error(err); })); } }; /** * @return {?} */ EditorToolbarComponent.prototype.fileReset = /** * @return {?} */ function () { this.myInputFile.nativeElement.value = ""; }; /** * @param {?} classId * @return {?} */ EditorToolbarComponent.prototype.setCustomClass = /** * @param {?} classId * @return {?} */ function (classId) { this.editorService.createCustomClass(this.customClasses[classId]); }; EditorToolbarComponent.decorators = [ { type: Component, args: [{ selector: 'aq-editor-toolbar', template: "<div class=\"angular-editor-toolbar\" *ngIf=\"showToolbar\">\n <nz-button-group>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" (click)=\"triggerCommand('undo')\" nzTitle=\"Undo\" tabindex=\"-1\">\n <i nz-icon nzType=\"undo\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" (click)=\"triggerCommand('redo')\" nzTitle=\"Redo\" tabindex=\"-1\">\n <i nz-icon nzType=\"redo\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-button-group>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'bold-'+id\" (click)=\"triggerCommand('bold')\" nzTitle=\"Bold\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"bold\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'italic-'+id\" (click)=\"triggerCommand('italic')\" nzTitle=\"Italic\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"italic\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'underline-'+id\" (click)=\"triggerCommand('underline')\" nzTitle=\"Underline\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"underline\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'strikeThrough-'+id\" (click)=\"triggerCommand('strikeThrough')\" nzTitle=\"Strike Through\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n <i nz-icon nzType=\"strikethrough\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'subscript-'+id\" (click)=\"triggerCommand('subscript')\" nzTitle=\"subscript\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n x<sub>2</sub>\n </button>\n <button nzSize=\"large\" nz-tooltip nz-button type=\"button\" [id]=\"'superscript-'+id\" (click)=\"triggerCommand('superscript')\" nzTitle=\"superscript\" tabindex=\"-1\" [disabled]=\"htmlMode\">\n x<sup>2</sup>\n </button>\n </nz-button-group>\n\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'justifyLeft-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Left\" nz-button (click)=\"triggerCommand('justifyLeft')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-left\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyCenter-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Center\" nz-button (click)=\"triggerCommand('justifyCenter')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-center\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyRight-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Right\" nz-button (click)=\"triggerCommand('justifyRight')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"align-right\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'justifyFull-'+id\" type=\"button\" nz-tooltip nzTitle=\"Justify Full\" nz-button (click)=\"triggerCommand('justifyFull')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"bars\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'indent-'+id\" type=\"button\" nz-tooltip nzTitle=\"Indent\" nz-button (click)=\"triggerCommand('indent')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"menu-unfold\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'outdent-'+id\" type=\"button\" nz-tooltip nzTitle=\"Outdent\" nz-button (click)=\"triggerCommand('outdent')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"menu-fold\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-button-group>\n <button nzSize=\"large\" [id]=\"'insertUnorderedList-'+id\" type=\"button\" nz-tooltip nzTitle=\"Unordered List\" nz-button (click)=\"triggerCommand('insertUnorderedList')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"unordered-list\" nzTheme=\"outline\"></i>\n </button>\n <button nzSize=\"large\" [id]=\"'insertOrderedList-'+id\" type=\"button\" nz-tooltip nzTitle=\"Ordered List\" nz-button (click)=\"triggerCommand('insertOrderedList')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"ordered-list\" nzTheme=\"outline\"></i>\n </button>\n </nz-button-group>\n <nz-input-group nzCompact>\n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Formatting\" [id]=\"'heading-'+id\" nzPlaceHolder=\"Formatting\" class=\"select-heading\" [(ngModel)]=\"block\" (ngModelChange)=\"triggerCommand(block)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"h1\" nzValue=\"h1\" nzLabel=\"H1\"></nz-option>\n <nz-option class=\"h2\" nzValue=\"h2\" nzLabel=\"H2\"></nz-option>\n <nz-option class=\"h3\" nzValue=\"h3\" nzLabel=\"H3\"></nz-option>\n <nz-option class=\"h4\" nzValue=\"h4\" nzLabel=\"H4\"></nz-option>\n <nz-option class=\"h5\" nzValue=\"h5\" nzLabel=\"H5\"></nz-option>\n <nz-option class=\"h6\" nzValue=\"h6\" nzLabel=\"H6\"></nz-option>\n <nz-option class=\"p\" nzValue=\"p\" nzLabel=\"P\"></nz-option>\n <nz-option class=\"pre\" nzValue=\"pre\" nzLabel=\"Pre\"></nz-option>\n <nz-option class=\"div\" nzValue=\"div\" nzLabel=\"Div\"></nz-option>\n <nz-option class=\"default\" nzValue=\"default\" nzLabel=\"Default\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Font Name\" nzPlaceHolder=\"Font Name\" [id]=\"'fontSelector-'+id\" class=\"select-font\" [(ngModel)]=\"fontId\" (ngModelChange)=\"setFontName(fontId)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option *ngFor=\"let item of fonts; let i = index\" [class]=\"item.class\" [nzValue]=\"i\" [nzLabel]=\"item.name\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;\" nz-tooltip nzTitle=\"Font Size\" nzPlaceHolder=\"Font Sizing\" [id]=\"'fontSizeSelector-'+id\" class=\"select-font-size\" [(ngModel)]=\"fontSize\" (ngModelChange)=\"setFontSize(fontSize)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"size1\" nzValue=\"1\" nzLabel=\"1\"></nz-option>\n <nz-option class=\"size2\" nzValue=\"2\" nzLabel=\"2\"></nz-option>\n <nz-option class=\"size3\" nzValue=\"3\" nzLabel=\"3\"></nz-option>\n <nz-option class=\"size4\" nzValue=\"4\" nzLabel=\"4\"></nz-option>\n <nz-option class=\"size5\" nzValue=\"5\" nzLabel=\"5\"></nz-option>\n <nz-option class=\"size6\" nzValue=\"6\" nzLabel=\"6\"></nz-option>\n <nz-option class=\"size7\" nzValue=\"7\" nzLabel=\"7\"></nz-option>\n </nz-select>\n \n <nz-select nzSize=\"large\" style=\"width:auto;margin-right:4px;\" nz-tooltip nzTitle=\"Custom Style\" nzPlaceHolder=\"Custom Class\" [id]=\"'customClassSelector-'+id\" class=\"select-custom-style\" [(ngModel)]=\"customClassId\" (ngModelChange)=\"setCustomClass(customClassId)\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <nz-option class=\"\" [nzValue]=\"-1\" nzLabel=\"Clear Class\"></nz-option>\n <nz-option *ngFor=\"let item of customClasses; let i = index\" [class]=\"item.class\" [nzValue]=\"i\" [nzLabel]=\"item.name\"></nz-option>\n </nz-select>\n\n <button nzSize=\"large\" [id]=\"'foregroundColorPicker-'+id\" type=\"button\" nz-button (click)=\"fgInput.click()\" nz-tooltip nzTitle=\"Text Color\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <span class=\"color-label foreground\">\n <i nz-icon nzType=\"font-colors\" nzTheme=\"outline\"></i>\n </span>\n </button> \n\n <button nzSize=\"large\" [id]=\"'backgroundColorPicker-'+id\" type=\"button\" nz-button (click)=\"bgInput.click()\" nz-tooltip nzTitle=\"Background Color\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <span class=\"color-label background\">\n <i nz-icon nzType=\"bg-colors\" nzTheme=\"outline\"></i>\n </span>\n </button>\n\n <button nzSize=\"large\" [id]=\"'link-'+id\" type=\"button\" nz-button (click)=\"insertUrl()\" nz-tooltip nzTitle=\"Insert Link\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"link\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-button (click)=\"triggerCommand('unlink')\" nz-tooltip nzTitle=\"Unlink\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"disconnect\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-button (click)=\"fileInput.click()\" nz-tooltip nzTitle=\"Insert Image\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"picture\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-tooltip nzTitle=\"Horizontal Line\" nz-button (click)=\"triggerCommand('insertHorizontalRule')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"minus\" nzTheme=\"outline\"></i>\n </button>\n\n <button nzSize=\"large\" type=\"button\" nz-tooltip nzTitle=\"Clear Formatting\" nz-button (click)=\"triggerCommand('removeFormat')\" [disabled]=\"htmlMode\" tabindex=\"-1\">\n <i nz-icon nzType=\"delete\" nzTheme=\"outline\"></i>\n </button>\n \n <button nzSize=\"large\" [id]=\"'toggleEditorMode-'+id\" type=\"button\" nz-tooltip nzTitle=\"HTML Code\" nz-button (click)=\"triggerCommand('toggleEditorMode')\" tabindex=\"-1\">\n <i nz-icon nzType=\"code\" nzTheme=\"outline\"></i>\n </button>\n </nz-input-group>\n \n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(fgInput.value, 'textColor')\" #fgInput>\n <input style=\"display: none\" type=\"color\" (change)=\"insertColor(bgInput.value, 'backgroundColor')\" #bgInput>\n <input style=\"display: none\" accept=\"image/*\" type=\"file\" (change)=\"onFileChanged($event)\" #fileInput>\n</div>", styles: [".ant-btn:not(.ant-btn-circle):not(.ant-btn-circle-outline).ant-btn-icon-only{padding:0 15px}.ant-btn-group{margin-right:4px;margin-bottom:4px}.select{width:100px;margin-right:4px;margin-bottom:4px}"] }] } ]; /** @nocollapse */ EditorToolbarComponent.ctorParameters = function () { return [ { type: AngularFireStorage }, { type: NzMessageService }, { type: Renderer2 }, { type: EditorService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; EditorToolbarComponent.propDecorators = { execute: [{ type: Output }], myInputFile: [{ type: ViewChild, args: ['fileInput',] }] }; return EditorToolbarComponent; }()); export { EditorToolbarComponent }; if (false) { /** @type {?} */ EditorToolbarComponent.prototype.id; /** @type {?} */ EditorToolbarComponent.prototype.htmlMode; /** @type {?} */ EditorToolbarComponent.prototype.showToolbar; /** @type {?} */ EditorToolbarComponent.prototype.block; /** @type {?} */ EditorToolbarComponent.prototype.defaultFontId; /** @type {?} */ EditorToolbarComponent.prototype.fontId; /** @type {?} */ EditorToolbarComponent.prototype.fontSize; /** @type {?} */ EditorToolbarComponent.prototype.fonts; /** @type {?} */ EditorToolbarComponent.prototype.customClassId; /** @type {?} */ EditorToolbarComponent.prototype.customClasses; /** @type {?} */ EditorToolbarComponent.prototype.tagMap; /** @type {?} */ EditorToolbarComponent.prototype.select; /** @type {?} */ EditorToolbarComponent.prototype.buttons; /** @type {?} */ EditorToolbarComponent.prototype.execute; /** @type {?} */ EditorToolbarComponent.prototype.myInputFile; /** * @type {?} * @private */ EditorToolbarComponent.prototype.storage; /** * @type {?} * @private */ EditorToolbarComponent.prototype.message; /** * @type {?} * @private */ EditorToolbarComponent.prototype._renderer; /** * @type {?} * @private */ EditorToolbarComponent.prototype.editorService; /** * @type {?} * @private */ EditorToolbarComponent.prototype._document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpcmViYXNlLWNtcy8iLCJzb3VyY2VzIjpbImxpYi9kaXJlY3RpdmUvZWRpdG9yLXRvb2xiYXIvZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFlBQVksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWxILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTNEO0lBK0JFLGdDQUNVLE9BQTJCLEVBQzNCLE9BQXlCLEVBQ3pCLFNBQW9CLEVBQ3BCLGFBQTRCLEVBQ1YsU0FBYztRQUpoQyxZQUFPLEdBQVAsT0FBTyxDQUFvQjtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3BCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ1YsY0FBUyxHQUFULFNBQVMsQ0FBSztRQTdCMUMsT0FBRSxHQUFHLEVBQUUsQ0FBQztRQUNSLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFFbkIsVUFBSyxHQUFHLFNBQVMsQ0FBQztRQUVsQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLEdBQUcsQ0FBQztRQUdmLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFHbkIsV0FBTSxHQUFHO1lBQ1AsVUFBVSxFQUFFLFFBQVE7WUFDcEIsQ0FBQyxFQUFF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dWpVQUE4Qzs7aUJBRS9DOzs7O2dCQVJRLGtCQUFrQjtnQkFEbEIsZ0JBQWdCO2dCQUpnRCxTQUFTO2dCQUV6RSxhQUFhO2dEQTJDakIsTUFBTSxTQUFDLFFBQVE7OzswQkFSakIsTUFBTTs4QkFDTixTQUFTLFNBQUMsV0FBVzs7SUF3S3hCLDZCQUFDO0NBQUEsQUFyTUQsSUFxTUM7U0FoTVksc0JBQXNCOzs7SUFFakMsb0NBQVE7O0lBQ1IsMENBQWlCOztJQUNqQiw2Q0FBbUI7O0lBRW5CLHVDQUFrQjs7SUFDbEIsK0NBQWM7O0lBQ2Qsd0NBQVc7O0lBQ1gsMENBQWU7O0lBQ2YsdUNBQWM7O0lBRWQsK0NBQW1COztJQUNuQiwrQ0FBNkI7O0lBRTdCLHdDQUdFOztJQUVGLHdDQUFnRTs7SUFDaEUseUNBQThOOztJQUU5Tix5Q0FBb0U7O0lBQ3BFLDZDQUErQzs7Ozs7SUFHN0MseUNBQW1DOzs7OztJQUNuQyx5Q0FBaUM7Ozs7O0lBQ2pDLDJDQUE0Qjs7Ozs7SUFDNUIsK0NBQW9DOzs7OztJQUNwQywyQ0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgUmVuZGVyZXIyLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvbnQsIEN1c3RvbUNsYXNzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL2VkaXRvcic7XG5pbXBvcnQgeyBFZGl0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9lZGl0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBBbmd1bGFyRmlyZVN0b3JhZ2UgfSBmcm9tICdAYW5ndWxhci9maXJlL3N0b3JhZ2UnO1xuaW1wb3J0IHsgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEh0dHBFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXEtZWRpdG9yLXRvb2xiYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdG9yLXRvb2xiYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lZGl0b3ItdG9vbGJhci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yVG9vbGJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgaWQgPSAnJztcbiAgaHRtbE1vZGUgPSBmYWxzZTtcbiAgc2hvd1Rvb2xiYXIgPSB0cnVlO1xuXG4gIGJsb2NrID0gJ2RlZmF1bHQnO1xuICBkZWZhdWx0Rm9udElkO1xuICBmb250SWQgPSAwO1xuICBmb250U2l6ZSA9ICc1JztcbiAgZm9udHM6IEZvbnRbXTtcblxuICBjdXN0b21DbGFzc0lkID0gLTE7XG4gIGN1c3RvbUNsYXNzZXM6IEN1c3RvbUNsYXNzW107XG5cbiAgdGFnTWFwID0ge1xuICAgIEJMT0NLUVVPVEU6IFwiaW5kZW50XCIsXG4gICAgQTogXCJsaW5rXCJcbiAgfTtcblxuICBzZWxlY3QgPSBbXCJIMVwiLCBcIkgyXCIsIFwiSDNcIiwgXCJINFwiLCBcIkg1XCIsIFwiSDZcIiwgXCJQXCIsIFwiUFJFXCIsIFwiRElWXCJdXG4gIGJ1dHRvbnMgPSBbXCJib2xkXCIsIFwiaXRhbGljXCIsIFwidW5kZXJsaW5lXCIsIFwic3RyaWtlVGhyb3VnaFwiLCBcInN1YnNjcmlwdFwiLCBcInN1cGVyc2NyaXB0XCIsIFwianVzdGlmeUxlZnRcIiwgXCJqdXN0aWZ5Q2VudGVyXCIsIFwianVzdGlmeVJpZ2h0XCIsIFwianVzdGlmeUZ1bGxcIiwgXCJpbmRlbnRcIiwgXCJvdXRkZW50XCIsIFwiaW5zZXJ0VW5vcmRlcmVkTGlzdFwiLCBcImluc2VydE9yZGVyZWRMaXN0XCIsIFwibGlua1wiXVxuXG4gIEBPdXRwdXQoKSBleGVjdXRlOiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcpIG15SW5wdXRGaWxlOiBFbGVtZW50UmVmXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yYWdlOiBBbmd1bGFyRmlyZVN0b3JhZ2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlOiBOek1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBlZGl0b3JTZXJ2aWNlOiBFZGl0b3JTZXJ2aWNlLCBcbiAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIF9kb2N1bWVudDogYW55XG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgXG4gIH1cblxuICB0cmlnZ2VyQ29tbWFuZChjb21tYW5kOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV4ZWN1dGUuZW1pdChjb21tYW5kKTtcbiAgfVxuXG4gIHRyaWdnZXJCdXR0b25zKCkge1xuICAgIGlmICghdGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RvY3VtZW50LnF1ZXJ5Q29tbWFuZFN0YXRlKGUpO1xuICAgICAgY29uc3QgZWxlbWVudEJ5SWQgPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlICsgJy0nICsgdGhpcy5pZCk7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnRCeUlkLCBcImFjdGl2ZVwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKGVsZW1lbnRCeUlkLCBcImFjdGl2ZVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHRyaWdnZXJCbG9ja3Mobm9kZXM6IE5vZGVbXSkge1xuICAgIGlmICghdGhpcy5zaG93VG9vbGJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdC5mb3JFYWNoKHkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmZpbmQoeCA9PiB4Lm5vZGVOYW1lID09PSB5KTtcbiAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQgJiYgeSA9PT0gbm9kZS5ub2RlTmFtZSkge1xuICAgICAgICBpZiAoZm91bmQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhpcy5ibG9jayA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZm91bmQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuYmxvY2sgPSAnZGVmYXVsdCc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmZvbnRzKSB7XG4gICAgICB0aGlzLmZvbnRzLmZvckVhY2goKHksIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlcy5maW5kKHggPT4ge1xuICAgICAgICAgIGlmICh4IGluc3RhbmNlb2YgSFRNTEZvbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4geC5mYWNlID09PSB5Lm5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChmb3VuZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuZm9udElkID0gaW5kZXg7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuZm9udElkID0gdGhpcy5kZWZhdWx0Rm9udElkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBmb3VuZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1c3RvbUNsYXNzZXMpIHtcbiAgICAgIHRoaXMuY3VzdG9tQ2xhc3Nlcy5mb3JFYWNoKCh5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXMuZmluZCh4ID0+IHtcbiAgICAgICAgICBpZiAoeCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB4LmNsYXNzTmFtZSA9PT0geS5jbGFzcztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobm9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21DbGFzc0lkID0gaW5kZXg7XG4gICAgICAgICAgICBmb3VuZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGZvdW5kID09PSBmYWxzZSkge1xuICAgICAgICAgIHRoaXMuY3VzdG9tQ2xhc3NJZCA9IC0xO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLnRhZ01hcCkubWFwKGUgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudEJ5SWQgPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnRhZ01hcFtlXSArICctJyArIHRoaXMuaWQpO1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzLmZpbmQoeCA9PiB4Lm5vZGVOYW1lID09PSBlKTtcbiAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQgJiYgZSA9PT0gbm9kZS5ub2RlTmFtZSkge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50QnlJZCwgXCJhY3RpdmVcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVDbGFzcyhlbGVtZW50QnlJZCwgXCJhY3RpdmVcIik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpbnNlcnRVcmwoKSB7XG4gICAgY29uc3QgdXJsID0gcHJvbXB0KFwiSW5zZXJ0IFVSTCBsaW5rXCIsICdodHRwOlxcL1xcLycpO1xuICAgIGlmICh1cmwgJiYgdXJsICE9PSAnJyAmJiB1cmwgIT09ICdodHRwOi8vJykge1xuICAgICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmNyZWF0ZUxpbmsodXJsKTtcbiAgICB9XG4gIH1cblxuICBpbnNlcnRDb2xvcihjb2xvcjogc3RyaW5nLCB3aGVyZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLmluc2VydENvbG9yKGNvbG9yLCB3aGVyZSk7XG4gICAgdGhpcy5leGVjdXRlLmVtaXQoXCJcIik7XG4gIH1cblxuICBzZXRGb250TmFtZShmb250SWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5zZXRGb250TmFtZSh0aGlzLmZvbnRzW2ZvbnRJZF0ubmFtZSk7XG4gICAgdGhpcy5leGVjdXRlLmVtaXQoXCJcIik7XG4gIH1cblxuICBzZXRGb250U2l6ZShmb250U2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3JTZXJ2aWNlLnNldEZvbnRTaXplKGZvbnRTaXplKTtcbiAgICB0aGlzLmV4ZWN1dGUuZW1pdChcIlwiKTtcbiAgfVxuXG4gIHNldEVkaXRvck1vZGUobTogYm9vbGVhbikge1xuICAgIGNvbnN0IHRvZ2dsZUVkaXRvck1vZGVCdXR0b24gPSB0aGlzLl9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRvZ2dsZUVkaXRvck1vZGVcIiArICctJyArIHRoaXMuaWQpO1xuICAgIGlmIChtKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0b2dnbGVFZGl0b3JNb2RlQnV0dG9uLCBcImFjdGl2ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVuZGVyZXIucmVtb3ZlQ2xhc3ModG9nZ2xlRWRpdG9yTW9kZUJ1dHRvbiwgXCJhY3RpdmVcIik7XG4gICAgfVxuICAgIHRoaXMuaHRtbE1vZGUgPSBtO1xuICB9XG5cbiAgb25GaWxlQ2hhbmdlZChldmVudCkge1xuICAgIGNvbnN0IGZpbGUgPSBldmVudC50YXJnZXQuZmlsZXNbMF1cbiAgICBjb25zb2xlLmxvZyhmaWxlLnR5cGUpXG4gICAgaWYoZmlsZS50eXBlICE9PSBcImltYWdlL2pwZWdcIikge1xuICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKFwiRmlsZSB0eXBlIHNob3VsZCBiZSBKUEVHXCIpXG4gICAgICB0aGlzLmZpbGVSZXNldCgpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2UgaWYgKGZpbGUuc2l6ZS8xMDI0LzEwMjQgPiAxKSB7XG4gICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoXCJGaWxlIHNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIE1iXCIpXG4gICAgICB0aGlzLmZpbGVSZXNldCgpXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHRpbWVzdGFtcCA9IG5ldyBEYXRlKCkudmFsdWVPZigpXG4gICAgICBsZXQgZmlsZVBhdGggPSBgL21lZGlhLyR7dGltZXN0YW1wfS5qcGVnYFxuICAgICAgdGhpcy5zdG9yYWdlLnVwbG9hZChmaWxlUGF0aCwgZmlsZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnJlZihmaWxlUGF0aCkuZ2V0RG93bmxvYWRVUkwoKS50b1Byb21pc2UoKVxuICAgICAgICB9KVxuICAgICAgICAudGhlbih1cmwgPT4ge1xuICAgICAgICAgIHRoaXMubWVzc2FnZS5zdWNjZXNzKFwiSW1hZ2UgdXBsb2FkZWRcIilcbiAgICAgICAgICB0aGlzLmVkaXRvclNlcnZpY2UuaW5zZXJ0SW1hZ2UodXJsKVxuICAgICAgICAgIHRoaXMuZmlsZVJlc2V0KClcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlLmVycm9yKGVycilcbiAgICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBmaWxlUmVzZXQoKSB7XG4gICAgdGhpcy5teUlucHV0RmlsZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHNldEN1c3RvbUNsYXNzKGNsYXNzSWQ6IG51bWJlcikge1xuICAgIHRoaXMuZWRpdG9yU2VydmljZS5jcmVhdGVDdXN0b21DbGFzcyh0aGlzLmN1c3RvbUNsYXNzZXNbY2xhc3NJZF0pO1xuICB9XG59Il19