@alauda-fe/common 1.4.28-beta.0 → 1.4.28-beta.2

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 (169) 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 +64 -6
  5. package/code/resource-yaml-display/schema/component.d.ts +61 -0
  6. package/code/resource-yaml-editor/component.d.ts +95 -0
  7. package/code/yaml-examples.d.ts +8 -0
  8. package/code/yaml-sidebar/component.d.ts +57 -0
  9. package/code/yaml-sidebar/types.d.ts +21 -0
  10. package/code/yaml-sidebar/yaml-examples.d.ts +8 -0
  11. package/core/directives/scroll-to-first-invalid.directive.d.ts +1 -1
  12. package/core/services/kubernetes-schema.service.d.ts +44 -0
  13. package/core/services/public-api.d.ts +1 -0
  14. package/core/types/openapi.d.ts +37 -0
  15. package/core/types/public-api.d.ts +1 -0
  16. package/esm2022/abnormal-page/abnormal-page.component.mjs +1 -1
  17. package/esm2022/array-form-table/form/component.mjs +1 -1
  18. package/esm2022/array-form-table/key-value-form/component.mjs +1 -1
  19. package/esm2022/array-form-table/key-value-table/component.mjs +1 -1
  20. package/esm2022/array-form-table/string-array-form/component.mjs +1 -1
  21. package/esm2022/async-data/error-page/component.mjs +1 -1
  22. package/esm2022/async-data/page-state/component.mjs +1 -1
  23. package/esm2022/business/notification-disabled-container/component.mjs +1 -1
  24. package/esm2022/business/resource-select/exports/cluster-list/component.mjs +1 -1
  25. package/esm2022/business/resource-select/exports/cluster-selector/component.mjs +1 -1
  26. package/esm2022/business/resource-select/exports/icon/component.mjs +1 -1
  27. package/esm2022/business/resource-select/exports/mesh-group-selector/component.mjs +1 -1
  28. package/esm2022/business/resource-select/exports/namespace-list/component.mjs +1 -1
  29. package/esm2022/business/resource-select/exports/namespace-page/component.mjs +1 -1
  30. package/esm2022/business/resource-select/exports/namespace-selector/component.mjs +1 -1
  31. package/esm2022/business/resource-select/exports/project-list/component.mjs +1 -1
  32. package/esm2022/business/resource-select/exports/project-page/component.mjs +1 -1
  33. package/esm2022/business/resource-select/exports/project-selector/component.mjs +1 -1
  34. package/esm2022/business/resource-select/internals/data-grid/component.mjs +1 -1
  35. package/esm2022/business/resource-select/internals/meshgroup-list/component.mjs +1 -1
  36. package/esm2022/business/resource-select/internals/no-data/component.mjs +1 -1
  37. package/esm2022/business/resource-select/internals/resource-dashboard/component.mjs +1 -1
  38. package/esm2022/business/resource-select/internals/selector-popup/component.mjs +1 -1
  39. package/esm2022/chart/common/axis/axis-label.component.mjs +1 -1
  40. package/esm2022/chart/common/axis/x-axis-ticks.component.mjs +1 -1
  41. package/esm2022/chart/common/axis/x-axis.component.mjs +1 -1
  42. package/esm2022/chart/common/axis/x-plot-lines.component.mjs +1 -1
  43. package/esm2022/chart/common/axis/y-axis-ticks.component.mjs +1 -1
  44. package/esm2022/chart/common/axis/y-axis.component.mjs +1 -1
  45. package/esm2022/chart/common/axis/y-plot-lines.component.mjs +1 -1
  46. package/esm2022/chart/common/chart/chart.component.mjs +1 -1
  47. package/esm2022/chart/common/legend/legend.component.mjs +1 -1
  48. package/esm2022/chart/common/range-area/range-area.component.mjs +1 -1
  49. package/esm2022/chart/common/reference-area/reference-area.component.mjs +1 -1
  50. package/esm2022/chart/common/series/area-series.component.mjs +1 -1
  51. package/esm2022/chart/common/series/bar-path.component.mjs +1 -1
  52. package/esm2022/chart/common/series/bar-series.component.mjs +1 -1
  53. package/esm2022/chart/common/series/line-series.component.mjs +1 -1
  54. package/esm2022/chart/common/tooltip/tooltip.component.mjs +1 -1
  55. package/esm2022/chart/custom-template/dropdown-legend.mjs +1 -1
  56. package/esm2022/code/code-display-dialog/component.mjs +1 -1
  57. package/esm2022/code/code-editor-configs.mjs +12 -2
  58. package/esm2022/code/k8s-yaml-display-dialog/component.mjs +1 -1
  59. package/esm2022/code/managed-fields-folder.util.mjs +136 -0
  60. package/esm2022/code/public-api.mjs +5 -1
  61. package/esm2022/code/resource-yaml-display/component.mjs +254 -43
  62. package/esm2022/code/resource-yaml-display/schema/component.mjs +531 -0
  63. package/esm2022/code/resource-yaml-editor/component.mjs +387 -0
  64. package/esm2022/code/yaml-examples.mjs +337 -0
  65. package/esm2022/code/yaml-sidebar/component.mjs +482 -0
  66. package/esm2022/code/yaml-sidebar/types.mjs +2 -0
  67. package/esm2022/code/yaml-sidebar/yaml-examples.mjs +340 -0
  68. package/esm2022/core/components/tree/node/component.mjs +1 -1
  69. package/esm2022/core/components/tree/tree/component.mjs +1 -1
  70. package/esm2022/core/directives/readonly-field.directive.mjs +1 -1
  71. package/esm2022/core/services/kubernetes-schema.service.mjs +129 -0
  72. package/esm2022/core/services/public-api.mjs +2 -1
  73. package/esm2022/core/services/workspace-helper.service.mjs +4 -3
  74. package/esm2022/core/types/openapi.mjs +2 -0
  75. package/esm2022/core/types/public-api.mjs +2 -1
  76. package/esm2022/custom-columns-setting/component.mjs +1 -1
  77. package/esm2022/disabled-container/disabled-container.component.mjs +1 -1
  78. package/esm2022/editable/editable.component.mjs +1 -1
  79. package/esm2022/editable-text/component.mjs +1 -1
  80. package/esm2022/exec/placeholder/component.mjs +1 -1
  81. package/esm2022/exec/terminal/component.mjs +1 -1
  82. package/esm2022/exec/terminal-group/component.mjs +1 -1
  83. package/esm2022/feature-gate-forbidden/component/component.mjs +1 -1
  84. package/esm2022/form/errors-mapper/errors-mapper-component/component.mjs +1 -1
  85. package/esm2022/form/errors-mapper/errors-mapper.directive.mjs +1 -1
  86. package/esm2022/form/labels-editor/component.mjs +1 -1
  87. package/esm2022/form/taints-editor/component.mjs +1 -1
  88. package/esm2022/form/upload-file/component.mjs +1 -1
  89. package/esm2022/form/validators/strong-password/strong-password-tooltip/component.mjs +1 -1
  90. package/esm2022/graph-canvas/components/graph-actions.component.mjs +1 -1
  91. package/esm2022/graph-canvas/components/graph-canvas.component.mjs +1 -1
  92. package/esm2022/graph-canvas/components/graph-link.component.mjs +1 -1
  93. package/esm2022/graph-canvas/components/graph-links.component.mjs +1 -1
  94. package/esm2022/grid-layout/components/grid/component.mjs +1 -1
  95. package/esm2022/grid-layout/components/grid-items/component.mjs +1 -1
  96. package/esm2022/help-document/component.mjs +1 -1
  97. package/esm2022/k8s-resource-list/footer/component.mjs +1 -1
  98. package/esm2022/k8s-shared/resource-mark/k8s-resource-mark.component.mjs +1 -1
  99. package/esm2022/k8s-shared/update-description-dialog/component.mjs +1 -1
  100. package/esm2022/k8s-shared/update-display-name-dialog/component.mjs +1 -1
  101. package/esm2022/k8s-shared/update-key-value-dialog/component.mjs +1 -1
  102. package/esm2022/lazy-component/lazy-load-component.mjs +1 -1
  103. package/esm2022/license/license-error/component.mjs +1 -1
  104. package/esm2022/list-display/component.mjs +1 -1
  105. package/esm2022/metric-chart/metric-chart.component.mjs +1 -1
  106. package/esm2022/metric-chart/metric-time-pick.mjs +1 -1
  107. package/esm2022/multi-search/action-input/component.mjs +1 -1
  108. package/esm2022/multi-search/form/component.mjs +1 -1
  109. package/esm2022/multi-search/multi-search-tags/component.mjs +1 -1
  110. package/esm2022/mutable/mosaic/mosaic.component.mjs +1 -1
  111. package/esm2022/notification/feedback-notification/component.mjs +1 -1
  112. package/esm2022/overview-banner/overview-banner.component.mjs +1 -1
  113. package/esm2022/page-guard/component/component.mjs +1 -1
  114. package/esm2022/page-scaffold/navigation/breadcrumb/breadcrumb.component.mjs +1 -1
  115. package/esm2022/page-scaffold/navigation/nav-menu/nav-item-li/nav-item-li.component.mjs +1 -1
  116. package/esm2022/page-scaffold/navigation/nav-menu/nav-item-ul/nav-item-ul.component.mjs +1 -1
  117. package/esm2022/page-scaffold/navigation/nav-menu/nav-menu.component.mjs +1 -1
  118. package/esm2022/page-scaffold/page/notices/maintenance.component.mjs +1 -1
  119. package/esm2022/page-scaffold/page/notices/notice.component.mjs +1 -1
  120. package/esm2022/page-scaffold/page/page.component.mjs +1 -1
  121. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +1 -1
  122. package/esm2022/page-scaffold/page-header/common-layout/namespace-select/component.mjs +1 -1
  123. package/esm2022/page-scaffold/page-header/common-layout/product-select/component.mjs +1 -1
  124. package/esm2022/page-scaffold/page-header/component.mjs +1 -1
  125. package/esm2022/page-scaffold/page-header/enterprise-support-status/component.mjs +1 -1
  126. package/esm2022/page-scaffold/page-header/header-notify/component/header-notify.component.mjs +1 -1
  127. package/esm2022/page-scaffold/page-header/header-notify/component/notification-list/notification-list.component.mjs +1 -1
  128. package/esm2022/page-scaffold/page-header/help-menu/component/component.mjs +1 -1
  129. package/esm2022/pie-derivative-chart/donut-status/component.mjs +1 -1
  130. package/esm2022/pie-derivative-chart/radial-bar/radial-bar-chart.component.mjs +1 -1
  131. package/esm2022/pod-status/component.mjs +1 -1
  132. package/esm2022/searchable-selector/component.mjs +1 -1
  133. package/esm2022/skeleton/item/component.mjs +1 -1
  134. package/esm2022/skeleton/nav-skeleton/component.mjs +1 -1
  135. package/esm2022/table/component.mjs +1 -1
  136. package/esm2022/view-chart/custom-template/dropdown-legend.mjs +1 -1
  137. package/esm2022/view-chart/legend/legend.component.mjs +1 -1
  138. package/esm2022/view-chart/view-chart.component.mjs +1 -1
  139. package/esm2022/view-zchart/custom-template/dropdown-legend.mjs +1 -1
  140. package/esm2022/view-zchart/legend/legend.component.mjs +1 -1
  141. package/esm2022/view-zchart/view-zchart.component.mjs +1 -1
  142. package/esm2022/widget/card-section/card-section.component.mjs +1 -1
  143. package/esm2022/widget/confirm-delete/confirm-delete.component.mjs +1 -1
  144. package/esm2022/widget/current-time/component.mjs +1 -1
  145. package/esm2022/widget/date-range-picker/component.mjs +1 -1
  146. package/esm2022/widget/field-set/column/component.mjs +2 -2
  147. package/esm2022/widget/field-set/group/component.mjs +1 -1
  148. package/esm2022/widget/field-set/item/component.mjs +1 -1
  149. package/esm2022/widget/foldable-block/component.mjs +1 -1
  150. package/esm2022/widget/foldable-item-in-table/component.mjs +1 -1
  151. package/esm2022/widget/loading-mask/loading-mask.component.mjs +1 -1
  152. package/esm2022/widget/password-input/component.mjs +1 -1
  153. package/esm2022/widget/relative-time/component.mjs +1 -1
  154. package/esm2022/widget/resource-label/component.mjs +1 -1
  155. package/esm2022/widget/resource-multi-select/component.mjs +1 -1
  156. package/esm2022/widget/search-panel/component.mjs +1 -1
  157. package/esm2022/widget/search-panel/search-item/component.mjs +1 -1
  158. package/esm2022/widget/status-icon/status-icon.component.mjs +1 -1
  159. package/esm2022/widget/tags-label/component.mjs +1 -1
  160. package/esm2022/widget/terminating-tag/component.mjs +1 -1
  161. package/esm2022/widget/text-ellipsis/component.mjs +1 -1
  162. package/esm2022/widget/text-with-url/component.mjs +1 -1
  163. package/esm2022/widget/zero-state/zero-state.component.mjs +1 -1
  164. package/esm2022/workload-status-icon/component.mjs +1 -1
  165. package/esm2022/xterm/xterm-terminal/xterm-terminal.component.mjs +1 -1
  166. package/esm2022/xterm/xterm.component.mjs +1 -1
  167. package/package.json +2 -2
  168. package/styles/global.scss +4 -0
  169. package/table/component.d.ts +1 -1
