@alauda-fe/common 1.4.6 → 1.4.8

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 (37) hide show
  1. package/api/project-api.service.d.ts +2 -0
  2. package/business/resource-select/{internals → exports}/icon/component.d.ts +1 -1
  3. package/business/resource-select/module.d.ts +16 -16
  4. package/business/resource-select/public-api.d.ts +4 -0
  5. package/core/types/k8s/core.d.ts +1 -2
  6. package/core/types/k8s/crd.d.ts +136 -36
  7. package/core/types/k8s/raw.d.ts +1 -0
  8. package/core/types/resource-definitions.d.ts +71 -1
  9. package/core/utils/operators.d.ts +5 -2
  10. package/esm2022/api/project-api.service.mjs +11 -1
  11. package/esm2022/business/resource-select/exports/cluster-list/component.mjs +75 -0
  12. package/esm2022/business/resource-select/{internals → exports}/icon/component.mjs +2 -2
  13. package/esm2022/business/resource-select/exports/namespace-list/component.mjs +477 -0
  14. package/esm2022/business/resource-select/exports/project-list/component.mjs +76 -0
  15. package/esm2022/business/resource-select/module.mjs +40 -39
  16. package/esm2022/business/resource-select/public-api.mjs +5 -1
  17. package/esm2022/core/constants/tokens.mjs +2 -2
  18. package/esm2022/core/types/k8s/core.mjs +1 -1
  19. package/esm2022/core/types/k8s/crd.mjs +10 -1
  20. package/esm2022/core/types/k8s/raw.mjs +2 -1
  21. package/esm2022/core/types/resource-definitions.mjs +36 -1
  22. package/esm2022/core/utils/operators.mjs +8 -2
  23. package/esm2022/grid-layout/components/grid/component.mjs +2 -2
  24. package/esm2022/page-scaffold/navigation/nav-menu/nav-menu.component.mjs +3 -3
  25. package/esm2022/page-scaffold/page-header/account-menu/component/component.mjs +47 -56
  26. package/esm2022/page-scaffold/page-header/account-menu/module.mjs +4 -5
  27. package/esm2022/page-scaffold/page-header/component.mjs +9 -8
  28. package/package.json +1 -1
  29. package/page-scaffold/page-header/account-menu/component/component.d.ts +1 -2
  30. package/page-scaffold/page-header/account-menu/module.d.ts +2 -2
  31. package/page-scaffold/page-header/component.d.ts +1 -1
  32. package/esm2022/business/resource-select/internals/cluster-list/component.mjs +0 -75
  33. package/esm2022/business/resource-select/internals/namespace-list/component.mjs +0 -477
  34. package/esm2022/business/resource-select/internals/project-list/component.mjs +0 -76
  35. /package/business/resource-select/{internals → exports}/cluster-list/component.d.ts +0 -0
  36. /package/business/resource-select/{internals → exports}/namespace-list/component.d.ts +0 -0
  37. /package/business/resource-select/{internals → exports}/project-list/component.d.ts +0 -0
