@firestitch/html-editor 12.0.2 → 12.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/app/classes/plugin.d.ts +7 -7
  2. package/app/components/html-editor/html-editor.component.d.ts +58 -58
  3. package/app/components/html-renderer/html-renderer.component.d.ts +12 -12
  4. package/app/consts/paragraph-buttons.const.d.ts +1 -1
  5. package/app/consts/rich-buttons.const.d.ts +1 -1
  6. package/app/consts/text-buttons.const.d.ts +1 -1
  7. package/app/enums/default-plugin.enum.d.ts +15 -15
  8. package/app/fs-html-editor.module.d.ts +42 -42
  9. package/app/injects/config.inject.d.ts +3 -3
  10. package/app/interfaces/html-editor-config.d.ts +40 -40
  11. package/app/interfaces/plugin-button.d.ts +12 -12
  12. package/app/interfaces/plugin-config.d.ts +5 -5
  13. package/app/plugins/checklist.plugin.d.ts +7 -7
  14. package/app/plugins/code.plugin.d.ts +9 -9
  15. package/app/plugins/configs/mention-plugin.config.d.ts +13 -13
  16. package/app/plugins/configs/screen-record-plugin.config.d.ts +7 -7
  17. package/app/plugins/mention.plugin.d.ts +15 -15
  18. package/app/plugins/screen-record.plugin.d.ts +11 -11
  19. package/app/services/froala-loader.service.d.ts +20 -20
  20. package/app/utils/loader.d.ts +7 -7
  21. package/bundles/firestitch-html-editor.umd.js +1396 -1396
  22. package/bundles/firestitch-html-editor.umd.js.map +1 -1
  23. package/esm2015/app/classes/plugin.js +4 -4
  24. package/esm2015/app/components/html-editor/html-editor.component.js +489 -489
  25. package/esm2015/app/components/html-renderer/html-renderer.component.js +28 -28
  26. package/esm2015/app/consts/paragraph-buttons.const.js +8 -8
  27. package/esm2015/app/consts/rich-buttons.const.js +6 -6
  28. package/esm2015/app/consts/text-buttons.const.js +18 -18
  29. package/esm2015/app/enums/default-plugin.enum.js +1 -1
  30. package/esm2015/app/fs-html-editor.module.js +64 -64
  31. package/esm2015/app/injects/config.inject.js +3 -3
  32. package/esm2015/app/interfaces/html-editor-config.js +1 -1
  33. package/esm2015/app/interfaces/plugin-button.js +1 -1
  34. package/esm2015/app/interfaces/plugin-config.js +1 -1
  35. package/esm2015/app/plugins/checklist.plugin.js +34 -34
  36. package/esm2015/app/plugins/code.plugin.js +62 -62
  37. package/esm2015/app/plugins/configs/mention-plugin.config.js +1 -1
  38. package/esm2015/app/plugins/configs/screen-record-plugin.config.js +1 -1
  39. package/esm2015/app/plugins/mention.plugin.js +86 -86
  40. package/esm2015/app/plugins/screen-record.plugin.js +91 -91
  41. package/esm2015/app/services/froala-loader.service.js +79 -79
  42. package/esm2015/app/utils/loader.js +83 -83
  43. package/esm2015/firestitch-html-editor.js +4 -4
  44. package/esm2015/public_api.js +11 -11
  45. package/fesm2015/firestitch-html-editor.js +997 -997
  46. package/fesm2015/firestitch-html-editor.js.map +1 -1
  47. package/firestitch-html-editor.d.ts +5 -5
  48. package/package.json +1 -1
  49. package/public_api.d.ts +16 -16
