@alauda-fe/common 1.4.27 → 1.4.28-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/code/code-editor-configs.d.ts +2 -0
  2. package/code/managed-fields-folder.util.d.ts +35 -0
  3. package/code/public-api.d.ts +4 -0
  4. package/code/resource-yaml-display/component.d.ts +62 -6
  5. package/code/resource-yaml-editor/component.d.ts +93 -0
  6. package/code/yaml-examples.d.ts +8 -0
  7. package/code/yaml-sidebar/component.d.ts +57 -0
  8. package/code/yaml-sidebar/types.d.ts +21 -0
  9. package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
  10. package/core/services/feature-gate.service.d.ts +1 -1
  11. package/core/services/kubernetes-schema.service.d.ts +43 -0
  12. package/core/services/public-api.d.ts +1 -0
  13. package/core/types/openapi.d.ts +37 -0
  14. package/core/types/public-api.d.ts +1 -0
  15. package/esm2022/code/code-editor-configs.mjs +12 -2
  16. package/esm2022/code/managed-fields-folder.util.mjs +136 -0
  17. package/esm2022/code/public-api.mjs +5 -1
  18. package/esm2022/code/resource-yaml-display/component.mjs +247 -43
  19. package/esm2022/code/resource-yaml-editor/component.mjs +379 -0
  20. package/esm2022/code/yaml-examples.mjs +337 -0
  21. package/esm2022/code/yaml-sidebar/component.mjs +482 -0
  22. package/esm2022/code/yaml-sidebar/types.mjs +2 -0
  23. package/esm2022/core/services/kubernetes-schema.service.mjs +125 -0
  24. package/esm2022/core/services/public-api.mjs +2 -1
  25. package/esm2022/core/types/openapi.mjs +2 -0
  26. package/esm2022/core/types/public-api.mjs +2 -1
  27. package/package.json +1 -1
  28. package/styles/global.scss +4 -0
  29. package/table/component.d.ts +1 -1
  30. package/view-chart/view-chart.component.d.ts +1 -1