@@ -1,477 +0,0 @@
1
- import { HttpClient } from '@angular/common/http';
2
- import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, TemplateRef, } from '@angular/core';
3
- import { memoize, partition, uniq } from 'lodash-es';
4
- import { ReplaySubject, combineLatest, forkJoin, of, catchError, finalize, map, startWith, switchMap, takeUntil, tap, } from 'rxjs';
5
- import { API_GATEWAY, K8sUtilService, publishRef, getDomainAnnotation, DISPLAY_NAME, } from '../../../../core/public-api';
6
- import { CommonLayoutContextService } from '../../../../page-scaffold/public-api';
7
- import { ResourceListBase } from '../../base-list';
8
- import { ResourceSelectContextService } from '../../context.service';
9
- import { getDisplayArch, getWorkspaceParams } from '../../utils';
10
- import { K8sApiService } from './../../../../api/public-api';
11
- import * as i0 from "@angular/core";
12
- import * as i1 from "../../../../page-scaffold/public-api";
13
- import * as i2 from "./../../../../api/public-api";
14
- import * as i3 from "@angular/common/http";
15
- import * as i4 from "../../context.service";
16
- import * as i5 from "../../../../core/public-api";
17
- const _c0 = ["*"];
18
- const _c1 = () => [];
19
- const _c2 = (a0, a1) => ({ name: a0, displayName: a1 });
20
- function NamespaceListComponent_aui_option_6_Template(rf, ctx) { if (rf & 1) {
21
- i0.ɵɵelementStart(0, "aui-option", 7);
22
- i0.ɵɵpipe(1, "aclUnionDisplayName");
23
- i0.ɵɵtext(2);
24
- i0.ɵɵpipe(3, "aclUnionDisplayName");
25
- i0.ɵɵelementEnd();
26
- } if (rf & 2) {
27
- const project_r2 = ctx.$implicit;
28
- i0.ɵɵproperty("value", project_r2)("label", i0.ɵɵpipeBind1(1, 3, project_r2));
29
- i0.ɵɵadvance(2);
30
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, project_r2), " ");
31
- } }
32
- function NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template(rf, ctx) { if (rf & 1) {
33
- i0.ɵɵelementContainerStart(0);
34
- i0.ɵɵtext(1);
35
- i0.ɵɵelementContainerEnd();
36
- } if (rf & 2) {
37
- const mesh_r5 = i0.ɵɵnextContext().$implicit;
38
- i0.ɵɵadvance();
39
- i0.ɵɵtextInterpolate1(" (Istio ", mesh_r5.spec.istioVersion, ") ");
40
- } }
41
- function NamespaceListComponent_aui_form_item_10_aui_option_5_Template(rf, ctx) { if (rf & 1) {
42
- i0.ɵɵelementStart(0, "aui-option", 7);
43
- i0.ɵɵpipe(1, "aclName");
44
- i0.ɵɵtext(2);
45
- i0.ɵɵpipe(3, "aclName");
46
- i0.ɵɵtemplate(4, NamespaceListComponent_aui_form_item_10_aui_option_5_ng_container_4_Template, 2, 1, "ng-container", 5);
47
- i0.ɵɵelementEnd();
48
- } if (rf & 2) {
49
- const mesh_r5 = ctx.$implicit;
50
- i0.ɵɵproperty("value", mesh_r5)("label", i0.ɵɵpipeBind1(1, 4, mesh_r5) + ((mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion) ? " (Istio " + mesh_r5.spec.istioVersion + ")" : ""));
51
- i0.ɵɵadvance(2);
52
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 6, mesh_r5), " ");
53
- i0.ɵɵadvance(2);
54
- i0.ɵɵproperty("ngIf", mesh_r5.spec == null ? null : mesh_r5.spec.istioVersion);
55
- } }
56
- function NamespaceListComponent_aui_form_item_10_Template(rf, ctx) { if (rf & 1) {
57
- const _r3 = i0.ɵɵgetCurrentView();
58
- i0.ɵɵelementStart(0, "aui-form-item")(1, "label", 2);
59
- i0.ɵɵtext(2);
60
- i0.ɵɵpipe(3, "translate");
61
- i0.ɵɵelementEnd();
62
- i0.ɵɵelementStart(4, "aui-select", 11);
63
- i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_ngModelChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r3.selectedServiceMesh, $event) || (ctx_r3.selectedServiceMesh = $event); return i0.ɵɵresetView($event); });
64
- i0.ɵɵlistener("valueChange", function NamespaceListComponent_aui_form_item_10_Template_aui_select_valueChange_4_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.selectServiceMesh($event)); });
65
- i0.ɵɵtemplate(5, NamespaceListComponent_aui_form_item_10_aui_option_5_Template, 5, 8, "aui-option", 4);
66
- i0.ɵɵelementStart(6, "aui-option-placeholder");
67
- i0.ɵɵtext(7);
68
- i0.ɵɵpipe(8, "translate");
69
- i0.ɵɵelementEnd()()();
70
- } if (rf & 2) {
71
- const ctx_r3 = i0.ɵɵnextContext();
72
- i0.ɵɵadvance(2);
73
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 6, "service_mesh"));
74
- i0.ɵɵadvance(2);
75
- i0.ɵɵtwoWayProperty("ngModel", ctx_r3.selectedServiceMesh);
76
- i0.ɵɵproperty("trackFn", ctx_r3.serviceMeshTrackFn)("loading", !ctx_r3.projects.length && ctx_r3.projectsLoading);
77
- i0.ɵɵadvance();
78
- i0.ɵɵproperty("ngForOf", ctx_r3.projectServiceMeshes);
79
- i0.ɵɵadvance(2);
80
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 8, "no_data"), " ");
81
- } }
82
- function NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template(rf, ctx) { if (rf & 1) {
83
- i0.ɵɵelementContainer(0);
84
- } }
85
- function NamespaceListComponent_ng_container_20_aui_option_1_Template(rf, ctx) { if (rf & 1) {
86
- i0.ɵɵelementStart(0, "aui-option", 13);
87
- i0.ɵɵpipe(1, "pure");
88
- i0.ɵɵpipe(2, "async");
89
- i0.ɵɵpipe(3, "translate");
90
- i0.ɵɵpipe(4, "pure");
91
- i0.ɵɵpipe(5, "async");
92
- i0.ɵɵtemplate(6, NamespaceListComponent_ng_container_20_aui_option_1_ng_container_6_Template, 1, 0, "ng-container", 14);
93
- i0.ɵɵelementEnd();
94
- } if (rf & 2) {
95
- const cluster_r6 = ctx.declare;
96
- const clusterName_r7 = i0.ɵɵnextContext().$implicit;
97
- const ctx_r3 = i0.ɵɵnextContext();
98
- const clusterLabel_r8 = i0.ɵɵreference(25);
99
- i0.ɵɵproperty("value", clusterName_r7)("label", clusterLabel_r8)("labelContext", cluster_r6)("disabled", i0.ɵɵpipeBind1(2, 11, i0.ɵɵpipeBind2(1, 8, clusterName_r7, ctx_r3.checkClusterError$)))("auiTooltip", i0.ɵɵpipeBind1(3, 13, "current_cluster_status_abnormal"))("auiTooltipDisabled", !i0.ɵɵpipeBind1(5, 18, i0.ɵɵpipeBind2(4, 15, clusterName_r7, ctx_r3.checkClusterError$)));
100
- i0.ɵɵadvance(6);
101
- i0.ɵɵproperty("ngTemplateOutlet", clusterLabel_r8)("ngTemplateOutletContext", cluster_r6);
102
- } }
103
- function NamespaceListComponent_ng_container_20_Template(rf, ctx) { if (rf & 1) {
104
- i0.ɵɵelementContainerStart(0);
105
- i0.ɵɵtemplate(1, NamespaceListComponent_ng_container_20_aui_option_1_Template, 7, 20, "aui-option", 12);
106
- i0.ɵɵpipe(2, "pure");
107
- i0.ɵɵpipe(3, "async");
108
- i0.ɵɵelementContainerEnd();
109
- } if (rf & 2) {
110
- const clusterName_r7 = ctx.$implicit;
111
- const ctx_r3 = i0.ɵɵnextContext();
112
- i0.ɵɵadvance();
113
- i0.ɵɵproperty("declare", i0.ɵɵpureFunction2(6, _c2, clusterName_r7, i0.ɵɵpipeBind1(3, 4, i0.ɵɵpipeBind2(2, 1, clusterName_r7, ctx_r3.getClusterDisplayName$))));
114
- } }
115
- function NamespaceListComponent_ng_template_24_ng_container_1_Template(rf, ctx) { if (rf & 1) {
116
- i0.ɵɵelementContainerStart(0);
117
- i0.ɵɵtext(1);
118
- i0.ɵɵelementContainerEnd();
119
- } if (rf & 2) {
120
- const displayName_r9 = i0.ɵɵnextContext().displayName;
121
- i0.ɵɵadvance();
122
- i0.ɵɵtextInterpolate1("(", displayName_r9, ")");
123
- } }
124
- function NamespaceListComponent_ng_template_24_Template(rf, ctx) { if (rf & 1) {
125
- i0.ɵɵtext(0);
126
- i0.ɵɵtemplate(1, NamespaceListComponent_ng_template_24_ng_container_1_Template, 2, 1, "ng-container", 5);
127
- } if (rf & 2) {
128
- const name_r10 = ctx.name;
129
- const displayName_r9 = ctx.displayName;
130
- i0.ɵɵtextInterpolate1(" ", name_r10, " ");
131
- i0.ɵɵadvance();
132
- i0.ɵɵproperty("ngIf", displayName_r9);
133
- } }
134
- export class NamespaceListComponent extends ResourceListBase {
135
- constructor(commonLayoutService, k8sService, http, contextService, cdr, k8sUtil) {
136
- super(cdr, k8sUtil, contextService);
137
- this.commonLayoutService = commonLayoutService;
138
- this.k8sService = k8sService;
139
- this.http = http;
140
- this.displayServiceMesh = false;
141
- this.clusterChange = new EventEmitter();
142
- this.projectChange = new EventEmitter();
143
- this.projects = [];
144
- this.clusters = [];
145
- this.projectsLoading = true;
146
- this.serviceMeshes = [];
147
- this.projectServiceMeshes = [];
148
- this.type = 'namespace';
149
- this.displayedData = [];
150
- this.namespaceClusterMap = {};
151
- this.gridStateMap = {};
152
- this.load$$ = new ReplaySubject(1);
153
- this.serviceMeshes$ = this.k8sService
154
- .getGlobalResourceList({
155
- definition: {
156
- apiGroup: 'asm.alauda.io',
157
- apiVersion: 'v1alpha1',
158
- type: 'servicemeshgroups',
159
- },
160
- namespaced: true,
161
- })
162
- .pipe(map(res => res.items));
163
- this.clusters$ = this.http
164
- .get(`${API_GATEWAY}/auth/v1/clusters?availableClusters=false`)
165
- .pipe(map(res => res?.items), catchError(() => of([])), publishRef());
166
- this.getClusterDisplayName$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.k8sUtil.getDisplayName(clusters.find(i => this.k8sUtil.getName(i) === cluster)))));
167
- this.checkClusterError$ = memoize((cluster) => this.clusters$.pipe(map(clusters => this.checkClusterError(clusters, cluster))));
168
- this.namespaces$ = combineLatest([
169
- this.load$$,
170
- this.reload$$.pipe(startWith(null)),
171
- ]).pipe(switchMap(([{ project, cluster }]) => {
172
- if (!project || !cluster) {
173
- return of([]);
174
- }
175
- const clusters = cluster === '__all' ? this.clusters : [cluster];
176
- return clusters.length
177
- ? forkJoin(clusters.map(cluster => this.commonLayoutService
178
- .getClusterNamespaces(project.metadata.name, cluster)
179
- .pipe(catchError(() => of([]))))).pipe(tap(lists => {
180
- this.namespaceClusterMap = lists.reduce((acc, cur, i) => ({
181
- ...acc,
182
- ...cur.reduce((subAcc, subCurr) => ({
183
- ...subAcc,
184
- [subCurr.metadata.uid]: clusters[i],
185
- }), {}),
186
- }), {});
187
- }), map((lists) => lists.flat()))
188
- : of([]);
189
- }), takeUntil(this.destroy$$), publishRef());
190
- this.projectFilterFn = (keyword = '', option) => {
191
- const k = keyword.toLowerCase();
192
- return (option.value.metadata.name.includes(k) ||
193
- getDomainAnnotation(DISPLAY_NAME, option.value)
194
- ?.toLowerCase()
195
- ?.includes(k));
196
- };
197
- this.clusterFilterFn = (keyword = '', option) => {
198
- const k = keyword.toLowerCase();
199
- if (option.value === '__all') {
200
- return option.label.toLowerCase().includes(k);
201
- }
202
- const { name, displayName } = option.labelContext;
203
- return name.includes(k) || displayName?.toLowerCase()?.includes(k);
204
- };
205
- this.serviceMeshFilterFn = (keyword = '', option) => {
206
- const k = keyword.toLowerCase();
207
- const version = option.value.spec?.istioVersion
208
- ? `Istio ${option.value.spec.istioVersion}`
209
- : '';
210
- return (option.value.metadata.name.includes(k) ||
211
- version.toLowerCase()?.includes(k));
212
- };
213
- this.projectTrackFn = (project) => project?.metadata.name;
214
- this.serviceMeshTrackFn = (mesh) => mesh?.metadata.name;
215
- this.mapResource = (list, { isMultiArch, clusters, }) => list.map(item => {
216
- const cluster = this.namespaceClusterMap[item.metadata.uid];
217
- const itemDisabled = this.disableFn ? this.disableFn(item) : null;
218
- const cachedItem = this.displayedData.find(ns => ns.__origin.metadata.uid === item.metadata.uid);
219
- const servicemesh = this.serviceMeshes.find(item => item.spec.clusters.includes(cachedItem?.cluster || cluster));
220
- return {
221
- name: this.k8sUtil.getName(item),
222
- displayName: this.k8sUtil.getDisplayName(item),
223
- cluster: cachedItem?.cluster || cluster,
224
- clusterDisplayName: cachedItem?.clusterDisplayName ||
225
- this.k8sUtil.getDisplayName(clusters.find(c => c.metadata.name === cluster)),
226
- clusterArch: cachedItem?.clusterArch || isMultiArch
227
- ? this.getClusterArch(clusters.find(c => c.metadata.name === cluster))
228
- : null,
229
- serviceMeshName: servicemesh ? this.k8sUtil.getName(servicemesh) : '',
230
- serviceMeshClusters: servicemesh ? servicemesh.spec.clusters : [],
231
- serviceMeshIstioVersion: servicemesh
232
- ? servicemesh.spec.istioVersion
233
- : '',
234
- admin: cachedItem?.admin || '-',
235
- timestamp: this.k8sUtil.getCreationTimestamp(item),
236
- state: {
237
- disabled: this.gridStateMap[cluster]?.disabled ||
238
- itemDisabled?.disabled ||
239
- this.checkClusterError(clusters, cachedItem?.cluster || cluster) ||
240
- false,
241
- tooltip: this.gridStateMap[cluster]?.disabled
242
- ? this.gridStateMap[cluster]?.tooltip || ''
243
- : itemDisabled?.tooltip,
244
- },
245
- __origin: item,
246
- };
247
- });
248
- }
249
- ngOnInit() {
250
- // From cache
251
- this.projects = this.contextService.cachedProjectResources;
252
- this.serviceMeshes = this.contextService.cachedServiceMeshGroupResources;
253
- if (this.projects.length) {
254
- this.initProject(this.projects);
255
- }
256
- // Get latest data in the background
257
- forkJoin([
258
- this.commonLayoutService
259
- .getProjects()
260
- .pipe(catchError(() => of([]))),
261
- this.displayServiceMesh
262
- ? this.serviceMeshes$
263
- : of([]),
264
- ])
265
- .pipe(finalize(() => {
266
- this.projectsLoading = false;
267
- this.cdr.markForCheck();
268
- }), takeUntil(this.destroy$$))
269
- .subscribe(([projects, serviceMeshes]) => {
270
- if (this.displayServiceMesh) {
271
- this.serviceMeshes = serviceMeshes;
272
- this.contextService.cachedServiceMeshGroupResources = serviceMeshes;
273
- }
274
- this.projects = projects;
275
- if (!this.contextService.cachedProjectResources?.length) {
276
- this.initProject(projects);
277
- }
278
- this.contextService.cachedProjectResources = this.projects;
279
- });
280
- combineLatest([this.clusters$, this.namespaces$]).subscribe(([clusters, data]) => {
281
- const isMultiArch = uniq(clusters.map(c => this.k8sUtil.getLabel(c, 'arch'))).length > 1;
282
- this.displayedData = this.mapResource(data, {
283
- clusters,
284
- isMultiArch,
285
- }).filter(ns => this.context === 'page' || !ns.state?.disabled);
286
- this.setSelectedNamespace(this.displayedData);
287
- if (this.selectedUid) {
288
- this.displayedData = this.getSortedNamespace(this.displayedData, this.value.name);
289
- }
290
- this.loading = false;
291
- this.forceLoading = false;
292
- this.storeNamespaces();
293
- this.cdr.markForCheck();
294
- });
295
- }
296
- getSortedNamespace(rawData, namespace) {
297
- if (!namespace) {
298
- return rawData;
299
- }
300
- const [selected, others] = partition(this.displayedData, item => item.name === namespace);
301
- return [...selected, ...others];
302
- }
303
- storeNamespaces() {
304
- if (!this.selectedProject) {
305
- return;
306
- }
307
- if (this.selectedCluster === '__all') {
308
- for (const cluster of this.clusters) {
309
- this.contextService.storeNamespaces(this.selectedProject.metadata.name, cluster, this.displayedData.filter(item => item.cluster === cluster));
310
- }
311
- }
312
- this.contextService.storeNamespaces(this.selectedProject.metadata.name, this.selectedCluster, this.displayedData);
313
- }
314
- initProject(projects) {
315
- this.selectProject((projects || []).length
316
- ? projects.find(item => item.metadata.name === this.value?.project) ||
317
- projects[0]
318
- : null, true);
319
- this.load.emit({
320
- project: projects.length,
321
- cluster: uniq(projects.reduce((acc, cur) => [...acc, ...(cur.spec.clusters || []).map(c => c.name)], [])).length,
322
- });
323
- }
324
- selectServiceMesh(serviceMesh) {
325
- this.selectedServiceMesh = serviceMesh;
326
- this.clusters = (this.selectedProject.spec.clusters || [])
327
- .map(c => c.name)
328
- .filter(cluster => this.serviceMeshes
329
- .find(mesh => this.k8sUtil.getName(mesh) === this.k8sUtil.getName(serviceMesh))
330
- .spec.clusters.includes(cluster));
331
- this.selectCluster('__all');
332
- }
333
- selectProject(project, initial = false) {
334
- this.projectChange.emit(project?.metadata.name);
335
- this.selectedProject = project;
336
- this.clusters = project
337
- ? (project.spec.clusters || []).map(c => c.name)
338
- : [];
339
- if (this.displayServiceMesh) {
340
- this.projectServiceMeshes = this.serviceMeshes.filter(mesh => mesh.spec.clusters.some(cluster => this.clusters.includes(cluster)));
341
- if (this.projectServiceMeshes?.length) {
342
- let meshName = this.value?.servicemesh;
343
- if (!meshName) {
344
- this.auth.getAccountInfo().subscribe(({ email }) => {
345
- meshName = getWorkspaceParams(email)?.servicemesh;
346
- });
347
- }
348
- const selectedServiceMesh = this.projectServiceMeshes.find(mesh => this.k8sUtil.getName(mesh) === meshName) || this.projectServiceMeshes[0];
349
- this.selectServiceMesh(selectedServiceMesh);
350
- }
351
- else {
352
- this.selectedServiceMesh = null;
353
- this.clusters = [];
354
- }
355
- }
356
- this.selectCluster('__all', initial);
357
- }
358
- selectCluster(clusterName, initial = false) {
359
- this.selectedCluster = clusterName;
360
- const displayedData = this.contextService.getCachedNamespaces(this.selectedProject?.metadata.name, this.selectedCluster) || [];
361
- this.displayedData = this.getSortedNamespace(displayedData, initial ? this.value?.name : null);
362
- this.setSelectedNamespace(this.displayedData);
363
- this.clusterChange.emit(this.selectedCluster === '__all' ? null : clusterName);
364
- this.loading = true;
365
- this.load$$.next({
366
- project: this.selectedProject,
367
- cluster: clusterName,
368
- });
369
- }
370
- setSelectedNamespace(data) {
371
- const selectedNamespace = this.value
372
- ? data.find(item => item.name === this.value.name &&
373
- this.value.cluster === item.cluster)
374
- : null;
375
- this.selectedUid = selectedNamespace
376
- ? selectedNamespace.__origin.metadata.uid
377
- : null;
378
- }
379
- getClusterArch(cluster) {
380
- return getDisplayArch(this.k8sUtil.getLabel(cluster, 'arch'));
381
- }
382
- checkClusterError(clusters, cluster) {
383
- return (clusters
384
- .find(i => this.k8sUtil.getName(i) === cluster)
385
- ?.status.conditions.find(c => c.type === 'NodeNotReady')?.status !==
386
- 'False');
387
- }
388
- static { this.ɵfac = function NamespaceListComponent_Factory(t) { return new (t || NamespaceListComponent)(i0.ɵɵdirectiveInject(i1.CommonLayoutContextService), i0.ɵɵdirectiveInject(i2.K8sApiService), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.ResourceSelectContextService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i5.K8sUtilService)); }; }
389
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: NamespaceListComponent, selectors: [["acl-namespace-list"]], inputs: { actionTemplateRef: "actionTemplateRef", disableFn: "disableFn", value: "value", displayServiceMesh: "displayServiceMesh" }, outputs: { clusterChange: "clusterChange", projectChange: "projectChange" }, features: [i0.ɵɵInheritDefinitionFeature], ngContentSelectors: _c0, decls: 29, vars: 38, consts: [["clusterLabel", ""], [1, "filter"], ["auiFormItemLabel", ""], ["auiFormItemControl", "", "name", "project", 3, "ngModelChange", "valueChange", "ngClass", "ngModel", "filterFn", "trackFn", "loading"], [3, "value", "label", 4, "ngFor", "ngForOf"], [4, "ngIf"], ["auiFormItemControl", "", "name", "cluster", 3, "ngModelChange", "valueChange", "ngClass", "filterFn", "loading", "ngModel"], [3, "value", "label"], [4, "ngFor", "ngForOf"], [3, "selectItem", "reload", "data", "fields", "context", "actionTemplateRef", "selectedUid", "loading"], ["aclResourceGridHeader", ""], ["auiFormItemControl", "", "name", "serviceMeshProject", 1, "lang-not-zh:!tw-w-[230px]", 3, "ngModelChange", "valueChange", "ngModel", "trackFn", "loading"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled", 4, "declare"], [3, "value", "label", "labelContext", "disabled", "auiTooltip", "auiTooltipDisabled"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function NamespaceListComponent_Template(rf, ctx) { if (rf & 1) {
390
- const _r1 = i0.ɵɵgetCurrentView();
391
- i0.ɵɵprojectionDef();
392
- i0.ɵɵelementStart(0, "div", 1)(1, "aui-form-item")(2, "label", 2);
393
- i0.ɵɵtext(3);
394
- i0.ɵɵpipe(4, "translate");
395
- i0.ɵɵelementEnd();
396
- i0.ɵɵelementStart(5, "aui-select", 3);
397
- i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedProject, $event) || (ctx.selectedProject = $event); return i0.ɵɵresetView($event); });
398
- i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_5_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectProject($event)); });
399
- i0.ɵɵtemplate(6, NamespaceListComponent_aui_option_6_Template, 4, 7, "aui-option", 4);
400
- i0.ɵɵelementStart(7, "aui-option-placeholder");
401
- i0.ɵɵtext(8);
402
- i0.ɵɵpipe(9, "translate");
403
- i0.ɵɵelementEnd()()();
404
- i0.ɵɵtemplate(10, NamespaceListComponent_aui_form_item_10_Template, 9, 10, "aui-form-item", 5);
405
- i0.ɵɵelementStart(11, "aui-form-item")(12, "label", 2);
406
- i0.ɵɵtext(13);
407
- i0.ɵɵpipe(14, "translate");
408
- i0.ɵɵelementEnd();
409
- i0.ɵɵelementStart(15, "aui-select", 6);
410
- i0.ɵɵtwoWayListener("ngModelChange", function NamespaceListComponent_Template_aui_select_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.selectedCluster, $event) || (ctx.selectedCluster = $event); return i0.ɵɵresetView($event); });
411
- i0.ɵɵlistener("valueChange", function NamespaceListComponent_Template_aui_select_valueChange_15_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.selectCluster($event)); });
412
- i0.ɵɵelementStart(16, "aui-option", 7);
413
- i0.ɵɵpipe(17, "translate");
414
- i0.ɵɵtext(18);
415
- i0.ɵɵpipe(19, "translate");
416
- i0.ɵɵelementEnd();
417
- i0.ɵɵtemplate(20, NamespaceListComponent_ng_container_20_Template, 4, 9, "ng-container", 8);
418
- i0.ɵɵelementStart(21, "aui-option-placeholder");
419
- i0.ɵɵtext(22);
420
- i0.ɵɵpipe(23, "translate");
421
- i0.ɵɵelementEnd();
422
- i0.ɵɵtemplate(24, NamespaceListComponent_ng_template_24_Template, 2, 2, "ng-template", null, 0, i0.ɵɵtemplateRefExtractor);
423
- i0.ɵɵelementEnd()()();
424
- i0.ɵɵelementStart(26, "acl-resource-data-grid", 9);
425
- i0.ɵɵlistener("selectItem", function NamespaceListComponent_Template_acl_resource_data_grid_selectItem_26_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.onSelect($event)); })("reload", function NamespaceListComponent_Template_acl_resource_data_grid_reload_26_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.reload()); });
426
- i0.ɵɵelementContainerStart(27, 10);
427
- i0.ɵɵprojection(28);
428
- i0.ɵɵelementContainerEnd();
429
- i0.ɵɵelementEnd();
430
- } if (rf & 2) {
431
- i0.ɵɵadvance(3);
432
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(4, 25, "project"));
433
- i0.ɵɵadvance(2);
434
- i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "");
435
- i0.ɵɵtwoWayProperty("ngModel", ctx.selectedProject);
436
- i0.ɵɵproperty("filterFn", ctx.projectFilterFn)("trackFn", ctx.projectTrackFn)("loading", !ctx.projects.length && ctx.projectsLoading);
437
- i0.ɵɵadvance();
438
- i0.ɵɵproperty("ngForOf", ctx.projects);
439
- i0.ɵɵadvance(2);
440
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(9, 27, "no_data"), " ");
441
- i0.ɵɵadvance(2);
442
- i0.ɵɵproperty("ngIf", ctx.displayServiceMesh);
443
- i0.ɵɵadvance(3);
444
- i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(14, 29, "cluster"));
445
- i0.ɵɵadvance(2);
446
- i0.ɵɵproperty("ngClass", ctx.displayServiceMesh ? "lang-not-zh:!tw-w-[230px]" : "")("filterFn", ctx.clusterFilterFn)("loading", !ctx.projects.length && ctx.projectsLoading);
447
- i0.ɵɵtwoWayProperty("ngModel", ctx.selectedCluster);
448
- i0.ɵɵadvance();
449
- i0.ɵɵproperty("value", "__all")("label", i0.ɵɵpipeBind1(17, 31, "all"));
450
- i0.ɵɵadvance(2);
451
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(19, 33, "all"), " ");
452
- i0.ɵɵadvance(2);
453
- i0.ɵɵproperty("ngForOf", ctx.clusters);
454
- i0.ɵɵadvance(2);
455
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(23, 35, "no_data"), " ");
456
- i0.ɵɵadvance(4);
457
- i0.ɵɵproperty("data", ctx.displayedData || i0.ɵɵpureFunction0(37, _c1))("fields", ctx.fields)("context", ctx.context)("actionTemplateRef", ctx.actionTemplateRef)("selectedUid", ctx.selectedUid)("loading", ctx.forceLoading || !(ctx.displayedData == null ? null : ctx.displayedData.length) && ctx.loading);
458
- } }, styles: ["[_nghost-%COMP%]{display:flex;flex:1;flex-direction:column}.filter[_ngcontent-%COMP%]{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%]{margin-right:20px}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item{margin-bottom:0}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-form-item__label-wrapper{width:auto!important}.filter[_ngcontent-%COMP%] aui-form-item[_ngcontent-%COMP%] .aui-input{color:rgb(var(--aui-color-n-2))}.filter[_ngcontent-%COMP%] label[_ngcontent-%COMP%]{font-weight:500}.filter[_ngcontent-%COMP%] aui-select[_ngcontent-%COMP%]{width:260px}"], changeDetection: 0 }); }
459
- }
460
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceListComponent, [{
461
- type: Component,
462
- args: [{ selector: 'acl-namespace-list', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"filter\">\n <aui-form-item>\n <label auiFormItemLabel>{{ 'project' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"project\"\n [(ngModel)]=\"selectedProject\"\n [filterFn]=\"projectFilterFn\"\n [trackFn]=\"projectTrackFn\"\n (valueChange)=\"selectProject($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let project of projects\"\n [value]=\"project\"\n [label]=\"project | aclUnionDisplayName\"\n >\n {{ project | aclUnionDisplayName }}\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <!-- ASM \u9009\u62E9\u7F51\u683C\u8FC7\u6EE4\u96C6\u7FA4\u9009\u9879 -->\n <aui-form-item *ngIf=\"displayServiceMesh\">\n <label auiFormItemLabel>{{ 'service_mesh' | translate }}</label>\n <aui-select\n class=\"lang-not-zh:!tw-w-[230px]\"\n auiFormItemControl\n name=\"serviceMeshProject\"\n [(ngModel)]=\"selectedServiceMesh\"\n [trackFn]=\"serviceMeshTrackFn\"\n (valueChange)=\"selectServiceMesh($event)\"\n [loading]=\"!projects.length && projectsLoading\"\n >\n <aui-option\n *ngFor=\"let mesh of projectServiceMeshes\"\n [value]=\"mesh\"\n [label]=\"\n (mesh | aclName) +\n (mesh.spec?.istioVersion\n ? ' (Istio ' + mesh.spec.istioVersion + ')'\n : '')\n \"\n >\n {{ mesh | aclName }}\n <ng-container *ngIf=\"mesh.spec?.istioVersion\">\n (Istio {{ mesh.spec.istioVersion }})\n </ng-container>\n </aui-option>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n </aui-select>\n </aui-form-item>\n <aui-form-item>\n <label auiFormItemLabel>{{ 'cluster' | translate }}</label>\n <aui-select\n [ngClass]=\"displayServiceMesh ? 'lang-not-zh:!tw-w-[230px]' : ''\"\n auiFormItemControl\n name=\"cluster\"\n [filterFn]=\"clusterFilterFn\"\n [loading]=\"!projects.length && projectsLoading\"\n [(ngModel)]=\"selectedCluster\"\n (valueChange)=\"selectCluster($event)\"\n >\n <aui-option\n [value]=\"'__all'\"\n [label]=\"'all' | translate\"\n >\n {{ 'all' | translate }}\n </aui-option>\n <ng-container *ngFor=\"let clusterName of clusters\">\n <aui-option\n *declare=\"{\n name: clusterName,\n displayName: clusterName | pure: getClusterDisplayName$ | async\n } as cluster\"\n [value]=\"clusterName\"\n [label]=\"clusterLabel\"\n [labelContext]=\"cluster\"\n [disabled]=\"clusterName | pure: checkClusterError$ | async\"\n [auiTooltip]=\"'current_cluster_status_abnormal' | translate\"\n [auiTooltipDisabled]=\"\n !(clusterName | pure: checkClusterError$ | async)\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"clusterLabel; context: cluster\"\n ></ng-container>\n </aui-option>\n </ng-container>\n <aui-option-placeholder>\n {{ 'no_data' | translate }}\n </aui-option-placeholder>\n <ng-template\n #clusterLabel\n let-name=\"name\"\n let-displayName=\"displayName\"\n >\n {{ name }}\n <ng-container *ngIf=\"displayName\">({{ displayName }})</ng-container>\n </ng-template>\n </aui-select>\n </aui-form-item>\n</div>\n<acl-resource-data-grid\n [data]=\"displayedData || []\"\n [fields]=\"fields\"\n [context]=\"context\"\n (selectItem)=\"onSelect($event)\"\n [actionTemplateRef]=\"actionTemplateRef\"\n [selectedUid]=\"selectedUid\"\n [loading]=\"forceLoading || (!displayedData?.length && loading)\"\n (reload)=\"reload()\"\n>\n <ng-container aclResourceGridHeader>\n <ng-content></ng-content>\n </ng-container>\n</acl-resource-data-grid>\n", styles: [":host{display:flex;flex:1;flex-direction:column}.filter{display:flex;padding:20px;margin-bottom:20px;box-shadow:0 0 4px rgba(var(--aui-color-n-1),.16);background-color:rgb(var(--aui-color-n-10));border-radius:4px}.filter aui-form-item{margin-right:20px}.filter aui-form-item ::ng-deep .aui-form-item{margin-bottom:0}.filter aui-form-item ::ng-deep .aui-form-item__label-wrapper{width:auto!important}.filter aui-form-item ::ng-deep .aui-input{color:rgb(var(--aui-color-n-2))}.filter label{font-weight:500}.filter aui-select{width:260px}\n"] }]
463
- }], () => [{ type: i1.CommonLayoutContextService }, { type: i2.K8sApiService }, { type: i3.HttpClient }, { type: i4.ResourceSelectContextService }, { type: i0.ChangeDetectorRef }, { type: i5.K8sUtilService }], { actionTemplateRef: [{
464
- type: Input
465
- }], disableFn: [{
466
- type: Input
467
- }], value: [{
468
- type: Input
469
- }], displayServiceMesh: [{
470
- type: Input
471
- }], clusterChange: [{
472
- type: Output
473
- }], projectChange: [{
474
- type: Output
475
- }] }); })();
476
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(NamespaceListComponent, { className: "NamespaceListComponent", filePath: "business/resource-select/internals/namespace-list/component.ts", lineNumber: 60 }); })();
477
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9pbnRlcm5hbHMvbmFtZXNwYWNlLWxpc3QvY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2J1c2luZXNzL3Jlc291cmNlLXNlbGVjdC9pbnRlcm5hbHMvbmFtZXNwYWNlLWxpc3QvdGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxFQUNMLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLEVBQUUsRUFDRixVQUFVLEVBQ1YsUUFBUSxFQUNSLEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFFZCxPQUFPLEVBQ0wsV0FBVyxFQUVYLGNBQWMsRUFFZCxVQUFVLEVBSVYsbUJBQW1CLEVBQ25CLFlBQVksR0FDYixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtC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RFIsS0FBSztZQUlOLEtBQUs7a0JBREosS0FBSztZQUlOLGtCQUFrQjtrQkFEakIsS0FBSztZQUlOLGFBQWE7a0JBRFosTUFBTTtZQUlQLGFBQWE7a0JBRFosTUFBTTs7a0ZBbkJJLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNlbGVjdEZpbHRlck9wdGlvbiB9IGZyb20gJ0BhbGF1ZGEvdWknO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBtZW1vaXplLCBwYXJ0aXRpb24sIHVuaXEgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHtcbiAgUmVwbGF5U3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgZm9ya0pvaW4sXG4gIG9mLFxuICBjYXRjaEVycm9yLFxuICBmaW5hbGl6ZSxcbiAgbWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBBUElfR0FURVdBWSxcbiAgQ2x1c3RlcixcbiAgSzhzVXRpbFNlcnZpY2UsXG4gIFByb2plY3QsXG4gIHB1Ymxpc2hSZWYsXG4gIFNlcnZpY2VNZXNoR3JvdXAsXG4gIEt1YmVybmV0ZXNSZXNvdXJjZSxcbiAgS3ViZXJuZXRlc1Jlc291cmNlTGlzdCxcbiAgZ2V0RG9tYWluQW5ub3RhdGlvbixcbiAgRElTUExBWV9OQU1FLFxufSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgQ29tbW9uTGF5b3V0Q29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9wYWdlLXNjYWZmb2xkL3B1YmxpYy1hcGknO1xuaW1wb3J0IHsgUmVzb3VyY2VMaXN0QmFzZSB9IGZyb20gJy4uLy4uL2Jhc2UtbGlzdCc7XG5pbXBvcnQgeyBSZXNvdXJjZVNlbGVjdENvbnRleHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IGdldERpc3BsYXlBcmNoLCBnZXRXb3Jrc3BhY2VQYXJhbXMgfSBmcm9tICcuLi8uLi91dGlscyc7XG5cbmltcG9ydCB7IEs4c0FwaVNlcnZpY2UgfSBmcm9tICcuLy4uLy4uLy4uLy4uL2FwaS9wdWJsaWMtYXBpJztcbmltcG9ydCB7XG4gIENsdXN0ZXJBcmNoLFxuICBEaXNhYmxlRm4sXG4gIE5hbWVzcGFjZURhdGFJdGVtLFxuICBTZWxlY3RlZE5hbWVzcGFjZVZhbHVlLFxufSBmcm9tICcuLy4uLy4uL3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWNsLW5hbWVzcGFjZS1saXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zdHlsZS5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOYW1lc3BhY2VMaXN0Q29tcG9uZW50XG4gIGV4dGVuZHMgUmVzb3VyY2VMaXN0QmFzZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95XG57XG4gIEBJbnB1dCgpXG4gIGFjdGlvblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBJbnB1dCgpXG4gIGRpc2FibGVGbjogRGlzYWJsZUZuO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBTZWxlY3RlZE5hbWVzcGFjZVZhbHVlO1xuXG4gIEBJbnB1dCgpXG4gIGRpc3BsYXlTZXJ2aWNlTWVzaCA9IGZhbHNlO1xuXG4gIEBPdXRwdXQoKVxuICBjbHVzdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHByb2plY3RDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcm9qZWN0czogUHJvamVjdFtdID0gW107XG5cbiAgc2VsZWN0ZWRQcm9qZWN0OiBQcm9qZWN0O1xuICBzZWxlY3RlZENsdXN0ZXI6IHN0cmluZztcbiAgY2x1c3RlcnM6IHN0cmluZ1tdID0gW107XG4gIHByb2plY3RzTG9hZGluZyA9IHRydWU7XG5cbiAgc2VydmljZU1lc2hlczogU2VydmljZU1lc2hHcm91cFtdID0gW107XG4gIHByb2plY3RTZXJ2aWNlTWVzaGVzOiBTZXJ2aWNlTWVzaEdyb3VwW10gPSBbXTtcbiAgc2VsZWN0ZWRTZXJ2aWNlTWVzaDogU2VydmljZU1lc2hHcm91cDtcblxuICB0eXBlID0gJ25hbWVzcGFjZSc7XG5cbiAgZGlzcGxheWVkRGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSA9IFtdO1xuXG4gIG5hbWVzcGFjZUNsdXN0ZXJNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICBncmlkU3RhdGVNYXA6IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8RGlzYWJsZUZuPj4gPSB7fTtcblxuICBzZWxlY3RlZFVpZDogc3RyaW5nO1xuXG4gIGxvYWQkJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHsgcHJvamVjdDogUHJvamVjdDsgY2x1c3Rlcjogc3RyaW5nIH0+KDEpO1xuXG4gIHNlcnZpY2VNZXNoZXMkID0gdGhpcy5rOHNTZXJ2aWNlXG4gICAgLmdldEdsb2JhbFJlc291cmNlTGlzdDxTZXJ2aWNlTWVzaEdyb3VwPih7XG4gICAgICBkZWZpbml0aW9uOiB7XG4gICAgICAgIGFwaUdyb3VwOiAnYXNtLmFsYXVkYS5pbycsXG4gICAgICAgIGFwaVZlcnNpb246ICd2MWFscGhhMScsXG4gICAgICAgIHR5cGU6ICdzZXJ2aWNlbWVzaGdyb3VwcycsXG4gICAgICB9LFxuICAgICAgbmFtZXNwYWNlZDogdHJ1ZSxcbiAgICB9KVxuICAgIC5waXBlKG1hcChyZXMgPT4gcmVzLml0ZW1zKSk7XG5cbiAgY2x1c3RlcnMkID0gdGhpcy5odHRwXG4gICAgLmdldDxLdWJlcm5ldGVzUmVzb3VyY2VMaXN0PENsdXN0ZXI+PihcbiAgICAgIGAke0FQSV9HQVRFV0FZfS9hdXRoL3YxL2NsdXN0ZXJzP2F2YWlsYWJsZUNsdXN0ZXJzPWZhbHNlYCxcbiAgICApXG4gICAgLnBpcGUoXG4gICAgICBtYXAocmVzID0+IHJlcz8uaXRlbXMpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihbXSBhcyBDbHVzdGVyW10pKSxcbiAgICAgIHB1Ymxpc2hSZWYoKSxcbiAgICApO1xuXG4gIGdldENsdXN0ZXJEaXNwbGF5TmFtZSQgPSBtZW1vaXplKChjbHVzdGVyOiBzdHJpbmcpID0+XG4gICAgdGhpcy5jbHVzdGVycyQucGlwZShcbiAgICAgIG1hcChjbHVzdGVycyA9PlxuICAgICAgICB0aGlzLms4c1V0aWwuZ2V0RGlzcGxheU5hbWUoXG4gICAgICAgICAgY2x1c3RlcnMuZmluZChpID0+IHRoaXMuazhzVXRpbC5nZXROYW1lKGkpID09PSBjbHVzdGVyKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTtcblxuICBjaGVja0NsdXN0ZXJFcnJvciQgPSBtZW1vaXplKChjbHVzdGVyOiBzdHJpbmcpID0+XG4gICAgdGhpcy5jbHVzdGVycyQucGlwZShcbiAgICAgIG1hcChjbHVzdGVycyA9PiB0aGlzLmNoZWNrQ2x1c3RlckVycm9yKGNsdXN0ZXJzLCBjbHVzdGVyKSksXG4gICAgKSxcbiAgKTtcblxuICBuYW1lc3BhY2VzJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMubG9hZCQkLFxuICAgIHRoaXMucmVsb2FkJCQucGlwZShzdGFydFdpdGgobnVsbCBhcyB2b2lkKSksXG4gIF0pLnBpcGUoXG4gICAgc3dpdGNoTWFwKChbeyBwcm9qZWN0LCBjbHVzdGVyIH1dKSA9PiB7XG4gICAgICBpZiAoIXByb2plY3QgfHwgIWNsdXN0ZXIpIHtcbiAgICAgICAgcmV0dXJuIG9mKFtdIGFzIEt1YmVybmV0ZXNSZXNvdXJjZVtdKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNsdXN0ZXJzID0gY2x1c3RlciA9PT0gJ19fYWxsJyA/IHRoaXMuY2x1c3RlcnMgOiBbY2x1c3Rlcl07XG4gICAgICByZXR1cm4gY2x1c3RlcnMubGVuZ3RoXG4gICAgICAgID8gZm9ya0pvaW4oXG4gICAgICAgICAgICBjbHVzdGVycy5tYXAoY2x1c3RlciA9PlxuICAgICAgICAgICAgICB0aGlzLmNvbW1vbkxheW91dFNlcnZpY2VcbiAgICAgICAgICAgICAgICAuZ2V0Q2x1c3Rlck5hbWVzcGFjZXMocHJvamVjdC5tZXRhZGF0YS5uYW1lLCBjbHVzdGVyKVxuICAgICAgICAgICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgIHRhcChsaXN0cyA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlQ2x1c3Rlck1hcCA9IGxpc3RzLnJlZHVjZShcbiAgICAgICAgICAgICAgICAoYWNjLCBjdXIsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgICAuLi5hY2MsXG4gICAgICAgICAgICAgICAgICAuLi5jdXIucmVkdWNlKFxuICAgICAgICAgICAgICAgICAgICAoc3ViQWNjLCBzdWJDdXJyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLnN1YkFjYyxcbiAgICAgICAgICAgICAgICAgICAgICBbc3ViQ3Vyci5tZXRhZGF0YS51aWRdOiBjbHVzdGVyc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKChsaXN0czogS3ViZXJuZXRlc1Jlc291cmNlW11bXSkgPT4gbGlzdHMuZmxhdCgpKSxcbiAgICAgICAgICApXG4gICAgICAgIDogb2YoW10gYXMgS3ViZXJuZXRlc1Jlc291cmNlW10pO1xuICAgIH0pLFxuICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkJCksXG4gICAgcHVibGlzaFJlZigpLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29tbW9uTGF5b3V0U2VydmljZTogQ29tbW9uTGF5b3V0Q29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBrOHNTZXJ2aWNlOiBLOHNBcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcbiAgICBjb250ZXh0U2VydmljZTogUmVzb3VyY2VTZWxlY3RDb250ZXh0U2VydmljZSxcbiAgICBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGs4c1V0aWw6IEs4c1V0aWxTZXJ2aWNlLFxuICApIHtcbiAgICBzdXBlcihjZHIsIGs4c1V0aWwsIGNvbnRleHRTZXJ2aWNlKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIEZyb20gY2FjaGVcbiAgICB0aGlzLnByb2plY3RzID0gdGhpcy5jb250ZXh0U2VydmljZS5jYWNoZWRQcm9qZWN0UmVzb3VyY2VzO1xuICAgIHRoaXMuc2VydmljZU1lc2hlcyA9IHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkU2VydmljZU1lc2hHcm91cFJlc291cmNlcztcbiAgICBpZiAodGhpcy5wcm9qZWN0cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaW5pdFByb2plY3QodGhpcy5wcm9qZWN0cyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IGxhdGVzdCBkYXRhIGluIHRoZSBiYWNrZ3JvdW5kXG4gICAgZm9ya0pvaW4oW1xuICAgICAgdGhpcy5jb21tb25MYXlvdXRTZXJ2aWNlXG4gICAgICAgIC5nZXRQcm9qZWN0cygpXG4gICAgICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10gYXMgUHJvamVjdFtdKSkpLFxuICAgICAgdGhpcy5kaXNwbGF5U2VydmljZU1lc2hcbiAgICAgICAgPyB0aGlzLnNlcnZpY2VNZXNoZXMkXG4gICAgICAgIDogb2YoW10gYXMgU2VydmljZU1lc2hHcm91cFtdKSxcbiAgICBdKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnByb2plY3RzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKFtwcm9qZWN0cywgc2VydmljZU1lc2hlc10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlzcGxheVNlcnZpY2VNZXNoKSB7XG4gICAgICAgICAgdGhpcy5zZXJ2aWNlTWVzaGVzID0gc2VydmljZU1lc2hlcztcbiAgICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFNlcnZpY2VNZXNoR3JvdXBSZXNvdXJjZXMgPSBzZXJ2aWNlTWVzaGVzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvamVjdHMgPSBwcm9qZWN0cztcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHRTZXJ2aWNlLmNhY2hlZFByb2plY3RSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuaW5pdFByb2plY3QocHJvamVjdHMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dFNlcnZpY2UuY2FjaGVkUHJvamVjdFJlc291cmNlcyA9IHRoaXMucHJvamVjdHM7XG4gICAgICB9KTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuY2x1c3RlcnMkLCB0aGlzLm5hbWVzcGFjZXMkXSkuc3Vic2NyaWJlKFxuICAgICAgKFtjbHVzdGVycywgZGF0YV0pID0+IHtcbiAgICAgICAgY29uc3QgaXNNdWx0aUFyY2ggPVxuICAgICAgICAgIHVuaXEoY2x1c3RlcnMubWFwKGMgPT4gdGhpcy5rOHNVdGlsLmdldExhYmVsKGMsICdhcmNoJykpKS5sZW5ndGggPiAxO1xuICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEgPSB0aGlzLm1hcFJlc291cmNlKGRhdGEsIHtcbiAgICAgICAgICBjbHVzdGVycyxcbiAgICAgICAgICBpc011bHRpQXJjaCxcbiAgICAgICAgfSkuZmlsdGVyKG5zID0+IHRoaXMuY29udGV4dCA9PT0gJ3BhZ2UnIHx8ICFucy5zdGF0ZT8uZGlzYWJsZWQpO1xuICAgICAgICB0aGlzLnNldFNlbGVjdGVkTmFtZXNwYWNlKHRoaXMuZGlzcGxheWVkRGF0YSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkVWlkKSB7XG4gICAgICAgICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5nZXRTb3J0ZWROYW1lc3BhY2UoXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgICAgICAgICB0aGlzLnZhbHVlLm5hbWUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JjZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zdG9yZU5hbWVzcGFjZXMoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBnZXRTb3J0ZWROYW1lc3BhY2UocmF3RGF0YTogTmFtZXNwYWNlRGF0YUl0ZW1bXSwgbmFtZXNwYWNlPzogc3RyaW5nKSB7XG4gICAgaWYgKCFuYW1lc3BhY2UpIHtcbiAgICAgIHJldHVybiByYXdEYXRhO1xuICAgIH1cbiAgICBjb25zdCBbc2VsZWN0ZWQsIG90aGVyc10gPSBwYXJ0aXRpb24oXG4gICAgICB0aGlzLmRpc3BsYXllZERhdGEsXG4gICAgICBpdGVtID0+IGl0ZW0ubmFtZSA9PT0gbmFtZXNwYWNlLFxuICAgICk7XG4gICAgcmV0dXJuIFsuLi5zZWxlY3RlZCwgLi4ub3RoZXJzXTtcbiAgfVxuXG4gIHN0b3JlTmFtZXNwYWNlcygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRQcm9qZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2x1c3RlciA9PT0gJ19fYWxsJykge1xuICAgICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIHRoaXMuY2x1c3RlcnMpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0U2VydmljZS5zdG9yZU5hbWVzcGFjZXMoXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFByb2plY3QubWV0YWRhdGEubmFtZSxcbiAgICAgICAgICBjbHVzdGVyLFxuICAgICAgICAgIHRoaXMuZGlzcGxheWVkRGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLmNsdXN0ZXIgPT09IGNsdXN0ZXIpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLnN0b3JlTmFtZXNwYWNlcyhcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Lm1ldGFkYXRhLm5hbWUsXG4gICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlcixcbiAgICAgIHRoaXMuZGlzcGxheWVkRGF0YSxcbiAgICApO1xuICB9XG5cbiAgcHJvamVjdEZpbHRlckZuID0gKGtleXdvcmQgPSAnJywgb3B0aW9uOiBTZWxlY3RGaWx0ZXJPcHRpb248UHJvamVjdD4pID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiAoXG4gICAgICBvcHRpb24udmFsdWUubWV0YWRhdGEubmFtZS5pbmNsdWRlcyhrKSB8fFxuICAgICAgZ2V0RG9tYWluQW5ub3RhdGlvbihESVNQTEFZX05BTUUsIG9wdGlvbi52YWx1ZSlcbiAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgID8uaW5jbHVkZXMoaylcbiAgICApO1xuICB9O1xuXG4gIGNsdXN0ZXJGaWx0ZXJGbiA9IChrZXl3b3JkID0gJycsIG9wdGlvbjogU2VsZWN0RmlsdGVyT3B0aW9uPHN0cmluZz4pID0+IHtcbiAgICBjb25zdCBrID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChvcHRpb24udmFsdWUgPT09ICdfX2FsbCcpIHtcbiAgICAgIHJldHVybiAob3B0aW9uLmxhYmVsIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhrKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG5hbWUsIGRpc3BsYXlOYW1lIH0gPSBvcHRpb24ubGFiZWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICByZXR1cm4gbmFtZS5pbmNsdWRlcyhrKSB8fCBkaXNwbGF5TmFtZT8udG9Mb3dlckNhc2UoKT8uaW5jbHVkZXMoayk7XG4gIH07XG5cbiAgc2VydmljZU1lc2hGaWx0ZXJGbiA9IChcbiAgICBrZXl3b3JkID0gJycsXG4gICAgb3B0aW9uOiBTZWxlY3RGaWx0ZXJPcHRpb248U2VydmljZU1lc2hHcm91cD4sXG4gICkgPT4ge1xuICAgIGNvbnN0IGsgPSBrZXl3b3JkLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgdmVyc2lvbiA9IG9wdGlvbi52YWx1ZS5zcGVjPy5pc3Rpb1ZlcnNpb25cbiAgICAgID8gYElzdGlvICR7b3B0aW9uLnZhbHVlLnNwZWMuaXN0aW9WZXJzaW9ufWBcbiAgICAgIDogJyc7XG4gICAgcmV0dXJuIChcbiAgICAgIG9wdGlvbi52YWx1ZS5tZXRhZGF0YS5uYW1lLmluY2x1ZGVzKGspIHx8XG4gICAgICB2ZXJzaW9uLnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKGspXG4gICAgKTtcbiAgfTtcblxuICBwcm9qZWN0VHJhY2tGbiA9IChwcm9qZWN0OiBQcm9qZWN0KSA9PiBwcm9qZWN0Py5tZXRhZGF0YS5uYW1lO1xuXG4gIHNlcnZpY2VNZXNoVHJhY2tGbiA9IChtZXNoOiBTZXJ2aWNlTWVzaEdyb3VwKSA9PiBtZXNoPy5tZXRhZGF0YS5uYW1lO1xuXG4gIHByaXZhdGUgaW5pdFByb2plY3QocHJvamVjdHM6IFByb2plY3RbXSkge1xuICAgIHRoaXMuc2VsZWN0UHJvamVjdChcbiAgICAgIChwcm9qZWN0cyB8fCBbXSkubGVuZ3RoXG4gICAgICAgID8gcHJvamVjdHMuZmluZChpdGVtID0+IGl0ZW0ubWV0YWRhdGEubmFtZSA9PT0gdGhpcy52YWx1ZT8ucHJvamVjdCkgfHxcbiAgICAgICAgICAgIHByb2plY3RzWzBdXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgICB0aGlzLmxvYWQuZW1pdCh7XG4gICAgICBwcm9qZWN0OiBwcm9qZWN0cy5sZW5ndGgsXG4gICAgICBjbHVzdGVyOiB1bmlxKFxuICAgICAgICBwcm9qZWN0cy5yZWR1Y2UoXG4gICAgICAgICAgKGFjYywgY3VyKSA9PiBbLi4uYWNjLCAuLi4oY3VyLnNwZWMuY2x1c3RlcnMgfHwgW10pLm1hcChjID0+IGMubmFtZSldLFxuICAgICAgICAgIFtdLFxuICAgICAgICApLFxuICAgICAgKS5sZW5ndGgsXG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RTZXJ2aWNlTWVzaChzZXJ2aWNlTWVzaDogU2VydmljZU1lc2hHcm91cCkge1xuICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9IHNlcnZpY2VNZXNoO1xuICAgIHRoaXMuY2x1c3RlcnMgPSAodGhpcy5zZWxlY3RlZFByb2plY3Quc3BlYy5jbHVzdGVycyB8fCBbXSlcbiAgICAgIC5tYXAoYyA9PiBjLm5hbWUpXG4gICAgICAuZmlsdGVyKGNsdXN0ZXIgPT5cbiAgICAgICAgdGhpcy5zZXJ2aWNlTWVzaGVzXG4gICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICBtZXNoID0+XG4gICAgICAgICAgICAgIHRoaXMuazhzVXRpbC5nZXROYW1lKG1lc2gpID09PSB0aGlzLms4c1V0aWwuZ2V0TmFtZShzZXJ2aWNlTWVzaCksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5zcGVjLmNsdXN0ZXJzLmluY2x1ZGVzKGNsdXN0ZXIpLFxuICAgICAgKTtcbiAgICB0aGlzLnNlbGVjdENsdXN0ZXIoJ19fYWxsJyk7XG4gIH1cblxuICBzZWxlY3RQcm9qZWN0KHByb2plY3Q6IFByb2plY3QsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgIHRoaXMucHJvamVjdENoYW5nZS5lbWl0KHByb2plY3Q/Lm1ldGFkYXRhLm5hbWUpO1xuICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0ID0gcHJvamVjdDtcbiAgICB0aGlzLmNsdXN0ZXJzID0gcHJvamVjdFxuICAgICAgPyAocHJvamVjdC5zcGVjLmNsdXN0ZXJzIHx8IFtdKS5tYXAoYyA9PiBjLm5hbWUpXG4gICAgICA6IFtdO1xuICAgIGlmICh0aGlzLmRpc3BsYXlTZXJ2aWNlTWVzaCkge1xuICAgICAgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcyA9IHRoaXMuc2VydmljZU1lc2hlcy5maWx0ZXIobWVzaCA9PlxuICAgICAgICBtZXNoLnNwZWMuY2x1c3RlcnMuc29tZShjbHVzdGVyID0+IHRoaXMuY2x1c3RlcnMuaW5jbHVkZXMoY2x1c3RlcikpLFxuICAgICAgKTtcbiAgICAgIGlmICh0aGlzLnByb2plY3RTZXJ2aWNlTWVzaGVzPy5sZW5ndGgpIHtcbiAgICAgICAgbGV0IG1lc2hOYW1lID0gdGhpcy52YWx1ZT8uc2VydmljZW1lc2g7XG5cbiAgICAgICAgaWYgKCFtZXNoTmFtZSkge1xuICAgICAgICAgIHRoaXMuYXV0aC5nZXRBY2NvdW50SW5mbygpLnN1YnNjcmliZSgoeyBlbWFpbCB9KSA9PiB7XG4gICAgICAgICAgICBtZXNoTmFtZSA9IGdldFdvcmtzcGFjZVBhcmFtcyhlbWFpbCk/LnNlcnZpY2VtZXNoO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRTZXJ2aWNlTWVzaCA9XG4gICAgICAgICAgdGhpcy5wcm9qZWN0U2VydmljZU1lc2hlcy5maW5kKFxuICAgICAgICAgICAgbWVzaCA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShtZXNoKSA9PT0gbWVzaE5hbWUsXG4gICAgICAgICAgKSB8fCB0aGlzLnByb2plY3RTZXJ2aWNlTWVzaGVzWzBdO1xuICAgICAgICB0aGlzLnNlbGVjdFNlcnZpY2VNZXNoKHNlbGVjdGVkU2VydmljZU1lc2gpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFNlcnZpY2VNZXNoID0gbnVsbDtcbiAgICAgICAgdGhpcy5jbHVzdGVycyA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnNlbGVjdENsdXN0ZXIoJ19fYWxsJywgaW5pdGlhbCk7XG4gIH1cblxuICBzZWxlY3RDbHVzdGVyKGNsdXN0ZXJOYW1lOiBzdHJpbmcsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgIHRoaXMuc2VsZWN0ZWRDbHVzdGVyID0gY2x1c3Rlck5hbWU7XG4gICAgY29uc3QgZGlzcGxheWVkRGF0YSA9XG4gICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlLmdldENhY2hlZE5hbWVzcGFjZXMoXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQcm9qZWN0Py5tZXRhZGF0YS5uYW1lLFxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlcixcbiAgICAgICkgfHwgW107XG4gICAgdGhpcy5kaXNwbGF5ZWREYXRhID0gdGhpcy5nZXRTb3J0ZWROYW1lc3BhY2UoXG4gICAgICBkaXNwbGF5ZWREYXRhLFxuICAgICAgaW5pdGlhbCA/IHRoaXMudmFsdWU/Lm5hbWUgOiBudWxsLFxuICAgICk7XG4gICAgdGhpcy5zZXRTZWxlY3RlZE5hbWVzcGFjZSh0aGlzLmRpc3BsYXllZERhdGEpO1xuXG4gICAgdGhpcy5jbHVzdGVyQ2hhbmdlLmVtaXQoXG4gICAgICB0aGlzLnNlbGVjdGVkQ2x1c3RlciA9PT0gJ19fYWxsJyA/IG51bGwgOiBjbHVzdGVyTmFtZSxcbiAgICApO1xuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5sb2FkJCQubmV4dCh7XG4gICAgICBwcm9qZWN0OiB0aGlzLnNlbGVjdGVkUHJvamVjdCxcbiAgICAgIGNsdXN0ZXI6IGNsdXN0ZXJOYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRTZWxlY3RlZE5hbWVzcGFjZShkYXRhOiBOYW1lc3BhY2VEYXRhSXRlbVtdKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWROYW1lc3BhY2UgPSB0aGlzLnZhbHVlXG4gICAgICA/IGRhdGEuZmluZChcbiAgICAgICAgICBpdGVtID0+XG4gICAgICAgICAgICBpdGVtLm5hbWUgPT09IHRoaXMudmFsdWUubmFtZSAmJlxuICAgICAgICAgICAgdGhpcy52YWx1ZS5jbHVzdGVyID09PSBpdGVtLmNsdXN0ZXIsXG4gICAgICAgIClcbiAgICAgIDogbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkVWlkID0gc2VsZWN0ZWROYW1lc3BhY2VcbiAgICAgID8gc2VsZWN0ZWROYW1lc3BhY2UuX19vcmlnaW4ubWV0YWRhdGEudWlkXG4gICAgICA6IG51bGw7XG4gIH1cblxuICBtYXBSZXNvdXJjZSA9IChcbiAgICBsaXN0OiBLdWJlcm5ldGVzUmVzb3VyY2VbXSxcbiAgICB7XG4gICAgICBpc011bHRpQXJjaCxcbiAgICAgIGNsdXN0ZXJzLFxuICAgIH06IHtcbiAgICAgIGlzTXVsdGlBcmNoOiBib29sZWFuO1xuICAgICAgY2x1c3RlcnM6IENsdXN0ZXJbXTtcbiAgICB9LFxuICApOiBOYW1lc3BhY2VEYXRhSXRlbVtdID0+XG4gICAgbGlzdC5tYXAoaXRlbSA9PiB7XG4gICAgICBjb25zdCBjbHVzdGVyID0gdGhpcy5uYW1lc3BhY2VDbHVzdGVyTWFwW2l0ZW0ubWV0YWRhdGEudWlkXTtcbiAgICAgIGNvbnN0IGl0ZW1EaXNhYmxlZCA9IHRoaXMuZGlzYWJsZUZuID8gdGhpcy5kaXNhYmxlRm4oaXRlbSkgOiBudWxsO1xuICAgICAgY29uc3QgY2FjaGVkSXRlbSA9IHRoaXMuZGlzcGxheWVkRGF0YS5maW5kKFxuICAgICAgICBucyA9PiBucy5fX29yaWdpbi5tZXRhZGF0YS51aWQgPT09IGl0ZW0ubWV0YWRhdGEudWlkLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VtZXNoID0gdGhpcy5zZXJ2aWNlTWVzaGVzLmZpbmQoaXRlbSA9PlxuICAgICAgICBpdGVtLnNwZWMuY2x1c3RlcnMuaW5jbHVkZXMoY2FjaGVkSXRlbT8uY2x1c3RlciB8fCBjbHVzdGVyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpdGVtKSxcbiAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMuazhzVXRpbC5nZXREaXNwbGF5TmFtZShpdGVtKSxcbiAgICAgICAgY2x1c3RlcjogY2FjaGVkSXRlbT8uY2x1c3RlciB8fCBjbHVzdGVyLFxuICAgICAgICBjbHVzdGVyRGlzcGxheU5hbWU6XG4gICAgICAgICAgY2FjaGVkSXRlbT8uY2x1c3RlckRpc3BsYXlOYW1lIHx8XG4gICAgICAgICAgdGhpcy5rOHNVdGlsLmdldERpc3BsYXlOYW1lKFxuICAgICAgICAgICAgY2x1c3RlcnMuZmluZChjID0+IGMubWV0YWRhdGEubmFtZSA9PT0gY2x1c3RlciksXG4gICAgICAgICAgKSxcbiAgICAgICAgY2x1c3RlckFyY2g6XG4gICAgICAgICAgY2FjaGVkSXRlbT8uY2x1c3RlckFyY2ggfHwgaXNNdWx0aUFyY2hcbiAgICAgICAgICAgID8gdGhpcy5nZXRDbHVzdGVyQXJjaChcbiAgICAgICAgICAgICAgICBjbHVzdGVycy5maW5kKGMgPT4gYy5tZXRhZGF0YS5uYW1lID09PSBjbHVzdGVyKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICBzZXJ2aWNlTWVzaE5hbWU6IHNlcnZpY2VtZXNoID8gdGhpcy5rOHNVdGlsLmdldE5hbWUoc2VydmljZW1lc2gpIDogJycsXG4gICAgICAgIHNlcnZpY2VNZXNoQ2x1c3RlcnM6IHNlcnZpY2VtZXNoID8gc2VydmljZW1lc2guc3BlYy5jbHVzdGVycyA6IFtdLFxuICAgICAgICBzZXJ2aWNlTWVzaElzdGlvVmVyc2lvbjogc2VydmljZW1lc2hcbiAgICAgICAgICA/IHNlcnZpY2VtZXNoLnNwZWMuaXN0aW9WZXJzaW9uXG4gICAgICAgICAgOiAnJyxcbiAgICAgICAgYWRtaW46IGNhY2hlZEl0ZW0/LmFkbWluIHx8ICctJyxcbiAgICAgICAgdGltZXN0YW1wOiB0aGlzLms4c1V0aWwuZ2V0Q3JlYXRpb25UaW1lc3RhbXAoaXRlbSksXG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgZGlzYWJsZWQ6XG4gICAgICAgICAgICB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8uZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIGl0ZW1EaXNhYmxlZD8uZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIHRoaXMuY2hlY2tDbHVzdGVyRXJyb3IoY2x1c3RlcnMsIGNhY2hlZEl0ZW0/LmNsdXN0ZXIgfHwgY2x1c3RlcikgfHxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHRvb2x0aXA6IHRoaXMuZ3JpZFN0YXRlTWFwW2NsdXN0ZXJdPy5kaXNhYmxlZFxuICAgICAgICAgICAgPyB0aGlzLmdyaWRTdGF0ZU1hcFtjbHVzdGVyXT8udG9vbHRpcCB8fCAnJ1xuICAgICAgICAgICAgOiBpdGVtRGlzYWJsZWQ/LnRvb2x0aXAsXG4gICAgICAgIH0sXG4gICAgICAgIF9fb3JpZ2luOiBpdGVtLFxuICAgICAgfTtcbiAgICB9KTtcblxuICBwcml2YXRlIGdldENsdXN0ZXJBcmNoKGNsdXN0ZXI6IENsdXN0ZXIpIHtcbiAgICByZXR1cm4gZ2V0RGlzcGxheUFyY2goXG4gICAgICB0aGlzLms4c1V0aWwuZ2V0TGFiZWwoY2x1c3RlciwgJ2FyY2gnKSxcbiAgICApIGFzIENsdXN0ZXJBcmNoO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0NsdXN0ZXJFcnJvcihjbHVzdGVyczogQ2x1c3RlcltdLCBjbHVzdGVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2x1c3RlcnNcbiAgICAgICAgLmZpbmQoaSA9PiB0aGlzLms4c1V0aWwuZ2V0TmFtZShpKSA9PT0gY2x1c3RlcilcbiAgICAgICAgPy5zdGF0dXMuY29uZGl0aW9ucy5maW5kKGMgPT4gYy50eXBlID09PSAnTm9kZU5vdFJlYWR5Jyk/LnN0YXR1cyAhPT1cbiAgICAgICdGYWxzZSdcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsdGVyXCI+XG4gIDxhdWktZm9ybS1pdGVtPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdwcm9qZWN0JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgPGF1aS1zZWxlY3RcbiAgICAgIFtuZ0NsYXNzXT1cImRpc3BsYXlTZXJ2aWNlTWVzaCA/ICdsYW5nLW5vdC16aDohdHctdy1bMjMwcHhdJyA6ICcnXCJcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgbmFtZT1cInByb2plY3RcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFByb2plY3RcIlxuICAgICAgW2ZpbHRlckZuXT1cInByb2plY3RGaWx0ZXJGblwiXG4gICAgICBbdHJhY2tGbl09XCJwcm9qZWN0VHJhY2tGblwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwic2VsZWN0UHJvamVjdCgkZXZlbnQpXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICA+XG4gICAgICA8YXVpLW9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgcHJvamVjdCBvZiBwcm9qZWN0c1wiXG4gICAgICAgIFt2YWx1ZV09XCJwcm9qZWN0XCJcbiAgICAgICAgW2xhYmVsXT1cInByb2plY3QgfCBhY2xVbmlvbkRpc3BsYXlOYW1lXCJcbiAgICAgID5cbiAgICAgICAge3sgcHJvamVjdCB8IGFjbFVuaW9uRGlzcGxheU5hbWUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbj5cbiAgICAgIDxhdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgICAgICB7eyAnbm9fZGF0YScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvYXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbiAgPCEtLSBBU00g6YCJ5oup572R5qC86L+H5ruk6ZuG576k6YCJ6aG5IC0tPlxuICA8YXVpLWZvcm0taXRlbSAqbmdJZj1cImRpc3BsYXlTZXJ2aWNlTWVzaFwiPlxuICAgIDxsYWJlbCBhdWlGb3JtSXRlbUxhYmVsPnt7ICdzZXJ2aWNlX21lc2gnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICA8YXVpLXNlbGVjdFxuICAgICAgY2xhc3M9XCJsYW5nLW5vdC16aDohdHctdy1bMjMwcHhdXCJcbiAgICAgIGF1aUZvcm1JdGVtQ29udHJvbFxuICAgICAgbmFtZT1cInNlcnZpY2VNZXNoUHJvamVjdFwiXG4gICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZU1lc2hcIlxuICAgICAgW3RyYWNrRm5dPVwic2VydmljZU1lc2hUcmFja0ZuXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3RTZXJ2aWNlTWVzaCgkZXZlbnQpXCJcbiAgICAgIFtsb2FkaW5nXT1cIiFwcm9qZWN0cy5sZW5ndGggJiYgcHJvamVjdHNMb2FkaW5nXCJcbiAgICA+XG4gICAgICA8YXVpLW9wdGlvblxuICAgICAgICAqbmdGb3I9XCJsZXQgbWVzaCBvZiBwcm9qZWN0U2VydmljZU1lc2hlc1wiXG4gICAgICAgIFt2YWx1ZV09XCJtZXNoXCJcbiAgICAgICAgW2xhYmVsXT1cIlxuICAgICAgICAgIChtZXNoIHwgYWNsTmFtZSkgK1xuICAgICAgICAgIChtZXNoLnNwZWM/LmlzdGlvVmVyc2lvblxuICAgICAgICAgICAgPyAnIChJc3RpbyAnICsgbWVzaC5zcGVjLmlzdGlvVmVyc2lvbiArICcpJ1xuICAgICAgICAgICAgOiAnJylcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgbWVzaCB8IGFjbE5hbWUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1lc2guc3BlYz8uaXN0aW9WZXJzaW9uXCI+XG4gICAgICAgICAgKElzdGlvIHt7IG1lc2guc3BlYy5pc3Rpb1ZlcnNpb24gfX0pXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPGF1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgICAgIHt7ICdub19kYXRhJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9hdWktb3B0aW9uLXBsYWNlaG9sZGVyPlxuICAgIDwvYXVpLXNlbGVjdD5cbiAgPC9hdWktZm9ybS1pdGVtPlxuICA8YXVpLWZvcm0taXRlbT5cbiAgICA8bGFiZWwgYXVpRm9ybUl0ZW1MYWJlbD57eyAnY2x1c3RlcicgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgIDxhdWktc2VsZWN0XG4gICAgICBbbmdDbGFzc109XCJkaXNwbGF5U2VydmljZU1lc2ggPyAnbGFuZy1ub3Qtemg6IXR3LXctWzIzMHB4XScgOiAnJ1wiXG4gICAgICBhdWlGb3JtSXRlbUNvbnRyb2xcbiAgICAgIG5hbWU9XCJjbHVzdGVyXCJcbiAgICAgIFtmaWx0ZXJGbl09XCJjbHVzdGVyRmlsdGVyRm5cIlxuICAgICAgW2xvYWRpbmddPVwiIXByb2plY3RzLmxlbmd0aCAmJiBwcm9qZWN0c0xvYWRpbmdcIlxuICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZENsdXN0ZXJcIlxuICAgICAgKHZhbHVlQ2hhbmdlKT1cInNlbGVjdENsdXN0ZXIoJGV2ZW50KVwiXG4gICAgPlxuICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgW3ZhbHVlXT1cIidfX2FsbCdcIlxuICAgICAgICBbbGFiZWxdPVwiJ2FsbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgPlxuICAgICAgICB7eyAnYWxsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2x1c3Rlck5hbWUgb2YgY2x1c3RlcnNcIj5cbiAgICAgICAgPGF1aS1vcHRpb25cbiAgICAgICAgICAqZGVjbGFyZT1cIntcbiAgICAgICAgICAgIG5hbWU6IGNsdXN0ZXJOYW1lLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGNsdXN0ZXJOYW1lIHwgcHVyZTogZ2V0Q2x1c3RlckRpc3BsYXlOYW1lJCB8IGFzeW5jXG4gICAgICAgICAgfSBhcyBjbHVzdGVyXCJcbiAgICAgICAgICBbdmFsdWVdPVwiY2x1c3Rlck5hbWVcIlxuICAgICAgICAgIFtsYWJlbF09XCJjbHVzdGVyTGFiZWxcIlxuICAgICAgICAgIFtsYWJlbENvbnRleHRdPVwiY2x1c3RlclwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImNsdXN0ZXJOYW1lIHwgcHVyZTogY2hlY2tDbHVzdGVyRXJyb3IkIHwgYXN5bmNcIlxuICAgICAgICAgIFthdWlUb29sdGlwXT1cIidjdXJyZW50X2NsdXN0ZXJfc3RhdHVzX2Fibm9ybWFsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgW2F1aVRvb2x0aXBEaXNhYmxlZF09XCJcbiAgICAgICAgICAgICEoY2x1c3Rlck5hbWUgfCBwdXJlOiBjaGVja0NsdXN0ZXJFcnJvciQgfCBhc3luYylcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjbHVzdGVyTGFiZWw7IGNvbnRleHQ6IGNsdXN0ZXJcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hdWktb3B0aW9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8YXVpLW9wdGlvbi1wbGFjZWhvbGRlcj5cbiAgICAgICAge3sgJ25vX2RhdGEnIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2F1aS1vcHRpb24tcGxhY2Vob2xkZXI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgI2NsdXN0ZXJMYWJlbFxuICAgICAgICBsZXQtbmFtZT1cIm5hbWVcIlxuICAgICAgICBsZXQtZGlzcGxheU5hbWU9XCJkaXNwbGF5TmFtZVwiXG4gICAgICA+XG4gICAgICAgIHt7IG5hbWUgfX1cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlOYW1lXCI+KHt7IGRpc3BsYXlOYW1lIH19KTwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2F1aS1zZWxlY3Q+XG4gIDwvYXVpLWZvcm0taXRlbT5cbjwvZGl2PlxuPGFjbC1yZXNvdXJjZS1kYXRhLWdyaWRcbiAgW2RhdGFdPVwiZGlzcGxheWVkRGF0YSB8fCBbXVwiXG4gIFtmaWVsZHNdPVwiZmllbGRzXCJcbiAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gIChzZWxlY3RJdGVtKT1cIm9uU2VsZWN0KCRldmVudClcIlxuICBbYWN0aW9uVGVtcGxhdGVSZWZdPVwiYWN0aW9uVGVtcGxhdGVSZWZcIlxuICBbc2VsZWN0ZWRVaWRdPVwic2VsZWN0ZWRVaWRcIlxuICBbbG9hZGluZ109XCJmb3JjZUxvYWRpbmcgfHwgKCFkaXNwbGF5ZWREYXRhPy5sZW5ndGggJiYgbG9hZGluZylcIlxuICAocmVsb2FkKT1cInJlbG9hZCgpXCJcbj5cbiAgPG5nLWNvbnRhaW5lciBhY2xSZXNvdXJjZUdyaWRIZWFkZXI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvYWNsLXJlc291cmNlLWRhdGEtZ3JpZD5cbiJdfQ==