@firestitch/content 18.0.10 → 18.0.11
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.
- package/app/modules/content-layouts/components/content-layout/content-layout.component.d.ts +6 -15
- package/app/modules/content-layouts/components/content-layout-editor/content-layout-editor.component.d.ts +11 -24
- package/app/modules/content-pages/components/content-page/content-page.component.d.ts +13 -19
- package/app/modules/content-pages/components/content-page-editor/content-page-editor.component.d.ts +15 -32
- package/app/modules/editor/components/editor/editor.component.d.ts +41 -36
- package/esm2022/app/modules/content-layouts/components/content-layout/content-layout.component.mjs +15 -32
- package/esm2022/app/modules/content-layouts/components/content-layout-editor/content-layout-editor.component.mjs +44 -95
- package/esm2022/app/modules/content-pages/components/content-page/content-page.component.mjs +29 -40
- package/esm2022/app/modules/content-pages/components/content-page-editor/content-page-editor.component.mjs +54 -104
- package/esm2022/app/modules/content-pages/components/content-pages/content-pages.component.mjs +3 -3
- package/esm2022/app/modules/editor/components/editor/editor.component.mjs +119 -127
- package/fesm2022/firestitch-content.mjs +242 -372
- package/fesm2022/firestitch-content.mjs.map +1 -1
- package/package.json +1 -1
- package/app/modules/editor/components/editor/index.d.ts +0 -1
- package/esm2022/app/modules/editor/components/editor/index.mjs +0 -2
|
@@ -1,133 +1,148 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy,
|
|
1
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, model, signal, } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import { FsFormModule } from '@firestitch/form';
|
|
2
5
|
import { FsMessage } from '@firestitch/message';
|
|
6
|
+
import { FsSkeletonModule } from '@firestitch/skeleton';
|
|
3
7
|
import { FsTextEditorModule } from '@firestitch/text-editor';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { tap } from 'rxjs/operators';
|
|
6
|
-
import { EditorType } from '../../../../enums';
|
|
7
8
|
import { AngularSplitModule } from 'angular-split';
|
|
9
|
+
import { EMPTY, concat } from 'rxjs';
|
|
10
|
+
import { finalize, last, tap } from 'rxjs/operators';
|
|
11
|
+
import { EditorType } from '../../../../enums';
|
|
8
12
|
import { EditorLabelComponent } from '../editor-label/editor-label.component';
|
|
9
|
-
import { FormsModule } from '@angular/forms';
|
|
10
|
-
import { FsFormModule } from '@firestitch/form';
|
|
11
|
-
import { FsCommonModule } from '@firestitch/common';
|
|
12
|
-
import { FsSkeletonModule } from '@firestitch/skeleton';
|
|
13
13
|
import * as i0 from "@angular/core";
|
|
14
14
|
import * as i1 from "angular-split";
|
|
15
15
|
import * as i2 from "@firestitch/text-editor";
|
|
16
16
|
import * as i3 from "@angular/forms";
|
|
17
17
|
import * as i4 from "@firestitch/form";
|
|
18
|
-
import * as i5 from "@firestitch/
|
|
19
|
-
import * as i6 from "@firestitch/skeleton";
|
|
18
|
+
import * as i5 from "@firestitch/skeleton";
|
|
20
19
|
export class EditorComponent {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
20
|
+
showHtml = input(false);
|
|
21
|
+
showScss = input(false);
|
|
22
|
+
showJs = input(false);
|
|
23
|
+
showGlobalScss = input(false);
|
|
24
|
+
contentConfig = input();
|
|
25
|
+
// Two-way bound to the text editors, so each holds exactly what is on screen. Nothing sits
|
|
26
|
+
// between a keystroke and a save: the fsModelChange this replaced debounced every pane by
|
|
27
|
+
// 300 ms (its `debounce: 0` falls back to 300), so a quick Ctrl+S posted text without its
|
|
28
|
+
// last keystrokes (IEB-T292).
|
|
29
|
+
html = model();
|
|
30
|
+
scss = model();
|
|
31
|
+
js = model();
|
|
32
|
+
globalScss = signal(null);
|
|
33
|
+
contentStyle = signal(null);
|
|
34
|
+
focusedArea = signal(null);
|
|
35
|
+
saving = signal(false);
|
|
36
|
+
// A pane is changed when its text differs from what the server last confirmed. A pane
|
|
37
|
+
// cleared to '' counts; one typed back to its original text does not (IEB-T292).
|
|
38
|
+
changedTypes = computed(() => {
|
|
39
|
+
const saved = this._saved();
|
|
40
|
+
return Object.values(EditorType)
|
|
41
|
+
.filter((type) => type in saved && this.value(type) !== saved[type]);
|
|
42
|
+
});
|
|
43
|
+
hasChanges = computed(() => this.changedTypes().length !== 0);
|
|
35
44
|
EditorType = EditorType;
|
|
36
|
-
focusedArea;
|
|
37
|
-
contentStyle;
|
|
38
|
-
resizing = false;
|
|
39
|
-
title;
|
|
40
45
|
scssConfig;
|
|
41
46
|
globalScssConfig;
|
|
42
47
|
htmlConfig;
|
|
43
48
|
jsConfig;
|
|
44
|
-
|
|
49
|
+
_saved = signal({});
|
|
50
|
+
_message = inject(FsMessage);
|
|
51
|
+
_destroyRef = inject(DestroyRef);
|
|
45
52
|
ngOnInit() {
|
|
46
|
-
this.
|
|
47
|
-
this.
|
|
53
|
+
this._initTextEditors();
|
|
54
|
+
this._saved.set({
|
|
55
|
+
[EditorType.Html]: this.html() ?? '',
|
|
56
|
+
[EditorType.Scss]: this.scss() ?? '',
|
|
57
|
+
[EditorType.Js]: this.js() ?? '',
|
|
58
|
+
});
|
|
59
|
+
this._initGlobalContentStyle();
|
|
48
60
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
61
|
+
value(type) {
|
|
62
|
+
const panes = {
|
|
63
|
+
[EditorType.Html]: this.html,
|
|
64
|
+
[EditorType.Scss]: this.scss,
|
|
65
|
+
[EditorType.Js]: this.js,
|
|
66
|
+
[EditorType.GlobalScss]: this.globalScss,
|
|
67
|
+
};
|
|
68
|
+
return panes[type]() ?? '';
|
|
52
69
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
70
|
+
/**
|
|
71
|
+
* Saves every changed pane, not just the one last focused, and records what was sent as
|
|
72
|
+
* the new baseline, so anything typed while the request is in flight stays changed. With
|
|
73
|
+
* nothing changed it sends nothing and shows no toast. Ctrl+S reaches this through fsForm's
|
|
74
|
+
* [submit], so it shares the Save button's gate (IEB-T292).
|
|
75
|
+
*
|
|
76
|
+
* `fields` maps a pane to its property on the record (html → content); `saveRecord` posts
|
|
77
|
+
* those properties.
|
|
78
|
+
*/
|
|
79
|
+
save$(fields, saveRecord) {
|
|
80
|
+
const sent = Object.fromEntries(this.changedTypes().map((type) => [type, this.value(type)]));
|
|
81
|
+
const saves = [
|
|
82
|
+
this._saveRecord$(fields, sent, saveRecord),
|
|
83
|
+
this._saveGlobalScss$(sent),
|
|
84
|
+
].filter((save) => !!save);
|
|
85
|
+
if (!saves.length) {
|
|
86
|
+
return EMPTY;
|
|
87
|
+
}
|
|
88
|
+
this.saving.set(true);
|
|
89
|
+
return concat(...saves)
|
|
90
|
+
.pipe(last(), tap(() => this._message.success('Saved Changes')), finalize(() => this.saving.set(false)));
|
|
56
91
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.filter((
|
|
60
|
-
|
|
92
|
+
_saveRecord$(fields, sent, saveRecord) {
|
|
93
|
+
const types = Object.keys(sent)
|
|
94
|
+
.filter((type) => fields[type]);
|
|
95
|
+
if (!types.length) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return saveRecord(Object.fromEntries(types.map((type) => [fields[type], sent[type]])))
|
|
99
|
+
.pipe(tap(() => this._markSaved(types, sent)));
|
|
61
100
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
101
|
+
_saveGlobalScss$(sent) {
|
|
102
|
+
if (!(EditorType.GlobalScss in sent)) {
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const contentStyle = { ...this.contentStyle(), scss: sent[EditorType.GlobalScss] };
|
|
106
|
+
return this.contentConfig().saveContentStyle(contentStyle)
|
|
107
|
+
.pipe(tap(() => {
|
|
108
|
+
this.contentStyle.set(contentStyle);
|
|
109
|
+
this._markSaved([EditorType.GlobalScss], sent);
|
|
110
|
+
}));
|
|
65
111
|
}
|
|
66
|
-
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
language: 'js',
|
|
81
|
-
height: '100%',
|
|
82
|
-
focus: () => {
|
|
83
|
-
this._onFocus(EditorType.Js);
|
|
84
|
-
},
|
|
85
|
-
blur: () => {
|
|
86
|
-
this.blured.emit(EditorType.Js);
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
this.htmlConfig = {
|
|
90
|
-
tabSize: 2,
|
|
91
|
-
language: 'html',
|
|
92
|
-
height: '100%',
|
|
93
|
-
focus: () => {
|
|
94
|
-
this._onFocus(EditorType.Html);
|
|
95
|
-
},
|
|
96
|
-
blur: () => {
|
|
97
|
-
this.blured.emit(EditorType.Html);
|
|
98
|
-
},
|
|
99
|
-
};
|
|
100
|
-
this.globalScssConfig = {
|
|
112
|
+
_markSaved(types, sent) {
|
|
113
|
+
this._saved.update((saved) => ({
|
|
114
|
+
...saved,
|
|
115
|
+
...Object.fromEntries(types.map((type) => [type, sent[type]])),
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
118
|
+
_initTextEditors() {
|
|
119
|
+
this.scssConfig = this._createTextEditorConfig(EditorType.Scss, 'scss');
|
|
120
|
+
this.jsConfig = this._createTextEditorConfig(EditorType.Js, 'js');
|
|
121
|
+
this.htmlConfig = this._createTextEditorConfig(EditorType.Html, 'html');
|
|
122
|
+
this.globalScssConfig = this._createTextEditorConfig(EditorType.GlobalScss, 'scss');
|
|
123
|
+
}
|
|
124
|
+
_createTextEditorConfig(type, language) {
|
|
125
|
+
return {
|
|
101
126
|
tabSize: 2,
|
|
102
|
-
language
|
|
127
|
+
language,
|
|
103
128
|
height: '100%',
|
|
104
129
|
focus: () => {
|
|
105
|
-
this.
|
|
106
|
-
},
|
|
107
|
-
blur: () => {
|
|
108
|
-
this.blured.emit(EditorType.GlobalScss);
|
|
130
|
+
this.focusedArea.set(type);
|
|
109
131
|
},
|
|
110
132
|
};
|
|
111
133
|
}
|
|
112
|
-
|
|
113
|
-
this.contentConfig.loadContentStyle()
|
|
114
|
-
.
|
|
115
|
-
|
|
116
|
-
this.
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.pipe(tap(() => {
|
|
122
|
-
this._message.success('Saved Changes');
|
|
123
|
-
}));
|
|
124
|
-
}
|
|
125
|
-
_onFocus(type) {
|
|
126
|
-
this.focusedArea = type;
|
|
127
|
-
this.focused.emit(type);
|
|
134
|
+
_initGlobalContentStyle() {
|
|
135
|
+
this.contentConfig().loadContentStyle()
|
|
136
|
+
.pipe(tap((contentStyle) => {
|
|
137
|
+
const scss = contentStyle?.scss ?? '';
|
|
138
|
+
this.contentStyle.set(contentStyle || {});
|
|
139
|
+
this.globalScss.set(scss);
|
|
140
|
+
this._saved.update((saved) => ({ ...saved, [EditorType.GlobalScss]: scss }));
|
|
141
|
+
}), takeUntilDestroyed(this._destroyRef))
|
|
142
|
+
.subscribe();
|
|
128
143
|
}
|
|
129
144
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
130
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
145
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.7", type: EditorComponent, isStandalone: true, selector: "app-editor", inputs: { showHtml: { classPropertyName: "showHtml", publicName: "showHtml", isSignal: true, isRequired: false, transformFunction: null }, showScss: { classPropertyName: "showScss", publicName: "showScss", isSignal: true, isRequired: false, transformFunction: null }, showJs: { classPropertyName: "showJs", publicName: "showJs", isSignal: true, isRequired: false, transformFunction: null }, showGlobalScss: { classPropertyName: "showGlobalScss", publicName: "showGlobalScss", isSignal: true, isRequired: false, transformFunction: null }, contentConfig: { classPropertyName: "contentConfig", publicName: "contentConfig", isSignal: true, isRequired: false, transformFunction: null }, html: { classPropertyName: "html", publicName: "html", isSignal: true, isRequired: false, transformFunction: null }, scss: { classPropertyName: "scss", publicName: "scss", isSignal: true, isRequired: false, transformFunction: null }, js: { classPropertyName: "js", publicName: "js", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { html: "htmlChange", scss: "scssChange", js: "jsChange" }, ngImport: i0, template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\">\n <as-split-area [size]=\"70\" [visible]=\"showHtml()\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Html)\"\n [focused]=\"focusedArea() === EditorType.Html\">\n HTML\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"html\"\n name=\"html\"\n [config]=\"htmlConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss()\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Scss)\"\n [focused]=\"focusedArea() === EditorType.Scss\">\n SCSS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"scss\"\n name=\"scss\"\n [config]=\"scssConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs()\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Js)\"\n [focused]=\"focusedArea() === EditorType.Js\">\n JS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"js\"\n name=\"js\"\n [config]=\"jsConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss()\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.GlobalScss)\"\n [focused]=\"focusedArea() === EditorType.GlobalScss\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle()\">\n <fs-text-editor\n [(ngModel)]=\"globalScss\"\n name=\"globalScss\"\n [config]=\"globalScssConfig\">\n </fs-text-editor>\n </ng-container>\n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"], dependencies: [{ kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i1.SplitComponent, selector: "as-split", inputs: ["direction", "unit", "gutterSize", "gutterStep", "restrictMove", "useTransition", "disabled", "dir", "gutterDblClickDuration", "gutterClickDeltaPx", "gutterAriaLabel"], outputs: ["transitionEnd", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"], exportAs: ["asSplit"] }, { kind: "directive", type: i1.SplitAreaDirective, selector: "as-split-area, [as-split-area]", inputs: ["order", "size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: EditorLabelComponent, selector: "app-editor-label", inputs: ["changed", "focused"] }, { kind: "ngmodule", type: FsTextEditorModule }, { kind: "component", type: i2.FsTextEditorComponent, selector: "fs-text-editor", inputs: ["config", "scrollable"], outputs: ["ready", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i4.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsSkeletonModule }, { kind: "directive", type: i5.FsSkeletonContentDirective, selector: "[fsSkeleton]", inputs: ["fsSkeleton", "fsSkeletonPattern"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
131
146
|
}
|
|
132
147
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: EditorComponent, decorators: [{
|
|
133
148
|
type: Component,
|
|
@@ -137,30 +152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
137
152
|
FsTextEditorModule,
|
|
138
153
|
FormsModule,
|
|
139
154
|
FsFormModule,
|
|
140
|
-
FsCommonModule,
|
|
141
155
|
FsSkeletonModule,
|
|
142
|
-
], template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\"
|
|
143
|
-
}]
|
|
144
|
-
type: Input
|
|
145
|
-
}], showScss: [{
|
|
146
|
-
type: Input
|
|
147
|
-
}], showJs: [{
|
|
148
|
-
type: Input
|
|
149
|
-
}], showGlobalScss: [{
|
|
150
|
-
type: Input
|
|
151
|
-
}], html: [{
|
|
152
|
-
type: Input
|
|
153
|
-
}], scss: [{
|
|
154
|
-
type: Input
|
|
155
|
-
}], js: [{
|
|
156
|
-
type: Input
|
|
157
|
-
}], contentConfig: [{
|
|
158
|
-
type: Input
|
|
159
|
-
}], changed: [{
|
|
160
|
-
type: Output
|
|
161
|
-
}], focused: [{
|
|
162
|
-
type: Output
|
|
163
|
-
}], blured: [{
|
|
164
|
-
type: Output
|
|
165
|
-
}] } });
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc5SSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFzQixrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpGLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7O0FBbUJ4RCxNQUFNLE9BQU8sZUFBZTtJQUNsQixNQUFNLEdBQUcsTUFBTSxDQUFD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SUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyxRQUFRLENBQUMsSUFBSTtRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDO3VHQWxJVSxlQUFlOzJGQUFmLGVBQWUsK1RDbkM1QixzNUVBb0VBLGlVRDFDUSxrQkFBa0Isc2tCQUNsQixvQkFBb0IsNEZBQ3BCLGtCQUFrQiwrS0FDbEIsV0FBVyw4VkFDWCxZQUFZLHlnQkFDWixjQUFjLGlMQUNkLGdCQUFnQjs7MkZBR1gsZUFBZTtrQkFoQjNCLFNBQVM7K0JBQ0ksWUFBWSxtQkFHTCx1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDTCxrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsa0JBQWtCO3dCQUNsQixXQUFXO3dCQUNYLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxnQkFBZ0I7cUJBQ25COzhCQU9hLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxNQUFNO3NCQUFyQixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBRVUsSUFBSTtzQkFBbkIsS0FBSztnQkFDVSxJQUFJO3NCQUFuQixLQUFLO2dCQUNVLEVBQUU7c0JBQWpCLEtBQUs7Z0JBQ1UsYUFBYTtzQkFBNUIsS0FBSztnQkFFVyxPQUFPO3NCQUF2QixNQUFNO2dCQUNVLE9BQU87c0JBQXZCLE1BQU07Z0JBQ1UsTUFBTTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuXG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcbmltcG9ydCB7IEZzVGV4dEVkaXRvckNvbmZpZywgRnNUZXh0RWRpdG9yTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGV4dC1lZGl0b3InO1xuXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEVkaXRvclR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBGc0NvbnRlbnRDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFuZ3VsYXJTcGxpdE1vZHVsZSB9IGZyb20gJ2FuZ3VsYXItc3BsaXQnO1xuaW1wb3J0IHsgRWRpdG9yTGFiZWxDb21wb25lbnQgfSBmcm9tICcuLi9lZGl0b3ItbGFiZWwvZWRpdG9yLWxhYmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZzRm9ybU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2Zvcm0nO1xuaW1wb3J0IHsgRnNDb21tb25Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9jb21tb24nO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9lZGl0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2VkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBbmd1bGFyU3BsaXRNb2R1bGUsXG4gICAgICAgIEVkaXRvckxhYmVsQ29tcG9uZW50LFxuICAgICAgICBGc1RleHRFZGl0b3JNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgICAgIEZzQ29tbW9uTW9kdWxlLFxuICAgICAgICBGc1NrZWxldG9uTW9kdWxlLFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfY2RSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG5cblxuICBASW5wdXQoKSBwdWJsaWMgc2hvd0h0bWwgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dTY3NzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93SnMgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNob3dHbG9iYWxTY3NzID0gZmFsc2U7XG5cbiAgQElucHV0KCkgcHVibGljIGh0bWw7XG4gIEBJbnB1dCgpIHB1YmxpYyBzY3NzO1xuICBASW5wdXQoKSBwdWJsaWMganM7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb250ZW50Q29uZmlnOiBGc0NvbnRlbnRDb25maWc7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjx7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PigpO1xuICBAT3V0cHV0KCkgcHVibGljIGZvY3VzZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBibHVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwdWJsaWMgY2hhbmdlczogYW55ID0ge307XG4gIHB1YmxpYyBFZGl0b3JUeXBlID0gRWRpdG9yVHlwZTtcbiAgcHVibGljIGZvY3VzZWRBcmVhOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnRlbnRTdHlsZToge1xuICAgIHNjc3M/OiBzdHJpbmc7XG4gIH07XG5cbiAgcHVibGljIHJlc2l6aW5nID0gZmFsc2U7XG4gIHB1YmxpYyB0aXRsZTtcblxuICBwdWJsaWMgc2Nzc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMgZ2xvYmFsU2Nzc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMgaHRtbENvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuICBwdWJsaWMganNDb25maWc6IEZzVGV4dEVkaXRvckNvbmZpZztcblxuICBwcml2YXRlIF9kZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFRleHRFZGl0b3JzKCk7XG4gICAgdGhpcy5pbml0R2xvYmFsQ29udGVudFN0eWxlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dChudWxsKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZSh0eXBlLCB2YWx1ZSkge1xuICAgIHRoaXMuY2hhbmdlZC5lbWl0KHsgdHlwZSwgdmFsdWUgfSk7XG4gICAgdGhpcy5jaGFuZ2VzW3R5cGVdID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhhc0NoYW5nZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY2hhbmdlcylcbiAgICAgIC5maWx0ZXIoKG5hbWUpID0+ICEhdGhpcy5jaGFuZ2VzW25hbWVdKVxuICAgICAgLmxlbmd0aCAhPT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckNoYW5nZSh0eXBlKSB7XG4gICAgdGhpcy5jaGFuZ2VzW3R5cGVdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGluaXRUZXh0RWRpdG9ycygpIHtcbiAgICB0aGlzLnNjc3NDb25maWcgPSB7XG4gICAgICB0YWJTaXplOiAyLFxuICAgICAgbGFuZ3VhZ2U6ICdzY3NzJyxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgdGhpcy5fb25Gb2N1cyhFZGl0b3JUeXBlLlNjc3MpO1xuICAgICAgfSxcbiAgICAgIGJsdXI6ICgpID0+IHtcbiAgICAgICAgdGhpcy5ibHVyZWQuZW1pdChFZGl0b3JUeXBlLlNjc3MpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuanNDb25maWcgPSB7XG4gICAgICB0YWJTaXplOiAyLFxuICAgICAgbGFuZ3VhZ2U6ICdqcycsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRm9jdXMoRWRpdG9yVHlwZS5Kcyk7XG4gICAgICB9LFxuICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJsdXJlZC5lbWl0KEVkaXRvclR5cGUuSnMpO1xuICAgICAgfSxcbiAgICB9O1xuICAgIHRoaXMuaHRtbENvbmZpZyA9IHtcbiAgICAgIHRhYlNpemU6IDIsXG4gICAgICBsYW5ndWFnZTogJ2h0bWwnLFxuICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICBmb2N1czogKCkgPT4ge1xuICAgICAgICB0aGlzLl9vbkZvY3VzKEVkaXRvclR5cGUuSHRtbCk7XG4gICAgICB9LFxuICAgICAgYmx1cjogKCkgPT4ge1xuICAgICAgICB0aGlzLmJsdXJlZC5lbWl0KEVkaXRvclR5cGUuSHRtbCk7XG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5nbG9iYWxTY3NzQ29uZmlnID0ge1xuICAgICAgdGFiU2l6ZTogMixcbiAgICAgIGxhbmd1YWdlOiAnc2NzcycsXG4gICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgIGZvY3VzOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uRm9jdXMoRWRpdG9yVHlwZS5HbG9iYWxTY3NzKTtcbiAgICAgIH0sXG4gICAgICBibHVyOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuYmx1cmVkLmVtaXQoRWRpdG9yVHlwZS5HbG9iYWxTY3NzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0R2xvYmFsQ29udGVudFN0eWxlKCkge1xuICAgIHRoaXMuY29udGVudENvbmZpZy5sb2FkQ29udGVudFN0eWxlKClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbnRlbnRTdHlsZSkgPT4ge1xuICAgICAgICB0aGlzLmNvbnRlbnRTdHlsZSA9IGNvbnRlbnRTdHlsZSB8fCB7fTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlR2xvYmFsU2NzcygpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50Q29uZmlnLnNhdmVDb250ZW50U3R5bGUodGhpcy5jb250ZW50U3R5bGUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlLnN1Y2Nlc3MoJ1NhdmVkIENoYW5nZXMnKTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfb25Gb2N1cyh0eXBlKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkQXJlYSA9IHR5cGU7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQodHlwZSk7XG4gIH1cblxufVxuIiwiPGFzLXNwbGl0IFt1bml0XT1cIidwZXJjZW50J1wiIFtndXR0ZXJTaXplXT1cIjI1XCI+IFxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCI3MFwiIFt2aXNpYmxlXT1cInNob3dIdG1sXCIgW29yZGVyXT1cIjFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VzLmh0bWwgIT09IHVuZGVmaW5lZFwiXG4gICAgICAgICAgW2ZvY3VzZWRdPVwiZm9jdXNlZEFyZWEgPT09ICdodG1sJ1wiPlxuICAgICAgICBIVE1MXG4gICAgICA8L2FwcC1lZGl0b3ItbGFiZWw+XG4gICAgICA8ZnMtdGV4dC1lZGl0b3IgXG4gICAgICAgIFsobmdNb2RlbCldPVwiaHRtbFwiIFxuICAgICAgICBuYW1lPVwiaHRtbFwiXG4gICAgICAgIFtmc01vZGVsQ2hhbmdlT3B0aW9uc109XCJ7IGRlYm91bmNlOiAwIH1cIlxuICAgICAgICAoZnNNb2RlbENoYW5nZSk9XCJjaGFuZ2UoRWRpdG9yVHlwZS5IdG1sLCAkZXZlbnQpXCJcbiAgICAgICAgW2NvbmZpZ109XCJodG1sQ29uZmlnXCI+XG4gICAgICA8L2ZzLXRleHQtZWRpdG9yPiAgICAgICAgICAgICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiBbdmlzaWJsZV09XCJzaG93U2Nzc1wiIFtvcmRlcl09XCIyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlcy5zY3NzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnc2NzcydcIj5cbiAgICAgICAgU0NTU1xuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPGZzLXRleHQtZWRpdG9yIFxuICAgICAgICBbKG5nTW9kZWwpXT1cInNjc3NcIiBcbiAgICAgICAgbmFtZT1cInNjc3NcIlxuICAgICAgICBbZnNNb2RlbENoYW5nZU9wdGlvbnNdPVwieyBkZWJvdW5jZTogMCB9XCJcbiAgICAgICAgKGZzTW9kZWxDaGFuZ2UpPVwiY2hhbmdlKEVkaXRvclR5cGUuU2NzcywgJGV2ZW50KVwiXG4gICAgICAgIFtjb25maWddPVwic2Nzc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiAgW3Zpc2libGVdPVwic2hvd0pzXCIgW29yZGVyXT1cIjNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VzLmpzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnanMnXCI+XG4gICAgICAgIEpTXG4gICAgICA8L2FwcC1lZGl0b3ItbGFiZWw+XG4gICAgICA8ZnMtdGV4dC1lZGl0b3IgXG4gICAgICAgIFsobmdNb2RlbCldPVwianNcIiBcbiAgICAgICAgbmFtZT1cImpzXCJcbiAgICAgICAgW2ZzTW9kZWxDaGFuZ2VPcHRpb25zXT1cInsgZGVib3VuY2U6IDAgfVwiXG4gICAgICAgIChmc01vZGVsQ2hhbmdlKT1cImNoYW5nZShFZGl0b3JUeXBlLkpzLCAkZXZlbnQpXCJcbiAgICAgICAgW2NvbmZpZ109XCJqc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gICAgXG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiMzBcIiBbdmlzaWJsZV09XCJzaG93R2xvYmFsU2Nzc1wiIFtvcmRlcl09XCI0XCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlcy5nbG9iYWxTY3NzICE9PSB1bmRlZmluZWRcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhID09PSAnZ2xvYmFsU2NzcydcIj5cbiAgICAgICAgR2xvYmFsIFNDU1NcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxuZy1jb250YWluZXIgKmZzU2tlbGV0b249XCJjb250ZW50U3R5bGVcIj5cbiAgICAgICAgPGZzLXRleHQtZWRpdG9yIFxuICAgICAgICAgIFsobmdNb2RlbCldPVwiY29udGVudFN0eWxlLnNjc3NcIiBcbiAgICAgICAgICBuYW1lPVwiZ2xvYmFsU2Nzc1wiXG4gICAgICAgICAgW2ZzTW9kZWxDaGFuZ2VPcHRpb25zXT1cInsgZGVib3VuY2U6IDMwMCB9XCJcbiAgICAgICAgICAoZnNNb2RlbENoYW5nZSk9XCJjaGFuZ2UoRWRpdG9yVHlwZS5HbG9iYWxTY3NzLCAkZXZlbnQpXCJcbiAgICAgICAgICBbY29uZmlnXT1cImdsb2JhbFNjc3NDb25maWdcIj5cbiAgICAgICAgPC9mcy10ZXh0LWVkaXRvcj4gXG4gICAgICA8L25nLWNvbnRhaW5lcj4gICBcbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuPC9hcy1zcGxpdD5cbiJdfQ==
|
|
156
|
+
], template: "<as-split [unit]=\"'percent'\" [gutterSize]=\"25\">\n <as-split-area [size]=\"70\" [visible]=\"showHtml()\" [order]=\"1\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Html)\"\n [focused]=\"focusedArea() === EditorType.Html\">\n HTML\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"html\"\n name=\"html\"\n [config]=\"htmlConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showScss()\" [order]=\"2\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Scss)\"\n [focused]=\"focusedArea() === EditorType.Scss\">\n SCSS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"scss\"\n name=\"scss\"\n [config]=\"scssConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showJs()\" [order]=\"3\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.Js)\"\n [focused]=\"focusedArea() === EditorType.Js\">\n JS\n </app-editor-label>\n <fs-text-editor\n [(ngModel)]=\"js\"\n name=\"js\"\n [config]=\"jsConfig\">\n </fs-text-editor>\n </div>\n </as-split-area>\n <as-split-area [size]=\"30\" [visible]=\"showGlobalScss()\" [order]=\"4\">\n <div class=\"editor-container\">\n <app-editor-label\n [changed]=\"changedTypes().includes(EditorType.GlobalScss)\"\n [focused]=\"focusedArea() === EditorType.GlobalScss\">\n Global SCSS\n </app-editor-label>\n <ng-container *fsSkeleton=\"contentStyle()\">\n <fs-text-editor\n [(ngModel)]=\"globalScss\"\n name=\"globalScss\"\n [config]=\"globalScssConfig\">\n </fs-text-editor>\n </ng-container>\n </div>\n </as-split-area>\n</as-split>\n", styles: [":host{display:block;flex:1;height:100%;min-height:0}as-split{height:100%}:host ::ng-deep .as-split-gutter{background-color:unset!important}.editor-container{height:100%;border-radius:5px;display:flex;flex-direction:column}.editor-container fs-text-editor{flex:1}\n"] }]
|
|
157
|
+
}] });
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFFVixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBQ0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hELE9BQU8sRUFBc0Isa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVqRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7Ozs7O0FBcUI5RSxNQUFNLE9BQU8sZUFBZTtJQUVuQixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEIsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixjQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLGFBQWEsR0FBRyxLQUFLLEVBQW1CLENBQUM7SUFFaEQsMkZBQTJGO0lBQzNGLDBGQUEwRjtJQUMxRiwwRkFBMEY7SUFDMUYsOEJBQThCO0lBQ3ZCLElBQUksR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUN2QixJQUFJLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDdkIsRUFBRSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3JCLFVBQVUsR0FBRyxNQUFNLENBQVMsSUFBSSxDQUFDLENBQUM7SUFFbEMsWUFBWSxHQUFHLE1BQU0sQ0FBaUIsSUFBSSxDQUFDLENBQUM7SUFDNUMsV0FBVyxHQUFHLE1BQU0sQ0FBYSxJQUFJLENBQUMsQ0FBQztJQUN2QyxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlCLHNGQUFzRjtJQUN0RixpRkFBaUY7SUFDMUUsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBRTVCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7YUFDN0IsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDekUsQ0FBQyxDQUFDLENBQUM7SUFDSSxVQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFOUQsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUV4QixVQUFVLENBQXFCO0lBQy9CLGdCQUFnQixDQUFxQjtJQUNyQyxVQUFVLENBQXFCO0lBQy9CLFFBQVEsQ0FBcUI7SUFFNUIsTUFBTSxHQUFHLE1BQU0sQ0FBZSxFQUFFLENBQUMsQ0FBQztJQUNsQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdCLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFbEMsUUFBUTtRQUNiLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO1lBQ2QsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDcEMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDcEMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUU7U0FDakMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixNQUFNLEtBQUssR0FBRztZQUNaLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQzVCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQzVCLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ3hCLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQ3pDLENBQUM7UUFFRixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxLQUFLLENBQ1YsTUFBb0IsRUFDcEIsVUFBbUU7UUFFbkUsTUFBTSxJQUFJLEdBQWlCLE1BQU0sQ0FBQyxXQUFXLENBQzNDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUM1RCxDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUc7WUFDWixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7U0FDNUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRCLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3BCLElBQUksQ0FDSCxJQUFJLEVBQUUsRUFDTixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsRUFDakQsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3ZDLENBQUM7SUFDTixDQUFDO0lBRU8sWUFBWSxDQUNsQixNQUFvQixFQUNwQixJQUFrQixFQUNsQixVQUFtRTtRQUVuRSxNQUFNLEtBQUssR0FBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBa0I7YUFDOUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25GLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FDeEMsQ0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFrQjtRQUN6QyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1FBRW5GLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQzthQUN2RCxJQUFJLENBQ0gsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNQLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyxVQUFVLENBQUMsS0FBbUIsRUFBRSxJQUFrQjtRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QixHQUFHLEtBQUs7WUFDUixHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvRCxDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxJQUFnQixFQUFFLFFBQWdCO1FBQ2hFLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQztZQUNWLFFBQVE7WUFDUixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTthQUNwQyxJQUFJLENBQ0gsR0FBRyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDbkIsTUFBTSxJQUFJLEdBQUcsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7WUFFdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxFQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FDckM7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO3VHQTFLVSxlQUFlOzJGQUFmLGVBQWUsZ3BDQzlDNUIsNGdFQTREQSxpVUR0QlEsa0JBQWtCLHNrQkFDbEIsb0JBQW9CLDRGQUNwQixrQkFBa0IsK0tBQ2xCLFdBQVcsOFZBQ1gsWUFBWSx5Z0JBQ1osZ0JBQWdCOzsyRkFHWCxlQUFlO2tCQWYzQixTQUFTOytCQUNJLFlBQVksbUJBR0wsdUJBQXVCLENBQUMsTUFBTSxjQUNuQyxJQUFJLFdBQ1A7d0JBQ0wsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGtCQUFrQjt3QkFDbEIsV0FBVzt3QkFDWCxZQUFZO3dCQUNaLGdCQUFnQjtxQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBPbkluaXQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBtb2RlbCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGc0Zvcm1Nb2R1bGUgfSBmcm9tICdAZmlyZXN0aXRjaC9mb3JtJztcbmltcG9ydCB7IEZzTWVzc2FnZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuaW1wb3J0IHsgRnNTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL3NrZWxldG9uJztcbmltcG9ydCB7IEZzVGV4dEVkaXRvckNvbmZpZywgRnNUZXh0RWRpdG9yTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvdGV4dC1lZGl0b3InO1xuXG5pbXBvcnQgeyBBbmd1bGFyU3BsaXRNb2R1bGUgfSBmcm9tICdhbmd1bGFyLXNwbGl0JztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBjb25jYXQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplLCBsYXN0LCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEVkaXRvclR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi9lbnVtcyc7XG5pbXBvcnQgeyBGc0NvbnRlbnRDb25maWcsIEZzQ29udGVudFN0eWxlIH0gZnJvbSAnLi4vLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBFZGl0b3JMYWJlbENvbXBvbmVudCB9IGZyb20gJy4uL2VkaXRvci1sYWJlbC9lZGl0b3ItbGFiZWwuY29tcG9uZW50JztcblxuXG50eXBlIEVkaXRvclZhbHVlcyA9IFBhcnRpYWw8UmVjb3JkPEVkaXRvclR5cGUsIHN0cmluZz4+O1xuXG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXBwLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIEFuZ3VsYXJTcGxpdE1vZHVsZSxcbiAgICAgICAgRWRpdG9yTGFiZWxDb21wb25lbnQsXG4gICAgICAgIEZzVGV4dEVkaXRvck1vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGUsXG4gICAgICAgIEZzRm9ybU1vZHVsZSxcbiAgICAgICAgRnNTa2VsZXRvbk1vZHVsZSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzaG93SHRtbCA9IGlucHV0KGZhbHNlKTtcbiAgcHVibGljIHNob3dTY3NzID0gaW5wdXQoZmFsc2UpO1xuICBwdWJsaWMgc2hvd0pzID0gaW5wdXQoZmFsc2UpO1xuICBwdWJsaWMgc2hvd0dsb2JhbFNjc3MgPSBpbnB1dChmYWxzZSk7XG4gIHB1YmxpYyBjb250ZW50Q29uZmlnID0gaW5wdXQ8RnNDb250ZW50Q29uZmlnPigpO1xuXG4gIC8vIFR3by13YXkgYm91bmQgdG8gdGhlIHRleHQgZWRpdG9ycywgc28gZWFjaCBob2xkcyBleGFjdGx5IHdoYXQgaXMgb24gc2NyZWVuLiBOb3RoaW5nIHNpdHNcbiAgLy8gYmV0d2VlbiBhIGtleXN0cm9rZSBhbmQgYSBzYXZlOiB0aGUgZnNNb2RlbENoYW5nZSB0aGlzIHJlcGxhY2VkIGRlYm91bmNlZCBldmVyeSBwYW5lIGJ5XG4gIC8vIDMwMCBtcyAoaXRzIGBkZWJvdW5jZTogMGAgZmFsbHMgYmFjayB0byAzMDApLCBzbyBhIHF1aWNrIEN0cmwrUyBwb3N0ZWQgdGV4dCB3aXRob3V0IGl0c1xuICAvLyBsYXN0IGtleXN0cm9rZXMgKElFQi1UMjkyKS5cbiAgcHVibGljIGh0bWwgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHB1YmxpYyBzY3NzID0gbW9kZWw8c3RyaW5nPigpO1xuICBwdWJsaWMganMgPSBtb2RlbDxzdHJpbmc+KCk7XG4gIHB1YmxpYyBnbG9iYWxTY3NzID0gc2lnbmFsPHN0cmluZz4obnVsbCk7XG5cbiAgcHVibGljIGNvbnRlbnRTdHlsZSA9IHNpZ25hbDxGc0NvbnRlbnRTdHlsZT4obnVsbCk7XG4gIHB1YmxpYyBmb2N1c2VkQXJlYSA9IHNpZ25hbDxFZGl0b3JUeXBlPihudWxsKTtcbiAgcHVibGljIHNhdmluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgLy8gQSBwYW5lIGlzIGNoYW5nZWQgd2hlbiBpdHMgdGV4dCBkaWZmZXJzIGZyb20gd2hhdCB0aGUgc2VydmVyIGxhc3QgY29uZmlybWVkLiBBIHBhbmVcbiAgLy8gY2xlYXJlZCB0byAnJyBjb3VudHM7IG9uZSB0eXBlZCBiYWNrIHRvIGl0cyBvcmlnaW5hbCB0ZXh0IGRvZXMgbm90IChJRUItVDI5MikuXG4gIHB1YmxpYyBjaGFuZ2VkVHlwZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2F2ZWQgPSB0aGlzLl9zYXZlZCgpO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoRWRpdG9yVHlwZSlcbiAgICAgIC5maWx0ZXIoKHR5cGUpID0+IHR5cGUgaW4gc2F2ZWQgJiYgdGhpcy52YWx1ZSh0eXBlKSAhPT0gc2F2ZWRbdHlwZV0pO1xuICB9KTtcbiAgcHVibGljIGhhc0NoYW5nZXMgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNoYW5nZWRUeXBlcygpLmxlbmd0aCAhPT0gMCk7XG5cbiAgcHVibGljIEVkaXRvclR5cGUgPSBFZGl0b3JUeXBlO1xuXG4gIHB1YmxpYyBzY3NzQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBnbG9iYWxTY3NzQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBodG1sQ29uZmlnOiBGc1RleHRFZGl0b3JDb25maWc7XG4gIHB1YmxpYyBqc0NvbmZpZzogRnNUZXh0RWRpdG9yQ29uZmlnO1xuXG4gIHByaXZhdGUgX3NhdmVkID0gc2lnbmFsPEVkaXRvclZhbHVlcz4oe30pO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2luaXRUZXh0RWRpdG9ycygpO1xuICAgIHRoaXMuX3NhdmVkLnNldCh7XG4gICAgICBbRWRpdG9yVHlwZS5IdG1sXTogdGhpcy5odG1sKCkgPz8gJycsXG4gICAgICBbRWRpdG9yVHlwZS5TY3NzXTogdGhpcy5zY3NzKCkgPz8gJycsXG4gICAgICBbRWRpdG9yVHlwZS5Kc106IHRoaXMuanMoKSA/PyAnJyxcbiAgICB9KTtcbiAgICB0aGlzLl9pbml0R2xvYmFsQ29udGVudFN0eWxlKCk7XG4gIH1cblxuICBwdWJsaWMgdmFsdWUodHlwZTogRWRpdG9yVHlwZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFuZXMgPSB7XG4gICAgICBbRWRpdG9yVHlwZS5IdG1sXTogdGhpcy5odG1sLFxuICAgICAgW0VkaXRvclR5cGUuU2Nzc106IHRoaXMuc2NzcyxcbiAgICAgIFtFZGl0b3JUeXBlLkpzXTogdGhpcy5qcyxcbiAgICAgIFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdOiB0aGlzLmdsb2JhbFNjc3MsXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5lc1t0eXBlXSgpID8/ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGV2ZXJ5IGNoYW5nZWQgcGFuZSwgbm90IGp1c3QgdGhlIG9uZSBsYXN0IGZvY3VzZWQsIGFuZCByZWNvcmRzIHdoYXQgd2FzIHNlbnQgYXNcbiAgICogdGhlIG5ldyBiYXNlbGluZSwgc28gYW55dGhpbmcgdHlwZWQgd2hpbGUgdGhlIHJlcXVlc3QgaXMgaW4gZmxpZ2h0IHN0YXlzIGNoYW5nZWQuIFdpdGhcbiAgICogbm90aGluZyBjaGFuZ2VkIGl0IHNlbmRzIG5vdGhpbmcgYW5kIHNob3dzIG5vIHRvYXN0LiBDdHJsK1MgcmVhY2hlcyB0aGlzIHRocm91Z2ggZnNGb3JtJ3NcbiAgICogW3N1Ym1pdF0sIHNvIGl0IHNoYXJlcyB0aGUgU2F2ZSBidXR0b24ncyBnYXRlIChJRUItVDI5MikuXG4gICAqXG4gICAqIGBmaWVsZHNgIG1hcHMgYSBwYW5lIHRvIGl0cyBwcm9wZXJ0eSBvbiB0aGUgcmVjb3JkIChodG1sIOKGkiBjb250ZW50KTsgYHNhdmVSZWNvcmRgIHBvc3RzXG4gICAqIHRob3NlIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgc2F2ZSQoXG4gICAgZmllbGRzOiBFZGl0b3JWYWx1ZXMsXG4gICAgc2F2ZVJlY29yZDogKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3Qgc2VudDogRWRpdG9yVmFsdWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgdGhpcy5jaGFuZ2VkVHlwZXMoKS5tYXAoKHR5cGUpID0+IFt0eXBlLCB0aGlzLnZhbHVlKHR5cGUpXSksXG4gICAgKTtcbiAgICBjb25zdCBzYXZlcyA9IFtcbiAgICAgIHRoaXMuX3NhdmVSZWNvcmQkKGZpZWxkcywgc2VudCwgc2F2ZVJlY29yZCksXG4gICAgICB0aGlzLl9zYXZlR2xvYmFsU2NzcyQoc2VudCksXG4gICAgXS5maWx0ZXIoKHNhdmUpID0+ICEhc2F2ZSk7XG5cbiAgICBpZiAoIXNhdmVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIHRoaXMuc2F2aW5nLnNldCh0cnVlKTtcblxuICAgIHJldHVybiBjb25jYXQoLi4uc2F2ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbGFzdCgpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fbWVzc2FnZS5zdWNjZXNzKCdTYXZlZCBDaGFuZ2VzJykpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnNhdmluZy5zZXQoZmFsc2UpKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlUmVjb3JkJChcbiAgICBmaWVsZHM6IEVkaXRvclZhbHVlcyxcbiAgICBzZW50OiBFZGl0b3JWYWx1ZXMsXG4gICAgc2F2ZVJlY29yZDogKHZhbHVlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gT2JzZXJ2YWJsZTx1bmtub3duPixcbiAgKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgY29uc3QgdHlwZXMgPSAoT2JqZWN0LmtleXMoc2VudCkgYXMgRWRpdG9yVHlwZVtdKVxuICAgICAgLmZpbHRlcigodHlwZSkgPT4gZmllbGRzW3R5cGVdKTtcblxuICAgIGlmICghdHlwZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gc2F2ZVJlY29yZChPYmplY3QuZnJvbUVudHJpZXModHlwZXMubWFwKCh0eXBlKSA9PiBbZmllbGRzW3R5cGVdLCBzZW50W3R5cGVdXSkpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9tYXJrU2F2ZWQodHlwZXMsIHNlbnQpKSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9zYXZlR2xvYmFsU2NzcyQoc2VudDogRWRpdG9yVmFsdWVzKTogT2JzZXJ2YWJsZTx1bmtub3duPiB7XG4gICAgaWYgKCEoRWRpdG9yVHlwZS5HbG9iYWxTY3NzIGluIHNlbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50U3R5bGUgPSB7IC4uLnRoaXMuY29udGVudFN0eWxlKCksIHNjc3M6IHNlbnRbRWRpdG9yVHlwZS5HbG9iYWxTY3NzXSB9O1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudENvbmZpZygpLnNhdmVDb250ZW50U3R5bGUoY29udGVudFN0eWxlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250ZW50U3R5bGUuc2V0KGNvbnRlbnRTdHlsZSk7XG4gICAgICAgICAgdGhpcy5fbWFya1NhdmVkKFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdLCBzZW50KTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFya1NhdmVkKHR5cGVzOiBFZGl0b3JUeXBlW10sIHNlbnQ6IEVkaXRvclZhbHVlcyk6IHZvaWQge1xuICAgIHRoaXMuX3NhdmVkLnVwZGF0ZSgoc2F2ZWQpID0+ICh7XG4gICAgICAuLi5zYXZlZCxcbiAgICAgIC4uLk9iamVjdC5mcm9tRW50cmllcyh0eXBlcy5tYXAoKHR5cGUpID0+IFt0eXBlLCBzZW50W3R5cGVdXSkpLFxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRUZXh0RWRpdG9ycygpOiB2b2lkIHtcbiAgICB0aGlzLnNjc3NDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuU2NzcywgJ3Njc3MnKTtcbiAgICB0aGlzLmpzQ29uZmlnID0gdGhpcy5fY3JlYXRlVGV4dEVkaXRvckNvbmZpZyhFZGl0b3JUeXBlLkpzLCAnanMnKTtcbiAgICB0aGlzLmh0bWxDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuSHRtbCwgJ2h0bWwnKTtcbiAgICB0aGlzLmdsb2JhbFNjc3NDb25maWcgPSB0aGlzLl9jcmVhdGVUZXh0RWRpdG9yQ29uZmlnKEVkaXRvclR5cGUuR2xvYmFsU2NzcywgJ3Njc3MnKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVRleHRFZGl0b3JDb25maWcodHlwZTogRWRpdG9yVHlwZSwgbGFuZ3VhZ2U6IHN0cmluZyk6IEZzVGV4dEVkaXRvckNvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRhYlNpemU6IDIsXG4gICAgICBsYW5ndWFnZSxcbiAgICAgIGhlaWdodDogJzEwMCUnLFxuICAgICAgZm9jdXM6ICgpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1c2VkQXJlYS5zZXQodHlwZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9pbml0R2xvYmFsQ29udGVudFN0eWxlKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudENvbmZpZygpLmxvYWRDb250ZW50U3R5bGUoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoY29udGVudFN0eWxlKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2NzcyA9IGNvbnRlbnRTdHlsZT8uc2NzcyA/PyAnJztcblxuICAgICAgICAgIHRoaXMuY29udGVudFN0eWxlLnNldChjb250ZW50U3R5bGUgfHwge30pO1xuICAgICAgICAgIHRoaXMuZ2xvYmFsU2Nzcy5zZXQoc2Nzcyk7XG4gICAgICAgICAgdGhpcy5fc2F2ZWQudXBkYXRlKChzYXZlZCkgPT4gKHsgLi4uc2F2ZWQsIFtFZGl0b3JUeXBlLkdsb2JhbFNjc3NdOiBzY3NzIH0pKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLl9kZXN0cm95UmVmKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG59XG4iLCI8YXMtc3BsaXQgW3VuaXRdPVwiJ3BlcmNlbnQnXCIgW2d1dHRlclNpemVdPVwiMjVcIj5cbiAgPGFzLXNwbGl0LWFyZWEgW3NpemVdPVwiNzBcIiBbdmlzaWJsZV09XCJzaG93SHRtbCgpXCIgW29yZGVyXT1cIjFcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZWRpdG9yLWNvbnRhaW5lclwiPlxuICAgICAgPGFwcC1lZGl0b3ItbGFiZWxcbiAgICAgICAgICBbY2hhbmdlZF09XCJjaGFuZ2VkVHlwZXMoKS5pbmNsdWRlcyhFZGl0b3JUeXBlLkh0bWwpXCJcbiAgICAgICAgICBbZm9jdXNlZF09XCJmb2N1c2VkQXJlYSgpID09PSBFZGl0b3JUeXBlLkh0bWxcIj5cbiAgICAgICAgSFRNTFxuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPGZzLXRleHQtZWRpdG9yXG4gICAgICAgIFsobmdNb2RlbCldPVwiaHRtbFwiXG4gICAgICAgIG5hbWU9XCJodG1sXCJcbiAgICAgICAgW2NvbmZpZ109XCJodG1sQ29uZmlnXCI+XG4gICAgICA8L2ZzLXRleHQtZWRpdG9yPlxuICAgIDwvZGl2PlxuICA8L2FzLXNwbGl0LWFyZWE+XG4gIDxhcy1zcGxpdC1hcmVhIFtzaXplXT1cIjMwXCIgW3Zpc2libGVdPVwic2hvd1Njc3MoKVwiIFtvcmRlcl09XCIyXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlZFR5cGVzKCkuaW5jbHVkZXMoRWRpdG9yVHlwZS5TY3NzKVwiXG4gICAgICAgICAgW2ZvY3VzZWRdPVwiZm9jdXNlZEFyZWEoKSA9PT0gRWRpdG9yVHlwZS5TY3NzXCI+XG4gICAgICAgIFNDU1NcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICBbKG5nTW9kZWwpXT1cInNjc3NcIlxuICAgICAgICBuYW1lPVwic2Nzc1wiXG4gICAgICAgIFtjb25maWddPVwic2Nzc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCIzMFwiICBbdmlzaWJsZV09XCJzaG93SnMoKVwiIFtvcmRlcl09XCIzXCI+XG4gICAgPGRpdiBjbGFzcz1cImVkaXRvci1jb250YWluZXJcIj5cbiAgICAgIDxhcHAtZWRpdG9yLWxhYmVsXG4gICAgICAgICAgW2NoYW5nZWRdPVwiY2hhbmdlZFR5cGVzKCkuaW5jbHVkZXMoRWRpdG9yVHlwZS5KcylcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhKCkgPT09IEVkaXRvclR5cGUuSnNcIj5cbiAgICAgICAgSlNcbiAgICAgIDwvYXBwLWVkaXRvci1sYWJlbD5cbiAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICBbKG5nTW9kZWwpXT1cImpzXCJcbiAgICAgICAgbmFtZT1cImpzXCJcbiAgICAgICAgW2NvbmZpZ109XCJqc0NvbmZpZ1wiPlxuICAgICAgPC9mcy10ZXh0LWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgPC9hcy1zcGxpdC1hcmVhPlxuICA8YXMtc3BsaXQtYXJlYSBbc2l6ZV09XCIzMFwiIFt2aXNpYmxlXT1cInNob3dHbG9iYWxTY3NzKClcIiBbb3JkZXJdPVwiNFwiPlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0b3ItY29udGFpbmVyXCI+XG4gICAgICA8YXBwLWVkaXRvci1sYWJlbFxuICAgICAgICAgIFtjaGFuZ2VkXT1cImNoYW5nZWRUeXBlcygpLmluY2x1ZGVzKEVkaXRvclR5cGUuR2xvYmFsU2NzcylcIlxuICAgICAgICAgIFtmb2N1c2VkXT1cImZvY3VzZWRBcmVhKCkgPT09IEVkaXRvclR5cGUuR2xvYmFsU2Nzc1wiPlxuICAgICAgICBHbG9iYWwgU0NTU1xuICAgICAgPC9hcHAtZWRpdG9yLWxhYmVsPlxuICAgICAgPG5nLWNvbnRhaW5lciAqZnNTa2VsZXRvbj1cImNvbnRlbnRTdHlsZSgpXCI+XG4gICAgICAgIDxmcy10ZXh0LWVkaXRvclxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZ2xvYmFsU2Nzc1wiXG4gICAgICAgICAgbmFtZT1cImdsb2JhbFNjc3NcIlxuICAgICAgICAgIFtjb25maWddPVwiZ2xvYmFsU2Nzc0NvbmZpZ1wiPlxuICAgICAgICA8L2ZzLXRleHQtZWRpdG9yPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvYXMtc3BsaXQtYXJlYT5cbjwvYXMtc3BsaXQ+XG4iXX0=
|