UNPKG

truly-ui

Version:

Web Components for Desktop Applications.

526 lines (524 loc) 81.5 kB
/* MIT License Copyright (c) 2019 Temainfo Software Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ import { Component, ElementRef, EventEmitter, Input, Optional, Output, Self, ViewChild, } from '@angular/core'; import { trigger, transition, style, animate } from '@angular/animations'; import { ToolbarConfigModel } from './model/toolbar-config.model'; import { Subscription } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "../i18n/i18n.service"; import * as i2 from "./services/editor.service"; import * as i3 from "@angular/platform-browser"; import * as i4 from "@angular/forms"; import * as i5 from "@angular/common"; import * as i6 from "../internals/components/label/label"; import * as i7 from "./parts/editor-link-box/editor-link-box"; import * as i8 from "./parts/editor-image-box/editor-image-box"; import * as i9 from "./parts/editor-header/editor-header"; export class TlEditor { constructor(i18n, renderer, editorService, sanitizer, cd, ngControl) { this.i18n = i18n; this.renderer = renderer; this.editorService = editorService; this.sanitizer = sanitizer; this.cd = cd; this.ngControl = ngControl; this.color = 'basic'; this.tags = []; this.fields = []; this.height = '300px'; this.labelPlacement = 'top'; this.labelSize = '100px'; this.label = ''; this.editable = true; this.disabled = false; this.saveContent = new EventEmitter(); this.fontCollection = []; this.fontSizeCollection = []; this.font = 'Arial'; this.fontSize = '3pt'; this.toggleLink = false; this.toggleImage = false; this.saved = false; this.descriptionLink = ''; this.linkItself = ''; this.colorSelected = '#000000'; this.cursorHighlight = false; this.selectedContent = false; this.activeTools = { bold: false, italic: false, underline: false, listUnordered: false, listOrdered: false, alignLeft: false, alignCenter: false, alignRight: false, alignJustify: false, blockQuote: false }; this.image = { imageUrl: '' }; this.selection = { start: 0, end: 0, baseNode: null, extentNode: null }; this.listenerRegistered = false; this.subscription = new Subscription(); this.labelAddField = this.i18n.getLocale().Editor.labelAddField; this.onChange = () => { }; this.onTouched = () => { }; this.setControl(); this.fontCollection = [ { description: 'Arial', value: 'Arial' }, { description: 'Verdana', value: 'Verdana' }, { description: 'Calibri', value: 'Calibri' }, { description: 'Courier New', value: 'Courier New' }, { description: 'Georgia', value: 'Georgia' }, { description: 'Trebuchet MS', value: 'Trebuchet MS' }, { description: 'Bookman', value: 'Bookman' } ]; this.fontSizeCollection = [ { description: '10', value: '1pt' }, { description: '20', value: '2pt' }, { description: '30', value: '3pt' }, { description: '40', value: '4pt' }, { description: '50', value: '5pt' }, { description: '60', value: '6pt' }, { description: '70', value: '7pt' } ]; } get control() { return this.ngControl?.control; } setControl() { if (this.ngControl) { this.ngControl.valueAccessor = this; } } ngAfterContentInit() { this.setContentFocus(); this.toolbarConfig = Object.assign(new ToolbarConfigModel(this.i18n), this.toolbarConfig); } handleFieldsPropagation() { setTimeout(() => { const fields = this.contentEditor.nativeElement.querySelectorAll('.ui-field'); for (const item of fields) { this.preventPropagation(item); } }, 100); } alignContent(align) { this.setContentFocus(); const element = this.cursorSelection.baseNode.parentNode; const alignment = align === 'justifyFull' ? 'justify' : align.replace('justify', '').toLocaleLowerCase(); this.renderer.setStyle(element, 'text-align', alignment); this.setCursorSelection(); } setBold() { this.setContentFocus(); document.execCommand('bold', false, null); this.setCursorSelection(); } setQuote() { this.setContentFocus(); this.activeTools.blockQuote = !this.activeTools.blockQuote; document.execCommand('formatBlock', false, this.activeTools.blockQuote ? 'blockquote' : 'div'); this.setCursorSelection(); } setItalic() { this.setContentFocus(); document.execCommand('italic', false, null); this.setCursorSelection(); } setUnorderedList() { this.setContentFocus(); document.execCommand('insertUnorderedList', false, null); this.setCursorSelection(); } setOrderedList() { this.setContentFocus(); document.execCommand('insertOrderedList', false, null); this.setCursorSelection(); } setImage($event) { this.setContentFocus(); this.image.imageUrl = $event.imageUrl; this.cursorSelection.getRangeAt(0).insertNode(this.createImageElement()); this.toggleImageBox(); } setDescriptionLink() { if (this.selectedContent) { this.descriptionLink = this.anchorNodeCursor.baseNode.nodeValue.substring(this.selection.start, this.selection.end); return; } this.descriptionLink = ''; } addField(idField) { this.recoverSelection(); this.setContentFocus(); this.cursorSelection.getRangeAt(0).insertNode(this.createFieldText(idField).nativeElement); window.getSelection().collapseToEnd(); this.change(); } addTag(value) { this.setContentFocus(); this.cursorSelection.getRangeAt(0).insertNode(this.createHashTag(value).nativeElement); window.getSelection().collapseToEnd(); this.change(); } setLink($event) { this.linkItself = $event.link; this.descriptionLink = $event.description; this.setContentFocus(); this.recoverSelection(); this.createElementLink(); this.toggleLinkBox(); } setUnderline() { this.setContentFocus(); document.execCommand('underline', false, null); this.setCursorSelection(); } setHighlight() { this.wrapper.nativeElement.style.cursor = 'grabbing'; this.cursorHighlight = true; } onChangeColor($event) { document.execCommand('foreColor', false, $event.hex); } onChangeFontSize($event) { this.recoverSelection(); this.setContentFocus(); this.fontSize = $event; document.execCommand('fontSize', null, this.fontSize); } onChangeFont($event) { this.recoverSelection(); this.setContentFocus(); this.font = $event; document.execCommand('fontName', false, this.font); } onMouseUp() { this.toggleLink = false; this.touch(); this.setAnchorNode(); if (this.cursorHighlight) { document.execCommand('hiliteColor', false, '#f0ef99'); this.cursorHighlight = false; this.resetCursor(); } } onKeyDownSave(event) { if (this.contentEditor.nativeElement.innerHTML.length === 0 || this.contentEditor.nativeElement.innerHTML === '<br>') { this.writeValue('<div><br></div>'); } if ((event.ctrlKey || event.metaKey) && event.which === 83) { event.preventDefault(); this.save(); return false; } } toggleLinkBox() { this.toggleLink = !this.toggleLink; } toggleImageBox() { this.toggleImage = !this.toggleImage; } save() { this.saveContent.emit(this.contentEditor.nativeElement.innerHTML); this.showSavedMessage(); } setCursorSelection() { this.cursorSelection = window.getSelection(); if (this.cursorSelection.baseNode) { this.handleActiveTools(); } } showSavedMessage() { this.saved = true; clearInterval(this.interval); this.interval = setInterval(() => { this.saved = false; }, 1000); } handleActiveTools() { this.handleClosestBold(); this.handleClosestItalic(); this.handleClosestUnderline(); this.handleColorParent(); this.handleListUnordered(); this.handleListOrdered(); this.handleAlignLeft(); this.handleAlignCenter(); this.handleAlignRight(); this.handleAlignJustify(); this.handleFontSize(); this.handleFontName(); this.handleBlockQuote(); } handleFontName() { this.isClosestParentElement('font') && this.hasFontFace() ? this.setFontNodeSelected() : this.setDefaultFont(); } hasFontFace() { return this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('face'); } hasFontSize() { return this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('size'); } setFontNodeSelected() { this.font = this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('face'); } setDefaultFont() { this.font = 'Arial'; } setFontSizeNodeSelected() { this.fontSize = this.cursorSelection.baseNode.parentNode.closest('font').getAttribute('size') + 'pt'; } setDefaultFontSize() { this.fontSize = '3pt'; } setAnchorNode() { this.anchorNodeCursor = document.getSelection(); this.selection['start'] = this.anchorNodeCursor.baseOffset; this.selection['end'] = this.anchorNodeCursor.extentOffset; this.selection['baseNode'] = this.anchorNodeCursor.baseNode; this.selection['extentNode'] = this.anchorNodeCursor.extentNode; this.handleNoSelection(); } handleNoSelection() { this.selectedContent = this.hasSelection(); } hasSelection() { return (this.selection.end > 0) && (this.selection.end > this.selection.start); } handleFontSize() { this.isClosestParentElement('font') && this.hasFontSize() ? this.setFontSizeNodeSelected() : this.setDefaultFontSize(); } handleAlignLeft() { this.activeTools.alignLeft = this.hasStyleParentElement('left'); } handleAlignCenter() { this.activeTools.alignCenter = this.hasStyleParentElement('center'); } handleAlignRight() { this.activeTools.alignRight = this.hasStyleParentElement('right'); } handleAlignJustify() { this.activeTools.alignJustify = this.hasStyleParentElement('justify'); } handleListOrdered() { this.activeTools.listOrdered = this.isClosestParentElement('ol'); } handleListUnordered() { this.activeTools.listUnordered = this.isClosestParentElement('ul'); } handleColorParent() { const getElementFont = this.cursorSelection.baseNode.parentNode.closest('font'); getElementFont ? this.setColorWithColorElement(getElementFont) : this.colorSelected = '#000000'; } setColorWithColorElement(getElementFont) { this.colorSelected = getElementFont.getAttribute('color'); } handleClosestBold() { this.activeTools.bold = this.isClosestParentElement('b'); } handleClosestUnderline() { this.activeTools.underline = this.isClosestParentElement('u'); } handleClosestItalic() { this.activeTools.italic = this.isClosestParentElement('i'); } handleBlockQuote() { this.activeTools.blockQuote = this.isClosestParentElement('blockquote'); } hasStyleParentElement(alignment) { const element = this.cursorSelection.baseNode.parentNode; if (element.attributes.length > 0) { return element.attributes[0].value.includes(alignment); } return false; } isClosestParentElement(element) { return !!this.cursorSelection.baseNode.parentNode.closest(element); } preventPropagation(fieldText) { this.listenerRegistered = true; fieldText.addEventListener('input', (e) => { e.target.setAttribute('value', e.target.value); }); fieldText.addEventListener('keydown', (e) => { e.stopPropagation(); }); } createFieldText(idField) { const fieldText = new ElementRef(this.renderer.createElement('input')); this.renderer.addClass(fieldText.nativeElement, 'ui-field'); this.preventPropagation(fieldText.nativeElement); fieldText.nativeElement.setAttribute('id', idField); fieldText.nativeElement.placeholder = ''; return fieldText; } createHashTag(value) { const hashTag = new ElementRef(this.renderer.createElement('span')); this.renderer.addClass(hashTag.nativeElement, 'ui-hashtag'); hashTag.nativeElement.innerText = value; hashTag.nativeElement.setAttribute('id', value); hashTag.nativeElement.setAttribute('contenteditable', false); return hashTag; } createImageElement() { const imageHTML = new ElementRef(this.renderer.createElement('img')); this.renderer.addClass(imageHTML.nativeElement, 'ui-image-editor'); imageHTML.nativeElement.setAttribute('src', this.image.imageUrl); return imageHTML.nativeElement; } createElementLink() { const link = new ElementRef(this.renderer.createElement('a')); this.renderer.addClass(link.nativeElement, 'ui-link'); link.nativeElement.setAttribute('src', this.linkItself); link.nativeElement.setAttribute('text', this.descriptionLink); link.nativeElement.setAttribute('target', '_blank'); this.handleAddElementRange(link); } handleAddElementRange(link) { this.selectedContent ? window.getSelection().getRangeAt(0).surroundContents(link.nativeElement) : window.getSelection().getRangeAt(0).insertNode(link.nativeElement); } recoverSelection() { const selection = document.getSelection(); const range = document.createRange(); if (this.selection.baseNode) { range.setStart(this.selection.baseNode, this.selection.start); range.setEnd(this.selection.extentNode, this.selection.end); selection.removeAllRanges(); selection.addRange(range); } } recoverCursorPosition() { setTimeout(() => { const sel = document.getSelection(); const range = new Range(); if (this.selection.baseNode) { range.selectNodeContents(this.contentEditor.nativeElement); range.collapse(false); sel.removeAllRanges(); sel.addRange(range); } }, 1); } resetCursor() { this.wrapper.nativeElement.style.cursor = 'auto'; } setContentFocus() { this.contentEditor.nativeElement.focus(); } clearContent() { this.writeValue(''); this.save(); } writeValue(value) { this.content = this.sanitizer.bypassSecurityTrustHtml(value); this.handleFieldsPropagation(); this.recoverCursorPosition(); this.cd.detectChanges(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } touch() { this.onTouched(this.contentEditor.nativeElement.innerHTML); } change() { this.setCursorSelection(); this.onChange(this.contentEditor.nativeElement.innerHTML); } ngOnChanges(data) { } } /** @nocollapse */ TlEditor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlEditor, deps: [{ token: i1.I18nService }, { token: i0.Renderer2 }, { token: i2.EditorService }, { token: i3.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i4.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ TlEditor.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlEditor, selector: "tl-editor", inputs: { content: "content", color: "color", tags: "tags", fields: "fields", toolbarConfig: "toolbarConfig", height: "height", labelPlacement: "labelPlacement", labelSize: "labelSize", label: "label", editable: "editable", disabled: "disabled" }, outputs: { saveContent: "saveContent" }, viewQueries: [{ propertyName: "contentEditor", first: true, predicate: ["contentEditor"], descendants: true, static: true }, { propertyName: "linkBox", first: true, predicate: ["linkBox"], descendants: true, static: true }, { propertyName: "wrapper", first: true, predicate: ["wrapper"], descendants: true, static: true }, { propertyName: "fieldTemplate", first: true, predicate: ["fieldTemplate"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ui-editor\">\n <tl-label *ngIf=\"label\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div [class]=\"'ui-editor-wrapper ' + color\" #wrapper>\n <tl-editor-header [toolbarConfig]=\"toolbarConfig\"\n [activeTools]=\"activeTools\"\n [cursorHighlight]=\"cursorHighlight\"\n [labelAddField]=\"labelAddField\"\n [fields]=\"fields\"\n [color]=\"color\"\n [colorSelected]=\"colorSelected\"\n [fontSelected]=\"font\"\n [fontSizeSelected]=\"fontSize\"\n [fontCollection]=\"fontCollection\"\n [fontSizeCollection]=\"fontSizeCollection\"\n (changeColor)=\"onChangeColor($event)\"\n (changeFont)=\"onChangeFont($event)\"\n (changeFontSize)=\"onChangeFontSize($event)\"\n (clickBold)=\"setBold()\"\n (clickItalic)=\"setItalic()\"\n (clickHighlight)=\"setHighlight()\"\n (clickOrderedList)=\"setOrderedList()\"\n (clickAlignContent)=\"alignContent($event)\"\n (clickLink)=\"toggleLinkBox(); setDescriptionLink()\"\n (clickUnorderedList)=\"setUnorderedList()\"\n (clickUnderline)=\"setUnderline()\"\n (clickImage)=\"toggleImageBox()\"\n (clickField)=\"addField($event)\"\n (clickQuote)=\"setQuote()\"\n (clickSave)=\"save()\"\n (clickClear)=\"clearContent()\">\n </tl-editor-header>\n <div #contentEditor\n class=\"ui-editor-content\"\n [class.disabled]=\"disabled\"\n [style.height]=\"height\"\n (input)=\"change()\"\n (focusout)=\"setAnchorNode()\"\n (click)=\"setCursorSelection()\"\n (focus)=\"setCursorSelection()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.ArrowUp)=\"$event.stopPropagation()\"\n (keydown.ArrowDown)=\"$event.stopPropagation()\"\n (mouseup)=\"onMouseUp()\"\n [attr.contenteditable]=\"editable || !disabled\"\n [innerHTML]=\"content\">\n </div>\n <div class=\"ui-saved-content-message\" [@enterAnimation]=\"saved\" *ngIf=\"saved\">\n <i class=\"ion-ios-checkmark-outline\"></i>\n <span>Saved !</span>\n </div>\n <tl-editor-link-box [descriptionLink]=\"descriptionLink\"\n *ngIf=\"toggleLink && !toggleImage\"\n (onSetLink)=\"setLink($event)\"\n (onToggleLink)=\"toggleLinkBox()\">\n </tl-editor-link-box>\n <tl-editor-image-box *ngIf=\"toggleImage && !toggleLink\"\n [imageUrl]=\"image.imageUrl\"\n (onSetImage)=\"setImage($event)\"\n (onToggleImage)=\"toggleImageBox()\">\n </tl-editor-image-box>\n <div class=\"ui-editor-footer\" *ngIf=\"tags.length > 0\">\n <div *ngFor=\"let item of tags\" (click)=\"addTag(item)\" class=\"ui-hashtag\">{{ item }}</div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}:host{width:100%}.ui-editor-footer{display:flex;align-items:flex-start;height:auto;width:100%;background:#e9e9e9;overflow:auto}.ui-editor-footer::-webkit-scrollbar{height:4px;width:0}.ui-editor{width:100%}.ui-link{text-decoration:underline}.ui-editor-wrapper{width:100%;height:100%;position:relative;overflow:hidden}.ui-image-editor{padding:10px;box-sizing:border-box}.ui-image-editor:hover{cursor:pointer}.ui-saved-content-message{position:absolute;top:0;right:0;background:#333;padding:10px;box-sizing:border-box;-webkit-user-select:none;user-select:none;display:grid;grid-template-columns:25px 1fr;text-align:center;border-top-left-radius:0;border-bottom-left-radius:20px}.ui-color-component{position:absolute;height:12px;border:0;top:25px}.ui-editor-content{height:300px;overflow:auto;padding:10px;box-sizing:border-box;outline:none;word-break:break-word;cursor:text}.ui-editor-content.disabled{pointer-events:none;opacity:.5}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.TlLabel, selector: "tl-label", inputs: ["labelPlacement", "required", "labelSize", "labelTitle"] }, { kind: "component", type: i7.TlEditorLinkBox, selector: "tl-editor-link-box", inputs: ["descriptionLink"], outputs: ["onSetLink", "onToggleLink"] }, { kind: "component", type: i8.TlEditorImageBox, selector: "tl-editor-image-box", inputs: ["imageUrl"], outputs: ["onSetImage", "onToggleImage"] }, { kind: "component", type: i9.TlEditorHeader, selector: "tl-editor-header", inputs: ["toolbarConfig", "cursorHighlight", "fontSizeCollection", "fontCollection", "fields", "color", "activeTools", "colorSelected", "fontSelected", "fontSizeSelected", "labelAddField"], outputs: ["changeColor", "changeFont", "changeFontSize", "clickUnderline", "clickItalic", "clickBold", "clickHighlight", "clickAlignContent", "clickUnorderedList", "clickOrderedList", "clickLink", "clickImage", "clickQuote", "clickClear", "clickSave", "clickField"] }], animations: [ trigger('enterAnimation', [ transition(':enter', [ style({ transform: 'translateX(100%)', opacity: 0 }), animate('250ms', style({ transform: 'translateX(0)', opacity: 1 })) ]), transition(':leave', [ style({ transform: 'translateX(0)', opacity: 1 }), animate('250ms', style({ transform: 'translateX(100%)', opacity: 0 })) ]) ]) ] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlEditor, decorators: [{ type: Component, args: [{ selector: 'tl-editor', animations: [ trigger('enterAnimation', [ transition(':enter', [ style({ transform: 'translateX(100%)', opacity: 0 }), animate('250ms', style({ transform: 'translateX(0)', opacity: 1 })) ]), transition(':leave', [ style({ transform: 'translateX(0)', opacity: 1 }), animate('250ms', style({ transform: 'translateX(100%)', opacity: 0 })) ]) ]) ], template: "<div class=\"ui-editor\">\n <tl-label *ngIf=\"label\" [labelTitle]=\"label\" [labelSize]=\"labelSize\" [labelPlacement]=\"labelPlacement\"></tl-label>\n <div [class]=\"'ui-editor-wrapper ' + color\" #wrapper>\n <tl-editor-header [toolbarConfig]=\"toolbarConfig\"\n [activeTools]=\"activeTools\"\n [cursorHighlight]=\"cursorHighlight\"\n [labelAddField]=\"labelAddField\"\n [fields]=\"fields\"\n [color]=\"color\"\n [colorSelected]=\"colorSelected\"\n [fontSelected]=\"font\"\n [fontSizeSelected]=\"fontSize\"\n [fontCollection]=\"fontCollection\"\n [fontSizeCollection]=\"fontSizeCollection\"\n (changeColor)=\"onChangeColor($event)\"\n (changeFont)=\"onChangeFont($event)\"\n (changeFontSize)=\"onChangeFontSize($event)\"\n (clickBold)=\"setBold()\"\n (clickItalic)=\"setItalic()\"\n (clickHighlight)=\"setHighlight()\"\n (clickOrderedList)=\"setOrderedList()\"\n (clickAlignContent)=\"alignContent($event)\"\n (clickLink)=\"toggleLinkBox(); setDescriptionLink()\"\n (clickUnorderedList)=\"setUnorderedList()\"\n (clickUnderline)=\"setUnderline()\"\n (clickImage)=\"toggleImageBox()\"\n (clickField)=\"addField($event)\"\n (clickQuote)=\"setQuote()\"\n (clickSave)=\"save()\"\n (clickClear)=\"clearContent()\">\n </tl-editor-header>\n <div #contentEditor\n class=\"ui-editor-content\"\n [class.disabled]=\"disabled\"\n [style.height]=\"height\"\n (input)=\"change()\"\n (focusout)=\"setAnchorNode()\"\n (click)=\"setCursorSelection()\"\n (focus)=\"setCursorSelection()\"\n (keydown.enter)=\"$event.stopPropagation()\"\n (keydown.ArrowUp)=\"$event.stopPropagation()\"\n (keydown.ArrowDown)=\"$event.stopPropagation()\"\n (mouseup)=\"onMouseUp()\"\n [attr.contenteditable]=\"editable || !disabled\"\n [innerHTML]=\"content\">\n </div>\n <div class=\"ui-saved-content-message\" [@enterAnimation]=\"saved\" *ngIf=\"saved\">\n <i class=\"ion-ios-checkmark-outline\"></i>\n <span>Saved !</span>\n </div>\n <tl-editor-link-box [descriptionLink]=\"descriptionLink\"\n *ngIf=\"toggleLink && !toggleImage\"\n (onSetLink)=\"setLink($event)\"\n (onToggleLink)=\"toggleLinkBox()\">\n </tl-editor-link-box>\n <tl-editor-image-box *ngIf=\"toggleImage && !toggleLink\"\n [imageUrl]=\"image.imageUrl\"\n (onSetImage)=\"setImage($event)\"\n (onToggleImage)=\"toggleImageBox()\">\n </tl-editor-image-box>\n <div class=\"ui-editor-footer\" *ngIf=\"tags.length > 0\">\n <div *ngFor=\"let item of tags\" (click)=\"addTag(item)\" class=\"ui-hashtag\">{{ item }}</div>\n </div>\n </div>\n</div>\n", styles: ["*{box-sizing:border-box}:host{width:100%}.ui-editor-footer{display:flex;align-items:flex-start;height:auto;width:100%;background:#e9e9e9;overflow:auto}.ui-editor-footer::-webkit-scrollbar{height:4px;width:0}.ui-editor{width:100%}.ui-link{text-decoration:underline}.ui-editor-wrapper{width:100%;height:100%;position:relative;overflow:hidden}.ui-image-editor{padding:10px;box-sizing:border-box}.ui-image-editor:hover{cursor:pointer}.ui-saved-content-message{position:absolute;top:0;right:0;background:#333;padding:10px;box-sizing:border-box;-webkit-user-select:none;user-select:none;display:grid;grid-template-columns:25px 1fr;text-align:center;border-top-left-radius:0;border-bottom-left-radius:20px}.ui-color-component{position:absolute;height:12px;border:0;top:25px}.ui-editor-content{height:300px;overflow:auto;padding:10px;box-sizing:border-box;outline:none;word-break:break-word;cursor:text}.ui-editor-content.disabled{pointer-events:none;opacity:.5}\n"] }] }], ctorParameters: function () { return [{ type: i1.I18nService }, { type: i0.Renderer2 }, { type: i2.EditorService }, { type: i3.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i4.NgControl, decorators: [{ type: Optional }, { type: Self }] }]; }, propDecorators: { content: [{ type: Input }], color: [{ type: Input }], tags: [{ type: Input }], fields: [{ type: Input }], toolbarConfig: [{ type: Input }], height: [{ type: Input }], labelPlacement: [{ type: Input }], labelSize: [{ type: Input }], label: [{ type: Input }], editable: [{ type: Input }], disabled: [{ type: Input }], contentEditor: [{ type: ViewChild, args: ['contentEditor', { static: true }] }], linkBox: [{ type: ViewChild, args: ['linkBox', { static: true }] }], wrapper: [{ type: ViewChild, args: ['wrapper', { static: true }] }], fieldTemplate: [{ type: ViewChild, args: ['fieldTemplate', { static: true }] }], saveContent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvZWRpdG9yL2VkaXRvci50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL2VkaXRvci9lZGl0b3IuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNNLFFBQVEsRUFDbkIsTUFBTSxFQUNLLElBQUksRUFFZixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBS2hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBdUJsQyxNQUFNLE9BQU8sUUFBUTtJQTJGbkIsWUFBb0IsSUFBaUIsRUFDakIsUUFBbUIsRUFDbkIsYUFBNEIsRUFDNUIsU0FBdUIsRUFDdkIsRUFBcUIsRUFDRixTQUFvQjtRQUx2QyxTQUFJLEdBQUosSUFBSSxDQUFhO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNGLGNBQVMsR0FBVCxTQUFTLENBQVc7UUE1RmxELFVBQUssR0FBRyxPQUFPLENBQUM7UUFFaEIsU0FBSSxHQUFHLEVBQUUsQ0FBQztRQUVWLFdBQU0sR0FBbUIsRUFBRSxDQUFDO1FBSTVCLFdBQU0sR0FBRyxPQUFPLENBQUM7UUFFakIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkIsY0FBUyxHQUFHLE9BQU8sQ0FBQztRQUVwQixVQUFLLEdBQUcsRUFBRSxDQUFDO1FBRVgsYUFBUSxHQUFHLElBQUksQ0FBQztRQUVoQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBVWhCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwQyxtQkFBYyxHQUFHLEVBQUUsQ0FBQztRQUVwQix1QkFBa0IsR0FBRyxFQUFFLENBQUM7UUFFeEIsU0FBSSxHQUFHLE9BQU8sQ0FBQztRQUVmLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFakIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUVwQixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRWQsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFFckIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUVoQixrQkFBYSxHQUFHLFNBQVMsQ0FBQztRQUkxQixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUV4QixvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUl4QixnQkFBVyxHQUFHO1lBQ25CLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLEtBQUs7WUFDYixTQUFTLEVBQUUsS0FBSztZQUNoQixhQUFhLEVBQUUsS0FBSztZQUNwQixXQUFXLEVBQUUsS0FBSztZQUNsQixTQUFTLEVBQUUsS0FBSztZQUNoQixXQUFXLEVBQUUsS0FBSztZQUNsQixVQUFVLEVBQUUsS0FBSztZQUNqQixZQUFZLEVBQUUsS0FBSztZQUNuQixVQUFVLEVBQUUsS0FBSztTQUNsQixDQUFDO1FBRUssVUFBSyxHQUFHLEVBQUMsUUFBUSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBRXZCLGNBQVMsR0FBRyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUloRSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFM0IsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5DLGtCQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBRTFELGFBQVEsR0FBUSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7UUFFekIsY0FBUyxHQUFRLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztRQVFoQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQixFQUFDLFdBQVcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQztZQUN0QyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztZQUMxQyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztZQUMxQyxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBQztZQUNsRCxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztZQUMxQyxFQUFDLFdBQVcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBQztZQUNwRCxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBQztTQUMzQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1lBQ2pDLEVBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDO1NBQ2xDLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUssSUFBSSxDQUFDLFNBQVMsRUFBRztZQUNwQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7U0FDckM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRCx1QkFBdUI7UUFDckIsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlFLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFO2dCQUN6QixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDL0I7UUFDSCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQUs7UUFDaEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUMzRCxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0YsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVEsQ0FBQyxNQUFNO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDcEgsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFFBQVEsQ0FBRSxPQUFPO1FBQ2YsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFFLE9BQU8sQ0FBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdGLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFhO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RixNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBTTtRQUNaLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztRQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQU07UUFDbEIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBTTtRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7UUFDdkIsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsWUFBWSxDQUFDLE1BQU07UUFDakIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO1FBQ25CLFFBQVEsQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLFFBQVEsQ0FBQyxXQUFXLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQ3BILElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUNwQztRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTtZQUMxRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDckMsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxrQkFBa0I7UUFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRTtZQUNqQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN2RCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRU8sV0FBVztRQUNqQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFTyxXQUFXO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdkcsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQztRQUMzRCxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxpQkFBaUI7UUFDdkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVPLFlBQVk7UUFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUN2RCxDQUFDLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2pFLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEYsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ2xHLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxjQUFjO1FBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8scUJBQXFCLENBQUMsU0FBaUI7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQ3pELElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ3hEO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBTztRQUNwQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxTQUFTO1FBQ2xDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsU0FBUyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzFDLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxlQUFlLENBQUUsT0FBTztRQUM5QixNQUFNLFNBQVMsR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqRCxTQUFTLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFFLENBQUM7UUFDckQsU0FBUyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYTtRQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDNUQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sa0JBQWtCO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25FLFNBQVMsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sU0FBUyxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRU8scUJBQXFCLENBQUMsSUFBSTtRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQy9GLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRTtZQUMzQixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDOUQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVELFNBQVMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM1QixTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BDLE1BQU0s