@@ -1,489 +1,489 @@
1
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, Inject, Input, Optional, ViewChild } from '@angular/core';
2
- import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { FileProcessor, FsFile } from '@firestitch/file';
4
- import { BehaviorSubject, fromEventPattern, ReplaySubject, Subject } from 'rxjs';
5
- import { distinctUntilChanged, filter, map, skip, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
6
- import { merge } from 'lodash-es';
7
- import { RichButtons } from './../../consts/rich-buttons.const';
8
- import { TextButtons } from './../../consts/text-buttons.const';
9
- import { ParagraphButtons } from './../../consts/paragraph-buttons.const';
10
- import { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';
11
- import { FsFroalaLoaderService } from '../../services/froala-loader.service';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../../services/froala-loader.service";
14
- import * as i2 from "../html-renderer/html-renderer.component";
15
- import * as i3 from "@angular/common";
16
- import * as i4 from "@firestitch/skeleton";
17
- export class FsHtmlEditorComponent {
18
- constructor(_defaultConfig, _cdRef, _fr) {
19
- this._defaultConfig = _defaultConfig;
20
- this._cdRef = _cdRef;
21
- this._fr = _fr;
22
- this.classFocused = false;
23
- this.classDisabled = false;
24
- this.config = {};
25
- this.initialized = false;
26
- this._initialize$ = new ReplaySubject();
27
- this._froalaReady$ = new BehaviorSubject(null);
28
- this._destroy$ = new Subject();
29
- this.onChange = (data) => { };
30
- this.onTouched = () => { };
31
- }
32
- get el() {
33
- return this.elRef.nativeElement;
34
- }
35
- get html() {
36
- return this._html;
37
- }
38
- get editor() {
39
- return this._editor;
40
- }
41
- get froalaLoaded$() {
42
- return this._fr.loaded$;
43
- }
44
- ngOnInit() {
45
- this.config = this.config || {};
46
- this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;
47
- this.initialized = !this.config.initOnClick;
48
- this._listenLazyInit();
49
- }
50
- ngAfterViewInit() {
51
- if (!this.config.initOnClick || !this.hasContent()) {
52
- this.initialized = true;
53
- this._initialize$.next();
54
- }
55
- }
56
- hasContent() {
57
- const el = document.createElement('div');
58
- if (el.querySelector('img')) {
59
- return true;
60
- }
61
- el.innerHTML = this._html;
62
- return !!el.innerText.length;
63
- }
64
- initialize(options = {}) {
65
- const config = this._createConfig();
66
- this._initPlugins(config);
67
- this._initButtons(config);
68
- this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {
69
- this._froalaReady$.next({ config, options });
70
- });
71
- }
72
- _processImageUpload(blob) {
73
- const processor = new FileProcessor();
74
- const file = new FsFile(blob);
75
- return processor.process([file], this.config.image)
76
- .pipe(switchMap(([f]) => {
77
- return this.config.image.upload(f.file);
78
- }));
79
- }
80
- uninitializedClick(event) {
81
- if (!event.defaultPrevented) {
82
- const target = event.target;
83
- if (target && target.nodeName === 'A' && target.getAttribute('href')) {
84
- const targetTarget = target.getAttribute('target');
85
- target.setAttribute('target', '_blank');
86
- setTimeout(() => {
87
- if (targetTarget) {
88
- target.setAttribute('target', targetTarget);
89
- }
90
- else {
91
- target.removeAttribute('target');
92
- }
93
- });
94
- }
95
- else {
96
- if (this.config.initClick) {
97
- this.config.initClick(event);
98
- }
99
- this._initialize$.next();
100
- this.initialized = true;
101
- }
102
- }
103
- }
104
- updateSize() {
105
- // Hack: To trigger the toolbar button size modes
106
- window.dispatchEvent(new Event('resize'));
107
- }
108
- validate(control) {
109
- const err = {};
110
- if (this.config.maxLength && this._html) {
111
- const maxLength = this.config.maxLength;
112
- const length = this._html.length;
113
- if (length > maxLength) {
114
- err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;
115
- }
116
- }
117
- return Object.keys(err).length ? err : null;
118
- }
119
- focus(options) {
120
- options = options ? options : {};
121
- if (options.cursorPosition === 'end') {
122
- this.editor.selection.setAtEnd(this.editor.$el.get(0));
123
- }
124
- else {
125
- this.editor.selection.setAtStart(this.editor.$el.get(0));
126
- }
127
- this.editor.selection.restore();
128
- const elSelection = this.editor.selection.element();
129
- if (elSelection) {
130
- elSelection.scrollIntoView({ block: 'center' });
131
- }
132
- }
133
- clear() {
134
- this.writeValue('');
135
- }
136
- disable() {
137
- this.classDisabled = true;
138
- }
139
- setHtml(html) {
140
- this.writeValue(html);
141
- }
142
- writeValue(html) {
143
- this._html = html || '';
144
- if (this.editor && this.editor.html) {
145
- try {
146
- this.editor.html.set(this._html);
147
- }
148
- catch (e) {
149
- }
150
- }
151
- this._cdRef.markForCheck();
152
- }
153
- registerOnChange(fn) {
154
- this.onChange = fn;
155
- }
156
- registerOnTouched(fn) {
157
- this.onTouched = fn;
158
- }
159
- ngOnDestroy() {
160
- this._initialize$.complete();
161
- this._destroy$.next();
162
- this._destroy$.complete();
163
- this.destroy();
164
- }
165
- destroy() {
166
- if (this.editor) {
167
- this.editor.destroy();
168
- }
169
- this.initialized = false;
170
- this._cdRef.markForCheck();
171
- this.el.innerHTML = '';
172
- }
173
- _createConfig() {
174
- return merge({ froalaConfig: {} }, this._defaultConfig, this.config);
175
- }
176
- _change(html) {
177
- // this._html = html;
178
- this.onChange(html);
179
- }
180
- _initButtons(config) {
181
- (config.buttons || [])
182
- .forEach((button) => {
183
- /*
184
- Svg Keys:
185
- ["add", "advancedImageEditor", "alignCenter", "alignJustify", "alignLeft", "alignRight",
186
- "anchors", "back", "backgroundColor", "blockquote", "bold", "cellBackground",
187
- "cellBorderColor", "cellOptions", "cellStyle", "clearFormatting", "close", "codeView",
188
- "cogs", "columns", "editLink", "exitFullscreen", "fontAwesome", "fontFamily",
189
- "fontSize", "fullscreen", "help", "horizontalLine", "imageAltText", "imageCaption",
190
- "imageClass", "imageDisplay", "imageManager", "imageSize", "indent", "inlineClass",
191
- "inlineStyle", "insertEmbed", "insertFile", "insertImage", "insertLink", "insertMore",
192
- "insertTable", "insertVideo", "upload", "italic", "search", "lineHeight", "linkStyles",
193
- "mention", "more", "openLink", "orderedList", "outdent", "pageBreaker",
194
- "paragraphFormat", "paragraphMore", "paragraphStyle", "pdfExport", "print",
195
- "redo", "removeTable", "remove", "replaceImage", "row", "selectAll", "smile",
196
- "spellcheck", "star", "strikeThrough", "subscript", "superscript", "symbols", "tags",
197
- "tableHeader", "tableStyle", "textColor", "textMore", "underline", "undo", "unlink",
198
- "unorderedList", "verticalAlignBottom", "verticalAlignMiddle", "verticalAlignTop"]
199
- */
200
- var _a, _b, _c;
201
- if (button.svgKey) {
202
- this._fr.FroalaEditor.DefineIcon(button.name, { SVG_KEY: button.svgKey });
203
- }
204
- this._fr.FroalaEditor.RegisterCommand(button.name, {
205
- title: button.title,
206
- focus: (_a = button.focus) !== null && _a !== void 0 ? _a : true,
207
- undo: (_b = button.undo) !== null && _b !== void 0 ? _b : true,
208
- refreshAfterCallback: (_c = button.refreshAfterCallback) !== null && _c !== void 0 ? _c : true,
209
- callback: function () {
210
- button.click(this);
211
- }
212
- });
213
- });
214
- }
215
- _initPlugins(config) {
216
- (config.plugins || []).forEach((plugin) => {
217
- this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {
218
- plugin.editor = editor;
219
- plugin.initialize();
220
- return plugin;
221
- };
222
- (plugin.config.buttons || []).forEach((button) => {
223
- this._fr.FroalaEditor.DefineIcon(button.name, {
224
- NAME: button.name,
225
- PATH: button.svgPath,
226
- });
227
- this._fr.FroalaEditor.RegisterCommand(button.name, {
228
- icon: button.name,
229
- title: button.tooltip,
230
- undo: button.undo,
231
- focus: button.focus,
232
- showOnMobile: button.showOnMobile,
233
- refreshAfterCallback: button.refreshAfterCallback,
234
- callback: function () {
235
- if (button.click) {
236
- button.click(this);
237
- }
238
- },
239
- refresh: function (button) {
240
- if (button.refresh) {
241
- button.refresh(this, button);
242
- }
243
- }
244
- });
245
- });
246
- });
247
- }
248
- _createOptions() {
249
- const config = this._createConfig();
250
- return merge(
251
- // For some reason editor store somewhere pointer on default config object and dublicate options each time on init
252
- // Extra merge level fixed this problem and allow to init config properly without legacy data
253
- {}, {
254
- shortcutsEnabled: ['show', 'bold', 'italic', 'underline', 'indent', 'outdent', 'undo', 'redo', 'insertImage', 'createLink'],
255
- key: config.activationKey,
256
- placeholderText: config.placeholder,
257
- linkAlwaysBlank: true,
258
- tabSpaces: 2,
259
- typingTimer: 250,
260
- tooltips: false,
261
- wordPasteModal: false,
262
- imageDefaultWidth: 0,
263
- imageDefaultAlign: 'left',
264
- quickInsertEnabled: false,
265
- paragraphDefaultSelection: 'Format',
266
- videoUpload: false,
267
- paragraphFormat: {
268
- N: 'Normal',
269
- H1: 'Heading 1',
270
- H2: 'Heading 2',
271
- H3: 'Heading 3',
272
- H4: 'Heading 4',
273
- BLOCKQUOTE: 'Quote',
274
- },
275
- paragraphFormatSelection: true,
276
- toolbarButtonsXS: {
277
- moreText: {
278
- buttons: TextButtons,
279
- buttonsVisible: 1,
280
- },
281
- moreParagraph: {
282
- buttons: ParagraphButtons,
283
- buttonsVisible: 2,
284
- },
285
- moreRich: {
286
- buttons: RichButtons,
287
- buttonsVisible: 0,
288
- },
289
- },
290
- toolbarButtons: {
291
- moreText: {
292
- buttons: TextButtons,
293
- buttonsVisible: 3,
294
- },
295
- moreParagraph: {
296
- buttons: ParagraphButtons,
297
- buttonsVisible: 5,
298
- },
299
- moreRich: {
300
- buttons: RichButtons,
301
- buttonsVisible: 3,
302
- },
303
- },
304
- }, config.froalaConfig);
305
- }
306
- _listenLazyInit() {
307
- this.froalaLoaded$
308
- .pipe(filter((ready) => ready), switchMap(() => this._initialize$), tap(() => {
309
- const selection = window.getSelection();
310
- const options = {};
311
- if (selection.baseNode) {
312
- options.selection = {
313
- node: selection.baseNode.nodeValue,
314
- offset: selection.baseOffset,
315
- };
316
- }
317
- this.initialize(options);
318
- }), switchMap(() => this._froalaReady$), filter((data) => !!data), tap(({ config, options }) => {
319
- this._setupFroala(config, options);
320
- }))
321
- .subscribe();
322
- }
323
- _contentChanged() {
324
- const editorHTML = this._editor.html.get();
325
- if (this.html !== editorHTML) {
326
- this._change(editorHTML);
327
- }
328
- }
329
- _setupFroala(config, options) {
330
- this._cdRef.markForCheck();
331
- this.setHtml(this._html);
332
- if (config.disabled) {
333
- this.disable();
334
- }
335
- if (config.froalaConfig.events) {
336
- if (config.froalaConfig.events.initialized) {
337
- config.froalaConfig.events.initialized();
338
- }
339
- }
340
- this._editor.events.on('focus', () => {
341
- this.classFocused = true;
342
- this._cdRef.markForCheck();
343
- });
344
- this._editor.events.on('blur', () => {
345
- this.classFocused = false;
346
- this._cdRef.markForCheck();
347
- });
348
- fromEventPattern((handler) => {
349
- this._editor.events.on('contentChanged', handler);
350
- }, () => { })
351
- .pipe(startWith(this._html), map(() => this.editor.html.get()), distinctUntilChanged(), skip(1))
352
- .subscribe(() => {
353
- this._contentChanged();
354
- });
355
- // this._editor.events.on('contentChanged', () => {
356
- // console.log('test');
357
- // if (!this._firstChange) {
358
- // this._contentChanged();
359
- // }
360
- // });
361
- this._editor.events.on('paste.afterCleanup', (html) => {
362
- var div = document.createElement('div');
363
- div.innerHTML = html;
364
- div.querySelectorAll('*')
365
- .forEach((el) => {
366
- for (var i = 0; i < el.attributes.length; i++) {
367
- const name = el.attributes[0].name;
368
- if (name !== 'href') {
369
- el.removeAttribute(name);
370
- }
371
- }
372
- });
373
- return div.innerHTML;
374
- });
375
- this._editor.events.on('keydown', () => {
376
- this.onTouched();
377
- });
378
- if (this.config.image && this.config.image.upload) {
379
- this._editor.events.on('image.beforePasteUpload', (image) => {
380
- fetch(image.getAttribute('src'))
381
- .then((res) => {
382
- res.blob()
383
- .then((blob) => {
384
- this._processImageUpload(blob)
385
- .pipe(takeUntil(this._destroy$))
386
- .subscribe((url) => {
387
- image.setAttribute('src', url);
388
- image.removeAttribute('data-fr-image-pasted');
389
- this._contentChanged();
390
- });
391
- });
392
- });
393
- return false;
394
- });
395
- this._editor.events.on('image.beforeUpload', (blobs) => {
396
- this._processImageUpload(blobs[0])
397
- .pipe(takeUntil(this._destroy$))
398
- .subscribe((url) => {
399
- this.editor.image.insert(url, null, null, this.editor.image.get());
400
- });
401
- return false;
402
- });
403
- }
404
- if (this.el.querySelector('.fr-second-toolbar')) {
405
- this.el.querySelector('.fr-second-toolbar').remove();
406
- }
407
- const selection = options.selection;
408
- if (selection) {
409
- const node = Array.from(this.el.querySelectorAll('.fr-element *')).find((node) => {
410
- return selection.node === node.textContent;
411
- });
412
- if (node) {
413
- const range = document.createRange();
414
- const sel = window.getSelection();
415
- range.setStart(this._getTextNode(node), selection.offset);
416
- range.collapse(true);
417
- sel.removeAllRanges();
418
- sel.addRange(range);
419
- }
420
- else if (this.config.autofocus) {
421
- this.focus();
422
- }
423
- }
424
- else if (this.config.autofocus) {
425
- this.focus();
426
- }
427
- }
428
- _getTextNode(node) {
429
- if (node) {
430
- if (node.nodeType === Node.TEXT_NODE) {
431
- return node;
432
- }
433
- if (node.childNodes) {
434
- return this._getTextNode(node.childNodes[0]);
435
- }
436
- }
437
- }
438
- }
439
- FsHtmlEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsHtmlEditorComponent, deps: [{ token: FS_HTML_EDITOR_CONFIG, optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.FsFroalaLoaderService }], target: i0.ɵɵFactoryTarget.Component });
440
- FsHtmlEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsHtmlEditorComponent, selector: "fs-html-editor", inputs: { config: "config" }, host: { properties: { "class.focused": "this.classFocused", "class.disabled": "this.classDisabled" } }, providers: [
441
- {
442
- provide: NG_VALUE_ACCESSOR,
443
- useExisting: forwardRef(() => FsHtmlEditorComponent),
444
- multi: true
445
- },
446
- {
447
- provide: NG_VALIDATORS,
448
- useExisting: forwardRef(() => FsHtmlEditorComponent),
449
- multi: true
450
- },
451
- ], viewQueries: [{ propertyName: "elRef", first: true, predicate: ["elRef"], descendants: true }], ngImport: i0, template: "<div class=\"fs-html-editor-default\">\n <ng-container *ngIf=\"initialized\">\n <ng-container *fsSkeleton=\"(froalaLoaded$ | async) !== false\">\n </ng-container>\n </ng-container>\n\n <div #elRef></div>\n\n <div class=\"bottom-line\"></div>\n <div class=\"disabled-line\"></div>\n <fs-html-renderer\n *ngIf=\"!initialized\"\n [html]=\"html\"\n (click)=\"uninitializedClick($event)\">\n </fs-html-renderer>\n</div>\n", styles: [":host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper{transition:none!important}:host ::ng-deep .fr-toolbar.fr-top{position:sticky;z-index:2;border-radius:0;background-color:#fff}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(2):after{content:\"\";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar.fr-top div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-top.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top.fr-top{border:0}:host ::ng-deep .fr-toolbar.fr-top .fr-newline{margin:0}:host ::ng-deep .fr-toolbar.fr-top .fr-more-toolbar{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#F5F5F5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}\n"], components: [{ type: i2.FsHtmlRendererComponent, selector: "fs-html-renderer", inputs: ["html"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], pipes: { "async": i3.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
452
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsHtmlEditorComponent, decorators: [{
453
- type: Component,
454
- args: [{
455
- selector: 'fs-html-editor',
456
- templateUrl: 'html-editor.component.html',
457
- styleUrls: ['html-editor.component.scss'],
458
- providers: [
459
- {
460
- provide: NG_VALUE_ACCESSOR,
461
- useExisting: forwardRef(() => FsHtmlEditorComponent),
462
- multi: true
463
- },
464
- {
465
- provide: NG_VALIDATORS,
466
- useExisting: forwardRef(() => FsHtmlEditorComponent),
467
- multi: true
468
- },
469
- ],
470
- changeDetection: ChangeDetectionStrategy.OnPush,
471
- }]
472
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
473
- type: Optional
474
- }, {
475
- type: Inject,
476
- args: [FS_HTML_EDITOR_CONFIG]
477
- }] }, { type: i0.ChangeDetectorRef }, { type: i1.FsFroalaLoaderService }]; }, propDecorators: { classFocused: [{
478
- type: HostBinding,
479
- args: ['class.focused']
480
- }], classDisabled: [{
481
- type: HostBinding,
482
- args: ['class.disabled']
483
- }], elRef: [{
484
- type: ViewChild,
485
- args: ['elRef']
486
- }], config: [{
487
- type: Input
488
- }] } });
489
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2h0bWwtZWRpdG9yL2h0bWwtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9odG1sLWVkaXRvci9odG1sLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdw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QkFDcEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7d0JBQ0Q7NEJBQ0UsT0FBTyxFQUFFLGFBQWE7NEJBQ3RCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHNCQUFzQixDQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7OzBCQW1CSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQjtnSEFoQmIsWUFBWTtzQkFBekMsV0FBVzt1QkFBQyxlQUFlO2dCQUNHLGFBQWE7c0JBQTNDLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUVGLEtBQUs7c0JBQS9CLFNBQVM7dUJBQUMsT0FBTztnQkFFRixNQUFNO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3Jcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGaWxlUHJvY2Vzc29yLCBGc0ZpbGUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWxlJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnRQYXR0ZXJuLCBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNraXAsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdsb2Rhc2gtZXMnO1xuXG5pbXBvcnQgeyBQbHVnaW5CdXR0b24gfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvcGx1Z2luLWJ1dHRvbic7XG5pbXBvcnQgeyBGc0h0bWxFZGl0b3JDb25maWcgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2h0bWwtZWRpdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBSaWNoQnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3JpY2gtYnV0dG9ucy5jb25zdCc7XG5pbXBvcnQgeyBUZXh0QnV0dG9ucyB9IGZyb20gJy4vLi4vLi4vY29uc3RzL3RleHQtYnV0dG9ucy5jb25zdCc7XG5pbXBvcnQgeyBQYXJhZ3JhcGhCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvcGFyYWdyYXBoLWJ1dHRvbnMuY29uc3QnO1xuXG5pbXBvcnQgeyBGU19IVE1MX0VESVRPUl9DT05GSUcgfSBmcm9tICcuLi8uLi9pbmplY3RzL2NvbmZpZy5pbmplY3QnO1xuaW1wb3J0IHsgUGx1Z2luIH0gZnJvbSAnLi8uLi8uLi9jbGFzc2VzL3BsdWdpbic7XG5cbmltcG9ydCB7IEZzRnJvYWxhTG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Zyb2FsYS1sb2FkZXIuc2VydmljZSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZnMtaHRtbC1lZGl0b3InLFxuICB0ZW1wbGF0ZVVybDogJ2h0bWwtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2h0bWwtZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNIdG1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRnNIdG1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZzSHRtbEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25EZXN0cm95IHtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZvY3VzZWQnKSBjbGFzc0ZvY3VzZWQgPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5kaXNhYmxlZCcpIGNsYXNzRGlzYWJsZWQgPSBmYWxzZTtcblxuICBAVmlld0NoaWxkKCdlbFJlZicpIHB1YmxpYyBlbFJlZjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBGc0h0bWxFZGl0b3JDb25maWcgPSB7fTtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIF9lZGl0b3I6IGFueTtcbiAgcHJpdmF0ZSBfaHRtbDogc3RyaW5nO1xuICBwcml2YXRlIF9pbml0aWFsaXplJCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG4gIHByaXZhdGUgX2Zyb2FsYVJlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3QoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEZTX0hUTUxfRURJVE9SX0NPTkZJRykgcHJpdmF0ZSBfZGVmYXVsdENvbmZpZyxcbiAgICBwcml2YXRlIF9jZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBfZnI6IEZzRnJvYWxhTG9hZGVyU2VydmljZSxcbiAgKSB7IH1cblxuICBwdWJsaWMgb25DaGFuZ2UgPSAoZGF0YTogYW55KSA9PiB7fVxuICBwdWJsaWMgb25Ub3VjaGVkID0gKCkgPT4ge31cblxuICBwdWJsaWMgZ2V0IGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaHRtbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9odG1sO1xuICB9XG5cbiAgcHVibGljIGdldCBlZGl0b3IoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmcm9hbGFMb2FkZWQkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9mci5sb2FkZWQkO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25maWcgfHwge307XG4gICAgdGhpcy5jb25maWcuYXV0b2ZvY3VzID0gdGhpcy5jb25maWcuYXV0b2ZvY3VzICE9PSBmYWxzZSAmJiAhdGhpcy5jb25maWcuZGlzYWJsZWQ7XG4gICAgdGhpcy5pbml0aWFsaXplZCA9ICF0aGlzLmNvbmZpZy5pbml0T25DbGljaztcbiAgICB0aGlzLl9saXN0ZW5MYXp5SW5pdCgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnLmluaXRPbkNsaWNrIHx8ICF0aGlzLmhhc0NvbnRlbnQoKSkge1xuICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB0aGlzLl9pbml0aWFsaXplJC5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGhhc0NvbnRlbnQoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgIGlmIChlbC5xdWVyeVNlbGVjdG9yKCdpbWcnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZWwuaW5uZXJIVE1MID0gdGhpcy5faHRtbDtcbiAgICByZXR1cm4gISFlbC5pbm5lclRleHQubGVuZ3RoO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemUob3B0aW9uczogYW55ID0ge30pIHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLl9jcmVhdGVDb25maWcoKTtcbiAgICB0aGlzLl9pbml0UGx1Z2lucyhjb25maWcpO1xuICAgIHRoaXMuX2luaXRCdXR0b25zKGNvbmZpZyk7XG4gICAgdGhpcy5fZWRpdG9yID0gbmV3IHRoaXMuX2ZyLkZyb2FsYUVkaXRvcih0aGlzLmVsLCB0aGlzLl9jcmVhdGVPcHRpb25zKCksICgpID0+IHtcbiAgICAgIHRoaXMuX2Zyb2FsYVJlYWR5JC5uZXh0KHsgY29uZmlnLCBvcHRpb25zIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2IpIHtcbiAgICBjb25zdCBwcm9jZXNzb3IgPSBuZXcgRmlsZVByb2Nlc3NvcigpO1xuICAgIGNvbnN0IGZpbGUgPSBuZXcgRnNGaWxlKGJsb2IpO1xuXG4gICAgcmV0dXJuIHByb2Nlc3Nvci5wcm9jZXNzKFtmaWxlXSwgdGhpcy5jb25maWcuaW1hZ2UpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChbZl06IEZzRmlsZVtdKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlnLmltYWdlLnVwbG9hZChmLmZpbGUpXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgfVxuXG4gIHB1YmxpYyB1bmluaXRpYWxpemVkQ2xpY2soZXZlbnQ6IFVJRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGNvbnN0IHRhcmdldDogYW55ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQubm9kZU5hbWUgPT09ICdBJyAmJiB0YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0VGFyZ2V0ID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsICdfYmxhbmsnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRhcmdldFRhcmdldCkge1xuICAgICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgdGFyZ2V0VGFyZ2V0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZSgndGFyZ2V0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZy5pbml0Q2xpY2spIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZy5pbml0Q2xpY2soZXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2luaXRpYWxpemUkLm5leHQoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHVwZGF0ZVNpemUoKSB7XG4gICAgLy8gSGFjazogVG8gdHJpZ2dlciB0aGUgdG9vbGJhciBidXR0b24gc2l6ZSBtb2Rlc1xuICAgIHdpbmRvdy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgncmVzaXplJykpO1xuICB9XG5cbiAgcHVibGljIHZhbGlkYXRlKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsIHtcblxuICAgIGNvbnN0IGVycjogYW55ID0ge307XG4gICAgaWYgKHRoaXMuY29uZmlnLm1heExlbmd0aCAmJiB0aGlzLl9odG1sKSB7XG4gICAgICBjb25zdCBtYXhMZW5ndGggPSB0aGlzLmNvbmZpZy5tYXhMZW5ndGg7XG4gICAgICBjb25zdCBsZW5ndGggPSB0aGlzLl9odG1sLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggPiBtYXhMZW5ndGgpIHtcbiAgICAgICAgZXJyLm1heExlbmd0aEVycm9yID0gYE11c3QgYmUgJHttYXhMZW5ndGh9IGNoYXJhY3RlcnMgb3IgZmV3ZXIuIFlvdSBlbnRlcmVkICR7bGVuZ3RofSBjaGFyYWN0ZXJzLmA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGVycikubGVuZ3RoID8gZXJyIDogbnVsbDtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1cyhvcHRpb25zPzogeyBjdXJzb3JQb3NpdGlvbj86ICdzdGFydCcgfCAnZW5kJyB9KSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgPyBvcHRpb25zIDoge307XG5cbiAgICBpZiAob3B0aW9ucy5jdXJzb3JQb3NpdGlvbiA9PT0gJ2VuZCcpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNlbGVjdGlvbi5zZXRBdEVuZCh0aGlzLmVkaXRvci4kZWwuZ2V0KDApKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnNldEF0U3RhcnQodGhpcy5lZGl0b3IuJGVsLmdldCgwKSk7XG4gICAgfVxuXG4gICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnJlc3RvcmUoKTtcblxuICAgIGNvbnN0IGVsU2VsZWN0aW9uID0gdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLmVsZW1lbnQoKTtcbiAgICBpZiAoZWxTZWxlY3Rpb24pIHtcbiAgICAgIGVsU2VsZWN0aW9uLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUoJycpO1xuICB9XG5cbiAgcHVibGljIGRpc2FibGUoKSB7XG4gICAgdGhpcy5jbGFzc0Rpc2FibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIdG1sKGh0bWwpIHtcbiAgICB0aGlzLndyaXRlVmFsdWUoaHRtbCk7XG4gIH1cblxuICBwdWJsaWMgd3JpdGVWYWx1ZShodG1sOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9odG1sID0gaHRtbCB8fCAnJztcblxuICAgIGlmICh0aGlzLmVkaXRvciAmJiB0aGlzLmVkaXRvci5odG1sKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmVkaXRvci5odG1sLnNldCh0aGlzLl9odG1sKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuZGVzdHJveSgpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLmVsLmlubmVySFRNTCA9ICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ29uZmlnKCk6IEZzSHRtbEVkaXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIG1lcmdlKHsgZnJvYWxhQ29uZmlnOiB7fSB9LCB0aGlzLl9kZWZhdWx0Q29uZmlnLCB0aGlzLmNvbmZpZyk7XG4gIH1cblxuICBwcml2YXRlIF9jaGFuZ2UoaHRtbCk6IHZvaWQge1xuICAgIC8vIHRoaXMuX2h0bWwgPSBodG1sO1xuICAgIHRoaXMub25DaGFuZ2UoaHRtbCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QnV0dG9ucyhjb25maWc6IEZzSHRtbEVkaXRvckNvbmZpZykge1xuICAgIChjb25maWcuYnV0dG9ucyB8fCBbXSlcbiAgICAuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAvKlxuICAgICAgICBTdmcgS2V5czpcbiAgICAgICAgW1wiYWRkXCIsIFwiYWR2YW5jZWRJbWFnZUVkaXRvclwiLCBcImFsaWduQ2VudGVyXCIsIFwiYWxpZ25KdXN0aWZ5XCIsIFwiYWxpZ25MZWZ0XCIsIFwiYWxpZ25SaWdodFwiLCBcbiAgICAgICAgXCJhbmNob3JzXCIsIFwiYmFja1wiLCBcImJhY2tncm91bmRDb2xvclwiLCBcImJsb2NrcXVvdGVcIiwgXCJib2xkXCIsIFwiY2VsbEJhY2tncm91bmRcIiwgXG4gICAgICAgIFwiY2VsbEJvcmRlckNvbG9yXCIsIFwiY2VsbE9wdGlvbnNcIiwgXCJjZWxsU3R5bGVcIiwgXCJjbGVhckZvcm1hdHRpbmdcIiwgXCJjbG9zZVwiLCBcImNvZGVWaWV3XCIsIFxuICAgICAgICBcImNvZ3NcIiwgXCJjb2x1bW5zXCIsIFwiZWRpdExpbmtcIiwgXCJleGl0RnVsbHNjcmVlblwiLCBcImZvbnRBd2Vzb21lXCIsIFwiZm9udEZhbWlseVwiLCBcbiAgICAgICAgXCJmb250U2l6ZVwiLCBcImZ1bGxzY3JlZW5cIiwgXCJoZWxwXCIsIFwiaG9yaXpvbnRhbExpbmVcIiwgXCJpbWFnZUFsdFRleHRcIiwgXCJpbWFnZUNhcHRpb25cIiwgXG4gICAgICAgIFwiaW1hZ2VDbGFzc1wiLCBcImltYWdlRGlzcGxheVwiLCBcImltYWdlTWFuYWdlclwiLCBcImltYWdlU2l6ZVwiLCBcImluZGVudFwiLCBcImlubGluZUNsYXNzXCIsIFxuICAgICAgICBcImlubGluZVN0eWxlXCIsIFwiaW5zZXJ0RW1iZWRcIiwgXCJpbnNlcnRGaWxlXCIsIFwiaW5zZXJ0SW1hZ2VcIiwgXCJpbnNlcnRMaW5rXCIsIFwiaW5zZXJ0TW9yZVwiLCBcbiAgICAgICAgXCJpbnNlcnRUYWJsZVwiLCBcImluc2VydFZpZGVvXCIsIFwidXBsb2FkXCIsIFwiaXRhbGljXCIsIFwic2VhcmNoXCIsIFwibGluZUhlaWdodFwiLCBcImxpbmtTdHlsZXNcIiwgXG4gICAgICAgIFwibWVudGlvblwiLCBcIm1vcmVcIiwgXCJvcGVuTGlua1wiLCBcIm9yZGVyZWRMaXN0XCIsIFwib3V0ZGVudFwiLCBcInBhZ2VCcmVha2VyXCIsIFxuICAgICAgICBcInBhcmFncmFwaEZvcm1hdFwiLCBcInBhcmFncmFwaE1vcmVcIiwgXCJwYXJhZ3JhcGhTdHlsZVwiLCBcInBkZkV4cG9ydFwiLCBcInByaW50XCIsIFxuICAgICAgICBcInJlZG9cIiwgXCJyZW1vdmVUYWJsZVwiLCBcInJlbW92ZVwiLCBcInJlcGxhY2VJbWFnZVwiLCBcInJvd1wiLCBcInNlbGVjdEFsbFwiLCBcInNtaWxlXCIsXG4gICAgICAgIFwic3BlbGxjaGVja1wiLCBcInN0YXJcIiwgXCJzdHJpa2VUaHJvdWdoXCIsIFwic3Vic2NyaXB0XCIsIFwic3VwZXJzY3JpcHRcIiwgXCJzeW1ib2xzXCIsIFwidGFnc1wiLFxuICAgICAgICBcInRhYmxlSGVhZGVyXCIsIFwidGFibGVTdHlsZVwiLCBcInRleHRDb2xvclwiLCBcInRleHRNb3JlXCIsIFwidW5kZXJsaW5lXCIsIFwidW5kb1wiLCBcInVubGlua1wiLCBcbiAgICAgICAgXCJ1bm9yZGVyZWRMaXN0XCIsIFwidmVydGljYWxBbGlnbkJvdHRvbVwiLCBcInZlcnRpY2FsQWxpZ25NaWRkbGVcIiwgXCJ2ZXJ0aWNhbEFsaWduVG9wXCJdXG4gICAgICAqL1xuXG4gICAgICBpZihidXR0b24uc3ZnS2V5KSB7XG4gICAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5EZWZpbmVJY29uKGJ1dHRvbi5uYW1lLCB7IFNWR19LRVk6IGJ1dHRvbi5zdmdLZXkgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5SZWdpc3RlckNvbW1hbmQoYnV0dG9uLm5hbWUsIHtcbiAgICAgICAgdGl0bGU6IGJ1dHRvbi50aXRsZSxcbiAgICAgICAgZm9jdXM6IGJ1dHRvbi5mb2N1cyA/PyB0cnVlLFxuICAgICAgICB1bmRvOiBidXR0b24udW5kbyA/PyB0cnVlLFxuICAgICAgICByZWZyZXNoQWZ0ZXJDYWxsYmFjazogYnV0dG9uLnJlZnJlc2hBZnRlckNhbGxiYWNrID8/IHRydWUsXG4gICAgICAgIGNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgYnV0dG9uLmNsaWNrKHRoaXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRQbHVnaW5zKGNvbmZpZykge1xuICAgIChjb25maWcucGx1Z2lucyB8fCBbXSkuZm9yRWFjaCgocGx1Z2luOiBQbHVnaW4pID0+IHtcbiAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5QTFVHSU5TW3BsdWdpbi5jb25maWcubmFtZV0gPSBmdW5jdGlvbiAoZWRpdG9yKSB7XG4gICAgICAgIHBsdWdpbi5lZGl0b3IgPSBlZGl0b3I7XG4gICAgICAgIHBsdWdpbi5pbml0aWFsaXplKCk7XG4gICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICB9O1xuXG4gICAgICAocGx1Z2luLmNvbmZpZy5idXR0b25zIHx8IFtdKS5mb3JFYWNoKChidXR0b246IFBsdWdpbkJ1dHRvbikgPT4ge1xuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuRGVmaW5lSWNvbihidXR0b24ubmFtZSwge1xuICAgICAgICAgIE5BTUU6IGJ1dHRvbi5uYW1lLFxuICAgICAgICAgIFBBVEg6IGJ1dHRvbi5zdmdQYXRoLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9mci5Gcm9hbGFFZGl0b3IuUmVnaXN0ZXJDb21tYW5kKGJ1dHRvbi5uYW1lLCB7XG4gICAgICAgICAgaWNvbjogYnV0dG9uLm5hbWUsXG4gICAgICAgICAgdGl0bGU6IGJ1dHRvbi50b29sdGlwLFxuICAgICAgICAgIHVuZG86IGJ1dHRvbi51bmRvLFxuICAgICAgICAgIGZvY3VzOiBidXR0b24uZm9jdXMsXG4gICAgICAgICAgc2hvd09uTW9iaWxlOiBidXR0b24uc2hvd09uTW9iaWxlLFxuICAgICAgICAgIHJlZnJlc2hBZnRlckNhbGxiYWNrOiBidXR0b24ucmVmcmVzaEFmdGVyQ2FsbGJhY2ssXG4gICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChidXR0b24uY2xpY2spIHtcbiAgICAgICAgICAgICAgYnV0dG9uLmNsaWNrKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVmcmVzaDogZnVuY3Rpb24gKGJ1dHRvbikge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5yZWZyZXNoKSB7XG4gICAgICAgICAgICAgIGJ1dHRvbi5yZWZyZXNoKHRoaXMsIGJ1dHRvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVPcHRpb25zKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NyZWF0ZUNvbmZpZygpO1xuXG4gICAgcmV0dXJuIG1lcmdlKFxuICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIGVkaXRvciBzdG9yZSBzb21ld2hlcmUgcG9pbnRlciBvbiBkZWZhdWx0IGNvbmZpZyBvYmplY3QgYW5kIGR1YmxpY2F0ZSBvcHRpb25zIGVhY2ggdGltZSBvbiBpbml0XG4gICAgICAvLyBFeHRyYSBtZXJnZSBsZXZlbCBmaXhlZCB0aGlzIHByb2JsZW0gYW5kIGFsbG93IHRvIGluaXQgY29uZmlnIHByb3Blcmx5IHdpdGhvdXQgbGVnYWN5IGRhdGFcbiAgICAgIHt9LFxuICAgICAge1xuICAgICAgICBzaG9ydGN1dHNFbmFibGVkOiBbJ3Nob3cnLCAnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ2luZGVudCcsICdvdXRkZW50JywgJ3VuZG8nLCAncmVkbycsICdpbnNlcnRJbWFnZScsICdjcmVhdGVMaW5rJ10sXG4gICAgICAgIGtleTogY29uZmlnLmFjdGl2YXRpb25LZXksXG4gICAgICAgIHBsYWNlaG9sZGVyVGV4dDogY29uZmlnLnBsYWNlaG9sZGVyLFxuICAgICAgICBsaW5rQWx3YXlzQmxhbms6IHRydWUsXG4gICAgICAgIHRhYlNwYWNlczogMixcbiAgICAgICAgdHlwaW5nVGltZXI6IDI1MCxcbiAgICAgICAgdG9vbHRpcHM6IGZhbHNlLFxuICAgICAgICB3b3JkUGFzdGVNb2RhbDogZmFsc2UsXG4gICAgICAgIGltYWdlRGVmYXVsdFdpZHRoOiAwLFxuICAgICAgICBpbWFnZURlZmF1bHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICBxdWlja0luc2VydEVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBwYXJhZ3JhcGhEZWZhdWx0U2VsZWN0aW9uOiAnRm9ybWF0JyxcbiAgICAgICAgdmlkZW9VcGxvYWQ6IGZhbHNlLFxuICAgICAgICBwYXJhZ3JhcGhGb3JtYXQ6IHtcbiAgICAgICAgICBOOiAnTm9ybWFsJyxcbiAgICAgICAgICBIMTogJ0hlYWRpbmcgMScsXG4gICAgICAgICAgSDI6ICdIZWFkaW5nIDInLFxuICAgICAgICAgIEgzOiAnSGVhZGluZyAzJyxcbiAgICAgICAgICBINDogJ0hlYWRpbmcgNCcsXG4gICAgICAgICAgQkxPQ0tRVU9URTogJ1F1b3RlJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGFyYWdyYXBoRm9ybWF0U2VsZWN0aW9uOiB0cnVlLFxuICAgICAgICB0b29sYmFyQnV0dG9uc1hTOiB7XG4gICAgICAgICAgbW9yZVRleHQ6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFRleHRCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDEsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUGFyYWdyYXBoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBQYXJhZ3JhcGhCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUmljaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUmljaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB0b29sYmFyQnV0dG9uczoge1xuICAgICAgICAgIG1vcmVUZXh0OiB7XG4gICAgICAgICAgICBidXR0b25zOiBUZXh0QnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVBhcmFncmFwaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUGFyYWdyYXBoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiA1LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbW9yZVJpY2g6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFJpY2hCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maWcuZnJvYWxhQ29uZmlnLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5MYXp5SW5pdCgpIHtcbiAgICB0aGlzLmZyb2FsYUxvYWRlZCRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoKHJlYWR5KSA9PiByZWFkeSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9pbml0aWFsaXplJCksXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0aW9uOiBhbnkgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgICAgICAgY29uc3Qgb3B0aW9uczogYW55ID0ge307XG4gICAgICAgICAgaWYgKHNlbGVjdGlvbi5iYXNlTm9kZSkge1xuICAgICAgICAgICAgb3B0aW9ucy5zZWxlY3Rpb24gPSB7XG4gICAgICAgICAgICAgIG5vZGU6IHNlbGVjdGlvbi5iYXNlTm9kZS5ub2RlVmFsdWUsXG4gICAgICAgICAgICAgIG9mZnNldDogc2VsZWN0aW9uLmJhc2VPZmZzZXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluaXRpYWxpemUob3B0aW9ucyk7XG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5fZnJvYWxhUmVhZHkkKSxcbiAgICAgICAgZmlsdGVyKChkYXRhKSA9PiAhIWRhdGEpLFxuICAgICAgICB0YXAoKHsgY29uZmlnLCBvcHRpb25zIH0pID0+IHtcbiAgICAgICAgICB0aGlzLl9zZXR1cEZyb2FsYShjb25maWcsIG9wdGlvbnMpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29udGVudENoYW5nZWQoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9ySFRNTCA9IHRoaXMuX2VkaXRvci5odG1sLmdldCgpO1xuXG4gICAgaWYgKHRoaXMuaHRtbCAhPT0gZWRpdG9ySFRNTCkge1xuICAgICAgdGhpcy5fY2hhbmdlKGVkaXRvckhUTUwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3NldHVwRnJvYWxhKGNvbmZpZzogRnNIdG1sRWRpdG9yQ29uZmlnLCBvcHRpb25zOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRoaXMuc2V0SHRtbCh0aGlzLl9odG1sKTtcblxuICAgIGlmIChjb25maWcuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuZnJvYWxhQ29uZmlnLmV2ZW50cykge1xuICAgICAgaWYgKGNvbmZpZy5mcm9hbGFDb25maWcuZXZlbnRzLmluaXRpYWxpemVkKSB7XG4gICAgICAgIGNvbmZpZy5mcm9hbGFDb25maWcuZXZlbnRzLmluaXRpYWxpemVkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB0aGlzLmNsYXNzRm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2JsdXInLCAoKSA9PiB7XG4gICAgICB0aGlzLmNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG5cblxuICAgIGZyb21FdmVudFBhdHRlcm4oXG4gICAgICAoaGFuZGxlcikgPT4ge1xuICAgICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdjb250ZW50Q2hhbmdlZCcsIGhhbmRsZXIpO1xuICAgICAgfSxcbiAgICAgICgpID0+IHt9XG4gICAgKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLl9odG1sKSxcbiAgICAgICAgbWFwKCgpID0+IHRoaXMuZWRpdG9yLmh0bWwuZ2V0KCkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICBza2lwKDEpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnRDaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIC8vIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2NvbnRlbnRDaGFuZ2VkJywgKCkgPT4ge1xuICAgIC8vICAgY29uc29sZS5sb2coJ3Rlc3QnKTtcbiAgICAvLyAgIGlmICghdGhpcy5fZmlyc3RDaGFuZ2UpIHtcbiAgICAvLyAgICAgdGhpcy5fY29udGVudENoYW5nZWQoKTtcbiAgICAvLyAgIH1cbiAgICAvLyB9KTtcblxuICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ3Bhc3RlLmFmdGVyQ2xlYW51cCcsIChodG1sKSA9PiB7XG4gICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRpdi5xdWVyeVNlbGVjdG9yQWxsKCcqJylcbiAgICAgICAgLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gZWwuYXR0cmlidXRlc1swXS5uYW1lO1xuICAgICAgICAgICAgaWYgKG5hbWUgIT09ICdocmVmJykge1xuICAgICAgICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbigna2V5ZG93bicsICgpID0+IHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5jb25maWcuaW1hZ2UgJiYgdGhpcy5jb25maWcuaW1hZ2UudXBsb2FkKSB7XG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdpbWFnZS5iZWZvcmVQYXN0ZVVwbG9hZCcsIChpbWFnZSkgPT4ge1xuXG4gICAgICAgIGZldGNoKGltYWdlLmdldEF0dHJpYnV0ZSgnc3JjJykpXG4gICAgICAgICAgLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICAgICAgcmVzLmJsb2IoKVxuICAgICAgICAgICAgICAudGhlbigoYmxvYikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NJbWFnZVVwbG9hZChibG9iKVxuICAgICAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCh1cmwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaW1hZ2Uuc2V0QXR0cmlidXRlKCdzcmMnLCB1cmwpO1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZnItaW1hZ2UtcGFzdGVkJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGVudENoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignaW1hZ2UuYmVmb3JlVXBsb2FkJywgKGJsb2JzKSA9PiB7XG4gICAgICAgIHRoaXMuX3Byb2Nlc3NJbWFnZVVwbG9hZChibG9ic1swXSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHVybCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3IuaW1hZ2UuaW5zZXJ0KHVybCwgbnVsbCwgbnVsbCwgdGhpcy5lZGl0b3IuaW1hZ2UuZ2V0KCkpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mci1zZWNvbmQtdG9vbGJhcicpKSB7XG4gICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mci1zZWNvbmQtdG9vbGJhcicpLnJlbW92ZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvbiA9IG9wdGlvbnMuc2VsZWN0aW9uO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgY29uc3Qgbm9kZTogYW55ID0gQXJyYXkuZnJvbSh0aGlzLmVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5mci1lbGVtZW50IConKSkuZmluZCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBzZWxlY3Rpb24ubm9kZSA9PT0gbm9kZS50ZXh0Q29udGVudDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgIGNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICAgICAgICByYW5nZS5zZXRTdGFydCh0aGlzLl9nZXRUZXh0Tm9kZShub2RlKSwgc2VsZWN0aW9uLm9mZnNldCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpXG5cbiAgICAgICAgc2VsLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICBzZWwuYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcuYXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0VGV4dE5vZGUobm9kZSkge1xuICAgIGlmIChub2RlKSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBpZiAobm9kZS5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRUZXh0Tm9kZShub2RlLmNoaWxkTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZzLWh0bWwtZWRpdG9yLWRlZmF1bHRcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRpYWxpemVkXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqZnNTa2VsZXRvbj1cIihmcm9hbGFMb2FkZWQkIHwgYXN5bmMpICE9PSBmYWxzZVwiPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2ICNlbFJlZj48L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYm90dG9tLWxpbmVcIj48L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRpc2FibGVkLWxpbmVcIj48L2Rpdj5cbiAgPGZzLWh0bWwtcmVuZGVyZXJcbiAgICAqbmdJZj1cIiFpbml0aWFsaXplZFwiXG4gICAgW2h0bWxdPVwiaHRtbFwiXG4gICAgKGNsaWNrKT1cInVuaW5pdGlhbGl6ZWRDbGljaygkZXZlbnQpXCI+XG4gIDwvZnMtaHRtbC1yZW5kZXJlcj5cbjwvZGl2PlxuIl19
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, forwardRef, HostBinding, Inject, Input, Optional, ViewChild } from '@angular/core';
2
+ import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { FileProcessor, FsFile } from '@firestitch/file';
4
+ import { BehaviorSubject, fromEventPattern, ReplaySubject, Subject } from 'rxjs';
5
+ import { distinctUntilChanged, filter, map, skip, startWith, switchMap, takeUntil, tap } from 'rxjs/operators';
6
+ import { merge } from 'lodash-es';
7
+ import { RichButtons } from './../../consts/rich-buttons.const';
8
+ import { TextButtons } from './../../consts/text-buttons.const';
9
+ import { ParagraphButtons } from './../../consts/paragraph-buttons.const';
10
+ import { FS_HTML_EDITOR_CONFIG } from '../../injects/config.inject';
11
+ import { FsFroalaLoaderService } from '../../services/froala-loader.service';
12
+ import * as i0 from "@angular/core";
13
+ import * as i1 from "../../services/froala-loader.service";
14
+ import * as i2 from "../html-renderer/html-renderer.component";
15
+ import * as i3 from "@angular/common";
16
+ import * as i4 from "@firestitch/skeleton";
17
+ export class FsHtmlEditorComponent {
18
+ constructor(_defaultConfig, _cdRef, _fr) {
19
+ this._defaultConfig = _defaultConfig;
20
+ this._cdRef = _cdRef;
21
+ this._fr = _fr;
22
+ this.classFocused = false;
23
+ this.classDisabled = false;
24
+ this.config = {};
25
+ this.initialized = false;
26
+ this._initialize$ = new ReplaySubject();
27
+ this._froalaReady$ = new BehaviorSubject(null);
28
+ this._destroy$ = new Subject();
29
+ this.onChange = (data) => { };
30
+ this.onTouched = () => { };
31
+ }
32
+ get el() {
33
+ return this.elRef.nativeElement;
34
+ }
35
+ get html() {
36
+ return this._html;
37
+ }
38
+ get editor() {
39
+ return this._editor;
40
+ }
41
+ get froalaLoaded$() {
42
+ return this._fr.loaded$;
43
+ }
44
+ ngOnInit() {
45
+ this.config = this.config || {};
46
+ this.config.autofocus = this.config.autofocus !== false && !this.config.disabled;
47
+ this.initialized = !this.config.initOnClick;
48
+ this._listenLazyInit();
49
+ }
50
+ ngAfterViewInit() {
51
+ if (!this.config.initOnClick || !this.hasContent()) {
52
+ this.initialized = true;
53
+ this._initialize$.next();
54
+ }
55
+ }
56
+ hasContent() {
57
+ const el = document.createElement('div');
58
+ if (el.querySelector('img')) {
59
+ return true;
60
+ }
61
+ el.innerHTML = this._html;
62
+ return !!el.innerText.length;
63
+ }
64
+ initialize(options = {}) {
65
+ const config = this._createConfig();
66
+ this._initPlugins(config);
67
+ this._initButtons(config);
68
+ this._editor = new this._fr.FroalaEditor(this.el, this._createOptions(), () => {
69
+ this._froalaReady$.next({ config, options });
70
+ });
71
+ }
72
+ _processImageUpload(blob) {
73
+ const processor = new FileProcessor();
74
+ const file = new FsFile(blob);
75
+ return processor.process([file], this.config.image)
76
+ .pipe(switchMap(([f]) => {
77
+ return this.config.image.upload(f.file);
78
+ }));
79
+ }
80
+ uninitializedClick(event) {
81
+ if (!event.defaultPrevented) {
82
+ const target = event.target;
83
+ if (target && target.nodeName === 'A' && target.getAttribute('href')) {
84
+ const targetTarget = target.getAttribute('target');
85
+ target.setAttribute('target', '_blank');
86
+ setTimeout(() => {
87
+ if (targetTarget) {
88
+ target.setAttribute('target', targetTarget);
89
+ }
90
+ else {
91
+ target.removeAttribute('target');
92
+ }
93
+ });
94
+ }
95
+ else {
96
+ if (this.config.initClick) {
97
+ this.config.initClick(event);
98
+ }
99
+ this._initialize$.next();
100
+ this.initialized = true;
101
+ }
102
+ }
103
+ }
104
+ updateSize() {
105
+ // Hack: To trigger the toolbar button size modes
106
+ window.dispatchEvent(new Event('resize'));
107
+ }
108
+ validate(control) {
109
+ const err = {};
110
+ if (this.config.maxLength && this._html) {
111
+ const maxLength = this.config.maxLength;
112
+ const length = this._html.length;
113
+ if (length > maxLength) {
114
+ err.maxLengthError = `Must be ${maxLength} characters or fewer. You entered ${length} characters.`;
115
+ }
116
+ }
117
+ return Object.keys(err).length ? err : null;
118
+ }
119
+ focus(options) {
120
+ options = options ? options : {};
121
+ if (options.cursorPosition === 'end') {
122
+ this.editor.selection.setAtEnd(this.editor.$el.get(0));
123
+ }
124
+ else {
125
+ this.editor.selection.setAtStart(this.editor.$el.get(0));
126
+ }
127
+ this.editor.selection.restore();
128
+ const elSelection = this.editor.selection.element();
129
+ if (elSelection) {
130
+ elSelection.scrollIntoView({ block: 'center' });
131
+ }
132
+ }
133
+ clear() {
134
+ this.writeValue('');
135
+ }
136
+ disable() {
137
+ this.classDisabled = true;
138
+ }
139
+ setHtml(html) {
140
+ this.writeValue(html);
141
+ }
142
+ writeValue(html) {
143
+ this._html = html || '';
144
+ if (this.editor && this.editor.html) {
145
+ try {
146
+ this.editor.html.set(this._html);
147
+ }
148
+ catch (e) {
149
+ }
150
+ }
151
+ this._cdRef.markForCheck();
152
+ }
153
+ registerOnChange(fn) {
154
+ this.onChange = fn;
155
+ }
156
+ registerOnTouched(fn) {
157
+ this.onTouched = fn;
158
+ }
159
+ ngOnDestroy() {
160
+ this._initialize$.complete();
161
+ this._destroy$.next();
162
+ this._destroy$.complete();
163
+ this.destroy();
164
+ }
165
+ destroy() {
166
+ if (this.editor) {
167
+ this.editor.destroy();
168
+ }
169
+ this.initialized = false;
170
+ this._cdRef.markForCheck();
171
+ this.el.innerHTML = '';
172
+ }
173
+ _createConfig() {
174
+ return merge({ froalaConfig: {} }, this._defaultConfig, this.config);
175
+ }
176
+ _change(html) {
177
+ this._html = html;
178
+ this.onChange(html);
179
+ }
180
+ _initButtons(config) {
181
+ (config.buttons || [])
182
+ .forEach((button) => {
183
+ /*
184
+ Svg Keys:
185
+ ["add", "advancedImageEditor", "alignCenter", "alignJustify", "alignLeft", "alignRight",
186
+ "anchors", "back", "backgroundColor", "blockquote", "bold", "cellBackground",
187
+ "cellBorderColor", "cellOptions", "cellStyle", "clearFormatting", "close", "codeView",
188
+ "cogs", "columns", "editLink", "exitFullscreen", "fontAwesome", "fontFamily",
189
+ "fontSize", "fullscreen", "help", "horizontalLine", "imageAltText", "imageCaption",
190
+ "imageClass", "imageDisplay", "imageManager", "imageSize", "indent", "inlineClass",
191
+ "inlineStyle", "insertEmbed", "insertFile", "insertImage", "insertLink", "insertMore",
192
+ "insertTable", "insertVideo", "upload", "italic", "search", "lineHeight", "linkStyles",
193
+ "mention", "more", "openLink", "orderedList", "outdent", "pageBreaker",
194
+ "paragraphFormat", "paragraphMore", "paragraphStyle", "pdfExport", "print",
195
+ "redo", "removeTable", "remove", "replaceImage", "row", "selectAll", "smile",
196
+ "spellcheck", "star", "strikeThrough", "subscript", "superscript", "symbols", "tags",
197
+ "tableHeader", "tableStyle", "textColor", "textMore", "underline", "undo", "unlink",
198
+ "unorderedList", "verticalAlignBottom", "verticalAlignMiddle", "verticalAlignTop"]
199
+ */
200
+ var _a, _b, _c;
201
+ if (button.svgKey) {
202
+ this._fr.FroalaEditor.DefineIcon(button.name, { SVG_KEY: button.svgKey });
203
+ }
204
+ this._fr.FroalaEditor.RegisterCommand(button.name, {
205
+ title: button.title,
206
+ focus: (_a = button.focus) !== null && _a !== void 0 ? _a : true,
207
+ undo: (_b = button.undo) !== null && _b !== void 0 ? _b : true,
208
+ refreshAfterCallback: (_c = button.refreshAfterCallback) !== null && _c !== void 0 ? _c : true,
209
+ callback: function () {
210
+ button.click(this);
211
+ }
212
+ });
213
+ });
214
+ }
215
+ _initPlugins(config) {
216
+ (config.plugins || []).forEach((plugin) => {
217
+ this._fr.FroalaEditor.PLUGINS[plugin.config.name] = function (editor) {
218
+ plugin.editor = editor;
219
+ plugin.initialize();
220
+ return plugin;
221
+ };
222
+ (plugin.config.buttons || []).forEach((button) => {
223
+ this._fr.FroalaEditor.DefineIcon(button.name, {
224
+ NAME: button.name,
225
+ PATH: button.svgPath,
226
+ });
227
+ this._fr.FroalaEditor.RegisterCommand(button.name, {
228
+ icon: button.name,
229
+ title: button.tooltip,
230
+ undo: button.undo,
231
+ focus: button.focus,
232
+ showOnMobile: button.showOnMobile,
233
+ refreshAfterCallback: button.refreshAfterCallback,
234
+ callback: function () {
235
+ if (button.click) {
236
+ button.click(this);
237
+ }
238
+ },
239
+ refresh: function (button) {
240
+ if (button.refresh) {
241
+ button.refresh(this, button);
242
+ }
243
+ }
244
+ });
245
+ });
246
+ });
247
+ }
248
+ _createOptions() {
249
+ const config = this._createConfig();
250
+ return merge(
251
+ // For some reason editor store somewhere pointer on default config object and dublicate options each time on init
252
+ // Extra merge level fixed this problem and allow to init config properly without legacy data
253
+ {}, {
254
+ shortcutsEnabled: ['show', 'bold', 'italic', 'underline', 'indent', 'outdent', 'undo', 'redo', 'insertImage', 'createLink'],
255
+ key: config.activationKey,
256
+ placeholderText: config.placeholder,
257
+ linkAlwaysBlank: true,
258
+ tabSpaces: 2,
259
+ typingTimer: 250,
260
+ tooltips: false,
261
+ wordPasteModal: false,
262
+ imageDefaultWidth: 0,
263
+ imageDefaultAlign: 'left',
264
+ quickInsertEnabled: false,
265
+ paragraphDefaultSelection: 'Format',
266
+ videoUpload: false,
267
+ paragraphFormat: {
268
+ N: 'Normal',
269
+ H1: 'Heading 1',
270
+ H2: 'Heading 2',
271
+ H3: 'Heading 3',
272
+ H4: 'Heading 4',
273
+ BLOCKQUOTE: 'Quote',
274
+ },
275
+ paragraphFormatSelection: true,
276
+ toolbarButtonsXS: {
277
+ moreText: {
278
+ buttons: TextButtons,
279
+ buttonsVisible: 1,
280
+ },
281
+ moreParagraph: {
282
+ buttons: ParagraphButtons,
283
+ buttonsVisible: 2,
284
+ },
285
+ moreRich: {
286
+ buttons: RichButtons,
287
+ buttonsVisible: 0,
288
+ },
289
+ },
290
+ toolbarButtons: {
291
+ moreText: {
292
+ buttons: TextButtons,
293
+ buttonsVisible: 3,
294
+ },
295
+ moreParagraph: {
296
+ buttons: ParagraphButtons,
297
+ buttonsVisible: 5,
298
+ },
299
+ moreRich: {
300
+ buttons: RichButtons,
301
+ buttonsVisible: 3,
302
+ },
303
+ },
304
+ }, config.froalaConfig);
305
+ }
306
+ _listenLazyInit() {
307
+ this.froalaLoaded$
308
+ .pipe(filter((ready) => ready), switchMap(() => this._initialize$), tap(() => {
309
+ const selection = window.getSelection();
310
+ const options = {};
311
+ if (selection.baseNode) {
312
+ options.selection = {
313
+ node: selection.baseNode.nodeValue,
314
+ offset: selection.baseOffset,
315
+ };
316
+ }
317
+ this.initialize(options);
318
+ }), switchMap(() => this._froalaReady$), filter((data) => !!data), tap(({ config, options }) => {
319
+ this._setupFroala(config, options);
320
+ }))
321
+ .subscribe();
322
+ }
323
+ _contentChanged() {
324
+ const editorHTML = this._editor.html.get();
325
+ if (this.html !== editorHTML) {
326
+ this._change(editorHTML);
327
+ }
328
+ }
329
+ _setupFroala(config, options) {
330
+ this._cdRef.markForCheck();
331
+ this.setHtml(this._html);
332
+ if (config.disabled) {
333
+ this.disable();
334
+ }
335
+ if (config.froalaConfig.events) {
336
+ if (config.froalaConfig.events.initialized) {
337
+ config.froalaConfig.events.initialized();
338
+ }
339
+ }
340
+ this._editor.events.on('focus', () => {
341
+ this.classFocused = true;
342
+ this._cdRef.markForCheck();
343
+ });
344
+ this._editor.events.on('blur', () => {
345
+ this.classFocused = false;
346
+ this._cdRef.markForCheck();
347
+ });
348
+ fromEventPattern((handler) => {
349
+ this._editor.events.on('contentChanged', handler);
350
+ }, () => { })
351
+ .pipe(startWith(this._html), map(() => this.editor.html.get()), distinctUntilChanged(), skip(1))
352
+ .subscribe(() => {
353
+ this._contentChanged();
354
+ });
355
+ // this._editor.events.on('contentChanged', () => {
356
+ // console.log('test');
357
+ // if (!this._firstChange) {
358
+ // this._contentChanged();
359
+ // }
360
+ // });
361
+ this._editor.events.on('paste.afterCleanup', (html) => {
362
+ var div = document.createElement('div');
363
+ div.innerHTML = html;
364
+ div.querySelectorAll('*')
365
+ .forEach((el) => {
366
+ for (var i = 0; i < el.attributes.length; i++) {
367
+ const name = el.attributes[0].name;
368
+ if (name !== 'href') {
369
+ el.removeAttribute(name);
370
+ }
371
+ }
372
+ });
373
+ return div.innerHTML;
374
+ });
375
+ this._editor.events.on('keydown', () => {
376
+ this.onTouched();
377
+ });
378
+ if (this.config.image && this.config.image.upload) {
379
+ this._editor.events.on('image.beforePasteUpload', (image) => {
380
+ fetch(image.getAttribute('src'))
381
+ .then((res) => {
382
+ res.blob()
383
+ .then((blob) => {
384
+ this._processImageUpload(blob)
385
+ .pipe(takeUntil(this._destroy$))
386
+ .subscribe((url) => {
387
+ image.setAttribute('src', url);
388
+ image.removeAttribute('data-fr-image-pasted');
389
+ this._contentChanged();
390
+ });
391
+ });
392
+ });
393
+ return false;
394
+ });
395
+ this._editor.events.on('image.beforeUpload', (blobs) => {
396
+ this._processImageUpload(blobs[0])
397
+ .pipe(takeUntil(this._destroy$))
398
+ .subscribe((url) => {
399
+ this.editor.image.insert(url, null, null, this.editor.image.get());
400
+ });
401
+ return false;
402
+ });
403
+ }
404
+ if (this.el.querySelector('.fr-second-toolbar')) {
405
+ this.el.querySelector('.fr-second-toolbar').remove();
406
+ }
407
+ const selection = options.selection;
408
+ if (selection) {
409
+ const node = Array.from(this.el.querySelectorAll('.fr-element *')).find((node) => {
410
+ return selection.node === node.textContent;
411
+ });
412
+ if (node) {
413
+ const range = document.createRange();
414
+ const sel = window.getSelection();
415
+ range.setStart(this._getTextNode(node), selection.offset);
416
+ range.collapse(true);
417
+ sel.removeAllRanges();
418
+ sel.addRange(range);
419
+ }
420
+ else if (this.config.autofocus) {
421
+ this.focus();
422
+ }
423
+ }
424
+ else if (this.config.autofocus) {
425
+ this.focus();
426
+ }
427
+ }
428
+ _getTextNode(node) {
429
+ if (node) {
430
+ if (node.nodeType === Node.TEXT_NODE) {
431
+ return node;
432
+ }
433
+ if (node.childNodes) {
434
+ return this._getTextNode(node.childNodes[0]);
435
+ }
436
+ }
437
+ }
438
+ }
439
+ FsHtmlEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsHtmlEditorComponent, deps: [{ token: FS_HTML_EDITOR_CONFIG, optional: true }, { token: i0.ChangeDetectorRef }, { token: i1.FsFroalaLoaderService }], target: i0.ɵɵFactoryTarget.Component });
440
+ FsHtmlEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.16", type: FsHtmlEditorComponent, selector: "fs-html-editor", inputs: { config: "config" }, host: { properties: { "class.focused": "this.classFocused", "class.disabled": "this.classDisabled" } }, providers: [
441
+ {
442
+ provide: NG_VALUE_ACCESSOR,
443
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
444
+ multi: true
445
+ },
446
+ {
447
+ provide: NG_VALIDATORS,
448
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
449
+ multi: true
450
+ },
451
+ ], viewQueries: [{ propertyName: "elRef", first: true, predicate: ["elRef"], descendants: true }], ngImport: i0, template: "<div class=\"fs-html-editor-default\">\n <ng-container *ngIf=\"initialized\">\n <ng-container *fsSkeleton=\"(froalaLoaded$ | async) !== false\">\n </ng-container>\n </ng-container>\n\n <div #elRef></div>\n\n <div class=\"bottom-line\"></div>\n <div class=\"disabled-line\"></div>\n <fs-html-renderer\n *ngIf=\"!initialized\"\n [html]=\"html\"\n (click)=\"uninitializedClick($event)\">\n </fs-html-renderer>\n</div>\n", styles: [":host ::ng-deep .fr-box.fr-basic .fr-wrapper{border:0;border-bottom:1px solid #949494;margin-bottom:1px;background-color:transparent}:host ::ng-deep .fr-box.fr-basic .fr-element{padding:0;font-family:inherit;color:inherit;font-size:inherit;line-height:inherit;min-height:auto}:host ::ng-deep .fr-more-toolbar,:host ::ng-deep .fr-toolbar,:host ::ng-deep .fr-dropdown:after,:host ::ng-deep .fr-dropdown-menu .fr-dropdown-wrapper{transition:none!important}:host ::ng-deep .fr-toolbar.fr-top{position:sticky;z-index:2;border-radius:0;background-color:#fff}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp{margin:0 20px 0 0}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(1):after,:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:nth-child(2):after{content:\"\";position:absolute;top:9px;height:30px;border-left:1px solid #e5e5e5;margin-left:10px}:host ::ng-deep .fr-toolbar.fr-top div:first-of-type:before{border:none}:host ::ng-deep .fr-toolbar.fr-top.fr-toolbar-open .fr-newline{height:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-btn-grp:first-child{margin-left:0}:host ::ng-deep .fr-toolbar.fr-top.fr-top{border:0}:host ::ng-deep .fr-toolbar.fr-top .fr-newline{margin:0}:host ::ng-deep .fr-toolbar.fr-top .fr-more-toolbar{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn{z-index:auto}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown:after{right:3px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-dropdown.fr-selection span{margin-right:24px}:host ::ng-deep .fr-toolbar.fr-top .fr-command.fr-btn.fr-open{border-radius:4px;margin:4px 2px}:host ::ng-deep .fr-view ol,:host ::ng-deep .fr-view ul{list-style-position:unset}:host.disabled ::ng-deep .fr-box.fr-basic{opacity:.5;pointer-events:none}:host.disabled ::ng-deep .fr-box.fr-basic .fr-wrapper{border:none}:host.disabled ::ng-deep .disabled-line{display:block}::ng-deep .fr-popup{z-index:1001!important}::ng-deep .fr-video-by-url-layer .fr-checkbox-line{display:none}.disabled-line{display:none;position:absolute;bottom:-1px;z-index:1;background-image:linear-gradient(90deg,rgba(0,0,0,.42) 0,rgba(0,0,0,.42) 33%,transparent 0);background-size:4px 100%;background-repeat:repeat-x;height:1px;width:100%}.bottom-line{opacity:0;transform-origin:50%;transform:scaleX(.5);transition:background-color .3s cubic-bezier(.55,0,.55,.2);width:100%;border-bottom:2px solid #949494;position:absolute;bottom:-1px;z-index:1}:host{position:relative;display:block}:host.focused .bottom-line{opacity:1;display:block;transform:scaleX(1);transition:transform .3s cubic-bezier(.25,.8,.25,1),opacity .1s cubic-bezier(.25,.8,.25,1),background-color .3s cubic-bezier(.25,.8,.25,1)}::ng-deep .fs-html-editor-mention-container{position:absolute;top:0;left:0;height:auto;max-height:300px;max-width:500px;overflow:auto;display:block;z-index:999999;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-bottom-left-radius:4px;border-bottom-right-radius:4px;background:#fff}::ng-deep .fs-html-editor-mention-container ul{margin:0;padding:0;list-style:none}::ng-deep .fs-html-editor-mention-container li{padding:0 16px;cursor:pointer;line-height:48px}::ng-deep .fs-html-editor-mention-container li.highlight,::ng-deep .fs-html-editor-mention-container li:hover{background:#F5F5F5}::ng-deep .fs-html-editor-mention-container li.no-match{cursor:default}\n"], components: [{ type: i2.FsHtmlRendererComponent, selector: "fs-html-renderer", inputs: ["html"] }], directives: [{ type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], pipes: { "async": i3.AsyncPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
452
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: FsHtmlEditorComponent, decorators: [{
453
+ type: Component,
454
+ args: [{
455
+ selector: 'fs-html-editor',
456
+ templateUrl: 'html-editor.component.html',
457
+ styleUrls: ['html-editor.component.scss'],
458
+ providers: [
459
+ {
460
+ provide: NG_VALUE_ACCESSOR,
461
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
462
+ multi: true
463
+ },
464
+ {
465
+ provide: NG_VALIDATORS,
466
+ useExisting: forwardRef(() => FsHtmlEditorComponent),
467
+ multi: true
468
+ },
469
+ ],
470
+ changeDetection: ChangeDetectionStrategy.OnPush,
471
+ }]
472
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
473
+ type: Optional
474
+ }, {
475
+ type: Inject,
476
+ args: [FS_HTML_EDITOR_CONFIG]
477
+ }] }, { type: i0.ChangeDetectorRef }, { type: i1.FsFroalaLoaderService }]; }, propDecorators: { classFocused: [{
478
+ type: HostBinding,
479
+ args: ['class.focused']
480
+ }], classDisabled: [{
481
+ type: HostBinding,
482
+ args: ['class.disabled']
483
+ }], elRef: [{
484
+ type: ViewChild,
485
+ args: ['elRef']
486
+ }], config: [{
487
+ type: Input
488
+ }] } });
489
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2h0bWwtZWRpdG9yL2h0bWwtZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9odG1sLWVkaXRvci9odG1sLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxhQUFhLEVBQ2IsaUJBQWlCLEVBR2xCLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFjLGFBQWEsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9HLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFJbEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUdw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R0FBRyxFQUFFLHNCQUFzQixDQUFDOzRCQUNwRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsYUFBYTs0QkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7MEJBbUJJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMscUJBQXFCO2dIQWhCYixZQUFZO3NCQUF6QyxXQUFXO3VCQUFDLGVBQWU7Z0JBQ0csYUFBYTtzQkFBM0MsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBRUYsS0FBSztzQkFBL0IsU0FBUzt1QkFBQyxPQUFPO2dCQUVGLE1BQU07c0JBQXJCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTkdfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFZhbGlkYXRpb25FcnJvcnMsXG4gIFZhbGlkYXRvclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEZpbGVQcm9jZXNzb3IsIEZzRmlsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2ZpbGUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb21FdmVudFBhdHRlcm4sIE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIG1hcCwgc2tpcCwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbmltcG9ydCB7IFBsdWdpbkJ1dHRvbiB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9wbHVnaW4tYnV0dG9uJztcbmltcG9ydCB7IEZzSHRtbEVkaXRvckNvbmZpZyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvaHRtbC1lZGl0b3ItY29uZmlnJztcbmltcG9ydCB7IFJpY2hCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvcmljaC1idXR0b25zLmNvbnN0JztcbmltcG9ydCB7IFRleHRCdXR0b25zIH0gZnJvbSAnLi8uLi8uLi9jb25zdHMvdGV4dC1idXR0b25zLmNvbnN0JztcbmltcG9ydCB7IFBhcmFncmFwaEJ1dHRvbnMgfSBmcm9tICcuLy4uLy4uL2NvbnN0cy9wYXJhZ3JhcGgtYnV0dG9ucy5jb25zdCc7XG5cbmltcG9ydCB7IEZTX0hUTUxfRURJVE9SX0NPTkZJRyB9IGZyb20gJy4uLy4uL2luamVjdHMvY29uZmlnLmluamVjdCc7XG5pbXBvcnQgeyBQbHVnaW4gfSBmcm9tICcuLy4uLy4uL2NsYXNzZXMvcGx1Z2luJztcblxuaW1wb3J0IHsgRnNGcm9hbGFMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZnJvYWxhLWxvYWRlci5zZXJ2aWNlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmcy1odG1sLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAnaHRtbC1lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnaHRtbC1lZGl0b3IuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGc0h0bWxFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGc0h0bWxFZGl0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRnNIdG1sRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgVmFsaWRhdG9yLCBPbkRlc3Ryb3kge1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZm9jdXNlZCcpIGNsYXNzRm9jdXNlZCA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJykgY2xhc3NEaXNhYmxlZCA9IGZhbHNlO1xuXG4gIEBWaWV3Q2hpbGQoJ2VsUmVmJykgcHVibGljIGVsUmVmOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IEZzSHRtbEVkaXRvckNvbmZpZyA9IHt9O1xuXG4gIHB1YmxpYyBpbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX2VkaXRvcjogYW55O1xuICBwcml2YXRlIF9odG1sOiBzdHJpbmc7XG4gIHByaXZhdGUgX2luaXRpYWxpemUkID0gbmV3IFJlcGxheVN1YmplY3QoKTtcbiAgcHJpdmF0ZSBfZnJvYWxhUmVhZHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRlNfSFRNTF9FRElUT1JfQ09ORklHKSBwcml2YXRlIF9kZWZhdWx0Q29uZmlnLFxuICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIF9mcjogRnNGcm9hbGFMb2FkZXJTZXJ2aWNlLFxuICApIHsgfVxuXG4gIHB1YmxpYyBvbkNoYW5nZSA9IChkYXRhOiBhbnkpID0+IHt9XG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7fVxuXG4gIHB1YmxpYyBnZXQgZWwoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIGdldCBodG1sKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2h0bWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVkaXRvcigpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9lZGl0b3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZyb2FsYUxvYWRlZCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyLmxvYWRlZCQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jb25maWcgPSB0aGlzLmNvbmZpZyB8fCB7fTtcbiAgICB0aGlzLmNvbmZpZy5hdXRvZm9jdXMgPSB0aGlzLmNvbmZpZy5hdXRvZm9jdXMgIT09IGZhbHNlICYmICF0aGlzLmNvbmZpZy5kaXNhYmxlZDtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gIXRoaXMuY29uZmlnLmluaXRPbkNsaWNrO1xuICAgIHRoaXMuX2xpc3RlbkxhenlJbml0KCk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIGlmICghdGhpcy5jb25maWcuaW5pdE9uQ2xpY2sgfHwgIXRoaXMuaGFzQ29udGVudCgpKSB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2luaXRpYWxpemUkLm5leHQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaGFzQ29udGVudCgpIHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgaWYgKGVsLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBlbC5pbm5lckhUTUwgPSB0aGlzLl9odG1sO1xuICAgIHJldHVybiAhIWVsLmlubmVyVGV4dC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZShvcHRpb25zOiBhbnkgPSB7fSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2NyZWF0ZUNvbmZpZygpO1xuICAgIHRoaXMuX2luaXRQbHVnaW5zKGNvbmZpZyk7XG4gICAgdGhpcy5faW5pdEJ1dHRvbnMoY29uZmlnKTtcbiAgICB0aGlzLl9lZGl0b3IgPSBuZXcgdGhpcy5fZnIuRnJvYWxhRWRpdG9yKHRoaXMuZWwsIHRoaXMuX2NyZWF0ZU9wdGlvbnMoKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fZnJvYWxhUmVhZHkkLm5leHQoeyBjb25maWcsIG9wdGlvbnMgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzSW1hZ2VVcGxvYWQoYmxvYikge1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBGaWxlUHJvY2Vzc29yKCk7XG4gICAgY29uc3QgZmlsZSA9IG5ldyBGc0ZpbGUoYmxvYik7XG5cbiAgICByZXR1cm4gcHJvY2Vzc29yLnByb2Nlc3MoW2ZpbGVdLCB0aGlzLmNvbmZpZy5pbWFnZSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKFtmXTogRnNGaWxlW10pID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWcuaW1hZ2UudXBsb2FkKGYuZmlsZSlcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHVibGljIHVuaW5pdGlhbGl6ZWRDbGljayhldmVudDogVUlFdmVudCk6IHZvaWQge1xuICAgIGlmICghZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgY29uc3QgdGFyZ2V0OiBhbnkgPSBldmVudC50YXJnZXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5ub2RlTmFtZSA9PT0gJ0EnICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgICAgICBjb25zdCB0YXJnZXRUYXJnZXQgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGFyZ2V0VGFyZ2V0KSB7XG4gICAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCB0YXJnZXRUYXJnZXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKCd0YXJnZXQnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmluaXRDbGljaykge1xuICAgICAgICAgIHRoaXMuY29uZmlnLmluaXRDbGljayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW5pdGlhbGl6ZSQubmV4dCgpO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU2l6ZSgpIHtcbiAgICAvLyBIYWNrOiBUbyB0cmlnZ2VyIHRoZSB0b29sYmFyIGJ1dHRvbiBzaXplIG1vZGVzXG4gICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuXG4gICAgY29uc3QgZXJyOiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5jb25maWcubWF4TGVuZ3RoICYmIHRoaXMuX2h0bWwpIHtcbiAgICAgIGNvbnN0IG1heExlbmd0aCA9IHRoaXMuY29uZmlnLm1heExlbmd0aDtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuX2h0bWwubGVuZ3RoO1xuICAgICAgaWYgKGxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICBlcnIubWF4TGVuZ3RoRXJyb3IgPSBgTXVzdCBiZSAke21heExlbmd0aH0gY2hhcmFjdGVycyBvciBmZXdlci4gWW91IGVudGVyZWQgJHtsZW5ndGh9IGNoYXJhY3RlcnMuYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZXJyKS5sZW5ndGggPyBlcnIgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIGZvY3VzKG9wdGlvbnM/OiB7IGN1cnNvclBvc2l0aW9uPzogJ3N0YXJ0JyB8ICdlbmQnIH0pIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyA/IG9wdGlvbnMgOiB7fTtcblxuICAgIGlmIChvcHRpb25zLmN1cnNvclBvc2l0aW9uID09PSAnZW5kJykge1xuICAgICAgdGhpcy5lZGl0b3Iuc2VsZWN0aW9uLnNldEF0RW5kKHRoaXMuZWRpdG9yLiRlbC5nZXQoMCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24uc2V0QXRTdGFydCh0aGlzLmVkaXRvci4kZWwuZ2V0KDApKTtcbiAgICB9XG5cbiAgICB0aGlzLmVkaXRvci5zZWxlY3Rpb24ucmVzdG9yZSgpO1xuXG4gICAgY29uc3QgZWxTZWxlY3Rpb24gPSB0aGlzLmVkaXRvci5zZWxlY3Rpb24uZWxlbWVudCgpO1xuICAgIGlmIChlbFNlbGVjdGlvbikge1xuICAgICAgZWxTZWxlY3Rpb24uc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2NlbnRlcicgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZSgnJyk7XG4gIH1cblxuICBwdWJsaWMgZGlzYWJsZSgpIHtcbiAgICB0aGlzLmNsYXNzRGlzYWJsZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIHNldEh0bWwoaHRtbCkge1xuICAgIHRoaXMud3JpdGVWYWx1ZShodG1sKTtcbiAgfVxuXG4gIHB1YmxpYyB3cml0ZVZhbHVlKGh0bWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2h0bWwgPSBodG1sIHx8ICcnO1xuXG4gICAgaWYgKHRoaXMuZWRpdG9yICYmIHRoaXMuZWRpdG9yLmh0bWwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZWRpdG9yLmh0bWwuc2V0KHRoaXMuX2h0bWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuX2luaXRpYWxpemUkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVDb25maWcoKTogRnNIdG1sRWRpdG9yQ29uZmlnIHtcbiAgICByZXR1cm4gbWVyZ2UoeyBmcm9hbGFDb25maWc6IHt9IH0sIHRoaXMuX2RlZmF1bHRDb25maWcsIHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoYW5nZShodG1sKTogdm9pZCB7XG4gICAgdGhpcy5faHRtbCA9IGh0bWw7XG4gICAgdGhpcy5vbkNoYW5nZShodG1sKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRCdXR0b25zKGNvbmZpZzogRnNIdG1sRWRpdG9yQ29uZmlnKSB7XG4gICAgKGNvbmZpZy5idXR0b25zIHx8IFtdKVxuICAgIC5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgIC8qXG4gICAgICAgIFN2ZyBLZXlzOlxuICAgICAgICBbXCJhZGRcIiwgXCJhZHZhbmNlZEltYWdlRWRpdG9yXCIsIFwiYWxpZ25DZW50ZXJcIiwgXCJhbGlnbkp1c3RpZnlcIiwgXCJhbGlnbkxlZnRcIiwgXCJhbGlnblJpZ2h0XCIsIFxuICAgICAgICBcImFuY2hvcnNcIiwgXCJiYWNrXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIFwiYmxvY2txdW90ZVwiLCBcImJvbGRcIiwgXCJjZWxsQmFja2dyb3VuZFwiLCBcbiAgICAgICAgXCJjZWxsQm9yZGVyQ29sb3JcIiwgXCJjZWxsT3B0aW9uc1wiLCBcImNlbGxTdHlsZVwiLCBcImNsZWFyRm9ybWF0dGluZ1wiLCBcImNsb3NlXCIsIFwiY29kZVZpZXdcIiwgXG4gICAgICAgIFwiY29nc1wiLCBcImNvbHVtbnNcIiwgXCJlZGl0TGlua1wiLCBcImV4aXRGdWxsc2NyZWVuXCIsIFwiZm9udEF3ZXNvbWVcIiwgXCJmb250RmFtaWx5XCIsIFxuICAgICAgICBcImZvbnRTaXplXCIsIFwiZnVsbHNjcmVlblwiLCBcImhlbHBcIiwgXCJob3Jpem9udGFsTGluZVwiLCBcImltYWdlQWx0VGV4dFwiLCBcImltYWdlQ2FwdGlvblwiLCBcbiAgICAgICAgXCJpbWFnZUNsYXNzXCIsIFwiaW1hZ2VEaXNwbGF5XCIsIFwiaW1hZ2VNYW5hZ2VyXCIsIFwiaW1hZ2VTaXplXCIsIFwiaW5kZW50XCIsIFwiaW5saW5lQ2xhc3NcIiwgXG4gICAgICAgIFwiaW5saW5lU3R5bGVcIiwgXCJpbnNlcnRFbWJlZFwiLCBcImluc2VydEZpbGVcIiwgXCJpbnNlcnRJbWFnZVwiLCBcImluc2VydExpbmtcIiwgXCJpbnNlcnRNb3JlXCIsIFxuICAgICAgICBcImluc2VydFRhYmxlXCIsIFwiaW5zZXJ0VmlkZW9cIiwgXCJ1cGxvYWRcIiwgXCJpdGFsaWNcIiwgXCJzZWFyY2hcIiwgXCJsaW5lSGVpZ2h0XCIsIFwibGlua1N0eWxlc1wiLCBcbiAgICAgICAgXCJtZW50aW9uXCIsIFwibW9yZVwiLCBcIm9wZW5MaW5rXCIsIFwib3JkZXJlZExpc3RcIiwgXCJvdXRkZW50XCIsIFwicGFnZUJyZWFrZXJcIiwgXG4gICAgICAgIFwicGFyYWdyYXBoRm9ybWF0XCIsIFwicGFyYWdyYXBoTW9yZVwiLCBcInBhcmFncmFwaFN0eWxlXCIsIFwicGRmRXhwb3J0XCIsIFwicHJpbnRcIiwgXG4gICAgICAgIFwicmVkb1wiLCBcInJlbW92ZVRhYmxlXCIsIFwicmVtb3ZlXCIsIFwicmVwbGFjZUltYWdlXCIsIFwicm93XCIsIFwic2VsZWN0QWxsXCIsIFwic21pbGVcIixcbiAgICAgICAgXCJzcGVsbGNoZWNrXCIsIFwic3RhclwiLCBcInN0cmlrZVRocm91Z2hcIiwgXCJzdWJzY3JpcHRcIiwgXCJzdXBlcnNjcmlwdFwiLCBcInN5bWJvbHNcIiwgXCJ0YWdzXCIsXG4gICAgICAgIFwidGFibGVIZWFkZXJcIiwgXCJ0YWJsZVN0eWxlXCIsIFwidGV4dENvbG9yXCIsIFwidGV4dE1vcmVcIiwgXCJ1bmRlcmxpbmVcIiwgXCJ1bmRvXCIsIFwidW5saW5rXCIsIFxuICAgICAgICBcInVub3JkZXJlZExpc3RcIiwgXCJ2ZXJ0aWNhbEFsaWduQm90dG9tXCIsIFwidmVydGljYWxBbGlnbk1pZGRsZVwiLCBcInZlcnRpY2FsQWxpZ25Ub3BcIl1cbiAgICAgICovXG5cbiAgICAgIGlmKGJ1dHRvbi5zdmdLZXkpIHtcbiAgICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLkRlZmluZUljb24oYnV0dG9uLm5hbWUsIHsgU1ZHX0tFWTogYnV0dG9uLnN2Z0tleSB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLlJlZ2lzdGVyQ29tbWFuZChidXR0b24ubmFtZSwge1xuICAgICAgICB0aXRsZTogYnV0dG9uLnRpdGxlLFxuICAgICAgICBmb2N1czogYnV0dG9uLmZvY3VzID8/IHRydWUsXG4gICAgICAgIHVuZG86IGJ1dHRvbi51bmRvID8/IHRydWUsXG4gICAgICAgIHJlZnJlc2hBZnRlckNhbGxiYWNrOiBidXR0b24ucmVmcmVzaEFmdGVyQ2FsbGJhY2sgPz8gdHJ1ZSxcbiAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBidXR0b24uY2xpY2sodGhpcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdFBsdWdpbnMoY29uZmlnKSB7XG4gICAgKGNvbmZpZy5wbHVnaW5zIHx8IFtdKS5mb3JFYWNoKChwbHVnaW46IFBsdWdpbikgPT4ge1xuICAgICAgdGhpcy5fZnIuRnJvYWxhRWRpdG9yLlBMVUdJTlNbcGx1Z2luLmNvbmZpZy5uYW1lXSA9IGZ1bmN0aW9uIChlZGl0b3IpIHtcbiAgICAgICAgcGx1Z2luLmVkaXRvciA9IGVkaXRvcjtcbiAgICAgICAgcGx1Z2luLmluaXRpYWxpemUoKTtcbiAgICAgICAgcmV0dXJuIHBsdWdpbjtcbiAgICAgIH07XG5cbiAgICAgIChwbHVnaW4uY29uZmlnLmJ1dHRvbnMgfHwgW10pLmZvckVhY2goKGJ1dHRvbjogUGx1Z2luQnV0dG9uKSA9PiB7XG4gICAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5EZWZpbmVJY29uKGJ1dHRvbi5uYW1lLCB7XG4gICAgICAgICAgTkFNRTogYnV0dG9uLm5hbWUsXG4gICAgICAgICAgUEFUSDogYnV0dG9uLnN2Z1BhdGgsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2ZyLkZyb2FsYUVkaXRvci5SZWdpc3RlckNvbW1hbmQoYnV0dG9uLm5hbWUsIHtcbiAgICAgICAgICBpY29uOiBidXR0b24ubmFtZSxcbiAgICAgICAgICB0aXRsZTogYnV0dG9uLnRvb2x0aXAsXG4gICAgICAgICAgdW5kbzogYnV0dG9uLnVuZG8sXG4gICAgICAgICAgZm9jdXM6IGJ1dHRvbi5mb2N1cyxcbiAgICAgICAgICBzaG93T25Nb2JpbGU6IGJ1dHRvbi5zaG93T25Nb2JpbGUsXG4gICAgICAgICAgcmVmcmVzaEFmdGVyQ2FsbGJhY2s6IGJ1dHRvbi5yZWZyZXNoQWZ0ZXJDYWxsYmFjayxcbiAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5jbGljaykge1xuICAgICAgICAgICAgICBidXR0b24uY2xpY2sodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZWZyZXNoOiBmdW5jdGlvbiAoYnV0dG9uKSB7XG4gICAgICAgICAgICBpZiAoYnV0dG9uLnJlZnJlc2gpIHtcbiAgICAgICAgICAgICAgYnV0dG9uLnJlZnJlc2godGhpcywgYnV0dG9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU9wdGlvbnMoKSB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5fY3JlYXRlQ29uZmlnKCk7XG5cbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gZWRpdG9yIHN0b3JlIHNvbWV3aGVyZSBwb2ludGVyIG9uIGRlZmF1bHQgY29uZmlnIG9iamVjdCBhbmQgZHVibGljYXRlIG9wdGlvbnMgZWFjaCB0aW1lIG9uIGluaXRcbiAgICAgIC8vIEV4dHJhIG1lcmdlIGxldmVsIGZpeGVkIHRoaXMgcHJvYmxlbSBhbmQgYWxsb3cgdG8gaW5pdCBjb25maWcgcHJvcGVybHkgd2l0aG91dCBsZWdhY3kgZGF0YVxuICAgICAge30sXG4gICAgICB7XG4gICAgICAgIHNob3J0Y3V0c0VuYWJsZWQ6IFsnc2hvdycsICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnaW5kZW50JywgJ291dGRlbnQnLCAndW5kbycsICdyZWRvJywgJ2luc2VydEltYWdlJywgJ2NyZWF0ZUxpbmsnXSxcbiAgICAgICAga2V5OiBjb25maWcuYWN0aXZhdGlvbktleSxcbiAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiBjb25maWcucGxhY2Vob2xkZXIsXG4gICAgICAgIGxpbmtBbHdheXNCbGFuazogdHJ1ZSxcbiAgICAgICAgdGFiU3BhY2VzOiAyLFxuICAgICAgICB0eXBpbmdUaW1lcjogMjUwLFxuICAgICAgICB0b29sdGlwczogZmFsc2UsXG4gICAgICAgIHdvcmRQYXN0ZU1vZGFsOiBmYWxzZSxcbiAgICAgICAgaW1hZ2VEZWZhdWx0V2lkdGg6IDAsXG4gICAgICAgIGltYWdlRGVmYXVsdEFsaWduOiAnbGVmdCcsXG4gICAgICAgIHF1aWNrSW5zZXJ0RW5hYmxlZDogZmFsc2UsXG4gICAgICAgIHBhcmFncmFwaERlZmF1bHRTZWxlY3Rpb246ICdGb3JtYXQnLFxuICAgICAgICB2aWRlb1VwbG9hZDogZmFsc2UsXG4gICAgICAgIHBhcmFncmFwaEZvcm1hdDoge1xuICAgICAgICAgIE46ICdOb3JtYWwnLFxuICAgICAgICAgIEgxOiAnSGVhZGluZyAxJyxcbiAgICAgICAgICBIMjogJ0hlYWRpbmcgMicsXG4gICAgICAgICAgSDM6ICdIZWFkaW5nIDMnLFxuICAgICAgICAgIEg0OiAnSGVhZGluZyA0JyxcbiAgICAgICAgICBCTE9DS1FVT1RFOiAnUXVvdGUnLFxuICAgICAgICB9LFxuICAgICAgICBwYXJhZ3JhcGhGb3JtYXRTZWxlY3Rpb246IHRydWUsXG4gICAgICAgIHRvb2xiYXJCdXR0b25zWFM6IHtcbiAgICAgICAgICBtb3JlVGV4dDoge1xuICAgICAgICAgICAgYnV0dG9uczogVGV4dEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVQYXJhZ3JhcGg6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFBhcmFncmFwaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vcmVSaWNoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBSaWNoQnV0dG9ucyxcbiAgICAgICAgICAgIGJ1dHRvbnNWaXNpYmxlOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRvb2xiYXJCdXR0b25zOiB7XG4gICAgICAgICAgbW9yZVRleHQ6IHtcbiAgICAgICAgICAgIGJ1dHRvbnM6IFRleHRCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUGFyYWdyYXBoOiB7XG4gICAgICAgICAgICBidXR0b25zOiBQYXJhZ3JhcGhCdXR0b25zLFxuICAgICAgICAgICAgYnV0dG9uc1Zpc2libGU6IDUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb3JlUmljaDoge1xuICAgICAgICAgICAgYnV0dG9uczogUmljaEJ1dHRvbnMsXG4gICAgICAgICAgICBidXR0b25zVmlzaWJsZTogMyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZy5mcm9hbGFDb25maWcsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlbkxhenlJbml0KCkge1xuICAgIHRoaXMuZnJvYWxhTG9hZGVkJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocmVhZHkpID0+IHJlYWR5KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuX2luaXRpYWxpemUkKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzZWxlY3Rpb246IGFueSA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7fTtcbiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmJhc2VOb2RlKSB7XG4gICAgICAgICAgICBvcHRpb25zLnNlbGVjdGlvbiA9IHtcbiAgICAgICAgICAgICAgbm9kZTogc2VsZWN0aW9uLmJhc2VOb2RlLm5vZGVWYWx1ZSxcbiAgICAgICAgICAgICAgb2Zmc2V0OiBzZWxlY3Rpb24uYmFzZU9mZnNldCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZShvcHRpb25zKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9mcm9hbGFSZWFkeSQpLFxuICAgICAgICBmaWx0ZXIoKGRhdGEpID0+ICEhZGF0YSksXG4gICAgICAgIHRhcCgoeyBjb25maWcsIG9wdGlvbnMgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuX3NldHVwRnJvYWxhKGNvbmZpZywgb3B0aW9ucyk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9jb250ZW50Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3JIVE1MID0gdGhpcy5fZWRpdG9yLmh0bWwuZ2V0KCk7XG5cbiAgICBpZiAodGhpcy5odG1sICE9PSBlZGl0b3JIVE1MKSB7XG4gICAgICB0aGlzLl9jaGFuZ2UoZWRpdG9ySFRNTCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBGcm9hbGEoY29uZmlnOiBGc0h0bWxFZGl0b3JDb25maWcsIG9wdGlvbnM6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgdGhpcy5zZXRIdG1sKHRoaXMuX2h0bWwpO1xuXG4gICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5kaXNhYmxlKCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5mcm9hbGFDb25maWcuZXZlbnRzKSB7XG4gICAgICBpZiAoY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgY29uZmlnLmZyb2FsYUNvbmZpZy5ldmVudHMuaW5pdGlhbGl6ZWQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdmb2N1cycsICgpID0+IHtcbiAgICAgIHRoaXMuY2xhc3NGb2N1c2VkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignYmx1cicsICgpID0+IHtcbiAgICAgIHRoaXMuY2xhc3NGb2N1c2VkID0gZmFsc2U7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcblxuXG4gICAgZnJvbUV2ZW50UGF0dGVybihcbiAgICAgIChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2NvbnRlbnRDaGFuZ2VkJywgaGFuZGxlcik7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge31cbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMuX2h0bWwpLFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5lZGl0b3IuaHRtbC5nZXQoKSksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHNraXAoMSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fY29udGVudENoYW5nZWQoKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gdGhpcy5fZWRpdG9yLmV2ZW50cy5vbignY29udGVudENoYW5nZWQnLCAoKSA9PiB7XG4gICAgLy8gICBjb25zb2xlLmxvZygndGVzdCcpO1xuICAgIC8vICAgaWYgKCF0aGlzLl9maXJzdENoYW5nZSkge1xuICAgIC8vICAgICB0aGlzLl9jb250ZW50Q2hhbmdlZCgpO1xuICAgIC8vICAgfVxuICAgIC8vIH0pO1xuXG4gICAgdGhpcy5fZWRpdG9yLmV2ZW50cy5vbigncGFzdGUuYWZ0ZXJDbGVhbnVwJywgKGh0bWwpID0+IHtcbiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKVxuICAgICAgICAuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsLmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBlbC5hdHRyaWJ1dGVzWzBdLm5hbWU7XG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2hyZWYnKSB7XG4gICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdrZXlkb3duJywgKCkgPT4ge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5pbWFnZSAmJiB0aGlzLmNvbmZpZy5pbWFnZS51cGxvYWQpIHtcbiAgICAgIHRoaXMuX2VkaXRvci5ldmVudHMub24oJ2ltYWdlLmJlZm9yZVBhc3RlVXBsb2FkJywgKGltYWdlKSA9PiB7XG5cbiAgICAgICAgZmV0Y2goaW1hZ2UuZ2V0QXR0cmlidXRlKCdzcmMnKSlcbiAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICByZXMuYmxvYigpXG4gICAgICAgICAgICAgIC50aGVuKChibG9iKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2IpXG4gICAgICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKHVybCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpbWFnZS5zZXRBdHRyaWJ1dGUoJ3NyYycsIHVybCk7XG4gICAgICAgICAgICAgICAgICAgIGltYWdlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1mci1pbWFnZS1wYXN0ZWQnKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250ZW50Q2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9lZGl0b3IuZXZlbnRzLm9uKCdpbWFnZS5iZWZvcmVVcGxvYWQnLCAoYmxvYnMpID0+IHtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0ltYWdlVXBsb2FkKGJsb2JzWzBdKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgodXJsKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVkaXRvci5pbWFnZS5pbnNlcnQodXJsLCBudWxsLCBudWxsLCB0aGlzLmVkaXRvci5pbWFnZS5nZXQoKSk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZyLXNlY29uZC10b29sYmFyJykpIHtcbiAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZyLXNlY29uZC10b29sYmFyJykucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gb3B0aW9ucy5zZWxlY3Rpb247XG5cbiAgICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgICBjb25zdCBub2RlOiBhbnkgPSBBcnJheS5mcm9tKHRoaXMuZWwucXVlcnlTZWxlY3RvckFsbCgnLmZyLWVsZW1lbnQgKicpKS5maW5kKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbi5ub2RlID09PSBub2RlLnRleHRDb250ZW50O1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgY29uc3Qgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gICAgICAgIHJhbmdlLnNldFN0YXJ0KHRoaXMuX2dldFRleHROb2RlKG5vZGUpLCBzZWxlY3Rpb24ub2Zmc2V0KTtcbiAgICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSlcblxuICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgIHNlbC5hZGRSYW5nZShyYW5nZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5hdXRvZm9jdXMpIHtcbiAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRUZXh0Tm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRleHROb2RlKG5vZGUuY2hpbGROb2Rlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZnMtaHRtbC1lZGl0b3ItZGVmYXVsdFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiaW5pdGlhbGl6ZWRcIj5cbiAgICA8bmctY29udGFpbmVyICpmc1NrZWxldG9uPVwiKGZyb2FsYUxvYWRlZCQgfCBhc3luYykgIT09IGZhbHNlXCI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgI2VsUmVmPjwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJib3R0b20tbGluZVwiPjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZGlzYWJsZWQtbGluZVwiPjwvZGl2PlxuICA8ZnMtaHRtbC1yZW5kZXJlclxuICAgICpuZ0lmPVwiIWluaXRpYWxpemVkXCJcbiAgICBbaHRtbF09XCJodG1sXCJcbiAgICAoY2xpY2spPVwidW5pbml0aWFsaXplZENsaWNrKCRldmVudClcIj5cbiAgPC9mcy1odG1sLXJlbmRlcmVyPlxuPC9kaXY+XG4iXX0=