@datarailsshared/datarailsshared 1.5.284 → 1.5.286
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/assets/styles/_styles.scss +4 -0
- package/datarailsshared-datarailsshared-1.5.286.tgz +0 -0
- package/esm2022/lib/dr-code-editor/components/code-editor-hint-wrapper.component.mjs +15 -0
- package/esm2022/lib/dr-code-editor/components/dr-codemirror.component.mjs +201 -0
- package/esm2022/lib/dr-code-editor/dr-code-editor.component.mjs +292 -0
- package/esm2022/lib/dr-code-editor/dr-code-editor.module.mjs +42 -0
- package/esm2022/lib/dr-code-editor/models/code-editor-hint.mjs +6 -0
- package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker/dr-date-picker.component.mjs +12 -2
- package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker-with-timeframe/dr-date-picker-with-timeframe.component.mjs +7 -2
- package/esm2022/lib/dr-inputs/date-pickers/dr-date-picker_custom-header/dr-date-picker_custom-header.component.mjs +3 -2
- package/esm2022/lib/utils/dr-shared-utils.mjs +4 -1
- package/esm2022/public-api.mjs +6 -1
- package/fesm2022/datarailsshared-datarailsshared.mjs +617 -68
- package/fesm2022/datarailsshared-datarailsshared.mjs.map +1 -1
- package/lib/dr-code-editor/components/code-editor-hint-wrapper.component.d.ts +7 -0
- package/lib/dr-code-editor/components/dr-codemirror.component.d.ts +47 -0
- package/lib/dr-code-editor/dr-code-editor.component.d.ts +44 -0
- package/lib/dr-code-editor/dr-code-editor.module.d.ts +17 -0
- package/lib/dr-code-editor/models/code-editor-hint.d.ts +14 -0
- package/lib/dr-inputs/date-pickers/dr-date-picker-with-timeframe/dr-date-picker-with-timeframe.component.d.ts +3 -2
- package/lib/utils/dr-shared-utils.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +5 -0
- package/styles.css +526 -0
- package/datarailsshared-datarailsshared-1.5.284.tgz +0 -0
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
@import '@angular/material/prebuilt-themes/deeppurple-amber.css';
|
|
2
2
|
@import '@ng-select/ng-select/themes/default.theme.css';
|
|
3
3
|
@import 'ngx-toastr/toastr.css';
|
|
4
|
+
|
|
5
|
+
@import 'codemirror/lib/codemirror.css';
|
|
6
|
+
@import 'codemirror/theme/material.css';
|
|
7
|
+
@import 'codemirror/addon/hint/show-hint.css';
|
|
Binary file
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "../../dr-tooltip/dr-tooltip.directive";
|
|
4
|
+
export class CodeEditorHintWrapperComponent {
|
|
5
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CodeEditorHintWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CodeEditorHintWrapperComponent, selector: "dr-code-editor-hint-wrapper", ngImport: i0, template: ` <span [innerHTML]="content" [drTooltip]="tooltip"></span> `, isInline: true, dependencies: [{ kind: "directive", type: i1.DrTooltipDirective, selector: "[drTooltip]", inputs: ["drTooltip", "drTooltipContext", "drTooltipPosition", "drTooltipClass", "drTooltipTheme", "drTooltipMousleaveTimeout", "drTooltipMouseEnterTimeout", "drTooltipOptions", "drTooltipShow"] }] }); }
|
|
7
|
+
}
|
|
8
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CodeEditorHintWrapperComponent, decorators: [{
|
|
9
|
+
type: Component,
|
|
10
|
+
args: [{
|
|
11
|
+
selector: 'dr-code-editor-hint-wrapper',
|
|
12
|
+
template: ` <span [innerHTML]="content" [drTooltip]="tooltip"></span> `,
|
|
13
|
+
}]
|
|
14
|
+
}] });
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZS1lZGl0b3ItaGludC13cmFwcGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGFyYWlsc3NoYXJlZC9zcmMvbGliL2RyLWNvZGUtZWRpdG9yL2NvbXBvbmVudHMvY29kZS1lZGl0b3ItaGludC13cmFwcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFNMUMsTUFBTSxPQUFPLDhCQUE4QjtrSUFBOUIsOEJBQThCO3NIQUE5Qiw4QkFBOEIsbUVBRjdCLDZEQUE2RDs7NEZBRTlELDhCQUE4QjtrQkFKMUMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsNkJBQTZCO29CQUN2QyxRQUFRLEVBQUUsNkRBQTZEO2lCQUMxRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2RyLWNvZGUtZWRpdG9yLWhpbnQtd3JhcHBlcicsXG4gICAgdGVtcGxhdGU6IGAgPHNwYW4gW2lubmVySFRNTF09XCJjb250ZW50XCIgW2RyVG9vbHRpcF09XCJ0b29sdGlwXCI+PC9zcGFuPiBgLFxufSlcbmV4cG9ydCBjbGFzcyBDb2RlRWRpdG9ySGludFdyYXBwZXJDb21wb25lbnQge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICB0b29sdGlwOiBzdHJpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, forwardRef, Input, KeyValueDiffers, NgZone, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import * as CodeMirror from 'codemirror';
|
|
4
|
+
import { DrSharedUtils } from '../../utils/dr-shared-utils';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export class DrCodemirrorComponent {
|
|
7
|
+
set options(value) {
|
|
8
|
+
this._options = value;
|
|
9
|
+
if (!this._differ && value) {
|
|
10
|
+
this._differ = this._differs.find(value).create();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
constructor(_differs, _ngZone) {
|
|
14
|
+
this._differs = _differs;
|
|
15
|
+
this._ngZone = _ngZone;
|
|
16
|
+
this.className = '';
|
|
17
|
+
this.name = 'codemirror';
|
|
18
|
+
this.autoFocus = false;
|
|
19
|
+
this.preserveScrollPosition = false;
|
|
20
|
+
this.cursorActivity = new EventEmitter();
|
|
21
|
+
this.focusChange = new EventEmitter();
|
|
22
|
+
this.scroll = new EventEmitter();
|
|
23
|
+
this.drop = new EventEmitter();
|
|
24
|
+
this.codeMirrorLoaded = new EventEmitter();
|
|
25
|
+
this.value = '';
|
|
26
|
+
this.disabled = false;
|
|
27
|
+
this.isFocused = false;
|
|
28
|
+
this.onChange = (_) => { };
|
|
29
|
+
this.onTouched = () => { };
|
|
30
|
+
}
|
|
31
|
+
get codeMirrorGlobal() {
|
|
32
|
+
if (this._codeMirror) {
|
|
33
|
+
return this._codeMirror;
|
|
34
|
+
}
|
|
35
|
+
this._codeMirror = CodeMirror;
|
|
36
|
+
return this._codeMirror;
|
|
37
|
+
}
|
|
38
|
+
ngAfterViewInit() {
|
|
39
|
+
this._ngZone.runOutsideAngular(async () => {
|
|
40
|
+
const codeMirrorObj = await this.codeMirrorGlobal;
|
|
41
|
+
const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;
|
|
42
|
+
this.codeMirror = codeMirror.fromTextArea(this.ref.nativeElement, this._options);
|
|
43
|
+
this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
|
|
44
|
+
this.codeMirror.on('scroll', this.scrollChanged.bind(this));
|
|
45
|
+
this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
|
|
46
|
+
this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
|
|
47
|
+
this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
|
|
48
|
+
this.codeMirror.on('drop', (cm, e) => {
|
|
49
|
+
this._ngZone.run(() => this.dropFiles(cm, e));
|
|
50
|
+
});
|
|
51
|
+
this.codeMirror.setValue(this.value);
|
|
52
|
+
this.codeMirrorLoaded.emit(this);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
ngDoCheck() {
|
|
56
|
+
if (!this._differ) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// check options have not changed
|
|
60
|
+
const changes = this._differ.diff(this._options);
|
|
61
|
+
if (changes) {
|
|
62
|
+
changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
|
63
|
+
changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
|
64
|
+
changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
ngOnDestroy() {
|
|
68
|
+
// is there a lighter-weight way to remove the cm instance?
|
|
69
|
+
if (this.codeMirror) {
|
|
70
|
+
this.codeMirror.toTextArea();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
codemirrorValueChanged(cm, change) {
|
|
74
|
+
const cmVal = cm.getValue();
|
|
75
|
+
if (this.value !== cmVal) {
|
|
76
|
+
this.value = cmVal;
|
|
77
|
+
this.onChange(this.value);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
setOptionIfChanged(optionName, newValue) {
|
|
81
|
+
if (!this.codeMirror) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// cast to any to handle strictly typed option names
|
|
85
|
+
// could possibly import settings strings available in the future
|
|
86
|
+
this.codeMirror.setOption(optionName, newValue);
|
|
87
|
+
}
|
|
88
|
+
focusChanged(focused) {
|
|
89
|
+
this.onTouched();
|
|
90
|
+
this.isFocused = focused;
|
|
91
|
+
this.focusChange.emit(focused);
|
|
92
|
+
}
|
|
93
|
+
scrollChanged(cm) {
|
|
94
|
+
this.scroll.emit(cm.getScrollInfo());
|
|
95
|
+
}
|
|
96
|
+
cursorActive(cm) {
|
|
97
|
+
this.cursorActivity.emit(cm);
|
|
98
|
+
}
|
|
99
|
+
dropFiles(cm, e) {
|
|
100
|
+
this.drop.emit([cm, e]);
|
|
101
|
+
}
|
|
102
|
+
writeValue(value) {
|
|
103
|
+
if (value === null || value === undefined) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!this.codeMirror) {
|
|
107
|
+
this.value = value;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const cur = this.codeMirror.getValue();
|
|
111
|
+
if (value !== cur && DrSharedUtils.normalizeLineEndings(cur) !== DrSharedUtils.normalizeLineEndings(value)) {
|
|
112
|
+
this.value = value;
|
|
113
|
+
if (this.preserveScrollPosition) {
|
|
114
|
+
const prevScrollPosition = this.codeMirror.getScrollInfo();
|
|
115
|
+
this.codeMirror.setValue(this.value);
|
|
116
|
+
this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
this.codeMirror.setValue(this.value);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
registerOnChange(fn) {
|
|
124
|
+
this.onChange = fn;
|
|
125
|
+
}
|
|
126
|
+
registerOnTouched(fn) {
|
|
127
|
+
this.onTouched = fn;
|
|
128
|
+
}
|
|
129
|
+
setDisabledState(isDisabled) {
|
|
130
|
+
this.disabled = isDisabled;
|
|
131
|
+
this.setOptionIfChanged('readOnly', this.disabled);
|
|
132
|
+
}
|
|
133
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DrCodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
134
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DrCodemirrorComponent, selector: "dr-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
|
135
|
+
{
|
|
136
|
+
provide: NG_VALUE_ACCESSOR,
|
|
137
|
+
useExisting: forwardRef((() => DrCodemirrorComponent)),
|
|
138
|
+
multi: true,
|
|
139
|
+
},
|
|
140
|
+
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
|
141
|
+
<textarea
|
|
142
|
+
[name]="name"
|
|
143
|
+
class="dr-codemirror {{ className }}"
|
|
144
|
+
[class.dr-codemirror--focused]="isFocused"
|
|
145
|
+
autocomplete="off"
|
|
146
|
+
[autofocus]="autoFocus"
|
|
147
|
+
#ref
|
|
148
|
+
>
|
|
149
|
+
</textarea>
|
|
150
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
151
|
+
}
|
|
152
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DrCodemirrorComponent, decorators: [{
|
|
153
|
+
type: Component,
|
|
154
|
+
args: [{
|
|
155
|
+
selector: 'dr-codemirror',
|
|
156
|
+
template: `
|
|
157
|
+
<textarea
|
|
158
|
+
[name]="name"
|
|
159
|
+
class="dr-codemirror {{ className }}"
|
|
160
|
+
[class.dr-codemirror--focused]="isFocused"
|
|
161
|
+
autocomplete="off"
|
|
162
|
+
[autofocus]="autoFocus"
|
|
163
|
+
#ref
|
|
164
|
+
>
|
|
165
|
+
</textarea>
|
|
166
|
+
`,
|
|
167
|
+
providers: [
|
|
168
|
+
{
|
|
169
|
+
provide: NG_VALUE_ACCESSOR,
|
|
170
|
+
useExisting: forwardRef((() => DrCodemirrorComponent)),
|
|
171
|
+
multi: true,
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
preserveWhitespaces: false,
|
|
175
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
176
|
+
}]
|
|
177
|
+
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }]; }, propDecorators: { className: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], name: [{
|
|
180
|
+
type: Input
|
|
181
|
+
}], autoFocus: [{
|
|
182
|
+
type: Input
|
|
183
|
+
}], options: [{
|
|
184
|
+
type: Input
|
|
185
|
+
}], preserveScrollPosition: [{
|
|
186
|
+
type: Input
|
|
187
|
+
}], cursorActivity: [{
|
|
188
|
+
type: Output
|
|
189
|
+
}], focusChange: [{
|
|
190
|
+
type: Output
|
|
191
|
+
}], scroll: [{
|
|
192
|
+
type: Output
|
|
193
|
+
}], drop: [{
|
|
194
|
+
type: Output
|
|
195
|
+
}], codeMirrorLoaded: [{
|
|
196
|
+
type: Output
|
|
197
|
+
}], ref: [{
|
|
198
|
+
type: ViewChild,
|
|
199
|
+
args: ['ref']
|
|
200
|
+
}] } });
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhcmFpbHNzaGFyZWQvc3JjL2xpYi9kci1jb2RlLWVkaXRvci9jb21wb25lbnRzL2RyLWNvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUVULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXpFLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7QUF5QjVELE1BQU0sT0FBTyxxQkFBcUI7SUFNOUIsSUFDSSxPQUFPLENBQUMsS0FBNkI7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksS0FBSyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBaUJELFlBQW9CLFFBQXlCLEVBQVUsT0FBZTtRQUFsRCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7UUEzQjdELGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDZixTQUFJLEdBQUcsWUFBWSxDQUFDO1FBQ3BCLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFTbEIsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBQzlCLG1CQUFjLEdB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QkFDcEQsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLHNIQWpCUzs7Ozs7Ozs7OztHQVVYOzs0RkFXVSxxQkFBcUI7a0JBdkJqQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxlQUFlO29CQUN6QixRQUFRLEVBQUU7Ozs7Ozs7Ozs7R0FVWDtvQkFDQyxTQUFTLEVBQUU7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsRUFBQyxHQUFHLEVBQUUsc0JBQXNCLEVBQUM7NEJBQ3BELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO29CQUNELG1CQUFtQixFQUFFLEtBQUs7b0JBQzFCLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNsRDsySEFHWSxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdGLE9BQU87c0JBRFYsS0FBSztnQkFPRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0ksY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLE1BQU07c0JBQWYsTUFBTTtnQkFDRyxJQUFJO3NCQUFiLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNXLEdBQUc7c0JBQXBCLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRG9DaGVjayxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIEtleVZhbHVlRGlmZmVyLFxuICAgIEtleVZhbHVlRGlmZmVycyxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRWRpdG9yLCBFZGl0b3JDaGFuZ2UsIEVkaXRvckZyb21UZXh0QXJlYSwgU2Nyb2xsSW5mbyB9IGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0ICogYXMgQ29kZU1pcnJvciBmcm9tICdjb2RlbWlycm9yJ1xuaW1wb3J0IHsgRHJTaGFyZWRVdGlscyB9IGZyb20gJy4uLy4uL3V0aWxzL2RyLXNoYXJlZC11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZHItY29kZW1pcnJvcicsXG4gICAgdGVtcGxhdGU6IGBcbiAgICA8dGV4dGFyZWFcbiAgICAgIFtuYW1lXT1cIm5hbWVcIlxuICAgICAgY2xhc3M9XCJkci1jb2RlbWlycm9yIHt7IGNsYXNzTmFtZSB9fVwiXG4gICAgICBbY2xhc3MuZHItY29kZW1pcnJvci0tZm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFthdXRvZm9jdXNdPVwiYXV0b0ZvY3VzXCJcbiAgICAgICNyZWZcbiAgICA+XG4gICAgPC90ZXh0YXJlYT5cbiAgYCxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEckNvZGVtaXJyb3JDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgRHJDb2RlbWlycm9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRG9DaGVja1xue1xuICAgIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuICAgIEBJbnB1dCgpIG5hbWUgPSAnY29kZW1pcnJvcic7XG4gICAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKVxuICAgIHNldCBvcHRpb25zKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZTtcbiAgICAgICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQElucHV0KCkgcHJlc2VydmVTY3JvbGxQb3NpdGlvbiA9IGZhbHNlO1xuICAgIEBPdXRwdXQoKSBjdXJzb3JBY3Rpdml0eSA9IG5ldyBFdmVudEVtaXR0ZXI8RWRpdG9yPigpO1xuICAgIEBPdXRwdXQoKSBmb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxJbmZvPigpO1xuICAgIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxbRWRpdG9yLCBEcmFnRXZlbnRdPigpO1xuICAgIEBPdXRwdXQoKSBjb2RlTWlycm9yTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxEckNvZGVtaXJyb3JDb21wb25lbnQ+KCk7XG4gICAgQFZpZXdDaGlsZCgncmVmJykgcmVmITogRWxlbWVudFJlZjxIVE1MVGV4dEFyZWFFbGVtZW50PjtcbiAgICB2YWx1ZSA9ICcnO1xuICAgIGRpc2FibGVkID0gZmFsc2U7XG4gICAgaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgY29kZU1pcnJvcj86IEVkaXRvckZyb21UZXh0QXJlYTtcblxuICAgIHByaXZhdGUgX2NvZGVNaXJyb3I6IGFueTtcbiAgICBwcml2YXRlIF9kaWZmZXI/OiBLZXlWYWx1ZURpZmZlcjxzdHJpbmcsIGFueT47XG4gICAgcHJpdmF0ZSBfb3B0aW9uczogYW55O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlmZmVyczogS2V5VmFsdWVEaWZmZXJzLCBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICAgIGdldCBjb2RlTWlycm9yR2xvYmFsKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzLl9jb2RlTWlycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NvZGVNaXJyb3IgPSBDb2RlTWlycm9yO1xuICAgICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2RlTWlycm9yT2JqID0gYXdhaXQgdGhpcy5jb2RlTWlycm9yR2xvYmFsO1xuICAgICAgICAgICAgY29uc3QgY29kZU1pcnJvciA9IGNvZGVNaXJyb3JPYmo/LmRlZmF1bHQgPyBjb2RlTWlycm9yT2JqLmRlZmF1bHQgOiBjb2RlTWlycm9yT2JqO1xuICAgICAgICAgICAgdGhpcy5jb2RlTWlycm9yID0gY29kZU1pcnJvci5mcm9tVGV4dEFyZWEoXG4gICAgICAgICAgICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLFxuICAgICAgICAgICAgKSBhcyBFZGl0b3JGcm9tVGV4dEFyZWE7XG4gICAgICAgICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2N1cnNvckFjdGl2aXR5JywgY20gPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmN1cnNvckFjdGl2ZShjbSkpKTtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci5vbignc2Nyb2xsJywgdGhpcy5zY3JvbGxDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdibHVyJywgKCkgPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzQ2hhbmdlZChmYWxzZSkpKTtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci5vbignZm9jdXMnLCAoKSA9PiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZm9jdXNDaGFuZ2VkKHRydWUpKSk7XG4gICAgICAgICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2NoYW5nZScsIChjbSwgY2hhbmdlKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5jb2RlbWlycm9yVmFsdWVDaGFuZ2VkKGNtLCBjaGFuZ2UpKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2Ryb3AnLCAoY20sIGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZHJvcEZpbGVzKGNtLCBlKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvckxvYWRlZC5lbWl0KHRoaXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5fZGlmZmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9ucyBoYXZlIG5vdCBjaGFuZ2VkXG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9vcHRpb25zKTtcbiAgICAgICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShvcHRpb24gPT4gdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQob3B0aW9uLmtleSwgb3B0aW9uLmN1cnJlbnRWYWx1ZSkpO1xuICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQob3B0aW9uLmtleSwgb3B0aW9uLmN1cnJlbnRWYWx1ZSksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIC8vIGlzIHRoZXJlIGEgbGlnaHRlci13ZWlnaHQgd2F5IHRvIHJlbW92ZSB0aGUgY20gaW5zdGFuY2U/XG4gICAgICAgIGlmICh0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci50b1RleHRBcmVhKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb2RlbWlycm9yVmFsdWVDaGFuZ2VkKGNtOiBFZGl0b3IsIGNoYW5nZTogRWRpdG9yQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGNtVmFsID0gY20uZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgIT09IGNtVmFsKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gY21WYWw7XG4gICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMuY29kZU1pcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2FzdCB0byBhbnkgdG8gaGFuZGxlIHN0cmljdGx5IHR5cGVkIG9wdGlvbiBuYW1lc1xuICAgICAgICAvLyBjb3VsZCBwb3NzaWJseSBpbXBvcnQgc2V0dGluZ3Mgc3RyaW5ncyBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZVxuICAgICAgICB0aGlzLmNvZGVNaXJyb3Iuc2V0T3B0aW9uKG9wdGlvbk5hbWUgYXMgYW55LCBuZXdWYWx1ZSk7XG4gICAgfVxuXG4gICAgZm9jdXNDaGFuZ2VkKGZvY3VzZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBmb2N1c2VkO1xuICAgICAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQoZm9jdXNlZCk7XG4gICAgfVxuXG4gICAgc2Nyb2xsQ2hhbmdlZChjbTogRWRpdG9yKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsLmVtaXQoY20uZ2V0U2Nyb2xsSW5mbygpKTtcbiAgICB9XG5cbiAgICBjdXJzb3JBY3RpdmUoY206IEVkaXRvcikge1xuICAgICAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQoY20pO1xuICAgIH1cblxuICAgIGRyb3BGaWxlcyhjbTogRWRpdG9yLCBlOiBEcmFnRXZlbnQpIHtcbiAgICAgICAgdGhpcy5kcm9wLmVtaXQoW2NtLCBlXSk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXIgPSB0aGlzLmNvZGVNaXJyb3IuZ2V0VmFsdWUoKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSBjdXIgJiYgRHJTaGFyZWRVdGlscy5ub3JtYWxpemVMaW5lRW5kaW5ncyhjdXIpICE9PSBEclNoYXJlZFV0aWxzLm5vcm1hbGl6ZUxpbmVFbmRpbmdzKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlc2VydmVTY3JvbGxQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZTY3JvbGxQb3NpdGlvbiA9IHRoaXMuY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci5zY3JvbGxUbyhwcmV2U2Nyb2xsUG9zaXRpb24ubGVmdCwgcHJldlNjcm9sbFBvc2l0aW9uLnRvcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICAgICAgdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQoJ3JlYWRPbmx5JywgdGhpcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuXG4gICAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ComponentFactoryResolver, forwardRef, Injector, Input, ViewChild, } from '@angular/core';
|
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import * as CodeMirror from 'codemirror';
|
|
4
|
+
import { CodeEditorHintWrapperComponent } from './components/code-editor-hint-wrapper.component';
|
|
5
|
+
import { DrCodemirrorComponent } from './components/dr-codemirror.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
import * as i2 from "@angular/forms";
|
|
9
|
+
import * as i3 from "../dr-error/dr-error.component";
|
|
10
|
+
import * as i4 from "./components/dr-codemirror.component";
|
|
11
|
+
const noop = () => { };
|
|
12
|
+
export class DrCodeEditorComponent {
|
|
13
|
+
constructor(cdr, cfr, injector) {
|
|
14
|
+
this.cdr = cdr;
|
|
15
|
+
this.cfr = cfr;
|
|
16
|
+
this.injector = injector;
|
|
17
|
+
this.innerValue = '';
|
|
18
|
+
this.onTouchedCallback = noop;
|
|
19
|
+
this.onChangeCallback = noop;
|
|
20
|
+
this.parenthesesMarkers = [];
|
|
21
|
+
this.parenthesisColors = [
|
|
22
|
+
'#2F3E48',
|
|
23
|
+
'#1f68cc',
|
|
24
|
+
'#9480CD',
|
|
25
|
+
'#4D9944',
|
|
26
|
+
'#B03E84',
|
|
27
|
+
'#B64900',
|
|
28
|
+
'#267392',
|
|
29
|
+
'#326AC7',
|
|
30
|
+
];
|
|
31
|
+
this.parenthesesMap = {
|
|
32
|
+
'}': '{',
|
|
33
|
+
']': '[',
|
|
34
|
+
')': '(',
|
|
35
|
+
'{': '}',
|
|
36
|
+
'[': ']',
|
|
37
|
+
'(': ')',
|
|
38
|
+
};
|
|
39
|
+
this._hints = [];
|
|
40
|
+
this.hintRefsStack = [];
|
|
41
|
+
this.codeMirrorOptions = {
|
|
42
|
+
lineWrapping: true,
|
|
43
|
+
matchBrackets: true,
|
|
44
|
+
autoRefresh: true,
|
|
45
|
+
lineNumbers: false,
|
|
46
|
+
mode: 'javascript',
|
|
47
|
+
extraKeys: { 'Ctrl-Space': 'autocomplete' },
|
|
48
|
+
autoCloseBrackets: true,
|
|
49
|
+
hintOptions: {
|
|
50
|
+
container: window.document.body,
|
|
51
|
+
completeSingle: false,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
this.highlightHints = false;
|
|
55
|
+
}
|
|
56
|
+
set hints(values) {
|
|
57
|
+
if (values?.length) {
|
|
58
|
+
this._hints = values;
|
|
59
|
+
this.registerHints(values);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
get value() {
|
|
63
|
+
return this.innerValue;
|
|
64
|
+
}
|
|
65
|
+
set value(v) {
|
|
66
|
+
if (v !== this.innerValue) {
|
|
67
|
+
this.innerValue = v;
|
|
68
|
+
this.onChangeCallback(v);
|
|
69
|
+
this.highlightCustomFunctionsInEditor();
|
|
70
|
+
this.colorizeParentheses();
|
|
71
|
+
if (this.highlightHints) {
|
|
72
|
+
this.updateHighlightHints();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
writeValue(value) {
|
|
77
|
+
if (value !== this.innerValue) {
|
|
78
|
+
this.innerValue = value;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
registerOnChange(fn) {
|
|
82
|
+
this.onChangeCallback = fn;
|
|
83
|
+
}
|
|
84
|
+
registerOnTouched(fn) {
|
|
85
|
+
this.onTouchedCallback = fn;
|
|
86
|
+
}
|
|
87
|
+
focusChanged(bool) {
|
|
88
|
+
this.isFocused = bool;
|
|
89
|
+
}
|
|
90
|
+
afterCodeMirrorLoaded() {
|
|
91
|
+
this.doc = this.codeEditor.codeMirror.getDoc();
|
|
92
|
+
if (this._hints.length) {
|
|
93
|
+
this.codeEditor.codeMirror.on('keyup', (cm, event) => {
|
|
94
|
+
if ((!event.ctrlKey && event.keyCode >= 65 && event.keyCode <= 90) ||
|
|
95
|
+
(event.keyCode >= 97 && event.keyCode <= 122) ||
|
|
96
|
+
(event.keyCode >= 46 && event.keyCode <= 57) ||
|
|
97
|
+
event.keyCode === 32) {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
CodeMirror.commands.autocomplete(this.codeEditor.codeMirror);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
this.codeEditor.codeMirror.on('focus', (cm, event) => {
|
|
103
|
+
setTimeout(() => {
|
|
104
|
+
if (this.isFocused) {
|
|
105
|
+
// @ts-ignore
|
|
106
|
+
CodeMirror.commands.autocomplete(this.codeEditor.codeMirror);
|
|
107
|
+
}
|
|
108
|
+
}, 200);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
setTimeout(() => {
|
|
112
|
+
if (this.highlightHints) {
|
|
113
|
+
this.updateHighlightHints();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
isClosedParenthesis(parenthesis) {
|
|
118
|
+
return ['}', ')', ']'].some((value) => value === parenthesis);
|
|
119
|
+
}
|
|
120
|
+
colorizeParentheses() {
|
|
121
|
+
const string = this.doc.getValue();
|
|
122
|
+
const stack = [];
|
|
123
|
+
const result = [];
|
|
124
|
+
let line = 0;
|
|
125
|
+
let ch = 0;
|
|
126
|
+
this.parenthesesMarkers.forEach((marker) => marker.clear());
|
|
127
|
+
this.parenthesesMarkers = [];
|
|
128
|
+
for (let index = 0; index < string.length; index++) {
|
|
129
|
+
const char = string.charAt(index);
|
|
130
|
+
if (char === '\n') {
|
|
131
|
+
line++;
|
|
132
|
+
ch = 0;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (this.parenthesesMap[char]) {
|
|
136
|
+
const peek = stack ? stack[stack.length - 1] : null;
|
|
137
|
+
if (!this.isClosedParenthesis(char)) {
|
|
138
|
+
let colorIndex = (peek?.colorIndex + 1) || 0;
|
|
139
|
+
colorIndex = colorIndex > this.parenthesisColors.length - 1 ? 0 : colorIndex;
|
|
140
|
+
stack.push({ value: char, color: this.parenthesisColors[colorIndex], colorIndex });
|
|
141
|
+
result[index] = { value: char, color: this.parenthesisColors[colorIndex], colorIndex };
|
|
142
|
+
}
|
|
143
|
+
if (stack?.length && peek?.value === this.parenthesesMap[char]) {
|
|
144
|
+
result[index] = { value: char, color: peek.color, colorIndex: peek.colorIndex };
|
|
145
|
+
stack.pop();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (result[index]) {
|
|
149
|
+
this.parenthesesMarkers.push(this.doc.markText({
|
|
150
|
+
line,
|
|
151
|
+
ch,
|
|
152
|
+
}, {
|
|
153
|
+
line,
|
|
154
|
+
ch: ch + 1,
|
|
155
|
+
}, {
|
|
156
|
+
css: `color: ${result[index].color}`,
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
159
|
+
ch++;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
highlightCustomFunctionsInEditor() {
|
|
163
|
+
const markers = this.markers || [];
|
|
164
|
+
const existMarkers = this.existMarkers || [];
|
|
165
|
+
existMarkers.forEach((m) => m.clear());
|
|
166
|
+
this.doc.eachLine((line) => {
|
|
167
|
+
markers.forEach((marker) => {
|
|
168
|
+
const searchStr = marker.name + '\\(';
|
|
169
|
+
const matches = line.text.matchAll(new RegExp(searchStr, 'g'));
|
|
170
|
+
for (const match of matches) {
|
|
171
|
+
existMarkers.push(this.doc.markText({
|
|
172
|
+
line: line.lineNo(),
|
|
173
|
+
ch: match.index,
|
|
174
|
+
}, {
|
|
175
|
+
line: line.lineNo(),
|
|
176
|
+
ch: match.index + marker.name.length,
|
|
177
|
+
}, {
|
|
178
|
+
className: 'marker',
|
|
179
|
+
title: marker.title,
|
|
180
|
+
}));
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
pasteText(text, goCharLeft) {
|
|
186
|
+
this.doc.replaceSelection(text);
|
|
187
|
+
this.doc.cm.focus();
|
|
188
|
+
if (goCharLeft) {
|
|
189
|
+
this.doc.cm.execCommand('goCharLeft');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
registerHints(dictionary = []) {
|
|
193
|
+
const hintRegexp = /[\w$]|[ &'"#%$@]/;
|
|
194
|
+
CodeMirror.registerHelper('hint', 'dictionaryHint', (editor) => {
|
|
195
|
+
const cursor = editor.getCursor();
|
|
196
|
+
const currentLine = editor.getLine(cursor.line);
|
|
197
|
+
let start = cursor.ch;
|
|
198
|
+
let end = cursor.ch;
|
|
199
|
+
while (end < currentLine.length && hintRegexp.test(currentLine.charAt(end)))
|
|
200
|
+
++end;
|
|
201
|
+
while (start && hintRegexp.test(currentLine.charAt(start - 1)))
|
|
202
|
+
--start;
|
|
203
|
+
const currentWord = (start !== end && currentLine.slice(start, end)) || '';
|
|
204
|
+
const filteredDictionary = (!currentWord
|
|
205
|
+
? dictionary
|
|
206
|
+
: dictionary.filter((item) => item.value.toLowerCase().includes(currentWord.toLowerCase()))).sort() || [];
|
|
207
|
+
const hintsList = filteredDictionary.map((item) => {
|
|
208
|
+
const displayText = item.value;
|
|
209
|
+
let text = item.value;
|
|
210
|
+
if (currentLine[start - 1] !== '[') {
|
|
211
|
+
text = '[' + text;
|
|
212
|
+
}
|
|
213
|
+
if (currentLine[end] !== ']') {
|
|
214
|
+
text += ']';
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
text,
|
|
218
|
+
displayText,
|
|
219
|
+
render: (element, data, current) => {
|
|
220
|
+
const startIndex = current.displayText.toLowerCase().indexOf(currentWord.toLowerCase());
|
|
221
|
+
const stringToReplace = current.displayText.slice(startIndex, startIndex + currentWord.length);
|
|
222
|
+
const hintHTML = `${item.icon} ` + current.displayText.replace(stringToReplace, `<b>${stringToReplace}</b>`);
|
|
223
|
+
const componentFactory = this.cfr.resolveComponentFactory(CodeEditorHintWrapperComponent);
|
|
224
|
+
const componentRef = componentFactory.create(this.injector);
|
|
225
|
+
componentRef.instance.content = hintHTML;
|
|
226
|
+
componentRef.instance.tooltip = item.hint;
|
|
227
|
+
componentRef.changeDetectorRef.detectChanges();
|
|
228
|
+
element.appendChild(componentRef.location.nativeElement);
|
|
229
|
+
this.hintRefsStack.push(componentRef);
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
});
|
|
233
|
+
return {
|
|
234
|
+
list: hintsList,
|
|
235
|
+
from: CodeMirror.Pos(cursor.line, start),
|
|
236
|
+
to: CodeMirror.Pos(cursor.line, end),
|
|
237
|
+
};
|
|
238
|
+
});
|
|
239
|
+
// @ts-ignore
|
|
240
|
+
CodeMirror.commands.autocomplete = (cm) => {
|
|
241
|
+
this.destroyHints();
|
|
242
|
+
// @ts-ignore
|
|
243
|
+
CodeMirror.showHint(cm, CodeMirror.hint.dictionaryHint);
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
destroyHints() {
|
|
247
|
+
this.hintRefsStack.forEach((ref) => ref.destroy());
|
|
248
|
+
this.hintRefsStack = [];
|
|
249
|
+
}
|
|
250
|
+
updateHighlightHints() {
|
|
251
|
+
const hints = this._hints || [];
|
|
252
|
+
const highlightedHints = this.highlightedHints || [];
|
|
253
|
+
highlightedHints.forEach((m) => m.clear());
|
|
254
|
+
this.doc.eachLine((line) => {
|
|
255
|
+
const matches = line.text.matchAll(/(?:\[).+?(?=\])/gm);
|
|
256
|
+
for (const match of matches) {
|
|
257
|
+
const hint = hints.find((h) => h.value === match[0].replace('[', ''));
|
|
258
|
+
if (hint) {
|
|
259
|
+
highlightedHints.push(this.doc.markText({
|
|
260
|
+
line: line.lineNo(),
|
|
261
|
+
ch: match.index + 1,
|
|
262
|
+
}, {
|
|
263
|
+
line: line.lineNo(),
|
|
264
|
+
ch: match.index + 1 + hint.value.length,
|
|
265
|
+
}, {
|
|
266
|
+
className: 'hint-variable',
|
|
267
|
+
title: hint.value,
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
this.cdr.markForCheck();
|
|
273
|
+
}
|
|
274
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DrCodeEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ComponentFactoryResolver }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
275
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DrCodeEditorComponent, selector: "dr-code-editor", inputs: { markers: "markers", highlightHints: "highlightHints", hints: "hints", control: "control" }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => DrCodeEditorComponent)), multi: true }], viewQueries: [{ propertyName: "codeEditor", first: true, predicate: ["codeEditor"], descendants: true }], ngImport: i0, template: "<dr-codemirror\n #codeEditor\n [(ngModel)]=\"value\"\n [options]=\"codeMirrorOptions\"\n [class.mark-hints]=\"highlightHints\"\n [class.mirror-error]=\"control.status === 'INVALID' && !control.pristine\"\n (focusChange)=\"focusChanged($event)\"\n (codeMirrorLoaded)=\"afterCodeMirrorLoaded()\"></dr-codemirror>\n<span *ngIf=\"!isFocused && !innerValue\" class=\"codemirror-placeholder\"\n >Start typing your formula here. We support (+,-,*,/). <br />\n For Example: [Feb-22] - [Jan-22]</span\n>\n<dr-error [control]=\"control\" label=\"Formula error\"></dr-error>\n", styles: ["dr-codemirror ::ng-deep .CodeMirror{height:10rem;border:1px solid #9EA1AA;border-radius:6px}dr-codemirror ::ng-deep .CodeMirror-focused{border-color:#4646ce!important}dr-codemirror ::ng-deep .CodeMirror-line{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400}dr-codemirror ::ng-deep .CodeMirror .CodeMirror-scroll{padding:0}dr-codemirror ::ng-deep .CodeMirror .marker{color:#fff;background:#20a452}dr-codemirror ::ng-deep .CodeMirror .marker:first-child,dr-codemirror ::ng-deep .CodeMirror .cm-variable:not(.marker)+.marker{padding-left:2px;margin-left:2px}dr-codemirror ::ng-deep .CodeMirror .marker+.cm-variable:not(.marker){margin-left:2px}dr-codemirror ::ng-deep .CodeMirror-matchingbracket{color:#0f0!important}:host::ng-deep{position:relative}:host::ng-deep .mirror-error .CodeMirror{border:1px solid #BF1D30}:host::ng-deep .mark-hints .hint-variable{color:#4646ce}dr-error{position:absolute;bottom:5px;left:7px;background:#fff;margin:0}dr-error:not(:last-child){display:none}.codemirror-placeholder{color:#6d6e6f;position:absolute;top:10px;left:10px;font-size:12px;pointer-events:none}::ng-deep .CodeMirror-hints{background:#fff;border:1px solid #e5e6ea;box-shadow:0 4px 8px 1px #00000040;border-radius:6px;z-index:100;padding:8px 0}::ng-deep .CodeMirror-hints .CodeMirror-hint{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400;padding:0 12px;display:flex;align-items:center;height:32px;background:#fff;color:#333}::ng-deep .CodeMirror-hints .CodeMirror-hint,::ng-deep .CodeMirror-hints .CodeMirror-hint-active{background:#fff;color:#333}::ng-deep .CodeMirror-hints:not(:hover) .CodeMirror-hint-active,::ng-deep .CodeMirror-hints .CodeMirror-hint:hover{background:#eaeaff;cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.DrErrorComponent, selector: "dr-error", inputs: ["control", "controlName", "label", "errorTooltipPosition", "displayAsLabel", "noIcon"] }, { kind: "component", type: i4.DrCodemirrorComponent, selector: "dr-codemirror", inputs: ["className", "name", "autoFocus", "options", "preserveScrollPosition"], outputs: ["cursorActivity", "focusChange", "scroll", "drop", "codeMirrorLoaded"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
276
|
+
}
|
|
277
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DrCodeEditorComponent, decorators: [{
|
|
278
|
+
type: Component,
|
|
279
|
+
args: [{ selector: 'dr-code-editor', changeDetection: ChangeDetectionStrategy.OnPush, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((() => DrCodeEditorComponent)), multi: true }], template: "<dr-codemirror\n #codeEditor\n [(ngModel)]=\"value\"\n [options]=\"codeMirrorOptions\"\n [class.mark-hints]=\"highlightHints\"\n [class.mirror-error]=\"control.status === 'INVALID' && !control.pristine\"\n (focusChange)=\"focusChanged($event)\"\n (codeMirrorLoaded)=\"afterCodeMirrorLoaded()\"></dr-codemirror>\n<span *ngIf=\"!isFocused && !innerValue\" class=\"codemirror-placeholder\"\n >Start typing your formula here. We support (+,-,*,/). <br />\n For Example: [Feb-22] - [Jan-22]</span\n>\n<dr-error [control]=\"control\" label=\"Formula error\"></dr-error>\n", styles: ["dr-codemirror ::ng-deep .CodeMirror{height:10rem;border:1px solid #9EA1AA;border-radius:6px}dr-codemirror ::ng-deep .CodeMirror-focused{border-color:#4646ce!important}dr-codemirror ::ng-deep .CodeMirror-line{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400}dr-codemirror ::ng-deep .CodeMirror .CodeMirror-scroll{padding:0}dr-codemirror ::ng-deep .CodeMirror .marker{color:#fff;background:#20a452}dr-codemirror ::ng-deep .CodeMirror .marker:first-child,dr-codemirror ::ng-deep .CodeMirror .cm-variable:not(.marker)+.marker{padding-left:2px;margin-left:2px}dr-codemirror ::ng-deep .CodeMirror .marker+.cm-variable:not(.marker){margin-left:2px}dr-codemirror ::ng-deep .CodeMirror-matchingbracket{color:#0f0!important}:host::ng-deep{position:relative}:host::ng-deep .mirror-error .CodeMirror{border:1px solid #BF1D30}:host::ng-deep .mark-hints .hint-variable{color:#4646ce}dr-error{position:absolute;bottom:5px;left:7px;background:#fff;margin:0}dr-error:not(:last-child){display:none}.codemirror-placeholder{color:#6d6e6f;position:absolute;top:10px;left:10px;font-size:12px;pointer-events:none}::ng-deep .CodeMirror-hints{background:#fff;border:1px solid #e5e6ea;box-shadow:0 4px 8px 1px #00000040;border-radius:6px;z-index:100;padding:8px 0}::ng-deep .CodeMirror-hints .CodeMirror-hint{font-family:Poppins,sans-serif;font-size:12px;line-height:20px;font-weight:500;font-weight:400;padding:0 12px;display:flex;align-items:center;height:32px;background:#fff;color:#333}::ng-deep .CodeMirror-hints .CodeMirror-hint,::ng-deep .CodeMirror-hints .CodeMirror-hint-active{background:#fff;color:#333}::ng-deep .CodeMirror-hints:not(:hover) .CodeMirror-hint-active,::ng-deep .CodeMirror-hints .CodeMirror-hint:hover{background:#eaeaff;cursor:pointer}\n"] }]
|
|
280
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ComponentFactoryResolver }, { type: i0.Injector }]; }, propDecorators: { markers: [{
|
|
281
|
+
type: Input
|
|
282
|
+
}], highlightHints: [{
|
|
283
|
+
type: Input
|
|
284
|
+
}], hints: [{
|
|
285
|
+
type: Input
|
|
286
|
+
}], control: [{
|
|
287
|
+
type: Input
|
|
288
|
+
}], codeEditor: [{
|
|
289
|
+
type: ViewChild,
|
|
290
|
+
args: ['codeEditor']
|
|
291
|
+
}] } });
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHItY29kZS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItY29kZS1lZGl0b3IvZHItY29kZS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0YXJhaWxzc2hhcmVkL3NyYy9saWIvZHItY29kZS1lZGl0b3IvZHItY29kZS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULHdCQUF3QixFQUN4QixVQUFVLEVBQ1YsUUFBUSxFQUNSLEtBQUssRUFDTCxTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFxQyxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRWpHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7Ozs7QUFDN0UsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0FBU3RCLE1BQU0sT0FBTyxxQkFBcUI7SUFDOUIsWUFDWSxHQUFzQixFQUN0QixHQUE2QixFQUM3QixRQUFrQjtRQUZsQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQUM3QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBR3ZCLGVBQVUsR0FBUSxFQUFFLENBQUM7UUFDcEIsc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUFxQixJQUFJLENBQUM7UUFHMUMsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLHNCQUFpQixH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QUM7a0lBeFVRLHFCQUFxQjtzSEFBckIscUJBQXFCLCtJQUZuQixDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLENBQUMscUJBQXFCLEVBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsb0lDdkJsSCxrbEJBYUE7OzRGRFlhLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDSSxnQkFBZ0IsbUJBR1QsdUJBQXVCLENBQUMsTUFBTSxhQUNwQyxDQUFDLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUMsR0FBRyxFQUFFLHNCQUFzQixFQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO3NLQW9EN0YsT0FBTztzQkFBdkIsS0FBSztnQkFDVSxjQUFjO3NCQUE3QixLQUFLO2dCQUVPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQUMyQixVQUFVO3NCQUExQyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbmplY3RvcixcbiAgICBJbnB1dCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCAqIGFzIENvZGVNaXJyb3IgZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyBIaW50LCBIaW50cyB9IGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0IHsgQ29kZUVkaXRvckhpbnRXcmFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvZGUtZWRpdG9yLWhpbnQtd3JhcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvZGVFZGl0b3JIaW50LCBJQ29kZUVkaXRvck1hcmtlciB9IGZyb20gJy4vbW9kZWxzL2NvZGUtZWRpdG9yLWhpbnQnO1xuaW1wb3J0IHsgRHJDb2RlbWlycm9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2RyLWNvZGVtaXJyb3IuY29tcG9uZW50JztcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkci1jb2RlLWVkaXRvcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2RyLWNvZGUtZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9kci1jb2RlLWVkaXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERyQ29kZUVkaXRvckNvbXBvbmVudCksIG11bHRpOiB0cnVlIH1dLFxufSlcbmV4cG9ydCBjbGFzcyBEckNvZGVFZGl0b3JDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBjZnI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGlubmVyVmFsdWU6IGFueSA9ICcnO1xuICAgIHByaXZhdGUgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICAgIHByaXZhdGUgb25DaGFuZ2VDYWxsYmFjazogKF86IGFueSkgPT4gdm9pZCA9IG5vb3A7XG4gICAgcHJpdmF0ZSBleGlzdE1hcmtlcnM6IGFueVtdO1xuICAgIHByaXZhdGUgaGlnaGxpZ2h0ZWRIaW50czogYW55W107XG4gICAgcHJpdmF0ZSBwYXJlbnRoZXNlc01hcmtlcnMgPSBbXTtcbiAgICBwcml2YXRlIHBhcmVudGhlc2lzQ29sb3JzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJyMyRjNFNDgnLFxuICAgICAgICAnIzFmNjhjYycsXG4gICAgICAgICcjOTQ4MENEJyxcbiAgICAgICAgJyM0RDk5NDQnLFxuICAgICAgICAnI0IwM0U4NCcsXG4gICAgICAgICcjQjY0OTAwJyxcbiAgICAgICAgJyMyNjczOTInLFxuICAgICAgICAnIzMyNkFDNycsXG4gICAgXTtcbiAgICBwcml2YXRlIHBhcmVudGhlc2VzTWFwID0ge1xuICAgICAgICAnfSc6ICd7JyxcbiAgICAgICAgJ10nOiAnWycsXG4gICAgICAgICcpJzogJygnLFxuICAgICAgICAneyc6ICd9JyxcbiAgICAgICAgJ1snOiAnXScsXG4gICAgICAgICcoJzogJyknLFxuICAgIH07XG4gICAgcHJpdmF0ZSBkb2M6IGFueTtcbiAgICBwcml2YXRlIF9oaW50czogSUNvZGVFZGl0b3JIaW50W10gPSBbXTtcblxuICAgIHByaXZhdGUgaGludFJlZnNTdGFjayA9IFtdO1xuXG4gICAgcHVibGljIGNvZGVNaXJyb3JPcHRpb25zOiBhbnkgPSB7XG4gICAgICAgIGxpbmVXcmFwcGluZzogdHJ1ZSxcbiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgYXV0b1JlZnJlc2g6IHRydWUsXG4gICAgICAgIGxpbmVOdW1iZXJzOiBmYWxzZSxcbiAgICAgICAgbW9kZTogJ2phdmFzY3JpcHQnLFxuICAgICAgICBleHRyYUtleXM6IHsgJ0N0cmwtU3BhY2UnOiAnYXV0b2NvbXBsZXRlJyB9LFxuICAgICAgICBhdXRvQ2xvc2VCcmFja2V0czogdHJ1ZSxcbiAgICAgICAgaGludE9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogd2luZG93LmRvY3VtZW50LmJvZHksXG4gICAgICAgICAgICBjb21wbGV0ZVNpbmdsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBwdWJsaWMgaXNGb2N1c2VkOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByaXZhdGUgbWFya2VyczogSUNvZGVFZGl0b3JNYXJrZXJbXTtcbiAgICBASW5wdXQoKSBwdWJsaWMgaGlnaGxpZ2h0SGludHMgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIHNldCBoaW50cyh2YWx1ZXM6IElDb2RlRWRpdG9ySGludFtdKSB7XG4gICAgICAgIGlmICh2YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5faGludHMgPSB2YWx1ZXM7XG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVySGludHModmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEBJbnB1dCgpIGNvbnRyb2w6IEZvcm1Db250cm9sIHwgYW55O1xuICAgIEBWaWV3Q2hpbGQoJ2NvZGVFZGl0b3InKSBwcml2YXRlIGNvZGVFZGl0b3I6IERyQ29kZW1pcnJvckNvbXBvbmVudDtcblxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJWYWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHZhbHVlKHY6IHN0cmluZykge1xuICAgICAgICBpZiAodiAhPT0gdGhpcy5pbm5lclZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmlubmVyVmFsdWUgPSB2O1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRDdXN0b21GdW5jdGlvbnNJbkVkaXRvcigpO1xuICAgICAgICAgICAgdGhpcy5jb2xvcml6ZVBhcmVudGhlc2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRIaW50cykge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSGlnaGxpZ2h0SGludHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmlubmVyVmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuaW5uZXJWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gICAgfVxuXG4gICAgZm9jdXNDaGFuZ2VkKGJvb2wpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzZWQgPSBib29sO1xuICAgIH1cbiAgICBwdWJsaWMgYWZ0ZXJDb2RlTWlycm9yTG9hZGVkKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvYyA9IHRoaXMuY29kZUVkaXRvci5jb2RlTWlycm9yLmdldERvYygpO1xuXG4gICAgICAgIGlmICh0aGlzLl9oaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuY29kZUVkaXRvci5jb2RlTWlycm9yLm9uKCdrZXl1cCcsIChjbSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICghZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXlDb2RlID49IDY1ICYmIGV2ZW50LmtleUNvZGUgPD0gOTApIHx8XG4gICAgICAgICAgICAgICAgICAgIChldmVudC5rZXlDb2RlID49IDk3ICYmIGV2ZW50LmtleUNvZGUgPD0gMTIyKSB8fFxuICAgICAgICAgICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA+PSA0NiAmJiBldmVudC5rZXlDb2RlIDw9IDU3KSB8fFxuICAgICAgICAgICAgICAgICAgICBldmVudC5rZXlDb2RlID09PSAzMlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuYXV0b2NvbXBsZXRlKHRoaXMuY29kZUVkaXRvci5jb2RlTWlycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY29kZUVkaXRvci5jb2RlTWlycm9yLm9uKCdmb2N1cycsIChjbSwgZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNGb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLmF1dG9jb21wbGV0ZSh0aGlzLmNvZGVFZGl0b3IuY29kZU1pcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmhpZ2hsaWdodEhpbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIaWdobGlnaHRIaW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ2xvc2VkUGFyZW50aGVzaXMocGFyZW50aGVzaXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gWyd9JywgJyknLCAnXSddLnNvbWUoKHZhbHVlOiBzdHJpbmcpID0+IHZhbHVlID09PSBwYXJlbnRoZXNpcylcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbG9yaXplUGFyZW50aGVzZXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmluZyA9IHRoaXMuZG9jLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IHN0YWNrID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgICAgICBsZXQgbGluZSA9IDA7XG4gICAgICAgIGxldCBjaCA9IDA7XG4gICAgICAgIHRoaXMucGFyZW50aGVzZXNNYXJrZXJzLmZvckVhY2goKG1hcmtlcikgPT4gbWFya2VyLmNsZWFyKCkpO1xuICAgICAgICB0aGlzLnBhcmVudGhlc2VzTWFya2VycyA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpbmcubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyID0gc3RyaW5nLmNoYXJBdChpbmRleCk7XG4gICAgICAgICAgICBpZiAoY2hhciA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICBsaW5lKys7XG4gICAgICAgICAgICAgICAgY2ggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50aGVzZXNNYXBbY2hhcl0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwZWVrID0gc3RhY2sgPyBzdGFja1tzdGFjay5sZW5ndGggLSAxXSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNDbG9zZWRQYXJlbnRoZXNpcyhjaGFyKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JJbmRleCA9IChwZWVrPy5jb2xvckluZGV4ICsgMSkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY29sb3JJbmRleCA9IGNvbG9ySW5kZXggPiB0aGlzLnBhcmVudGhlc2lzQ29sb3JzLmxlbmd0aCAtIDEgPyAwIDogY29sb3JJbmRleDtcblxuICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHsgdmFsdWU6IGNoYXIsIGNvbG9yOiB0aGlzLnBhcmVudGhlc2lzQ29sb3JzW2NvbG9ySW5kZXhdLCBjb2xvckluZGV4IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0geyB2YWx1ZTogY2hhciwgY29sb3I6IHRoaXMucGFyZW50aGVzaXNDb2xvcnNbY29sb3JJbmRleF0sIGNvbG9ySW5kZXggfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN0YWNrPy5sZW5ndGggJiYgcGVlaz8udmFsdWUgPT09IHRoaXMucGFyZW50aGVzZXNNYXBbY2hhcl0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2luZGV4XSA9IHsgdmFsdWU6IGNoYXIsIGNvbG9yOiBwZWVrLmNvbG9yLCBjb2xvckluZGV4OiBwZWVrLmNvbG9ySW5kZXggfTtcbiAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0W2luZGV4XSkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50aGVzZXNNYXJrZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZG9jLm1hcmtUZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2gsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2g6IGNoICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiBgY29sb3I6ICR7cmVzdWx0W2luZGV4XS5jb2xvcn1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2grKztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlnaGxpZ2h0Q3VzdG9tRnVuY3Rpb25zSW5FZGl0b3IoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hcmtlcnMgPSB0aGlzLm1hcmtlcnMgfHwgW107XG4gICAgICAgIGNvbnN0IGV4aXN0TWFya2VycyA9IHRoaXMuZXhpc3RNYXJrZXJzIHx8IFtdO1xuXG4gICAgICAgIGV4aXN0TWFya2Vycy5mb3JFYWNoKChtKSA9PiBtLmNsZWFyKCkpO1xuICAgICAgICB0aGlzLmRvYy5lYWNoTGluZSgobGluZSkgPT4ge1xuICAgICAgICAgICAgbWFya2Vycy5mb3JFYWNoKChtYXJrZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTdHIgPSBtYXJrZXIubmFtZSArICdcXFxcKCc7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGxpbmUudGV4dC5tYXRjaEFsbChuZXcgUmVnRXhwKHNlYXJjaFN0ciwgJ2cnKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4aXN0TWFya2Vycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MubWFya1RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLmxpbmVObygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDogbWF0Y2guaW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmUubGluZU5vKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoOiBtYXRjaC5pbmRleCArIG1hcmtlci5uYW1lLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAnbWFya2VyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1hcmtlci50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHBhc3RlVGV4dCh0ZXh0OiBzdHJpbmcsIGdvQ2hhckxlZnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZG9jLnJlcGxhY2VTZWxlY3Rpb24odGV4dCk7XG4gICAgICAgIHRoaXMuZG9jLmNtLmZvY3VzKCk7XG4gICAgICAgIGlmIChnb0NoYXJMZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLmRvYy5jbS5leGVjQ29tbWFuZCgnZ29DaGFyTGVmdCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckhpbnRzKGRpY3Rpb25hcnk6IElDb2RlRWRpdG9ySGludFtdID0gW10pIHtcbiAgICAgICAgY29uc3QgaGludFJlZ2V4cCA9IC9bXFx3JF18WyAmJ1wiIyUkQF0vO1xuICAgICAgICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCdoaW50JywgJ2RpY3Rpb25hcnlIaW50JywgKGVkaXRvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3Vyc29yID0gZWRpdG9yLmdldEN1cnNvcigpO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudExpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXJzb3IubGluZSk7XG5cbiAgICAgICAgICAgIGxldCBzdGFydCA9IGN1cnNvci5jaDtcbiAgICAgICAgICAgIGxldCBlbmQgPSBjdXJzb3IuY2g7XG4gICAgICAgICAgICB3aGlsZSAoZW5kIDwgY3VycmVudExpbmUubGVuZ3RoICYmIGhpbnRSZWdleHAudGVzdChjdXJyZW50TGluZS5jaGFyQXQoZW5kKSkpICsrZW5kO1xuICAgICAgICAgICAgd2hpbGUgKHN0YXJ0ICYmIGhpbnRSZWdleHAudGVzdChjdXJyZW50TGluZS5jaGFyQXQoc3RhcnQgLSAxKSkpIC0tc3RhcnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXb3JkID0gKHN0YXJ0ICE9PSBlbmQgJiYgY3VycmVudExpbmUuc2xpY2Uoc3RhcnQsIGVuZCkpIHx8ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBmaWx0ZXJlZERpY3Rpb25hcnkgPSAoXG4gICAgICAgICAgICAgICAgIWN1cnJlbnRXb3JkXG4gICAgICAgICAgICAgICAgICAgID8gZGljdGlvbmFyeVxuICAgICAgICAgICAgICAgICAgICA6IGRpY3Rpb25hcnkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY3VycmVudFdvcmQudG9Mb3dlckNhc2UoKSkpXG4gICAgICAgICAgICApLnNvcnQoKSB8fCBbXTtcblxuICAgICAgICAgICAgY29uc3QgaGludHNMaXN0OiBIaW50W10gPSBmaWx0ZXJlZERpY3Rpb25hcnkubWFwKChpdGVtOiBJQ29kZUVkaXRvckhpbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwbGF5VGV4dCA9IGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IHRleHQgPSBpdGVtLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lW3N0YXJ0IC0gMV0gIT09ICdbJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJ1snICsgdGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lW2VuZF0gIT09ICddJykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICddJztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyOiAoZWxlbWVudDogSFRNTExJRWxlbWVudCwgZGF0YTogSGludHMsIGN1cnJlbnQ6IEhpbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50LmRpc3BsYXlUZXh0LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihjdXJyZW50V29yZC50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZ1RvUmVwbGFjZSA9IGN1cnJlbnQuZGlzcGxheVRleHQuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIGN1cnJlbnRXb3JkLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaW50SFRNTCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7aXRlbS5pY29ufSBgICsgY3VycmVudC5kaXNwbGF5VGV4dC5yZXBsYWNlKHN0cmluZ1RvUmVwbGFjZSwgYDxiPiR7c3RyaW5nVG9SZXBsYWNlfTwvYj5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuY2ZyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KENvZGVFZGl0b3JIaW50V3JhcHBlckNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5jb250ZW50ID0gaGludEhUTUw7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudG9vbHRpcCA9IGl0ZW0uaGludDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZi5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oaW50UmVmc1N0YWNrLnB1c2goY29tcG9uZW50UmVmKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGlzdDogaGludHNMaXN0LFxuICAgICAgICAgICAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKGN1cnNvci5saW5lLCBzdGFydCksXG4gICAgICAgICAgICAgICAgdG86IENvZGVNaXJyb3IuUG9zKGN1cnNvci5saW5lLCBlbmQpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLmF1dG9jb21wbGV0ZSA9IChjbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95SGludHMoKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgQ29kZU1pcnJvci5zaG93SGludChjbSwgQ29kZU1pcnJvci5oaW50LmRpY3Rpb25hcnlIaW50KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlc3Ryb3lIaW50cygpIHtcbiAgICAgICAgdGhpcy5oaW50UmVmc1N0YWNrLmZvckVhY2goKHJlZikgPT4gcmVmLmRlc3Ryb3koKSk7XG4gICAgICAgIHRoaXMuaGludFJlZnNTdGFjayA9IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSGlnaGxpZ2h0SGludHMoKSB7XG4gICAgICAgIGNvbnN0IGhpbnRzID0gdGhpcy5faGludHMgfHwgW107XG4gICAgICAgIGNvbnN0IGhpZ2hsaWdodGVkSGludHMgPSB0aGlzLmhpZ2hsaWdodGVkSGludHMgfHwgW107XG5cbiAgICAgICAgaGlnaGxpZ2h0ZWRIaW50cy5mb3JFYWNoKChtKSA9PiBtLmNsZWFyKCkpO1xuXG4gICAgICAgIHRoaXMuZG9jLmVhY2hMaW5lKChsaW5lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gbGluZS50ZXh0Lm1hdGNoQWxsKC8oPzpcXFspLis/KD89XFxdKS9nbSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoaW50ID0gaGludHMuZmluZCgoaCkgPT4gaC52YWx1ZSA9PT0gbWF0Y2hbMF0ucmVwbGFjZSgnWycsICcnKSk7XG4gICAgICAgICAgICAgICAgaWYgKGhpbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWRIaW50cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2MubWFya1RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLmxpbmVObygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDogbWF0Y2guaW5kZXggKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lLmxpbmVObygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaDogbWF0Y2guaW5kZXggKyAxICsgaGludC52YWx1ZS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ2hpbnQtdmFyaWFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogaGludC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbn1cbiIsIjxkci1jb2RlbWlycm9yXG4gICAgI2NvZGVFZGl0b3JcbiAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICBbb3B0aW9uc109XCJjb2RlTWlycm9yT3B0aW9uc1wiXG4gICAgW2NsYXNzLm1hcmstaGludHNdPVwiaGlnaGxpZ2h0SGludHNcIlxuICAgIFtjbGFzcy5taXJyb3ItZXJyb3JdPVwiY29udHJvbC5zdGF0dXMgPT09ICdJTlZBTElEJyAmJiAhY29udHJvbC5wcmlzdGluZVwiXG4gICAgKGZvY3VzQ2hhbmdlKT1cImZvY3VzQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAoY29kZU1pcnJvckxvYWRlZCk9XCJhZnRlckNvZGVNaXJyb3JMb2FkZWQoKVwiPjwvZHItY29kZW1pcnJvcj5cbjxzcGFuICpuZ0lmPVwiIWlzRm9jdXNlZCAmJiAhaW5uZXJWYWx1ZVwiIGNsYXNzPVwiY29kZW1pcnJvci1wbGFjZWhvbGRlclwiXG4gICAgPlN0YXJ0IHR5cGluZyB5b3VyIGZvcm11bGEgaGVyZS4gV2Ugc3VwcG9ydCAoKywtLCosLykuIDxiciAvPlxuICAgIEZvciBFeGFtcGxlOiBbRmViLTIyXSAtIFtKYW4tMjJdPC9zcGFuXG4+XG48ZHItZXJyb3IgW2NvbnRyb2xdPVwiY29udHJvbFwiIGxhYmVsPVwiRm9ybXVsYSBlcnJvclwiPjwvZHItZXJyb3I+XG4iXX0=
|