@@ -0,0 +1,387 @@
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
+ this.hasFolded = false;
127
+ /**
128
+ * 自动获取的 schema,当没有手动提供 schema 时使用
129
+ */
130
+ this.autoSchema$ = this.resource$.pipe(switchMap(resource => {
131
+ if (!resource) {
132
+ return of(null);
133
+ }
134
+ const firstResource = (Array.isArray(resource) ? resource[0] : resource);
135
+ if (!firstResource?.apiVersion || !firstResource?.kind) {
136
+ return of(null);
137
+ }
138
+ return this.schemaService.getResourceSchema(firstResource.apiVersion, firstResource.kind);
139
+ }), publishRef());
140
+ /**
141
+ * 最终使用的 schema,优先使用手动提供的,否则使用自动获取的
142
+ */
143
+ this.finalSchema$ = combineLatest([this.schema$, this.autoSchema$]).pipe(map(([manualSchema, autoSchema]) => manualSchema || autoSchema), distinctUntilChanged(), shareReplay(1));
144
+ this.yamlSchemaService =
145
+ this.monacoLanguageService.getLanguageSchemaService(['yaml', 'yamlDefaults'], yamlDefaults);
146
+ // 自动设置 schema
147
+ combineLatest([this.resource$, this.finalSchema$])
148
+ .pipe(takeUntil(this.destroy$))
149
+ .subscribe(([resource, schema]) => {
150
+ if (resource && schema) {
151
+ const firstResource = Array.isArray(resource)
152
+ ? resource[0]
153
+ : resource;
154
+ if (firstResource && !Array.isArray(firstResource)) {
155
+ this.setYamlSchema(firstResource, schema);
156
+ }
157
+ }
158
+ });
159
+ this.autoSchema$.pipe(takeUntil(this.destroy$)).subscribe();
160
+ }
161
+ ngAfterViewInit() {
162
+ // 监听 YAML 内容变化,自动折叠 managedFields
163
+ if (this.autoFoldManagedFields && this.schemaService.definitions) {
164
+ this.selfFoldManagedFields();
165
+ }
166
+ }
167
+ selfFoldManagedFields() {
168
+ if (this.hasFolded) {
169
+ return;
170
+ }
171
+ this.hasFolded = true;
172
+ setTimeout(() => {
173
+ const editor = this.getEditorInstance();
174
+ if (editor) {
175
+ foldManagedFields(editor);
176
+ }
177
+ }, 0);
178
+ }
179
+ get value() {
180
+ return this._value;
181
+ }
182
+ set value(val) {
183
+ this._value = val;
184
+ this.onChange(val);
185
+ this.onTouched();
186
+ }
187
+ // ControlValueAccessor implementation
188
+ writeValue(value) {
189
+ this._value = value || '';
190
+ }
191
+ registerOnChange(fn) {
192
+ this.onChange = fn;
193
+ }
194
+ registerOnTouched(fn) {
195
+ this.onTouched = fn;
196
+ }
197
+ toggleSidebar() {
198
+ this.showSidebar$$.next(!this.showSidebar$$.value);
199
+ }
200
+ toggleDebugInfo() {
201
+ this.showDebugPanel$$.next(!this.showDebugPanel$$.value);
202
+ }
203
+ getCurrentResource() {
204
+ const resource = this.resource;
205
+ if (Array.isArray(resource)) {
206
+ return resource.length > 0 ? resource[0] : null;
207
+ }
208
+ return resource || null;
209
+ }
210
+ getCurrentSchema() {
211
+ return this.schema || null;
212
+ }
213
+ getDebugInfo() {
214
+ const resource = this.getCurrentResource();
215
+ return {
216
+ hasResource: !!resource,
217
+ resourceApiVersion: resource?.apiVersion,
218
+ resourceKind: resource?.kind,
219
+ hasManualSchema: !!this.schema,
220
+ workspaceHelperAvailable: this.schemaService.isWorkspaceHelperAvailable(),
221
+ currentWorkspace: this.schemaService.workspaceHelper?.baseParamsSnapshot,
222
+ };
223
+ }
224
+ onTryYaml(yamlContent) {
225
+ let targetYaml = yamlContent;
226
+ const namespace = this.schemaService.workspaceHelper?.baseParamsSnapshot?.namespace;
227
+ if (this.autoFillNamespace && namespace) {
228
+ targetYaml = parseAll(yamlContent)
229
+ .filter(r => !!r)
230
+ .map((r) => {
231
+ if (!r?.metadata?.namespace) {
232
+ return {
233
+ ...r,
234
+ metadata: {
235
+ ...r.metadata,
236
+ namespace,
237
+ },
238
+ };
239
+ }
240
+ return r;
241
+ })
242
+ .map(r => stringify(r, { sortMapEntries: true }))
243
+ .join('---\r\n');
244
+ }
245
+ this.tryYaml.emit(targetYaml);
246
+ }
247
+ /**
248
+ * 设置 YAML schema 以提供 hover 提示和自动完成
249
+ */
250
+ setYamlSchema(resource, schema) {
251
+ if (!schema) {
252
+ return;
253
+ }
254
+ // 使用 apiVersion + kind 组合作为标识
255
+ const apiVersion = resource?.apiVersion || 'unknown';
256
+ const kind = resource?.kind || 'unknown';
257
+ const schemaKey = `${apiVersion}/${kind}`;
258
+ this.modelUri = `${schemaKey}.yaml`;
259
+ this.selfFoldManagedFields();
260
+ // 检查是否已经注册过相同的 schema,避免重复注册
261
+ if (this.registeredSchemas.has(schemaKey)) {
262
+ return;
263
+ }
264
+ // 获取完整的 definitions 以支持 $ref 引用
265
+ const definitions = this.schemaService.definitions || {};
266
+ // 创建包含完整 definitions 的 schema 对象
267
+ const fullSchema = {
268
+ ...schema,
269
+ definitions,
270
+ };
271
+ // 确保schema被正确注册,并启用自动完成功能
272
+ this.yamlSchemaService.addSchema({
273
+ uri: `k8s://${schemaKey}.schema.json`,
274
+ fileMatch: [this.modelUri],
275
+ schema: fullSchema,
276
+ });
277
+ this.registeredSchemas.add(schemaKey);
278
+ }
279
+ /**
280
+ * 获取 Monaco 编辑器实例
281
+ */
282
+ getEditorInstance() {
283
+ if (!this.monacoEditor && this.codeEditorRef?.editor) {
284
+ this.monacoEditor = this.codeEditorRef.editor;
285
+ }
286
+ return this.monacoEditor;
287
+ }
288
+ /**
289
+ * 手动折叠 managedFields
290
+ */
291
+ foldManagedFields() {
292
+ const editor = this.getEditorInstance();
293
+ if (editor) {
294
+ foldManagedFields(editor);
295
+ }
296
+ }
297
+ ngOnDestroy() {
298
+ this.destroy$.next();
299
+ this.destroy$.complete();
300
+ }
301
+ static { this.ɵfac = function ResourceYamlEditorComponent_Factory(t) { return new (t || ResourceYamlEditorComponent)(i0.ɵɵdirectiveInject(i1.YamlUtilService), i0.ɵɵdirectiveInject(i2.KubernetesSchemaService), i0.ɵɵdirectiveInject(i3.MonacoLanguageService)); }; }
302
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ResourceYamlEditorComponent, selectors: [["acl-resource-yaml-editor"]], viewQuery: function ResourceYamlEditorComponent_Query(rf, ctx) { if (rf & 1) {
303
+ i0.ɵɵviewQuery(_c0, 5);
304
+ } if (rf & 2) {
305
+ let _t;
306
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.codeEditorRef = _t.first);
307
+ } }, 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([
308
+ {
309
+ provide: NG_VALUE_ACCESSOR,
310
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
311
+ multi: true,
312
+ },
313
+ ]), 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) {
314
+ 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);
315
+ } if (rf & 2) {
316
+ const content_r1 = i0.ɵɵreference(2);
317
+ i0.ɵɵproperty("ngIf", ctx.hasWrapper)("ngIfElse", content_r1);
318
+ } }, dependencies: [i4.CardComponent, NgIf,
319
+ FormsModule, i5.NgControlStatus, i5.NgModel, ButtonModule,
320
+ CodeEditorModule, i3.CodeEditorComponent, i6.TranslatePipe, AsyncPipe,
321
+ NgTemplateOutlet,
322
+ ResourceYamlSidebarComponent,
323
+ 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 }); }
324
+ }
325
+ __decorate([
326
+ ObservableInput(),
327
+ __metadata("design:type", Observable)
328
+ ], ResourceYamlEditorComponent.prototype, "resource$", void 0);
329
+ __decorate([
330
+ ObservableInput(),
331
+ __metadata("design:type", Observable)
332
+ ], ResourceYamlEditorComponent.prototype, "schema$", void 0);
333
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ResourceYamlEditorComponent, [{
334
+ type: Component,
335
+ args: [{ selector: 'acl-resource-yaml-editor', preserveWhitespaces: false, standalone: true, imports: [
336
+ CARD_MODULE,
337
+ NgIf,
338
+ FormsModule,
339
+ CHECKBOX_MODULE,
340
+ ButtonModule,
341
+ CodeEditorModule,
342
+ TRANSLATE_MODULE,
343
+ AsyncPipe,
344
+ NgTemplateOutlet,
345
+ ResourceYamlSidebarComponent,
346
+ IconModule,
347
+ ], providers: [
348
+ {
349
+ provide: NG_VALUE_ACCESSOR,
350
+ useExisting: forwardRef(() => ResourceYamlEditorComponent),
351
+ multi: true,
352
+ },
353
+ ], 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"] }]
354
+ }], () => [{ type: i1.YamlUtilService }, { type: i2.KubernetesSchemaService }, { type: i3.MonacoLanguageService }], { codeEditorRef: [{
355
+ type: ViewChild,
356
+ args: ['codeEditor', { static: false }]
357
+ }], hasWrapper: [{
358
+ type: Input
359
+ }], showDebugInfo: [{
360
+ type: Input
361
+ }], sidebarEnable: [{
362
+ type: Input
363
+ }], schema: [{
364
+ type: Input
365
+ }], schemaEnable: [{
366
+ type: Input
367
+ }], exampleEnable: [{
368
+ type: Input
369
+ }], resource: [{
370
+ type: Input
371
+ }], autoFoldManagedFields: [{
372
+ type: Input
373
+ }], originalValue: [{
374
+ type: Input
375
+ }], options: [{
376
+ type: Input
377
+ }], actionsConfig: [{
378
+ type: Input
379
+ }], tryYaml: [{
380
+ type: Output
381
+ }], resource$: [], schema$: [], autoFillNamespace: [{
382
+ type: Input
383
+ }], extraExamples: [{
384
+ type: Input
385
+ }] }); })();
386
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ResourceYamlEditorComponent, { className: "ResourceYamlEditorComponent" }); })();
387
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvZGUvcmVzb3VyY2UteWFtbC1lZGl0b3IvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUVoQixxQkFBcUIsR0FDdEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsV0FBVyxFQUNYLGVBQWUsRUFDZixZQUFZLEVBQ1osVUFBVSxHQUNYLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEUsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsR0FHWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsV0FBVyxFQUNYLGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDM0MsT0FBTyxFQUNMLGVBQWUsRUFDZixhQUFhLEVBQ2IsVUFBVSxFQUNWLEdBQUcsRUFDSCxvQkFBb0IsRUFDcEIsRUFBRSxFQUNGLFNBQVMsRUFDVCxXQUFXLEVBQ1gsU0FBUyxFQUNULE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUl4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFD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SU4sYUFBYTtrQkFEWixLQUFLOztrRkFoRkssMkJBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29kZUVkaXRvck1vZHVsZSxcbiAgTGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlLFxuICBNb25hY29MYW5ndWFnZVNlcnZpY2UsXG59IGZyb20gJ0BhbGF1ZGEvY29kZS1lZGl0b3InO1xuaW1wb3J0IHtcbiAgQ0FSRF9NT0RVTEUsXG4gIENIRUNLQk9YX01PRFVMRSxcbiAgQnV0dG9uTW9kdWxlLFxuICBJY29uTW9kdWxlLFxufSBmcm9tICdAYWxhdWRhL3VpJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZixcbiAgT25EZXN0cm95LFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3Jtc01vZHVsZSxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IHlhbWxEZWZhdWx0cyB9IGZyb20gJ21vbmFjby15YW1sJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgbWFwLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgb2YsXG4gIHN3aXRjaE1hcCxcbiAgc2hhcmVSZXBsYXksXG4gIHRha2VVbnRpbCxcbiAgU3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEt1YmVybmV0ZXNTY2hlbWFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9rdWJlcm5ldGVzLXNjaGVtYS5zZXJ2aWNlJztcbmltcG9ydCB7IFlhbWxVdGlsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMveWFtbC11dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXJyYXlhYmxlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9oZWxwZXJzJztcbmltcG9ydCB7IEt1YmVybmV0ZXNSZXNvdXJjZSB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvazhzL2NvcmUnO1xuaW1wb3J0IHsgT3BlbkFQSVYzU2NoZW1hT2JqZWN0IH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zY2hlbWEnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZUlucHV0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9kZWNvcmF0b3JzJztcbmltcG9ydCB7IHB1Ymxpc2hSZWYgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBwYXJzZUFsbCwgc3RyaW5naWZ5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy95YW1sJztcbmltcG9ydCB7IFRSQU5TTEFURV9NT0RVTEUgfSBmcm9tICcuLi8uLi90cmFuc2xhdGUvdHJhbnNsYXRlLm1vZHVsZSc7XG5pbXBvcnQgeyB1cGRhdGVBY3Rpb25zLCB5YW1sV3JpdGVNaW5pbWFwT3B0aW9ucyB9IGZyb20gJy4uL2NvZGUtZWRpdG9yLWNvbmZpZ3MnO1xuaW1wb3J0IHtcbiAgZm9sZE1hbmFnZWRGaWVsZHMsXG4gIEVkaXRvckluc3RhbmNlUHJvdmlkZXIsXG59IGZyb20gJy4uL21hbmFnZWQtZmllbGRzLWZvbGRlci51dGlsJztcbmltcG9ydCB7IFJlc291cmNlWWFtbFNpZGViYXJDb21wb25lbnQgfSBmcm9tICcuLi95YW1sLXNpZGViYXIvY29tcG9uZW50JztcbmltcG9ydCB7IFlhbWxFeGFtcGxlIH0gZnJvbSAnLi4veWFtbC1zaWRlYmFyL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLXJlc291cmNlLXlhbWwtZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICd0ZW1wbGF0ZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3N0eWxlcy5zY3NzJ10sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ0FSRF9NT0RVTEUsXG4gICAgTmdJZixcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBDSEVDS0JPWF9NT0RVTEUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENvZGVFZGl0b3JNb2R1bGUsXG4gICAgVFJBTlNMQVRFX01PRFVMRSxcbiAgICBBc3luY1BpcGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBSZXNvdXJjZVlhbWxTaWRlYmFyQ29tcG9uZW50LFxuICAgIEljb25Nb2R1bGUsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmVzb3VyY2VZYW1sRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVlhbWxFZGl0b3JDb21wb25lbnQ8VCBleHRlbmRzIEt1YmVybmV0ZXNSZXNvdXJjZT5cbiAgaW1wbGVtZW50c1xuICAgIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICAgIE9uRGVzdHJveSxcbiAgICBFZGl0b3JJbnN0YW5jZVByb3ZpZGVyLFxuICAgIEFmdGVyVmlld0luaXRcbntcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG4gIHByaXZhdGUgX29yaWdpbmFsVmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfdmFsdWU6IHN0cmluZykgPT4ge1xuICAgIC8vIFBsYWNlaG9sZGVyIGZvciBmb3JtIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrXG4gIH07XG5cbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZvcm0gY29udHJvbCB0b3VjaGVkIGNhbGxiYWNrXG4gIH07XG5cbiAgc2hvd1NpZGViYXIkJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBzaG93RGVidWdQYW5lbCQkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgbW9kZWxVcmk6IHN0cmluZztcbiAgcHJpdmF0ZSB5YW1sU2NoZW1hU2VydmljZTogTGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlO1xuICBwcml2YXRlIG1vbmFjb0VkaXRvcjogYW55ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWdpc3RlcmVkU2NoZW1hcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NvZGVFZGl0b3InLCB7IHN0YXRpYzogZmFsc2UgfSlcbiAgcHJpdmF0ZSBjb2RlRWRpdG9yUmVmOiBhbnk7XG5cbiAgQElucHV0KClcbiAgaGFzV3JhcHBlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgc2hvd0RlYnVnSW5mbyA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHNpZGViYXJFbmFibGUgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0O1xuXG4gIEBJbnB1dCgpXG4gIHNjaGVtYUVuYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgZXhhbXBsZUVuYWJsZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcmVzb3VyY2U6IEFycmF5YWJsZTxUPjtcblxuICBASW5wdXQoKVxuICBhdXRvRm9sZE1hbmFnZWRGaWVsZHMgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBvcmlnaW5hbFZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9vcmlnaW5hbFZhbHVlID0gdmFsdWUgfHwgJyc7XG4gIH1cblxuICBnZXQgb3JpZ2luYWxWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9vcmlnaW5hbFZhbHVlO1xuICB9XG5cbiAgQElucHV0KClcbiAgb3B0aW9ucyA9IHlhbWxXcml0ZU1pbmltYXBPcHRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIGFjdGlvbnNDb25maWcgPSB1cGRhdGVBY3Rpb25zO1xuXG4gIEBPdXRwdXQoKVxuICB0cnlZYW1sID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE9ic2VydmFibGVJbnB1dCgpXG4gIHJlYWRvbmx5IHJlc291cmNlJCE6IE9ic2VydmFibGU8QXJyYXlhYmxlPFQ+PjtcblxuICBAT2JzZXJ2YWJsZUlucHV0KClcbiAgcmVhZG9ubHkgc2NoZW1hJCE6IE9ic2VydmFibGU8T3BlbkFQSVYzU2NoZW1hT2JqZWN0PjtcblxuICBASW5wdXQoKVxuICBhdXRvRmlsbE5hbWVzcGFjZSA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgZXh0cmFFeGFtcGxlczogWWFtbEV4YW1wbGVbXTtcblxuICBoYXNGb2xkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog6Ieq5Yqo6I635Y+W55qEIHNjaGVtYe+8jOW9k+ayoeacieaJi+WKqOaPkOS+myBzY2hlbWEg5pe25L2/55SoXG4gICAqL1xuICBhdXRvU2NoZW1hJCA9IHRoaXMucmVzb3VyY2UkLnBpcGUoXG4gICAgc3dpdGNoTWFwKHJlc291cmNlID0+IHtcbiAgICAgIGlmICghcmVzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaXJzdFJlc291cmNlID0gKFxuICAgICAgICBBcnJheS5pc0FycmF5KHJlc291cmNlKSA/IHJlc291cmNlWzBdIDogcmVzb3VyY2VcbiAgICAgICkgYXMgVDtcbiAgICAgIGlmICghZmlyc3RSZXNvdXJjZT8uYXBpVmVyc2lvbiB8fCAhZmlyc3RSZXNvdXJjZT8ua2luZCkge1xuICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0UmVzb3VyY2VTY2hlbWEoXG4gICAgICAgIGZpcnN0UmVzb3VyY2UuYXBpVmVyc2lvbixcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5raW5kLFxuICAgICAgKTtcbiAgICB9KSxcbiAgICBwdWJsaXNoUmVmKCksXG4gICk7XG5cbiAgLyoqXG4gICAqIOacgOe7iOS9v+eUqOeahCBzY2hlbWHvvIzkvJjlhYjkvb/nlKjmiYvliqjmj5DkvpvnmoTvvIzlkKbliJnkvb/nlKjoh6rliqjojrflj5bnmoRcbiAgICovXG4gIGZpbmFsU2NoZW1hJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc2NoZW1hJCwgdGhpcy5hdXRvU2NoZW1hJF0pLnBpcGUoXG4gICAgbWFwKChbbWFudWFsU2NoZW1hLCBhdXRvU2NoZW1hXSkgPT4gbWFudWFsU2NoZW1hIHx8IGF1dG9TY2hlbWEpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSksXG4gICk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHlhbWxVdGlsOiBZYW1sVXRpbFNlcnZpY2UsXG4gICAgcHVibGljIHJlYWRvbmx5IHNjaGVtYVNlcnZpY2U6IEt1YmVybmV0ZXNTY2hlbWFTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9uYWNvTGFuZ3VhZ2VTZXJ2aWNlOiBNb25hY29MYW5ndWFnZVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMueWFtbFNjaGVtYVNlcnZpY2UgPVxuICAgICAgdGhpcy5tb25hY29MYW5ndWFnZVNlcnZpY2UuZ2V0TGFuZ3VhZ2VTY2hlbWFTZXJ2aWNlKFxuICAgICAgICBbJ3lhbWwnLCAneWFtbERlZmF1bHRzJ10sXG4gICAgICAgIHlhbWxEZWZhdWx0cyxcbiAgICAgICk7XG5cbiAgICAvLyDoh6rliqjorr7nva4gc2NoZW1hXG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5yZXNvdXJjZSQsIHRoaXMuZmluYWxTY2hlbWEkXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgIC5zdWJzY3JpYmUoKFtyZXNvdXJjZSwgc2NoZW1hXSkgPT4ge1xuICAgICAgICBpZiAocmVzb3VyY2UgJiYgc2NoZW1hKSB7XG4gICAgICAgICAgY29uc3QgZmlyc3RSZXNvdXJjZSA9IEFycmF5LmlzQXJyYXkocmVzb3VyY2UpXG4gICAgICAgICAgICA/IHJlc291cmNlWzBdXG4gICAgICAgICAgICA6IHJlc291cmNlO1xuICAgICAgICAgIGlmIChmaXJzdFJlc291cmNlICYmICFBcnJheS5pc0FycmF5KGZpcnN0UmVzb3VyY2UpKSB7XG4gICAgICAgICAgICB0aGlzLnNldFlhbWxTY2hlbWEoZmlyc3RSZXNvdXJjZSBhcyBULCBzY2hlbWEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLmF1dG9TY2hlbWEkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAvLyDnm5HlkKwgWUFNTCDlhoXlrrnlj5jljJbvvIzoh6rliqjmipjlj6AgbWFuYWdlZEZpZWxkc1xuICAgIGlmICh0aGlzLmF1dG9Gb2xkTWFuYWdlZEZpZWxkcyAmJiB0aGlzLnNjaGVtYVNlcnZpY2UuZGVmaW5pdGlvbnMpIHtcbiAgICAgIHRoaXMuc2VsZkZvbGRNYW5hZ2VkRmllbGRzKCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZkZvbGRNYW5hZ2VkRmllbGRzKCkge1xuICAgIGlmICh0aGlzLmhhc0ZvbGRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmhhc0ZvbGRlZCA9IHRydWU7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmdldEVkaXRvckluc3RhbmNlKCk7XG4gICAgICBpZiAoZWRpdG9yKSB7XG4gICAgICAgIGZvbGRNYW5hZ2VkRmllbGRzKGVkaXRvcik7XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBzZXQgdmFsdWUodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbDtcbiAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgfHwgJyc7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHRvZ2dsZVNpZGViYXIoKSB7XG4gICAgdGhpcy5zaG93U2lkZWJhciQkLm5leHQoIXRoaXMuc2hvd1NpZGViYXIkJC52YWx1ZSk7XG4gIH1cblxuICB0b2dnbGVEZWJ1Z0luZm8oKSB7XG4gICAgdGhpcy5zaG93RGVidWdQYW5lbCQkLm5leHQoIXRoaXMuc2hvd0RlYnVnUGFuZWwkJC52YWx1ZSk7XG4gIH1cblxuICBnZXRDdXJyZW50UmVzb3VyY2UoKTogVCB8IG51bGwge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvdXJjZSkpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZS5sZW5ndGggPiAwID8gcmVzb3VyY2VbMF0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gKHJlc291cmNlIGFzIFQpIHx8IG51bGw7XG4gIH1cblxuICBnZXRDdXJyZW50U2NoZW1hKCk6IE9wZW5BUElWM1NjaGVtYU9iamVjdCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYSB8fCBudWxsO1xuICB9XG5cbiAgZ2V0RGVidWdJbmZvKCkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5nZXRDdXJyZW50UmVzb3VyY2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzUmVzb3VyY2U6ICEhcmVzb3VyY2UsXG4gICAgICByZXNvdXJjZUFwaVZlcnNpb246IHJlc291cmNlPy5hcGlWZXJzaW9uLFxuICAgICAgcmVzb3VyY2VLaW5kOiByZXNvdXJjZT8ua2luZCxcbiAgICAgIGhhc01hbnVhbFNjaGVtYTogISF0aGlzLnNjaGVtYSxcbiAgICAgIHdvcmtzcGFjZUhlbHBlckF2YWlsYWJsZTogdGhpcy5zY2hlbWFTZXJ2aWNlLmlzV29ya3NwYWNlSGVscGVyQXZhaWxhYmxlKCksXG4gICAgICBjdXJyZW50V29ya3NwYWNlOiB0aGlzLnNjaGVtYVNlcnZpY2Uud29ya3NwYWNlSGVscGVyPy5iYXNlUGFyYW1zU25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIG9uVHJ5WWFtbCh5YW1sQ29udGVudDogc3RyaW5nKSB7XG4gICAgbGV0IHRhcmdldFlhbWwgPSB5YW1sQ29udGVudDtcblxuICAgIGNvbnN0IG5hbWVzcGFjZSA9XG4gICAgICB0aGlzLnNjaGVtYVNlcnZpY2Uud29ya3NwYWNlSGVscGVyPy5iYXNlUGFyYW1zU25hcHNob3Q/Lm5hbWVzcGFjZTtcblxuICAgIGlmICh0aGlzLmF1dG9GaWxsTmFtZXNwYWNlICYmIG5hbWVzcGFjZSkge1xuICAgICAgdGFyZ2V0WWFtbCA9IHBhcnNlQWxsKHlhbWxDb250ZW50KVxuICAgICAgICAuZmlsdGVyKHIgPT4gISFyKVxuICAgICAgICAubWFwKChyOiBLdWJlcm5ldGVzUmVzb3VyY2UpID0+IHtcbiAgICAgICAgICBpZiAoIXI/Lm1ldGFkYXRhPy5uYW1lc3BhY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLnIsXG4gICAgICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgLi4uci5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfSlcbiAgICAgICAgLm1hcChyID0+IHN0cmluZ2lmeShyLCB7IHNvcnRNYXBFbnRyaWVzOiB0cnVlIH0pKVxuICAgICAgICAuam9pbignLS0tXFxyXFxuJyk7XG4gICAgfVxuXG4gICAgdGhpcy50cnlZYW1sLmVtaXQodGFyZ2V0WWFtbCk7XG4gIH1cblxuICAvKipcbiAgICog6K6+572uIFlBTUwgc2NoZW1hIOS7peaPkOS+myBob3ZlciDmj5DnpLrlkozoh6rliqjlrozmiJBcbiAgICovXG4gIHNldFlhbWxTY2hlbWEocmVzb3VyY2U6IFQsIHNjaGVtYTogT3BlbkFQSVYzU2NoZW1hT2JqZWN0KSB7XG4gICAgaWYgKCFzY2hlbWEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDkvb/nlKggYXBpVmVyc2lvbiArIGtpbmQg57uE5ZCI5L2c5Li65qCH6K+GXG4gICAgY29uc3QgYXBpVmVyc2lvbiA9IHJlc291cmNlPy5hcGlWZXJzaW9uIHx8ICd1bmtub3duJztcbiAgICBjb25zdCBraW5kID0gcmVzb3VyY2U/LmtpbmQgfHwgJ3Vua25vd24nO1xuICAgIGNvbnN0IHNjaGVtYUtleSA9IGAke2FwaVZlcnNpb259LyR7a2luZH1gO1xuXG4gICAgdGhpcy5tb2RlbFVyaSA9IGAke3NjaGVtYUtleX0ueWFtbGA7XG5cbiAgICB0aGlzLnNlbGZGb2xkTWFuYWdlZEZpZWxkcygpO1xuXG4gICAgLy8g5qOA5p+l5piv5ZCm5bey57uP5rOo5YaM6L+H55u45ZCM55qEIHNjaGVtYe+8jOmBv+WFjemHjeWkjeazqOWGjFxuICAgIGlmICh0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzLmhhcyhzY2hlbWFLZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g6I635Y+W5a6M5pW055qEIGRlZmluaXRpb25zIOS7peaUr+aMgSAkcmVmIOW8leeUqFxuICAgIGNvbnN0IGRlZmluaXRpb25zID0gdGhpcy5zY2hlbWFTZXJ2aWNlLmRlZmluaXRpb25zIHx8IHt9O1xuXG4gICAgLy8g5Yib5bu65YyF5ZCr5a6M5pW0IGRlZmluaXRpb25zIOeahCBzY2hlbWEg5a+56LGhXG4gICAgY29uc3QgZnVsbFNjaGVtYSA9IHtcbiAgICAgIC4uLnNjaGVtYSxcbiAgICAgIGRlZmluaXRpb25zLFxuICAgIH07XG5cbiAgICAvLyDnoa7kv51zY2hlbWHooqvmraPnoa7ms6jlhozvvIzlubblkK/nlKjoh6rliqjlrozmiJDlip/og71cbiAgICB0aGlzLnlhbWxTY2hlbWFTZXJ2aWNlLmFkZFNjaGVtYSh7XG4gICAgICB1cmk6IGBrOHM6Ly8ke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gLFxuICAgICAgZmlsZU1hdGNoOiBbdGhpcy5tb2RlbFVyaV0sXG4gICAgICBzY2hlbWE6IGZ1bGxTY2hlbWEsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzLmFkZChzY2hlbWFLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIOiOt+WPliBNb25hY28g57yW6L6R5Zmo5a6e5L6LXG4gICAqL1xuICBnZXRFZGl0b3JJbnN0YW5jZSgpOlxuICAgIHwgaW1wb3J0KCdtb25hY28tZWRpdG9yJykuZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvclxuICAgIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1vbmFjb0VkaXRvciAmJiB0aGlzLmNvZGVFZGl0b3JSZWY/LmVkaXRvcikge1xuICAgICAgdGhpcy5tb25hY29FZGl0b3IgPSB0aGlzLmNvZGVFZGl0b3JSZWYuZWRpdG9yO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb25hY29FZGl0b3I7XG4gIH1cblxuICAvKipcbiAgICog5omL5Yqo5oqY5Y+gIG1hbmFnZWRGaWVsZHNcbiAgICovXG4gIGZvbGRNYW5hZ2VkRmllbGRzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZ2V0RWRpdG9ySW5zdGFuY2UoKTtcbiAgICBpZiAoZWRpdG9yKSB7XG4gICAgICBmb2xkTWFuYWdlZEZpZWxkcyhlZGl0b3IpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPGF1aS1jYXJkICpuZ0lmPVwiaGFzV3JhcHBlcjsgZWxzZSBjb250ZW50XCI+XG4gIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250ZW50XCIgLz5cbjwvYXVpLWNhcmQ+XG48bmctdGVtcGxhdGUgI2NvbnRlbnQ+XG4gIDxkaXZcbiAgICBjbGFzcz1cInlhbWwtZWRpdG9yLWNvbnRhaW5lclwiXG4gICAgW2NsYXNzLndpdGgtc2lkZWJhcl09XCJzaG93U2lkZWJhciQkIHwgYXN5bmNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cInlhbWwtZWRpdG9yLXNlY3Rpb25cIj5cbiAgICAgIDxhdWktY29kZS1lZGl0b3JcbiAgICAgICAgI2NvZGVFZGl0b3JcbiAgICAgICAgbmFtZT1cInlhbWxcIlxuICAgICAgICBbb3JpZ2luYWxWYWx1ZV09XCJvcmlnaW5hbFZhbHVlXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXG4gICAgICAgIFtvcHRpb25zXT1cIm9wdGlvbnNcIlxuICAgICAgICBbYWN0aW9uc0NvbmZpZ109XCJhY3Rpb25zQ29uZmlnXCJcbiAgICAgICAgW21vZGVsVXJpXT1cIm1vZGVsVXJpXCJcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBhdWlDb2RlRWRpdG9yVG9vbGJhclJpZ2h0U2lkZT5cbiAgICAgICAgICA8IS0tIFNjaGVtYSDmjInpkq7vvJrlvZPlkK/nlKjkvqfovrnmoI/ml7bmmL7npLogLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgYXVpQnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInNpZGViYXJFbmFibGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJhdWktY29kZS1lZGl0b3ItdG9vbGJhcl9fY29udHJvbC1idXR0b25cIlxuICAgICAgICAgICAgW3R5cGVdPVwiKHNob3dTaWRlYmFyJCQgfCBhc3luYykgPyAncHJpbWFyeScgOiAndGV4dCdcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiEoZmluYWxTY2hlbWEkIHwgYXN5bmMpXCJcbiAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigpXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCJcbiAgICAgICAgICAgICAgKGZpbmFsU2NoZW1hJCB8IGFzeW5jKSA/ICcnIDogKCdzY2hlbWFfbm90X2F2YWlsYWJsZScgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxhdWktaWNvblxuICAgICAgICAgICAgICBbaWNvbl09XCJcbiAgICAgICAgICAgICAgICAoc2hvd1NpZGViYXIkJCB8IGFzeW5jKVxuICAgICAgICAgICAgICAgICAgPyAncHJvZDpleHBhbmRfc2lkZWJhcidcbiAgICAgICAgICAgICAgICAgIDogJ3Byb2Q6Y29sbGFwc2Vfc2lkZWJhcidcbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L2F1aS1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvYXVpLWNvZGUtZWRpdG9yPlxuICAgIDwvZGl2PlxuICAgIDxkaXZcbiAgICAgIGNsYXNzPVwieWFtbC1zaWRlYmFyLXNlY3Rpb25cIlxuICAgICAgKm5nSWY9XCJzaG93U2lkZWJhciQkIHwgYXN5bmNcIlxuICAgID5cbiAgICAgIDxhY2wtcmVzb3VyY2UteWFtbC1zaWRlYmFyXG4gICAgICAgIFtyZXNvdXJjZV09XCJnZXRDdXJyZW50UmVzb3VyY2UoKVwiXG4gICAgICAgIFtzY2hlbWFdPVwiZmluYWxTY2hlbWEkIHwgYXN5bmNcIlxuICAgICAgICBbc2NoZW1hRW5hYmxlXT1cInNjaGVtYUVuYWJsZVwiXG4gICAgICAgIFtleGFtcGxlRW5hYmxlXT1cImV4YW1wbGVFbmFibGVcIlxuICAgICAgICBbZXh0cmFFeGFtcGxlc109XCJleHRyYUV4YW1wbGVzXCJcbiAgICAgICAgKGNsb3NlKT1cInRvZ2dsZVNpZGViYXIoKVwiXG4gICAgICAgICh0cnlZYW1sKT1cIm9uVHJ5WWFtbCgkZXZlbnQpXCJcbiAgICAgID48L2FjbC1yZXNvdXJjZS15YW1sLXNpZGViYXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==