@@ -0,0 +1,379 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { CodeEditorModule, MonacoLanguageService, } from '@alauda/code-editor';
3
+ import { CARD_MODULE, CHECKBOX_MODULE, ButtonModule, IconModule, } from '@alauda/ui';
4
+ import { AsyncPipe, NgIf, NgTemplateOutlet } from '@angular/common';
5
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild, forwardRef, } from '@angular/core';
6
+ import { FormsModule, NG_VALUE_ACCESSOR, } from '@angular/forms';
7
+ import { yamlDefaults } from 'monaco-yaml';
8
+ import { BehaviorSubject, combineLatest, Observable, map, distinctUntilChanged, of, switchMap, shareReplay, takeUntil, Subject, } from 'rxjs';
9
+ import { KubernetesSchemaService } from '../../core/services/kubernetes-schema.service';
10
+ import { YamlUtilService } from '../../core/services/yaml-util.service';
11
+ import { ObservableInput } from '../../core/utils/decorators';
12
+ import { publishRef } from '../../core/utils/operators';
13
+ import { parseAll, stringify } from '../../core/utils/yaml';
14
+ import { TRANSLATE_MODULE } from '../../translate/translate.module';
15
+ import { updateActions, yamlWriteMinimapOptions } from '../code-editor-configs';
16
+ import { foldManagedFields, } from '../managed-fields-folder.util';
17
+ import { ResourceYamlSidebarComponent } from '../yaml-sidebar/component';
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../core/services/yaml-util.service";
20
+ import * as i2 from "../../core/services/kubernetes-schema.service";
21
+ import * as i3 from "@alauda/code-editor";
22
+ import * as i4 from "@alauda/ui";
23
+ import * as i5 from "@angular/forms";
24
+ import * as i6 from "../../translate/translate.pipe";
25
+ const _c0 = ["codeEditor"];
26
+ function ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵelementContainer(0);
28
+ } }
29
+ function ResourceYamlEditorComponent_aui_card_0_Template(rf, ctx) { if (rf & 1) {
30
+ i0.ɵɵelementStart(0, "aui-card");
31
+ i0.ɵɵtemplate(1, ResourceYamlEditorComponent_aui_card_0_ng_container_1_Template, 1, 0, "ng-container", 3);
32
+ i0.ɵɵelementEnd();
33
+ } if (rf & 2) {
34
+ i0.ɵɵnextContext();
35
+ const content_r1 = i0.ɵɵreference(2);
36
+ i0.ɵɵadvance();
37
+ i0.ɵɵproperty("ngTemplateOutlet", content_r1);
38
+ } }
39
+ function ResourceYamlEditorComponent_ng_template_1_button_6_Template(rf, ctx) { if (rf & 1) {
40
+ const _r4 = i0.ɵɵgetCurrentView();
41
+ i0.ɵɵelementStart(0, "button", 10);
42
+ i0.ɵɵpipe(1, "async");
43
+ i0.ɵɵpipe(2, "async");
44
+ i0.ɵɵpipe(3, "async");
45
+ i0.ɵɵpipe(4, "translate");
46
+ i0.ɵɵlistener("click", function ResourceYamlEditorComponent_ng_template_1_button_6_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); });
47
+ i0.ɵɵelement(5, "aui-icon", 11);
48
+ i0.ɵɵpipe(6, "async");
49
+ i0.ɵɵelementEnd();
50
+ } if (rf & 2) {
51
+ const ctx_r2 = i0.ɵɵnextContext(2);
52
+ i0.ɵɵproperty("type", i0.ɵɵpipeBind1(1, 4, ctx_r2.showSidebar$$) ? "primary" : "text")("disabled", !i0.ɵɵpipeBind1(2, 6, ctx_r2.finalSchema$))("title", i0.ɵɵpipeBind1(3, 8, ctx_r2.finalSchema$) ? "" : i0.ɵɵpipeBind1(4, 10, "schema_not_available"));
53
+ i0.ɵɵadvance(5);
54
+ i0.ɵɵproperty("icon", i0.ɵɵpipeBind1(6, 12, ctx_r2.showSidebar$$) ? "prod:expand_sidebar" : "prod:collapse_sidebar");
55
+ } }
56
+ function ResourceYamlEditorComponent_ng_template_1_div_7_Template(rf, ctx) { if (rf & 1) {
57
+ const _r5 = i0.ɵɵgetCurrentView();
58
+ i0.ɵɵelementStart(0, "div", 12)(1, "acl-resource-yaml-sidebar", 13);
59
+ i0.ɵɵpipe(2, "async");
60
+ i0.ɵɵlistener("close", function ResourceYamlEditorComponent_ng_template_1_div_7_Template_acl_resource_yaml_sidebar_close_1_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.toggleSidebar()); })("tryYaml", function ResourceYamlEditorComponent_ng_template_1_div_7_Template_acl_resource_yaml_sidebar_tryYaml_1_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.onTryYaml($event)); });
61
+ i0.ɵɵelementEnd()();
62
+ } if (rf & 2) {
63
+ const ctx_r2 = i0.ɵɵnextContext(2);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵproperty("resource", ctx_r2.getCurrentResource())("schema", i0.ɵɵpipeBind1(2, 5, ctx_r2.finalSchema$))("schemaEnable", ctx_r2.schemaEnable)("exampleEnable", ctx_r2.exampleEnable)("extraExamples", ctx_r2.extraExamples);
66
+ } }
67
+ function ResourceYamlEditorComponent_ng_template_1_Template(rf, ctx) { if (rf & 1) {
68
+ const _r2 = i0.ɵɵgetCurrentView();
69
+ i0.ɵɵelementStart(0, "div", 4);
70
+ i0.ɵɵpipe(1, "async");
71
+ i0.ɵɵelementStart(2, "div", 5)(3, "aui-code-editor", 6, 1);
72
+ i0.ɵɵtwoWayListener("ngModelChange", function ResourceYamlEditorComponent_ng_template_1_Template_aui_code_editor_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r2.value, $event) || (ctx_r2.value = $event); return i0.ɵɵresetView($event); });
73
+ i0.ɵɵelementContainerStart(5, 7);
74
+ i0.ɵɵtemplate(6, ResourceYamlEditorComponent_ng_template_1_button_6_Template, 7, 14, "button", 8);
75
+ i0.ɵɵelementContainerEnd();
76
+ i0.ɵɵelementEnd()();
77
+ i0.ɵɵtemplate(7, ResourceYamlEditorComponent_ng_template_1_div_7_Template, 3, 7, "div", 9);
78
+ i0.ɵɵpipe(8, "async");
79
+ i0.ɵɵelementEnd();
80
+ } if (rf & 2) {
81
+ const ctx_r2 = i0.ɵɵnextContext();
82
+ i0.ɵɵclassProp("with-sidebar", i0.ɵɵpipeBind1(1, 9, ctx_r2.showSidebar$$));
83
+ i0.ɵɵadvance(3);
84
+ i0.ɵɵproperty("originalValue", ctx_r2.originalValue);
85
+ i0.ɵɵtwoWayProperty("ngModel", ctx_r2.value);
86
+ i0.ɵɵproperty("options", ctx_r2.options)("actionsConfig", ctx_r2.actionsConfig)("modelUri", ctx_r2.modelUri);
87
+ i0.ɵɵadvance(3);
88
+ i0.ɵɵproperty("ngIf", ctx_r2.sidebarEnable);
89
+ i0.ɵɵadvance();
90
+ i0.ɵɵproperty("ngIf", i0.ɵɵpipeBind1(8, 11, ctx_r2.showSidebar$$));
91
+ } }
92
+ export class ResourceYamlEditorComponent {
93
+ set originalValue(value) {
94
+ this._originalValue = value || '';
95
+ }
96
+ get originalValue() {
97
+ return this._originalValue;
98
+ }
99
+ constructor(yamlUtil, schemaService, monacoLanguageService) {
100
+ this.yamlUtil = yamlUtil;
101
+ this.schemaService = schemaService;
102
+ this.monacoLanguageService = monacoLanguageService;
103
+ this.destroy$ = new Subject();
104
+ this._value = '';
105
+ this._originalValue = '';
106
+ this.onChange = (_value) => {
107
+ // Placeholder for form control change callback
108
+ };
109
+ this.onTouched = () => {
110
+ // Placeholder for form control touched callback
111
+ };
112
+ this.showSidebar$$ = new BehaviorSubject(false);
113
+ this.showDebugPanel$$ = new BehaviorSubject(false);
114
+ this.monacoEditor = null;
115
+ this.registeredSchemas = new Set();
116
+ this.hasWrapper = true;
117
+ this.showDebugInfo = false;
118
+ this.sidebarEnable = true;
119
+ this.schemaEnable = true;
120
+ this.exampleEnable = true;
121
+ this.autoFoldManagedFields = true;
122
+ this.options = yamlWriteMinimapOptions;
123
+ this.actionsConfig = updateActions;
124
+ this.tryYaml = new EventEmitter();
125
+ this.autoFillNamespace = true;
126
+ /**
127
+ * 自动获取的 schema,当没有手动提供 schema 时使用
128
+ */
129
+ this.autoSchema$ = this.resource$.pipe(switchMap(resource => {
130
+ if (!resource) {
131
+ return of(null);
132
+ }
133
+ const firstResource = (Array.isArray(resource) ? resource[0] : resource);
134
+ if (!firstResource?.apiVersion || !firstResource?.kind) {
135
+ return of(null);
136
+ }
137
+ return this.schemaService.getResourceSchema(firstResource.apiVersion, firstResource.kind);
138
+ }), publishRef());
139
+ /**
140
+ * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
141
+ */
142
+ this.finalSchema$ = combineLatest([this.schema$, this.autoSchema$]).pipe(map(([manualSchema, autoSchema]) => manualSchema || autoSchema), distinctUntilChanged(), shareReplay(1));
143
+ this.yamlSchemaService =
144
+ this.monacoLanguageService.getLanguageSchemaService(['yaml', 'yamlDefaults'], yamlDefaults);
145
+ // 自动设置 schema
146
+ combineLatest([this.resource$, this.finalSchema$])
147
+ .pipe(takeUntil(this.destroy$))
148
+ .subscribe(([resource, schema]) => {
149
+ if (resource && schema) {
150
+ const firstResource = Array.isArray(resource)
151
+ ? resource[0]
152
+ : resource;
153
+ if (firstResource && !Array.isArray(firstResource)) {
154
+ this.setYamlSchema(firstResource, schema);
155
+ }
156
+ }
157
+ });
158
+ this.autoSchema$.pipe(takeUntil(this.destroy$)).subscribe();
159
+ }
160
+ ngAfterViewInit() {
161
+ // 监听 YAML 内容变化,自动折叠 managedFields
162
+ if (this.autoFoldManagedFields) {
163
+ // 使用更短的延迟时间,减少视觉闪烁
164
+ setTimeout(() => {
165
+ const editor = this.getEditorInstance();
166
+ if (editor) {
167
+ foldManagedFields(editor);
168
+ }
169
+ }, 0);
170
+ }
171
+ }
172
+ get value() {
173
+ return this._value;
174
+ }
175
+ set value(val) {
176
+ this._value = val;
177
+ this.onChange(val);
178
+ this.onTouched();
179
+ }
180
+ // ControlValueAccessor implementation
181
+ writeValue(value) {
182
+ this._value = value || '';
183
+ }
184
+ registerOnChange(fn) {
185
+ this.onChange = fn;
186
+ }
187
+ registerOnTouched(fn) {
188
+ this.onTouched = fn;
189
+ }
190
+ toggleSidebar() {
191
+ this.showSidebar$$.next(!this.showSidebar$$.value);
192
+ }
193
+ toggleDebugInfo() {
194
+ this.showDebugPanel$$.next(!this.showDebugPanel$$.value);
195
+ }
196
+ getCurrentResource() {
197
+ const resource = this.resource;
198
+ if (Array.isArray(resource)) {
199
+ return resource.length > 0 ? resource[0] : null;
200
+ }
201
+ return resource || null;
202
+ }
203
+ getCurrentSchema() {
204
+ return this.schema || null;
205
+ }
206
+ getDebugInfo() {
207
+ const resource = this.getCurrentResource();
208
+ return {
209
+ hasResource: !!resource,
210
+ resourceApiVersion: resource?.apiVersion,
211
+ resourceKind: resource?.kind,
212
+ hasManualSchema: !!this.schema,
213
+ workspaceHelperAvailable: this.schemaService.isWorkspaceHelperAvailable(),
214
+ currentWorkspace: this.schemaService.workspaceHelper?.baseParamsSnapshot,
215
+ };
216
+ }
217
+ onTryYaml(yamlContent) {
218
+ let targetYaml = yamlContent;
219
+ const namespace = this.schemaService.workspaceHelper?.baseParamsSnapshot?.namespace;
220
+ if (this.autoFillNamespace && namespace) {
221
+ targetYaml = parseAll(yamlContent)
222
+ .filter(r => !!r)
223
+ .map((r) => {
224
+ if (!r?.metadata?.namespace) {
225
+ return {
226
+ ...r,
227
+ metadata: {
228
+ ...r.metadata,
229
+ namespace,
230
+ },
231
+ };
232
+ }
233
+ return r;
234
+ })
235
+ .map(r => stringify(r, { sortMapEntries: true }))
236
+ .join('---\r\n');
237
+ }
238
+ this.tryYaml.emit(targetYaml);
239
+ }
240
+ /**
241
+ * 设置 YAML schema 以提供 hover 提示和自动完成
242
+ */
243
+ setYamlSchema(resource, schema) {
244
+ if (!schema) {
245
+ return;
246
+ }
247
+ // 使用 apiVersion + kind 组合作为标识
248
+ const apiVersion = resource?.apiVersion || 'unknown';
249
+ const kind = resource?.kind || 'unknown';
250
+ const schemaKey = `${apiVersion}/${kind}`;
251
+ this.modelUri = `${schemaKey}.yaml`;
252
+ // 检查是否已经注册过相同的 schema,避免重复注册
253
+ if (this.registeredSchemas.has(schemaKey)) {
254
+ return;
255
+ }
256
+ // 获取完整的 definitions 以支持 $ref 引用
257
+ const definitions = this.schemaService.definitions || {};
258
+ // 创建包含完整 definitions 的 schema 对象
259
+ const fullSchema = {
260
+ ...schema,
261
+ definitions,
262
+ };
263
+ // 确保schema被正确注册,并启用自动完成功能
264
+ this.yamlSchemaService.addSchema({
265
+ uri: `k8s://${schemaKey}.schema.json`,
266
+ fileMatch: [this.modelUri],
267
+ schema: fullSchema,
268
+ });
269
+ this.registeredSchemas.add(schemaKey);
270
+ }
271
+ /**
272
+ * 获取 Monaco 编辑器实例
273
+ */
274
+ getEditorInstance() {
275
+ if (!this.monacoEditor && this.codeEditorRef?.editor) {
276
+ this.monacoEditor = this.codeEditorRef.editor;
277
+ }
278
+ return this.monacoEditor;
279
+ }
280
+ /**
281
+ * 手动折叠 managedFields
282
+ */
283
+ foldManagedFields() {
284
+ const editor = this.getEditorInstance();
285
+ if (editor) {
286
+ foldManagedFields(editor);
287
+ }
288
+ }
289
+ ngOnDestroy() {
290
+ this.destroy$.next();
291
+ this.destroy$.complete();
292
+ }
293
+ static { this.ɵfac = function ResourceYamlEditorComponent_Factory(t) { return new (t || ResourceYamlEditorComponent)(i0.ɵɵdirectiveInject(i1.YamlUtilService), i0.ɵɵdirectiveInject(i2.KubernetesSchemaService), i0.ɵɵdirectiveInject(i3.MonacoLanguageService)); }; }
294
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceYamlEditorComponent, selectors: [["acl-resource-yaml-editor"]], viewQuery: function ResourceYamlEditorComponent_Query(rf, ctx) { if (rf & 1) {
295
+ i0.ɵɵviewQuery(_c0, 5);
296
+ } if (rf & 2) {
297
+ let _t;
298
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditorRef = _t.first);
299
+ } }, inputs: { hasWrapper: "hasWrapper", showDebugInfo: "showDebugInfo", sidebarEnable: "sidebarEnable", schema: "schema", schemaEnable: "schemaEnable", exampleEnable: "exampleEnable", resource: "resource", autoFoldManagedFields: "autoFoldManagedFields", originalValue: "originalValue", options: "options", actionsConfig: "actionsConfig", autoFillNamespace: "autoFillNamespace", extraExamples: "extraExamples" }, outputs: { tryYaml: "tryYaml" }, standalone: true, features: [i0.ɵɵProvidersFeature([
300
+ {
301
+ provide: NG_VALUE_ACCESSOR,
302
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
303
+ multi: true,
304
+ },
305
+ ]), i0.ɵɵStandaloneFeature], decls: 3, vars: 2, consts: [["content", ""], ["codeEditor", ""], [4, "ngIf", "ngIfElse"], [4, "ngTemplateOutlet"], [1, "yaml-editor-container"], [1, "yaml-editor-section"], ["name", "yaml", 3, "ngModelChange", "originalValue", "ngModel", "options", "actionsConfig", "modelUri"], ["auiCodeEditorToolbarRightSide", ""], ["auiButton", "", "class", "aui-code-editor-toolbar__control-button", "size", "small", 3, "type", "disabled", "title", "click", 4, "ngIf"], ["class", "yaml-sidebar-section", 4, "ngIf"], ["auiButton", "", "size", "small", 1, "aui-code-editor-toolbar__control-button", 3, "click", "type", "disabled", "title"], [3, "icon"], [1, "yaml-sidebar-section"], [3, "close", "tryYaml", "resource", "schema", "schemaEnable", "exampleEnable", "extraExamples"]], template: function ResourceYamlEditorComponent_Template(rf, ctx) { if (rf & 1) {
306
+ i0.ɵɵtemplate(0, ResourceYamlEditorComponent_aui_card_0_Template, 2, 1, "aui-card", 2)(1, ResourceYamlEditorComponent_ng_template_1_Template, 9, 13, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
307
+ } if (rf & 2) {
308
+ const content_r1 = i0.ɵɵreference(2);
309
+ i0.ɵɵproperty("ngIf", ctx.hasWrapper)("ngIfElse", content_r1);
310
+ } }, dependencies: [i4.CardComponent, NgIf,
311
+ FormsModule, i5.NgControlStatus, i5.NgModel, ButtonModule,
312
+ CodeEditorModule, i3.CodeEditorComponent, i6.TranslatePipe, AsyncPipe,
313
+ NgTemplateOutlet,
314
+ ResourceYamlSidebarComponent,
315
+ IconModule, i4.IconComponent], styles: ["[_nghost-%COMP%]:not(.dialog-content){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}[_nghost-%COMP%]:not(.dialog-content) .aui-code-editor{min-height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%]{height:100%}[_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-card__content[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%], [_nghost-%COMP%]:not(.dialog-content) > .aui-card[_ngcontent-%COMP%] .aui-code-editor[_ngcontent-%COMP%]{height:100%;min-height:100%}[_nghost-%COMP%]{display:block}[_nghost-%COMP%] aui-card, [_nghost-%COMP%] .aui-card, [_nghost-%COMP%] .aui-card__content{height:100%}[_nghost-%COMP%] .aui-checkbox{margin-right:0}[_nghost-%COMP%] aui-code-editor[_ngcontent-%COMP%]{height:100%}.yaml-editor-container[_ngcontent-%COMP%]{display:flex;height:100%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:1;min-width:0}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:400px;flex-shrink:0}.yaml-editor-container[_ngcontent-%COMP%]:not(.with-sidebar) .yaml-editor-section[_ngcontent-%COMP%]{flex:1}.yaml-editor-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-editor-section[_ngcontent-%COMP%] aui-code-editor[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section[_ngcontent-%COMP%] acl-resource-yaml-sidebar[_ngcontent-%COMP%]{flex:1;height:100%}.yaml-debug-section[_ngcontent-%COMP%]{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel[_ngcontent-%COMP%]{padding:16px;font-size:12px}.debug-panel[_ngcontent-%COMP%] h4[_ngcontent-%COMP%]{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%]{margin-bottom:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%]{margin:0;padding-left:16px}.debug-panel[_ngcontent-%COMP%] .debug-item[_ngcontent-%COMP%] ul[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel[_ngcontent-%COMP%] .debug-actions[_ngcontent-%COMP%]{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (max-width: 1200px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:350px}}@media (max-width: 992px){.yaml-editor-container.with-sidebar[_ngcontent-%COMP%]{flex-direction:column}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-editor-section[_ngcontent-%COMP%]{flex:1;min-height:50%}.yaml-editor-container.with-sidebar[_ngcontent-%COMP%] .yaml-sidebar-section[_ngcontent-%COMP%]{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}"], changeDetection: 0 }); }
316
+ }
317
+ __decorate([
318
+ ObservableInput(),
319
+ __metadata("design:type", Observable)
320
+ ], ResourceYamlEditorComponent.prototype, "resource$", void 0);
321
+ __decorate([
322
+ ObservableInput(),
323
+ __metadata("design:type", Observable)
324
+ ], ResourceYamlEditorComponent.prototype, "schema$", void 0);
325
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceYamlEditorComponent, [{
326
+ type: Component,
327
+ args: [{ selector: 'acl-resource-yaml-editor', preserveWhitespaces: false, standalone: true, imports: [
328
+ CARD_MODULE,
329
+ NgIf,
330
+ FormsModule,
331
+ CHECKBOX_MODULE,
332
+ ButtonModule,
333
+ CodeEditorModule,
334
+ TRANSLATE_MODULE,
335
+ AsyncPipe,
336
+ NgTemplateOutlet,
337
+ ResourceYamlSidebarComponent,
338
+ IconModule,
339
+ ], providers: [
340
+ {
341
+ provide: NG_VALUE_ACCESSOR,
342
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
343
+ multi: true,
344
+ },
345
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<aui-card *ngIf=\"hasWrapper; else content\">\n <ng-container *ngTemplateOutlet=\"content\" />\n</aui-card>\n<ng-template #content>\n <div\n class=\"yaml-editor-container\"\n [class.with-sidebar]=\"showSidebar$$ | async\"\n >\n <div class=\"yaml-editor-section\">\n <aui-code-editor\n #codeEditor\n name=\"yaml\"\n [originalValue]=\"originalValue\"\n [(ngModel)]=\"value\"\n [options]=\"options\"\n [actionsConfig]=\"actionsConfig\"\n [modelUri]=\"modelUri\"\n >\n <ng-container auiCodeEditorToolbarRightSide>\n <!-- Schema \u6309\u94AE\uFF1A\u5F53\u542F\u7528\u4FA7\u8FB9\u680F\u65F6\u663E\u793A -->\n <button\n auiButton\n *ngIf=\"sidebarEnable\"\n class=\"aui-code-editor-toolbar__control-button\"\n [type]=\"(showSidebar$$ | async) ? 'primary' : 'text'\"\n [disabled]=\"!(finalSchema$ | async)\"\n size=\"small\"\n (click)=\"toggleSidebar()\"\n [title]=\"\n (finalSchema$ | async) ? '' : ('schema_not_available' | translate)\n \"\n >\n <aui-icon\n [icon]=\"\n (showSidebar$$ | async)\n ? 'prod:expand_sidebar'\n : 'prod:collapse_sidebar'\n \"\n ></aui-icon>\n </button>\n </ng-container>\n </aui-code-editor>\n </div>\n <div\n class=\"yaml-sidebar-section\"\n *ngIf=\"showSidebar$$ | async\"\n >\n <acl-resource-yaml-sidebar\n [resource]=\"getCurrentResource()\"\n [schema]=\"finalSchema$ | async\"\n [schemaEnable]=\"schemaEnable\"\n [exampleEnable]=\"exampleEnable\"\n [extraExamples]=\"extraExamples\"\n (close)=\"toggleSidebar()\"\n (tryYaml)=\"onTryYaml($event)\"\n ></acl-resource-yaml-sidebar>\n </div>\n </div>\n</ng-template>\n", styles: [":host(:not(.dialog-content)){display:block;height:calc(100vh - (var(--acl-page-header-height) + 44px) - 147px)}:host(:not(.dialog-content)) ::ng-deep .aui-code-editor{min-height:100%}:host(:not(.dialog-content))>.aui-card{height:100%}:host(:not(.dialog-content))>.aui-card .aui-card__content,:host(:not(.dialog-content))>.aui-card aui-code-editor,:host(:not(.dialog-content))>.aui-card .aui-code-editor{height:100%;min-height:100%}:host{display:block}:host ::ng-deep aui-card,:host ::ng-deep .aui-card,:host ::ng-deep .aui-card__content{height:100%}:host ::ng-deep .aui-checkbox{margin-right:0}:host aui-code-editor{height:100%}.yaml-editor-container{display:flex;height:100%}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:1;min-width:0}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:400px;flex-shrink:0}.yaml-editor-container:not(.with-sidebar) .yaml-editor-section{flex:1}.yaml-editor-section{display:flex;flex-direction:column;height:100%}.yaml-editor-section aui-code-editor{flex:1;height:100%}.yaml-sidebar-section{display:flex;flex-direction:column;height:100%}.yaml-sidebar-section acl-resource-yaml-sidebar{flex:1;height:100%}.yaml-debug-section{position:absolute;top:0;right:0;width:350px;height:100%;background:var(--aui-color-bg-container);border-left:1px solid var(--aui-color-border-default);z-index:1000;overflow-y:auto}.debug-panel{padding:16px;font-size:12px}.debug-panel h4{margin:0 0 12px;font-size:14px;color:var(--aui-color-text-primary)}.debug-panel .debug-item{margin-bottom:16px}.debug-panel .debug-item strong{color:var(--aui-color-text-primary);display:block;margin-bottom:4px}.debug-panel .debug-item ul{margin:0;padding-left:16px}.debug-panel .debug-item ul li{margin-bottom:2px;color:var(--aui-color-text-secondary)}.debug-panel .debug-actions{border-top:1px solid var(--aui-color-border-default);padding-top:12px;text-align:right}@media (max-width: 1200px){.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:350px}}@media (max-width: 992px){.yaml-editor-container.with-sidebar{flex-direction:column}.yaml-editor-container.with-sidebar .yaml-editor-section{flex:1;min-height:50%}.yaml-editor-container.with-sidebar .yaml-sidebar-section{width:100%;height:50%;border-top:1px solid var(--aui-color-border, #e0e0e0);border-left:none}}\n"] }]
346
+ }], () => [{ type: i1.YamlUtilService }, { type: i2.KubernetesSchemaService }, { type: i3.MonacoLanguageService }], { codeEditorRef: [{
347
+ type: ViewChild,
348
+ args: ['codeEditor', { static: false }]
349
+ }], hasWrapper: [{
350
+ type: Input
351
+ }], showDebugInfo: [{
352
+ type: Input
353
+ }], sidebarEnable: [{
354
+ type: Input
355
+ }], schema: [{
356
+ type: Input
357
+ }], schemaEnable: [{
358
+ type: Input
359
+ }], exampleEnable: [{
360
+ type: Input
361
+ }], resource: [{
362
+ type: Input
363
+ }], autoFoldManagedFields: [{
364
+ type: Input
365
+ }], originalValue: [{
366
+ type: Input
367
+ }], options: [{
368
+ type: Input
369
+ }], actionsConfig: [{
370
+ type: Input
371
+ }], tryYaml: [{
372
+ type: Output
373
+ }], resource$: [], schema$: [], autoFillNamespace: [{
374
+ type: Input
375
+ }], extraExamples: [{
376
+ type: Input
377
+ }] }); })();
378
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceYamlEditorComponent, { className: "ResourceYamlEditorComponent", filePath: "code/resource-yaml-editor/component.ts", lineNumber: 88 }); })();
379
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsR0FHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsVUFBVSxFQUNWLEdBQUcsRUFDSCxvQkFBb0IsRUFDcEIsRUFBRSxFQUNGLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUl4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFD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MEIsdUJBR2YsS0FBSyxjQUNkLElBQUksV0FDUDtvQkFDUCxXQUFXO29CQUNYLElBQUk7b0JBQ0osV0FBVztvQkFDWCxlQUFlO29CQUNmLFlBQVk7b0JBQ1osZ0JBQWdCO29CQUNoQixnQkFBZ0I7b0JBQ2hCLFNBQVM7b0JBQ1QsZ0JBQWdCO29CQUNoQiw0QkFBNEI7b0JBQzVCLFVBQVU7aUJBQ1gsYUFDVTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSw0QkFBNEIsQ0FBQzt3QkFDMUQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07MEhBNkJ2QyxhQUFhO2tCQURwQixTQUFTO21CQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFJMUMsVUFBVTtrQkFEVCxLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLO1lBSU4sTUFBTTtrQkFETCxLQUFLO1lBSU4sWUFBWTtrQkFEWCxLQUFLO1lBSU4sYUFBYTtrQkFEWixLQUFLO1lBSU4sUUFBUTtrQkFEUCxLQUFLO1lBSU4scUJBQXFCO2tCQURwQixLQUFLO1lBSUYsYUFBYTtrQkFEaEIsS0FBSztZQVVOLE9BQU87a0JBRE4sS0FBSztZQUlOLGFBQWE7a0JBRFosS0FBSztZQUlOLE9BQU87a0JBRE4sTUFBTTtZQUlFLFNBQVMsTUFHVCxPQUFPLE1BR2hCLGlCQUFpQjtrQkFEaEIsS0FBSztZQUlOLGFBQWE7a0JBRFosS0FBSzs7a0ZBaEZLLDJCQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvZGVFZGl0b3JNb2R1bGUsXG4gIExhbmd1YWdlU2NoZW1hU2VydmljZSxcbiAgTW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLFxufSBmcm9tICdAYWxhdWRhL2NvZGUtZWRpdG9yJztcbmltcG9ydCB7XG4gIENBUkRfTU9EVUxFLFxuICBDSEVDS0JPWF9NT0RVTEUsXG4gIEJ1dHRvbk1vZHVsZSxcbiAgSWNvbk1vZHVsZSxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWYsXG4gIE9uRGVzdHJveSxcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybXNNb2R1bGUsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyB5YW1sRGVmYXVsdHMgfSBmcm9tICdtb25hY28teWFtbCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIG1hcCxcbiAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gIG9mLFxuICBzd2l0Y2hNYXAsXG4gIHNoYXJlUmVwbGF5LFxuICB0YWtlVW50aWwsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBLdWJlcm5ldGVzU2NoZW1hU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMva3ViZXJuZXRlcy1zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBZYW1sVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL3lhbWwtdXRpbC5zZXJ2aWNlJztcbmltcG9ydCB7IEFycmF5YWJsZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvaGVscGVycyc7XG5pbXBvcnQgeyBLdWJlcm5ldGVzUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9jb3JlL3R5cGVzL2s4cy9jb3JlJztcbmltcG9ydCB7IE9wZW5BUElWM1NjaGVtYU9iamVjdCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvc2NoZW1hJztcbmltcG9ydCB7IE9ic2VydmFibGVJbnB1dCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBwdWJsaXNoUmVmIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGFyc2VBbGwsIHN0cmluZ2lmeSB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMveWFtbCc7XG5pbXBvcnQgeyBUUkFOU0xBVEVfTU9EVUxFIH0gZnJvbSAnLi4vLi4vdHJhbnNsYXRlL3RyYW5zbGF0ZS5tb2R1bGUnO1xuaW1wb3J0IHsgdXBkYXRlQWN0aW9ucywgeWFtbFdyaXRlTWluaW1hcE9wdGlvbnMgfSBmcm9tICcuLi9jb2RlLWVkaXRvci1jb25maWdzJztcbmltcG9ydCB7XG4gIGZvbGRNYW5hZ2VkRmllbGRzLFxuICBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyLFxufSBmcm9tICcuLi9tYW5hZ2VkLWZpZWxkcy1mb2xkZXIudXRpbCc7XG5pbXBvcnQgeyBSZXNvdXJjZVlhbWxTaWRlYmFyQ29tcG9uZW50IH0gZnJvbSAnLi4veWFtbC1zaWRlYmFyL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBZYW1sRXhhbXBsZSB9IGZyb20gJy4uL3lhbWwtc2lkZWJhci90eXBlcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1yZXNvdXJjZS15YW1sLWVkaXRvcicsXG4gIHRlbXBsYXRlVXJsOiAndGVtcGxhdGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWydzdHlsZXMuc2NzcyddLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENBUkRfTU9EVUxFLFxuICAgIE5nSWYsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgQ0hFQ0tCT1hfTU9EVUxFLFxuICAgIEJ1dHRvbk1vZHVsZSxcbiAgICBDb2RlRWRpdG9yTW9kdWxlLFxuICAgIFRSQU5TTEFURV9NT0RVTEUsXG4gICAgQXN5bmNQaXBlLFxuICAgIE5nVGVtcGxhdGVPdXRsZXQsXG4gICAgUmVzb3VyY2VZYW1sU2lkZWJhckNvbXBvbmVudCxcbiAgICBJY29uTW9kdWxlLFxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJlc291cmNlWWFtbEVkaXRvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VZYW1sRWRpdG9yQ29tcG9uZW50PFQgZXh0ZW5kcyBLdWJlcm5ldGVzUmVzb3VyY2U+XG4gIGltcGxlbWVudHNcbiAgICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgRWRpdG9ySW5zdGFuY2VQcm92aWRlcixcbiAgICBBZnRlclZpZXdJbml0XG57XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuICBwcml2YXRlIF9vcmlnaW5hbFZhbHVlID0gJyc7XG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoX3ZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZm9ybSBjb250cm9sIGNoYW5nZSBjYWxsYmFja1xuICB9O1xuXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge1xuICAgIC8vIFBsYWNlaG9sZGVyIGZvciBmb3JtIGNvbnRyb2wgdG91Y2hlZCBjYWxsYmFja1xuICB9O1xuXG4gIHNob3dTaWRlYmFyJCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgc2hvd0RlYnVnUGFuZWwkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIG1vZGVsVXJpOiBzdHJpbmc7XG4gIHByaXZhdGUgeWFtbFNjaGVtYVNlcnZpY2U6IExhbmd1YWdlU2NoZW1hU2VydmljZTtcbiAgcHJpdmF0ZSBtb25hY29FZGl0b3I6IGFueSA9IG51bGw7XG4gIHByaXZhdGUgcmVnaXN0ZXJlZFNjaGVtYXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdjb2RlRWRpdG9yJywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgY29kZUVkaXRvclJlZjogYW55O1xuXG4gIEBJbnB1dCgpXG4gIGhhc1dyYXBwZXIgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dEZWJ1Z0luZm8gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzaWRlYmFyRW5hYmxlID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzY2hlbWE6IE9wZW5BUElWM1NjaGVtYU9iamVjdDtcblxuICBASW5wdXQoKVxuICBzY2hlbWFFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGV4YW1wbGVFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHJlc291cmNlOiBBcnJheWFibGU8VD47XG5cbiAgQElucHV0KClcbiAgYXV0b0ZvbGRNYW5hZ2VkRmllbGRzID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgb3JpZ2luYWxWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fb3JpZ2luYWxWYWx1ZSA9IHZhbHVlIHx8ICcnO1xuICB9XG5cbiAgZ2V0IG9yaWdpbmFsVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3JpZ2luYWxWYWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIG9wdGlvbnMgPSB5YW1sV3JpdGVNaW5pbWFwT3B0aW9ucztcblxuICBASW5wdXQoKVxuICBhY3Rpb25zQ29uZmlnID0gdXBkYXRlQWN0aW9ucztcblxuICBAT3V0cHV0KClcbiAgdHJ5WWFtbCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIEBPYnNlcnZhYmxlSW5wdXQoKVxuICByZWFkb25seSByZXNvdXJjZSQhOiBPYnNlcnZhYmxlPEFycmF5YWJsZTxUPj47XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IHNjaGVtYSQhOiBPYnNlcnZhYmxlPE9wZW5BUElWM1NjaGVtYU9iamVjdD47XG5cbiAgQElucHV0KClcbiAgYXV0b0ZpbGxOYW1lc3BhY2UgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGV4dHJhRXhhbXBsZXM6IFlhbWxFeGFtcGxlW107XG5cbiAgLyoqXG4gICAqIOiHquWKqOiOt+WPlueahCBzY2hlbWHvvIzlvZPmsqHmnInmiYvliqjmj5Dkvpsgc2NoZW1hIOaXtuS9v+eUqFxuICAgKi9cbiAgYXV0b1NjaGVtYSQgPSB0aGlzLnJlc291cmNlJC5waXBlKFxuICAgIHN3aXRjaE1hcChyZXNvdXJjZSA9PiB7XG4gICAgICBpZiAoIXJlc291cmNlKSB7XG4gICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IChcbiAgICAgICAgQXJyYXkuaXNBcnJheShyZXNvdXJjZSkgPyByZXNvdXJjZVswXSA6IHJlc291cmNlXG4gICAgICApIGFzIFQ7XG4gICAgICBpZiAoIWZpcnN0UmVzb3VyY2U/LmFwaVZlcnNpb24gfHwgIWZpcnN0UmVzb3VyY2U/LmtpbmQpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFJlc291cmNlU2NoZW1hKFxuICAgICAgICBmaXJzdFJlc291cmNlLmFwaVZlcnNpb24sXG4gICAgICAgIGZpcnN0UmVzb3VyY2Uua2luZCxcbiAgICAgICk7XG4gICAgfSksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIC8qKlxuICAgKiDmnIDnu4jkvb/nlKjnmoQgc2NoZW1h77yM5LyY5YWI5L2/55So5omL5Yqo5o+Q5L6b55qE77yM5ZCm5YiZ5L2/55So6Ieq5Yqo6I635Y+W55qEXG4gICAqL1xuICBmaW5hbFNjaGVtYSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLnNjaGVtYSQsIHRoaXMuYXV0b1NjaGVtYSRdKS5waXBlKFxuICAgIG1hcCgoW21hbnVhbFNjaGVtYSwgYXV0b1NjaGVtYV0pID0+IG1hbnVhbFNjaGVtYSB8fCBhdXRvU2NoZW1hKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgIHNoYXJlUmVwbGF5KDEpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSB5YW1sVXRpbDogWWFtbFV0aWxTZXJ2aWNlLFxuICAgIHB1YmxpYyByZWFkb25seSBzY2hlbWFTZXJ2aWNlOiBLdWJlcm5ldGVzU2NoZW1hU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1vbmFjb0xhbmd1YWdlU2VydmljZTogTW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLFxuICApIHtcbiAgICB0aGlzLnlhbWxTY2hlbWFTZXJ2aWNlID1cbiAgICAgIHRoaXMubW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlLmdldExhbmd1YWdlU2NoZW1hU2VydmljZShcbiAgICAgICAgWyd5YW1sJywgJ3lhbWxEZWZhdWx0cyddLFxuICAgICAgICB5YW1sRGVmYXVsdHMsXG4gICAgICApO1xuXG4gICAgLy8g6Ieq5Yqo6K6+572uIHNjaGVtYVxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMucmVzb3VyY2UkLCB0aGlzLmZpbmFsU2NoZW1hJF0pXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKChbcmVzb3VyY2UsIHNjaGVtYV0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlICYmIHNjaGVtYSkge1xuICAgICAgICAgIGNvbnN0IGZpcnN0UmVzb3VyY2UgPSBBcnJheS5pc0FycmF5KHJlc291cmNlKVxuICAgICAgICAgICAgPyByZXNvdXJjZVswXVxuICAgICAgICAgICAgOiByZXNvdXJjZTtcbiAgICAgICAgICBpZiAoZmlyc3RSZXNvdXJjZSAmJiAhQXJyYXkuaXNBcnJheShmaXJzdFJlc291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRZYW1sU2NoZW1hKGZpcnN0UmVzb3VyY2UgYXMgVCwgc2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5hdXRvU2NoZW1hJC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8g55uR5ZCsIFlBTUwg5YaF5a655Y+Y5YyW77yM6Ieq5Yqo5oqY5Y+gIG1hbmFnZWRGaWVsZHNcbiAgICBpZiAodGhpcy5hdXRvRm9sZE1hbmFnZWRGaWVsZHMpIHtcbiAgICAgIC8vIOS9v+eUqOabtOefreeahOW7tui/n+aXtumXtO+8jOWHj+WwkeinhuiniemXqueDgVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9ySW5zdGFuY2UoKTtcbiAgICAgICAgaWYgKGVkaXRvcikge1xuICAgICAgICAgIGZvbGRNYW5hZ2VkRmllbGRzKGVkaXRvcik7XG4gICAgICAgIH1cbiAgICAgIH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IHN0cmluZykge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsO1xuICAgIHRoaXMub25DaGFuZ2UodmFsKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZSB8fCAnJztcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgdG9nZ2xlU2lkZWJhcigpIHtcbiAgICB0aGlzLnNob3dTaWRlYmFyJCQubmV4dCghdGhpcy5zaG93U2lkZWJhciQkLnZhbHVlKTtcbiAgfVxuXG4gIHRvZ2dsZURlYnVnSW5mbygpIHtcbiAgICB0aGlzLnNob3dEZWJ1Z1BhbmVsJCQubmV4dCghdGhpcy5zaG93RGVidWdQYW5lbCQkLnZhbHVlKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRSZXNvdXJjZSgpOiBUIHwgbnVsbCB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHJlc291cmNlKSkge1xuICAgICAgcmV0dXJuIHJlc291cmNlLmxlbmd0aCA+IDAgPyByZXNvdXJjZVswXSA6IG51bGw7XG4gICAgfVxuICAgIHJldHVybiAocmVzb3VyY2UgYXMgVCkgfHwgbnVsbDtcbiAgfVxuXG4gIGdldEN1cnJlbnRTY2hlbWEoKTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hIHx8IG51bGw7XG4gIH1cblxuICBnZXREZWJ1Z0luZm8oKSB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmdldEN1cnJlbnRSZXNvdXJjZSgpO1xuICAgIHJldHVybiB7XG4gICAgICBoYXNSZXNvdXJjZTogISFyZXNvdXJjZSxcbiAgICAgIHJlc291cmNlQXBpVmVyc2lvbjogcmVzb3VyY2U/LmFwaVZlcnNpb24sXG4gICAgICByZXNvdXJjZUtpbmQ6IHJlc291cmNlPy5raW5kLFxuICAgICAgaGFzTWFudWFsU2NoZW1hOiAhIXRoaXMuc2NoZW1hLFxuICAgICAgd29ya3NwYWNlSGVscGVyQXZhaWxhYmxlOiB0aGlzLnNjaGVtYVNlcnZpY2UuaXNXb3Jrc3BhY2VIZWxwZXJBdmFpbGFibGUoKSxcbiAgICAgIGN1cnJlbnRXb3Jrc3BhY2U6IHRoaXMuc2NoZW1hU2VydmljZS53b3Jrc3BhY2VIZWxwZXI/LmJhc2VQYXJhbXNTbmFwc2hvdCxcbiAgICB9O1xuICB9XG5cbiAgb25UcnlZYW1sKHlhbWxDb250ZW50OiBzdHJpbmcpIHtcbiAgICBsZXQgdGFyZ2V0WWFtbCA9IHlhbWxDb250ZW50O1xuXG4gICAgY29uc3QgbmFtZXNwYWNlID1cbiAgICAgIHRoaXMuc2NoZW1hU2VydmljZS53b3Jrc3BhY2VIZWxwZXI/LmJhc2VQYXJhbXNTbmFwc2hvdD8ubmFtZXNwYWNlO1xuXG4gICAgaWYgKHRoaXMuYXV0b0ZpbGxOYW1lc3BhY2UgJiYgbmFtZXNwYWNlKSB7XG4gICAgICB0YXJnZXRZYW1sID0gcGFyc2VBbGwoeWFtbENvbnRlbnQpXG4gICAgICAgIC5maWx0ZXIociA9PiAhIXIpXG4gICAgICAgIC5tYXAoKHI6IEt1YmVybmV0ZXNSZXNvdXJjZSkgPT4ge1xuICAgICAgICAgIGlmICghcj8ubWV0YWRhdGE/Lm5hbWVzcGFjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucixcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAuLi5yLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIG5hbWVzcGFjZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKHIgPT4gc3RyaW5naWZ5KHIsIHsgc29ydE1hcEVudHJpZXM6IHRydWUgfSkpXG4gICAgICAgIC5qb2luKCctLS1cXHJcXG4nKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeVlhbWwuZW1pdCh0YXJnZXRZYW1sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDorr7nva4gWUFNTCBzY2hlbWEg5Lul5o+Q5L6bIGhvdmVyIOaPkOekuuWSjOiHquWKqOWujOaIkFxuICAgKi9cbiAgc2V0WWFtbFNjaGVtYShyZXNvdXJjZTogVCwgc2NoZW1hOiBPcGVuQVBJVjNTY2hlbWFPYmplY3QpIHtcbiAgICBpZiAoIXNjaGVtYSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOS9v+eUqCBhcGlWZXJzaW9uICsga2luZCDnu4TlkIjkvZzkuLrmoIfor4ZcbiAgICBjb25zdCBhcGlWZXJzaW9uID0gcmVzb3VyY2U/LmFwaVZlcnNpb24gfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IGtpbmQgPSByZXNvdXJjZT8ua2luZCB8fCAndW5rbm93bic7XG4gICAgY29uc3Qgc2NoZW1hS2V5ID0gYCR7YXBpVmVyc2lvbn0vJHtraW5kfWA7XG5cbiAgICB0aGlzLm1vZGVsVXJpID0gYCR7c2NoZW1hS2V5fS55YW1sYDtcblxuICAgIC8vIOajgOafpeaYr+WQpuW3sue7j+azqOWGjOi/h+ebuOWQjOeahCBzY2hlbWHvvIzpgb/lhY3ph43lpI3ms6jlhoxcbiAgICBpZiAodGhpcy5yZWdpc3RlcmVkU2NoZW1hcy5oYXMoc2NoZW1hS2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOiOt+WPluWujOaVtOeahCBkZWZpbml0aW9ucyDku6XmlK/mjIEgJHJlZiDlvJXnlKhcbiAgICBjb25zdCBkZWZpbml0aW9ucyA9IHRoaXMuc2NoZW1hU2VydmljZS5kZWZpbml0aW9ucyB8fCB7fTtcblxuICAgIC8vIOWIm+W7uuWMheWQq+WujOaVtCBkZWZpbml0aW9ucyDnmoQgc2NoZW1hIOWvueixoVxuICAgIGNvbnN0IGZ1bGxTY2hlbWEgPSB7XG4gICAgICAuLi5zY2hlbWEsXG4gICAgICBkZWZpbml0aW9ucyxcbiAgICB9O1xuXG4gICAgLy8g56Gu5L+dc2NoZW1h6KKr5q2j56Gu5rOo5YaM77yM5bm25ZCv55So6Ieq5Yqo5a6M5oiQ5Yqf6IO9XG4gICAgdGhpcy55YW1sU2NoZW1hU2VydmljZS5hZGRTY2hlbWEoe1xuICAgICAgdXJpOiBgazhzOi8vJHtzY2hlbWFLZXl9LnNjaGVtYS5qc29uYCxcbiAgICAgIGZpbGVNYXRjaDogW3RoaXMubW9kZWxVcmldLFxuICAgICAgc2NoZW1hOiBmdWxsU2NoZW1hLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWdpc3RlcmVkU2NoZW1hcy5hZGQoc2NoZW1hS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDojrflj5YgTW9uYWNvIOe8lui+keWZqOWunuS+i1xuICAgKi9cbiAgZ2V0RWRpdG9ySW5zdGFuY2UoKTpcbiAgICB8IGltcG9ydCgnbW9uYWNvLWVkaXRvcicpLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3JcbiAgICB8IG51bGwge1xuICAgIGlmICghdGhpcy5tb25hY29FZGl0b3IgJiYgdGhpcy5jb2RlRWRpdG9yUmVmPy5lZGl0b3IpIHtcbiAgICAgIHRoaXMubW9uYWNvRWRpdG9yID0gdGhpcy5jb2RlRWRpdG9yUmVmLmVkaXRvcjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9uYWNvRWRpdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIOaJi+WKqOaKmOWPoCBtYW5hZ2VkRmllbGRzXG4gICAqL1xuICBmb2xkTWFuYWdlZEZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvckluc3RhbmNlKCk7XG4gICAgaWYgKGVkaXRvcikge1xuICAgICAgZm9sZE1hbmFnZWRGaWVsZHMoZWRpdG9yKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxhdWktY2FyZCAqbmdJZj1cImhhc1dyYXBwZXI7IGVsc2UgY29udGVudFwiPlxuICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGVudFwiIC8+XG48L2F1aS1jYXJkPlxuPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJ5YW1sLWVkaXRvci1jb250YWluZXJcIlxuICAgIFtjbGFzcy53aXRoLXNpZGViYXJdPVwic2hvd1NpZGViYXIkJCB8IGFzeW5jXCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJ5YW1sLWVkaXRvci1zZWN0aW9uXCI+XG4gICAgICA8YXVpLWNvZGUtZWRpdG9yXG4gICAgICAgICNjb2RlRWRpdG9yXG4gICAgICAgIG5hbWU9XCJ5YW1sXCJcbiAgICAgICAgW29yaWdpbmFsVmFsdWVdPVwib3JpZ2luYWxWYWx1ZVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxuICAgICAgICBbb3B0aW9uc109XCJvcHRpb25zXCJcbiAgICAgICAgW2FjdGlvbnNDb25maWddPVwiYWN0aW9uc0NvbmZpZ1wiXG4gICAgICAgIFttb2RlbFVyaV09XCJtb2RlbFVyaVwiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXIgYXVpQ29kZUVkaXRvclRvb2xiYXJSaWdodFNpZGU+XG4gICAgICAgICAgPCEtLSBTY2hlbWEg5oyJ6ZKu77ya5b2T5ZCv55So5L6n6L655qCP5pe25pi+56S6IC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGF1aUJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJzaWRlYmFyRW5hYmxlXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYXVpLWNvZGUtZWRpdG9yLXRvb2xiYXJfX2NvbnRyb2wtYnV0dG9uXCJcbiAgICAgICAgICAgIFt0eXBlXT1cIihzaG93U2lkZWJhciQkIHwgYXN5bmMpID8gJ3ByaW1hcnknIDogJ3RleHQnXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhKGZpbmFsU2NoZW1hJCB8IGFzeW5jKVwiXG4gICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVNpZGViYXIoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiXG4gICAgICAgICAgICAgIChmaW5hbFNjaGVtYSQgfCBhc3luYykgPyAnJyA6ICgnc2NoZW1hX25vdF9hdmFpbGFibGUnIHwgdHJhbnNsYXRlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8YXVpLWljb25cbiAgICAgICAgICAgICAgW2ljb25dPVwiXG4gICAgICAgICAgICAgICAgKHNob3dTaWRlYmFyJCQgfCBhc3luYylcbiAgICAgICAgICAgICAgICAgID8gJ3Byb2Q6ZXhwYW5kX3NpZGViYXInXG4gICAgICAgICAgICAgICAgICA6ICdwcm9kOmNvbGxhcHNlX3NpZGViYXInXG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9hdWktaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2F1aS1jb2RlLWVkaXRvcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cInlhbWwtc2lkZWJhci1zZWN0aW9uXCJcbiAgICAgICpuZ0lmPVwic2hvd1NpZGViYXIkJCB8IGFzeW5jXCJcbiAgICA+XG4gICAgICA8YWNsLXJlc291cmNlLXlhbWwtc2lkZWJhclxuICAgICAgICBbcmVzb3VyY2VdPVwiZ2V0Q3VycmVudFJlc291cmNlKClcIlxuICAgICAgICBbc2NoZW1hXT1cImZpbmFsU2NoZW1hJCB8IGFzeW5jXCJcbiAgICAgICAgW3NjaGVtYUVuYWJsZV09XCJzY2hlbWFFbmFibGVcIlxuICAgICAgICBbZXhhbXBsZUVuYWJsZV09XCJleGFtcGxlRW5hYmxlXCJcbiAgICAgICAgW2V4dHJhRXhhbXBsZXNdPVwiZXh0cmFFeGFtcGxlc1wiXG4gICAgICAgIChjbG9zZSk9XCJ0b2dnbGVTaWRlYmFyKClcIlxuICAgICAgICAodHJ5WWFtbCk9XCJvblRyeVlhbWwoJGV2ZW50KVwiXG4gICAgICA+PC9hY2wtcmVzb3VyY2UteWFtbC1zaWRlYmFyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=