@openziti/ziti-console-lib 0.4.9 → 0.5.0

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 (70) hide show
  1. package/assets/styles/global.scss +30 -0
  2. package/esm2022/lib/features/data-table/cells/table-cell-name/table-cell-name.component.mjs +11 -3
  3. package/esm2022/lib/features/data-table/data-table-filter.service.mjs +76 -5
  4. package/esm2022/lib/features/data-table/data-table.component.mjs +13 -4
  5. package/esm2022/lib/features/data-table/table-filter-bar/filter-bar.component.mjs +11 -5
  6. package/esm2022/lib/features/preview-list/preview-list.component.mjs +20 -4
  7. package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +1 -1
  8. package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +1 -1
  9. package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +2 -2
  10. package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +1 -1
  11. package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +3 -3
  12. package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +106 -21
  13. package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +9 -2
  14. package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +1 -1
  15. package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +1 -1
  16. package/esm2022/lib/features/projectable-forms/terminator/terminator-form.component.mjs +248 -0
  17. package/esm2022/lib/features/projectable-forms/terminator/terminator-form.service.mjs +131 -0
  18. package/esm2022/lib/features/visualizer/identity-service-path/identity-service-path.helper.mjs +2 -4
  19. package/esm2022/lib/models/terminator.mjs +14 -0
  20. package/esm2022/lib/pages/configurations/configurations-page.component.mjs +1 -1
  21. package/esm2022/lib/pages/edge-router-policies/edge-router-policies-page.component.mjs +1 -1
  22. package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +1 -1
  23. package/esm2022/lib/pages/identities/identities-page.component.mjs +1 -1
  24. package/esm2022/lib/pages/service-edge-router-policies/service-edge-router-policies-page.component.mjs +1 -1
  25. package/esm2022/lib/pages/service-policies/service-policies-page.component.mjs +1 -1
  26. package/esm2022/lib/pages/services/services-page.component.mjs +1 -1
  27. package/esm2022/lib/pages/terminators/terminators-page.component.mjs +96 -0
  28. package/esm2022/lib/pages/terminators/terminators-page.service.mjs +185 -0
  29. package/esm2022/lib/services/ziti-controller-data.service.mjs +7 -3
  30. package/esm2022/lib/services/ziti-data.service.mjs +1 -1
  31. package/esm2022/lib/version.mjs +2 -2
  32. package/esm2022/lib/ziti-console-lib.module.mjs +20 -8
  33. package/esm2022/public-api.mjs +6 -1
  34. package/fesm2022/openziti-ziti-console-lib.mjs +4168 -3343
  35. package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
  36. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts +1 -0
  37. package/lib/features/data-table/cells/table-cell-name/table-cell-name.component.d.ts.map +1 -1
  38. package/lib/features/data-table/data-table-filter.service.d.ts +11 -1
  39. package/lib/features/data-table/data-table-filter.service.d.ts.map +1 -1
  40. package/lib/features/data-table/data-table.component.d.ts +4 -1
  41. package/lib/features/data-table/data-table.component.d.ts.map +1 -1
  42. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts +3 -1
  43. package/lib/features/data-table/table-filter-bar/filter-bar.component.d.ts.map +1 -1
  44. package/lib/features/preview-list/preview-list.component.d.ts +2 -1
  45. package/lib/features/preview-list/preview-list.component.d.ts.map +1 -1
  46. package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts +1 -1
  47. package/lib/features/projectable-forms/service/service-form.component.d.ts +1 -1
  48. package/lib/features/projectable-forms/service/service-form.service.d.ts +16 -2
  49. package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
  50. package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
  51. package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts +59 -0
  52. package/lib/features/projectable-forms/terminator/terminator-form.component.d.ts.map +1 -0
  53. package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts +33 -0
  54. package/lib/features/projectable-forms/terminator/terminator-form.service.d.ts.map +1 -0
  55. package/lib/features/visualizer/identity-service-path/identity-service-path.helper.d.ts.map +1 -1
  56. package/lib/models/terminator.d.ts +11 -0
  57. package/lib/models/terminator.d.ts.map +1 -0
  58. package/lib/pages/terminators/terminators-page.component.d.ts +29 -0
  59. package/lib/pages/terminators/terminators-page.component.d.ts.map +1 -0
  60. package/lib/pages/terminators/terminators-page.service.d.ts +31 -0
  61. package/lib/pages/terminators/terminators-page.service.d.ts.map +1 -0
  62. package/lib/services/ziti-controller-data.service.d.ts +1 -1
  63. package/lib/services/ziti-controller-data.service.d.ts.map +1 -1
  64. package/lib/services/ziti-data.service.d.ts +1 -1
  65. package/lib/services/ziti-data.service.d.ts.map +1 -1
  66. package/lib/ziti-console-lib.module.d.ts +20 -18
  67. package/lib/ziti-console-lib.module.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/public-api.d.ts +5 -0
  70. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,248 @@
1
+ /*
2
+ Copyright NetFoundry Inc.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ https://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ */
16
+ import { Component, EventEmitter, Inject, Input, Output, } from '@angular/core';
17
+ import { ProjectableForm } from "../projectable-form.class";
18
+ import { SHAREDZ_EXTENSION } from "../../extendable/extensions-noop.service";
19
+ import { cloneDeep, defer, forOwn, invert, isEmpty } from 'lodash';
20
+ import { SETTINGS_SERVICE } from "../../../services/settings.service";
21
+ import { ZITI_DATA_SERVICE } from "../../../services/ziti-data.service";
22
+ import { Terminator } from "../../../models/terminator";
23
+ import * as i0 from "@angular/core";
24
+ import * as i1 from "./terminator-form.service";
25
+ import * as i2 from "../../../services/schema.service";
26
+ import * as i3 from "../../messaging/growler.service";
27
+ import * as i4 from "@angular/router";
28
+ import * as i5 from "@angular/common";
29
+ import * as i6 from "@angular/forms";
30
+ import * as i7 from "../form-header/form-header.component";
31
+ import * as i8 from "../form-field-container/form-field-container.component";
32
+ import * as i9 from "../../loading-indicator/loading-indicator.component";
33
+ import * as i10 from "../../json-view/json-view.component";
34
+ import * as i11 from "../../../services/settings.service";
35
+ import * as i12 from "../../../services/ziti-data.service";
36
+ class TerminatorFormComponent extends ProjectableForm {
37
+ constructor(svc, schemaSvc, growlerService, extService, settingsService, zitiService, router, route, location) {
38
+ super(growlerService, extService, zitiService, router, route, location);
39
+ this.svc = svc;
40
+ this.schemaSvc = schemaSvc;
41
+ this.settingsService = settingsService;
42
+ this.zitiService = zitiService;
43
+ this.router = router;
44
+ this.route = route;
45
+ this.formData = {};
46
+ this.errors = {};
47
+ this.close = new EventEmitter();
48
+ this.formView = 'simple';
49
+ this.options = [];
50
+ this.isEditing = !isEmpty(this.formData.id);
51
+ this.formDataInvalid = false;
52
+ this.editMode = false;
53
+ this.items = [];
54
+ this.settings = {};
55
+ this.entityType = 'terminators';
56
+ this.entityClass = Terminator;
57
+ this._apiData = {};
58
+ }
59
+ ngOnInit() {
60
+ super.ngOnInit();
61
+ this.settingsService.settingsChange.subscribe((results) => {
62
+ this.settings = results;
63
+ });
64
+ }
65
+ entityUpdated() {
66
+ super.entityUpdated();
67
+ const promises = [];
68
+ promises.push(this.svc.getServiceNamedAttributes());
69
+ promises.push(this.svc.getIdentityNamedAttributes());
70
+ promises.push(this.svc.getRouterNamedAttributes());
71
+ Promise.all(promises).then(() => {
72
+ this.initSelectedAttributes();
73
+ });
74
+ }
75
+ ngOnDestroy() {
76
+ this.clearForm();
77
+ }
78
+ headerActionRequested(event) {
79
+ switch (event.name) {
80
+ case 'save':
81
+ this.save(event);
82
+ break;
83
+ case 'close':
84
+ this.returnToListPage();
85
+ break;
86
+ case 'toggle-view':
87
+ this.formView = event.data;
88
+ break;
89
+ }
90
+ }
91
+ clear() {
92
+ this.formData.configTypeId = '';
93
+ this.clearForm();
94
+ }
95
+ clearForm() {
96
+ this.items.forEach((item) => {
97
+ if (item?.component)
98
+ item.component.destroy();
99
+ });
100
+ this.errors = {};
101
+ this.items = [];
102
+ this.formData = {};
103
+ if (this.subscription)
104
+ this.subscription.unsubscribe();
105
+ }
106
+ async save(event) {
107
+ if (!this.validate()) {
108
+ return;
109
+ }
110
+ const tagVals = this.getTagValues();
111
+ if (!isEmpty(tagVals)) {
112
+ forOwn(tagVals, (value, key) => {
113
+ this.formData.tags[key] = value;
114
+ });
115
+ }
116
+ const apiData = this.apiData;
117
+ this.isLoading = true;
118
+ this.svc.save(apiData).then((result) => {
119
+ if (this.isModal) {
120
+ this.closeModal(true, true);
121
+ return;
122
+ }
123
+ this.initData = this.formData;
124
+ this._dataChange = false;
125
+ this.returnToListPage();
126
+ }).finally(() => {
127
+ this.isLoading = false;
128
+ });
129
+ }
130
+ validate() {
131
+ this.errors = {};
132
+ return isEmpty(this.errors);
133
+ }
134
+ get apiCallURL() {
135
+ return this.settings.selectedEdgeController + '/edge/management/v1/terminators' + (this.formData.id ? `/${this.formData.id}` : '');
136
+ }
137
+ get apiData() {
138
+ const data = {
139
+ service: this.selectedServiceId || '',
140
+ router: this.selectedRouterId || '',
141
+ identity: this.selectedIdentityId || '',
142
+ binding: this.formData.binding || '',
143
+ address: this.formData.address || '',
144
+ identitySecret: this.formData.identitySecret || '',
145
+ precedence: this.formData.precedence || '',
146
+ cost: this.formData.cost || 0
147
+ };
148
+ if (this.formData.id) {
149
+ data.id = this.formData.id;
150
+ }
151
+ this._apiData = data;
152
+ return this._apiData;
153
+ }
154
+ set apiData(data) {
155
+ this._apiData = data;
156
+ }
157
+ dataChanged(event) {
158
+ this._apiData = cloneDeep(this.apiData);
159
+ }
160
+ initSelectedAttributes() {
161
+ const serviceIdAttributesMap = invert(this.svc.serviceNamedAttributesMap);
162
+ const identityIdAttributesMap = invert(this.svc.identityNamedAttributesMap);
163
+ const routerIdAttributesMap = invert(this.svc.routerNamedAttributesMap);
164
+ this.selectedServiceNamedAttribute = serviceIdAttributesMap[this.formData?.service.id];
165
+ this.selectedIdentityNamedAttribute = identityIdAttributesMap[this.formData?.identity];
166
+ this.selectedRouterNamedAttribute = routerIdAttributesMap[this.formData?.router.id];
167
+ this.selectedServiceId = this.formData?.service.id;
168
+ this.selectedIdentityId = this.formData?.identity;
169
+ this.selectedRouterId = this.formData?.router.id;
170
+ this.svc.selectedServiceNamedAttributes = [];
171
+ if (this.selectedServiceNamedAttribute) {
172
+ this.svc.selectedServiceNamedAttributes.push(this.selectedServiceNamedAttribute);
173
+ }
174
+ this.svc.selectedIdentityNamedAttributes = [];
175
+ if (this.selectedIdentityNamedAttribute) {
176
+ this.svc.selectedIdentityNamedAttributes.push(this.selectedIdentityNamedAttribute);
177
+ }
178
+ this.svc.selectedRouterNamedAttributes = [];
179
+ if (this.selectedRouterNamedAttribute) {
180
+ this.svc.selectedRouterNamedAttributes.push(this.selectedRouterNamedAttribute);
181
+ }
182
+ }
183
+ serviceAttributeChanged(event) {
184
+ let selectedNamedAttributes = [];
185
+ if (isEmpty(event)) {
186
+ this.selectedServiceId = '';
187
+ }
188
+ else {
189
+ this.selectedServiceId = this.svc.serviceNamedAttributesMap[event];
190
+ selectedNamedAttributes = [event];
191
+ }
192
+ this.selectedServiceNamedAttribute = event;
193
+ defer(() => {
194
+ this.svc.selectedServiceNamedAttributes = selectedNamedAttributes;
195
+ });
196
+ }
197
+ identityAttributeChanged(event) {
198
+ let selectedNamedAttributes = [];
199
+ if (isEmpty(event)) {
200
+ this.selectedIdentityId = '';
201
+ }
202
+ else {
203
+ this.selectedIdentityId = this.svc.identityNamedAttributesMap[event];
204
+ selectedNamedAttributes = [event];
205
+ }
206
+ this.selectedIdentityNamedAttribute = event;
207
+ defer(() => {
208
+ this.svc.selectedIdentityNamedAttributes = selectedNamedAttributes;
209
+ });
210
+ }
211
+ routerAttributeChanged(event) {
212
+ let selectedNamedAttributes = [];
213
+ if (isEmpty(event)) {
214
+ this.selectedRouterId = '';
215
+ }
216
+ else {
217
+ this.selectedRouterId = this.svc.routerNamedAttributesMap[event];
218
+ selectedNamedAttributes = [event];
219
+ }
220
+ this.selectedRouterNamedAttribute = event;
221
+ defer(() => {
222
+ this.svc.selectedRouterNamedAttributes = selectedNamedAttributes;
223
+ });
224
+ }
225
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormComponent, deps: [{ token: i1.TerminatorFormService }, { token: i2.SchemaService }, { token: i3.GrowlerService }, { token: SHAREDZ_EXTENSION }, { token: SETTINGS_SERVICE }, { token: ZITI_DATA_SERVICE }, { token: i4.Router }, { token: i4.ActivatedRoute }, { token: i5.Location }], target: i0.ɵɵFactoryTarget.Component }); }
226
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TerminatorFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, usesInheritance: true, ngImport: i0, template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Terminator Details' : 'Create Terminator')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"terminator-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Service'\"\n [contentStyle]=\"'z-index: 10003'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedServiceNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedServiceNamedAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n [placeholder]=\"'Select a service'\"\n (addNamedAttribute)=\"serviceAttributeChanged($event)\"\n (namedAttributeRemoved)=\"serviceAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Router'\"\n [contentStyle]=\"'z-index: 10002'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedRouterNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedRouterNamedAttributes\"\n [availableNamedAttributes]=\"svc.routerNamedAttributes\"\n [placeholder]=\"'Select a router'\"\n (addNamedAttribute)=\"routerAttributeChanged($event)\"\n (namedAttributeRemoved)=\"routerAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity'\"\n [contentStyle]=\"'z-index: 10001'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedIdentityNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedIdentityNamedAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n [placeholder]=\"'Select an identity'\"\n (addNamedAttribute)=\"identityAttributeChanged($event)\"\n (namedAttributeRemoved)=\"identityAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Address'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <input class=\"form-field-input read-only\" [disabled]=\"true\" [(ngModel)]=\"formData.address\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Binding</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.binding\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Identity Secret</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.identitySecret\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'row'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Hosting Cost</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.cost\" type=\"number\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Precedence</span>\n <select\n [(ngModel)]=\"formData.precedence\"\n [disabled]=\"true\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown read-only\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".terminator-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}::ng-deep .terminator-form-container select:disabled,::ng-deep .terminator-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}@media (max-width: 1524px){.terminator-form-container .projectable-form-main-column{max-width:620px}}\n"], dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i6.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i8.FormFieldContainerComponent, selector: "lib-form-field-container", inputs: ["title", "title2", "layout", "helpText", "helpText2", "label", "count", "action", "actionLabel", "class", "contentStyle", "showHeader", "headerActions"], outputs: ["actionRequested"] }, { kind: "component", type: i9.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: i10.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }] }); }
227
+ }
228
+ export { TerminatorFormComponent };
229
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormComponent, decorators: [{
230
+ type: Component,
231
+ args: [{ selector: 'lib-configuration', template: "<div class=\"projectable-form-wrapper\"\n (keyup.enter)=\"save($event)\"\n (keyup.escape)=\"closeModal(false)\"\n tabindex=\"0\"\n>\n <lib-form-header\n [data]=\"formData\"\n [title]=\"(formData.id ? 'Terminator Details' : 'Create Terminator')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"terminator-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Service'\"\n [contentStyle]=\"'z-index: 10003'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedServiceNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedServiceNamedAttributes\"\n [availableNamedAttributes]=\"svc.serviceNamedAttributes\"\n [placeholder]=\"'Select a service'\"\n (addNamedAttribute)=\"serviceAttributeChanged($event)\"\n (namedAttributeRemoved)=\"serviceAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Router'\"\n [contentStyle]=\"'z-index: 10002'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedRouterNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedRouterNamedAttributes\"\n [availableNamedAttributes]=\"svc.routerNamedAttributes\"\n [placeholder]=\"'Select a router'\"\n (addNamedAttribute)=\"routerAttributeChanged($event)\"\n (namedAttributeRemoved)=\"routerAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'Identity'\"\n [contentStyle]=\"'z-index: 10001'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"selectedIdentityNamedAttribute\" [disabled]=\"true\"/>\n <!--<lib-tag-selector\n [(selectedNamedAttributes)]=\"svc.selectedIdentityNamedAttributes\"\n [availableNamedAttributes]=\"svc.identityNamedAttributes\"\n [placeholder]=\"'Select an identity'\"\n (addNamedAttribute)=\"identityAttributeChanged($event)\"\n (namedAttributeRemoved)=\"identityAttributeChanged()\"\n ></lib-tag-selector>-->\n </lib-form-field-container>\n </div>\n <div class=\"form-group-column one-half\">\n <lib-form-field-container\n [title]=\"'Address'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <input class=\"form-field-input read-only\" [disabled]=\"true\" [(ngModel)]=\"formData.address\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n [contentStyle]=\"'z-index: 1001'\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Binding</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.binding\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Identity Secret</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.identitySecret\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'row'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Hosting Cost</span>\n <input class=\"form-field-input\" [disabled]=\"true\" [(ngModel)]=\"formData.cost\" type=\"number\"/>\n </div>\n <div class=\"form-field-label-container\">\n <span class=\"form-field-title\">Precedence</span>\n <select\n [(ngModel)]=\"formData.precedence\"\n [disabled]=\"true\"\n id=\"hostingPrecedence\"\n class=\"form-field-dropdown read-only\"\n >\n <option value=\"default\">Default</option>\n <option value=\"required\">Required</option>\n <option value=\"failed\">Failed</option>\n </select>\n </div>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column\" *ngIf=\"formView === 'raw'\">\n <lib-json-view *ngIf=\"formData\" [(data)]=\"formData\"></lib-json-view>\n </div>\n </div>\n</div>\n<lib-loading-indicator *ngIf=\"isLoading\" [isLoading]=\"isLoading\"></lib-loading-indicator>\n", styles: [".terminator-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.config-type-select.disabled{opacity:.7;pointer-events:none}::ng-deep .terminator-form-container select:disabled,::ng-deep .terminator-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}@media (max-width: 1524px){.terminator-form-container .projectable-form-main-column{max-width:620px}}\n"] }]
232
+ }], ctorParameters: function () { return [{ type: i1.TerminatorFormService }, { type: i2.SchemaService }, { type: i3.GrowlerService }, { type: undefined, decorators: [{
233
+ type: Inject,
234
+ args: [SHAREDZ_EXTENSION]
235
+ }] }, { type: i11.SettingsService, decorators: [{
236
+ type: Inject,
237
+ args: [SETTINGS_SERVICE]
238
+ }] }, { type: i12.ZitiDataService, decorators: [{
239
+ type: Inject,
240
+ args: [ZITI_DATA_SERVICE]
241
+ }] }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.Location }]; }, propDecorators: { formData: [{
242
+ type: Input
243
+ }], errors: [{
244
+ type: Input
245
+ }], close: [{
246
+ type: Output
247
+ }] } });
248
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYXRvci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9qZWN0YWJsZS1mb3Jtcy90ZXJtaW5hdG9yL3Rlcm1pbmF0b3ItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvdGVybWluYXRvci90ZXJtaW5hdG9yLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0VBY0U7QUFFRixPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFFRyxNQUFNLEdBRWpCLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFHN0YsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQWUsTUFBTSxRQUFRLENBQUM7QUFFL0UsT0FBTyxFQUFDLGdCQUFnQixFQUFrQixNQUFNLG9DQUFvQyxDQUFDO0FBQ3JGLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUV2RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBR3RELE1BS2EsdUJBQXdCLFNBQVEsZUFBZTtJQXNCeEQsWUFDVyxHQUEwQixFQUN6QixTQUF3QixFQUNoQyxjQUE4QixFQUNILFVBQTRCLEVBQ3RCLGVBQWdDLEVBQzdCLFdBQTRCLEVBQzdDLE1BQWMsRUFDZCxLQUFx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Qjs0RkFBdkIsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNJLG1CQUFtQjs7MEJBOEJ4QixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxpQkFBaUI7cUhBMUJYLFFBQVE7c0JBQXpCLEtBQUs7Z0JBQ1ksTUFBTTtzQkFBdkIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICAgIENvcHlyaWdodCBOZXRGb3VuZHJ5IEluYy5cblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LCBPdXRwdXQsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7VGVybWluYXRvckZvcm1TZXJ2aWNlfSBmcm9tIFwiLi90ZXJtaW5hdG9yLWZvcm0uc2VydmljZVwiO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQge1NjaGVtYVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zY2hlbWEuc2VydmljZVwiO1xuaW1wb3J0IHtQcm9qZWN0YWJsZUZvcm19IGZyb20gXCIuLi9wcm9qZWN0YWJsZS1mb3JtLmNsYXNzXCI7XG5pbXBvcnQge0dyb3dsZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vbWVzc2FnaW5nL2dyb3dsZXIuc2VydmljZVwiO1xuaW1wb3J0IHtFeHRlbnNpb25TZXJ2aWNlLCBTSEFSRURaX0VYVEVOU0lPTn0gZnJvbSBcIi4uLy4uL2V4dGVuZGFibGUvZXh0ZW5zaW9ucy1ub29wLnNlcnZpY2VcIjtcbmltcG9ydCB7Q29uZmlnRWRpdG9yQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29uZmlnLWVkaXRvci9jb25maWctZWRpdG9yLmNvbXBvbmVudFwiO1xuXG5pbXBvcnQge2Nsb25lRGVlcCwgZGVmZXIsIGZvck93biwgaW52ZXJ0LCBpc0VtcHR5LCBpc05pbCwgdW5zZXR9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge0dyb3dsZXJNb2RlbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLm1vZGVsXCI7XG5pbXBvcnQge1NFVFRJTkdTX1NFUlZJQ0UsIFNldHRpbmdzU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3NldHRpbmdzLnNlcnZpY2VcIjtcbmltcG9ydCB7WklUSV9EQVRBX1NFUlZJQ0UsIFppdGlEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlXCI7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcbmltcG9ydCB7VGVybWluYXRvcn0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy90ZXJtaW5hdG9yXCI7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWNvbmZpZ3VyYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90ZXJtaW5hdG9yLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Rlcm1pbmF0b3ItZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRlcm1pbmF0b3JGb3JtQ29tcG9uZW50IGV4dGVuZHMgUHJvamVjdGFibGVGb3JtIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgb3ZlcnJpZGUgZm9ybURhdGE6IGFueSA9IHt9O1xuICAgIEBJbnB1dCgpIG92ZXJyaWRlIGVycm9yczogYW55ID0ge307XG4gICAgQE91dHB1dCgpIGNsb3NlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBmb3JtVmlldyA9ICdzaW1wbGUnO1xuICAgIG9wdGlvbnM6IGFueVtdID0gW107XG4gICAgaXNFZGl0aW5nID0gIWlzRW1wdHkodGhpcy5mb3JtRGF0YS5pZCk7XG4gICAgZm9ybURhdGFJbnZhbGlkID0gZmFsc2U7XG4gICAgZWRpdE1vZGUgPSBmYWxzZTtcbiAgICBpdGVtczogYW55ID0gW107XG4gICAgc2V0dGluZ3M6IGFueSA9IHt9O1xuICAgIHNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZTtcbiAgICBzZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZTtcbiAgICBzZWxlY3RlZFJvdXRlck5hbWVkQXR0cmlidXRlO1xuICAgIHNlbGVjdGVkSWRlbnRpdHlJZDtcbiAgICBzZWxlY3RlZFNlcnZpY2VJZDtcbiAgICBzZWxlY3RlZFJvdXRlcklkO1xuICAgIG92ZXJyaWRlIGVudGl0eVR5cGUgPSAndGVybWluYXRvcnMnO1xuICAgIG92ZXJyaWRlIGVudGl0eUNsYXNzID0gVGVybWluYXRvcjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgc3ZjOiBUZXJtaW5hdG9yRm9ybVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2NoZW1hU3ZjOiBTY2hlbWFTZXJ2aWNlLFxuICAgICAgICBncm93bGVyU2VydmljZTogR3Jvd2xlclNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoU0hBUkVEWl9FWFRFTlNJT04pIGV4dFNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoU0VUVElOR1NfU0VSVklDRSkgcHVibGljIHNldHRpbmdzU2VydmljZTogU2V0dGluZ3NTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBvdmVycmlkZSB6aXRpU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgIGxvY2F0aW9uOiBMb2NhdGlvblxuICAgICkge1xuICAgICAgICBzdXBlcihncm93bGVyU2VydmljZSwgZXh0U2VydmljZSwgeml0aVNlcnZpY2UsIHJvdXRlciwgcm91dGUsIGxvY2F0aW9uKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3NDaGFuZ2Uuc3Vic2NyaWJlKChyZXN1bHRzOmFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHJlc3VsdHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBlbnRpdHlVcGRhdGVkKCkge1xuICAgICAgICBzdXBlci5lbnRpdHlVcGRhdGVkKCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gW107XG4gICAgICAgIHByb21pc2VzLnB1c2godGhpcy5zdmMuZ2V0U2VydmljZU5hbWVkQXR0cmlidXRlcygpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnN2Yy5nZXRJZGVudGl0eU5hbWVkQXR0cmlidXRlcygpKTtcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLnN2Yy5nZXRSb3V0ZXJOYW1lZEF0dHJpYnV0ZXMoKSk7XG4gICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdGVkQXR0cmlidXRlcygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhckZvcm0oKTtcbiAgICB9XG5cbiAgICBoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoZXZlbnQpIHtcbiAgICAgICAgc3dpdGNoKGV2ZW50Lm5hbWUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3NhdmUnOlxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZShldmVudCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjbG9zZSc6XG4gICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5Ub0xpc3RQYWdlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd0b2dnbGUtdmlldyc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtVmlldyA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvdmVycmlkZSBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YS5jb25maWdUeXBlSWQgPSAnJztcbiAgICAgICAgdGhpcy5jbGVhckZvcm0oKTtcbiAgICB9XG5cbiAgICBjbGVhckZvcm0oKSB7XG4gICAgICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXRlbT8uY29tcG9uZW50KSBpdGVtLmNvbXBvbmVudC5kZXN0cm95KCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmVycm9ycyA9IHt9O1xuICAgICAgICB0aGlzLml0ZW1zID0gW107XG4gICAgICAgIHRoaXMuZm9ybURhdGEgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB0aGlzLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIGFzeW5jIHNhdmUoZXZlbnQ/OiBhbnkpIHtcbiAgICAgICAgaWYoIXRoaXMudmFsaWRhdGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhZ1ZhbHMgPSB0aGlzLmdldFRhZ1ZhbHVlcygpO1xuICAgICAgICBpZiAoIWlzRW1wdHkodGFnVmFscykpIHtcbiAgICAgICAgICAgIGZvck93bih0YWdWYWxzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZm9ybURhdGEudGFnc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlEYXRhID0gdGhpcy5hcGlEYXRhO1xuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuc3ZjLnNhdmUoYXBpRGF0YSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01vZGFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsKHRydWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaW5pdERhdGEgPSB0aGlzLmZvcm1EYXRhO1xuICAgICAgICAgICAgdGhpcy5fZGF0YUNoYW5nZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZXR1cm5Ub0xpc3RQYWdlKCk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFsaWRhdGUoKSB7XG4gICAgICAgIHRoaXMuZXJyb3JzID0ge307XG4gICAgICAgIHJldHVybiBpc0VtcHR5KHRoaXMuZXJyb3JzKTtcbiAgICB9XG5cbiAgICBnZXQgYXBpQ2FsbFVSTCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0dGluZ3Muc2VsZWN0ZWRFZGdlQ29udHJvbGxlciArICcvZWRnZS9tYW5hZ2VtZW50L3YxL3Rlcm1pbmF0b3JzJyArICh0aGlzLmZvcm1EYXRhLmlkID8gYC8ke3RoaXMuZm9ybURhdGEuaWR9YCA6ICcnKTtcbiAgICB9XG5cbiAgICBnZXQgYXBpRGF0YSgpOiBhbnkge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB7XG4gICAgICAgICAgICBzZXJ2aWNlOiB0aGlzLnNlbGVjdGVkU2VydmljZUlkIHx8ICcnLFxuICAgICAgICAgICAgcm91dGVyOiB0aGlzLnNlbGVjdGVkUm91dGVySWQgfHwgJycsXG4gICAgICAgICAgICBpZGVudGl0eTogdGhpcy5zZWxlY3RlZElkZW50aXR5SWQgfHwgJycsXG4gICAgICAgICAgICBiaW5kaW5nOiB0aGlzLmZvcm1EYXRhLmJpbmRpbmcgfHwgJycsXG4gICAgICAgICAgICBhZGRyZXNzOiB0aGlzLmZvcm1EYXRhLmFkZHJlc3MgfHwgJycsXG4gICAgICAgICAgICBpZGVudGl0eVNlY3JldDogdGhpcy5mb3JtRGF0YS5pZGVudGl0eVNlY3JldCB8fCAnJyxcbiAgICAgICAgICAgIHByZWNlZGVuY2U6IHRoaXMuZm9ybURhdGEucHJlY2VkZW5jZSB8fCAnJyxcbiAgICAgICAgICAgIGNvc3Q6IHRoaXMuZm9ybURhdGEuY29zdCB8fCAwXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmZvcm1EYXRhLmlkKSB7XG4gICAgICAgICAgICBkYXRhLmlkID0gdGhpcy5mb3JtRGF0YS5pZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hcGlEYXRhID0gZGF0YTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwaURhdGE7XG4gICAgfVxuXG4gICAgX2FwaURhdGE6IGFueSA9IHt9O1xuICAgIHNldCBhcGlEYXRhKGRhdGEpIHtcbiAgICAgICAgdGhpcy5fYXBpRGF0YSA9IGRhdGE7XG4gICAgfVxuXG4gICAgZGF0YUNoYW5nZWQoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5fYXBpRGF0YSA9IGNsb25lRGVlcCh0aGlzLmFwaURhdGEpO1xuICAgIH1cblxuICAgIGluaXRTZWxlY3RlZEF0dHJpYnV0ZXMoKSB7XG4gICAgICAgIGNvbnN0IHNlcnZpY2VJZEF0dHJpYnV0ZXNNYXAgPSBpbnZlcnQodGhpcy5zdmMuc2VydmljZU5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgICAgIGNvbnN0IGlkZW50aXR5SWRBdHRyaWJ1dGVzTWFwID0gaW52ZXJ0KHRoaXMuc3ZjLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzTWFwKTtcbiAgICAgICAgY29uc3Qgcm91dGVySWRBdHRyaWJ1dGVzTWFwID0gaW52ZXJ0KHRoaXMuc3ZjLnJvdXRlck5hbWVkQXR0cmlidXRlc01hcCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGUgPSBzZXJ2aWNlSWRBdHRyaWJ1dGVzTWFwW3RoaXMuZm9ybURhdGE/LnNlcnZpY2UuaWRdO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZSA9IGlkZW50aXR5SWRBdHRyaWJ1dGVzTWFwW3RoaXMuZm9ybURhdGE/LmlkZW50aXR5XTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRlck5hbWVkQXR0cmlidXRlID0gcm91dGVySWRBdHRyaWJ1dGVzTWFwW3RoaXMuZm9ybURhdGE/LnJvdXRlci5pZF07XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlSWQgPSB0aGlzLmZvcm1EYXRhPy5zZXJ2aWNlLmlkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlJZCA9IHRoaXMuZm9ybURhdGE/LmlkZW50aXR5O1xuICAgICAgICB0aGlzLnNlbGVjdGVkUm91dGVySWQgPSB0aGlzLmZvcm1EYXRhPy5yb3V0ZXIuaWQ7XG4gICAgICAgIHRoaXMuc3ZjLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5zdmMuc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzLnB1c2godGhpcy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdmMuc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgIHRoaXMuc3ZjLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMucHVzaCh0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdmMuc2VsZWN0ZWRSb3V0ZXJOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSb3V0ZXJOYW1lZEF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgdGhpcy5zdmMuc2VsZWN0ZWRSb3V0ZXJOYW1lZEF0dHJpYnV0ZXMucHVzaCh0aGlzLnNlbGVjdGVkUm91dGVyTmFtZWRBdHRyaWJ1dGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VydmljZUF0dHJpYnV0ZUNoYW5nZWQoZXZlbnQ/KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAoaXNFbXB0eShldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlSWQgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlSWQgPSB0aGlzLnN2Yy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwW2V2ZW50XTtcbiAgICAgICAgICAgIHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzID0gW2V2ZW50XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlID0gZXZlbnQ7XG4gICAgICAgIGRlZmVyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc3ZjLnNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlcyA9IHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZGVudGl0eUF0dHJpYnV0ZUNoYW5nZWQoZXZlbnQ/KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAoaXNFbXB0eShldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZGVudGl0eUlkID0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlJZCA9IHRoaXMuc3ZjLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzTWFwW2V2ZW50XTtcbiAgICAgICAgICAgIHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzID0gW2V2ZW50XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkSWRlbnRpdHlOYW1lZEF0dHJpYnV0ZSA9IGV2ZW50O1xuICAgICAgICBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN2Yy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzID0gc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJvdXRlckF0dHJpYnV0ZUNoYW5nZWQoZXZlbnQ/KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBpZiAoaXNFbXB0eShldmVudCkpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZXJJZCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvdXRlcklkID0gdGhpcy5zdmMucm91dGVyTmFtZWRBdHRyaWJ1dGVzTWFwW2V2ZW50XTtcbiAgICAgICAgICAgIHNlbGVjdGVkTmFtZWRBdHRyaWJ1dGVzID0gW2V2ZW50XTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNlbGVjdGVkUm91dGVyTmFtZWRBdHRyaWJ1dGUgPSBldmVudDtcbiAgICAgICAgZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zdmMuc2VsZWN0ZWRSb3V0ZXJOYW1lZEF0dHJpYnV0ZXMgPSBzZWxlY3RlZE5hbWVkQXR0cmlidXRlcztcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0td3JhcHBlclwiXG4gICAgIChrZXl1cC5lbnRlcik9XCJzYXZlKCRldmVudClcIlxuICAgICAoa2V5dXAuZXNjYXBlKT1cImNsb3NlTW9kYWwoZmFsc2UpXCJcbiAgICAgdGFiaW5kZXg9XCIwXCJcbj5cbiAgICA8bGliLWZvcm0taGVhZGVyXG4gICAgICAgICAgICBbZGF0YV09XCJmb3JtRGF0YVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiKGZvcm1EYXRhLmlkID8gJ1Rlcm1pbmF0b3IgRGV0YWlscycgOiAnQ3JlYXRlIFRlcm1pbmF0b3InKVwiXG4gICAgICAgICAgICBbbW9yZUFjdGlvbnNdPVwiZm9ybURhdGEubW9yZUFjdGlvbnNcIlxuICAgICAgICAgICAgKGFjdGlvblJlcXVlc3RlZCk9XCJoZWFkZXJBY3Rpb25SZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICBbKGZvcm1WaWV3KV09XCJmb3JtVmlld1wiXG4gICAgICAgICAgICBbc2F2ZURpc2FibGVkXT1cInN2Yy5zYXZlRGlzYWJsZWQgfHwgZm9ybURhdGFJbnZhbGlkXCJcbiAgICA+PC9saWItZm9ybS1oZWFkZXI+XG4gICAgPGRpdiBjbGFzcz1cInRlcm1pbmF0b3ItZm9ybS1jb250YWluZXIgcHJvamVjdGFibGUtZm9ybS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2plY3RhYmxlLWZvcm0tbWFpbi1jb2x1bW4gZm9ybS1ncm91cC1yb3dcIiBbaGlkZGVuXT1cImZvcm1WaWV3ICE9PSAnc2ltcGxlJ1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uIG9uZS1oYWxmXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidTZXJ2aWNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiAxMDAwMydcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dCByZWFkLW9ubHlcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkU2VydmljZU5hbWVkQXR0cmlidXRlXCIgW2Rpc2FibGVkXT1cInRydWVcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS08bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cInN2Yy5zZWxlY3RlZFNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdmFpbGFibGVOYW1lZEF0dHJpYnV0ZXNdPVwic3ZjLnNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IGEgc2VydmljZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGROYW1lZEF0dHJpYnV0ZSk9XCJzZXJ2aWNlQXR0cmlidXRlQ2hhbmdlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZWRBdHRyaWJ1dGVSZW1vdmVkKT1cInNlcnZpY2VBdHRyaWJ1dGVDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPi0tPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUm91dGVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiAxMDAwMidcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dCByZWFkLW9ubHlcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUm91dGVyTmFtZWRBdHRyaWJ1dGVcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLTxsaWItdGFnLXNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhzZWxlY3RlZE5hbWVkQXR0cmlidXRlcyldPVwic3ZjLnNlbGVjdGVkUm91dGVyTmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cInN2Yy5yb3V0ZXJOYW1lZEF0dHJpYnV0ZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInU2VsZWN0IGEgcm91dGVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkZE5hbWVkQXR0cmlidXRlKT1cInJvdXRlckF0dHJpYnV0ZUNoYW5nZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVkQXR0cmlidXRlUmVtb3ZlZCk9XCJyb3V0ZXJBdHRyaWJ1dGVDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPi0tPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInSWRlbnRpdHknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDEwMDAxJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0IHJlYWQtb25seVwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlXCIgW2Rpc2FibGVkXT1cInRydWVcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwhLS08bGliLXRhZy1zZWxlY3RvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoc2VsZWN0ZWROYW1lZEF0dHJpYnV0ZXMpXT1cInN2Yy5zZWxlY3RlZElkZW50aXR5TmFtZWRBdHRyaWJ1dGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXZhaWxhYmxlTmFtZWRBdHRyaWJ1dGVzXT1cInN2Yy5pZGVudGl0eU5hbWVkQXR0cmlidXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgYW4gaWRlbnRpdHknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkTmFtZWRBdHRyaWJ1dGUpPVwiaWRlbnRpdHlBdHRyaWJ1dGVDaGFuZ2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lZEF0dHJpYnV0ZVJlbW92ZWQpPVwiaWRlbnRpdHlBdHRyaWJ1dGVDaGFuZ2VkKClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9saWItdGFnLXNlbGVjdG9yPi0tPlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW4gb25lLWhhbGZcIj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FkZHJlc3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb250ZW50U3R5bGVdPVwiJ3otaW5kZXg6IDEwMDEnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXQgcmVhZC1vbmx5XCIgW2Rpc2FibGVkXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmFkZHJlc3NcIi8+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xheW91dF09XCIncm93J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGVudFN0eWxlXT1cIid6LWluZGV4OiAxMDAxJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1sYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPkJpbmRpbmc8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCIgW2Rpc2FibGVkXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmJpbmRpbmdcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1sYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPklkZW50aXR5IFNlY3JldDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXRcIiBbZGlzYWJsZWRdPVwidHJ1ZVwiIFsobmdNb2RlbCldPVwiZm9ybURhdGEuaWRlbnRpdHlTZWNyZXRcIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGliLWZvcm0tZmllbGQtY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxsaWItZm9ybS1maWVsZC1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtsYXlvdXRdPVwiJ3JvdydcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtbGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5Ib3N0aW5nIENvc3Q8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCIgW2Rpc2FibGVkXT1cInRydWVcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmNvc3RcIiB0eXBlPVwibnVtYmVyXCIvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtbGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5QcmVjZWRlbmNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLnByZWNlZGVuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiaG9zdGluZ1ByZWNlZGVuY2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtZHJvcGRvd24gcmVhZC1vbmx5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZGVmYXVsdFwiPkRlZmF1bHQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVxdWlyZWRcIj5SZXF1aXJlZDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsZWRcIj5GYWlsZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtY29sdW1uXCIgKm5nSWY9XCJmb3JtVmlldyA9PT0gJ3JhdydcIj5cbiAgICAgICAgICAgIDxsaWItanNvbi12aWV3ICpuZ0lmPVwiZm9ybURhdGFcIiBbKGRhdGEpXT1cImZvcm1EYXRhXCI+PC9saWItanNvbi12aWV3PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGxpYi1sb2FkaW5nLWluZGljYXRvciAqbmdJZj1cImlzTG9hZGluZ1wiIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nXCI+PC9saWItbG9hZGluZy1pbmRpY2F0b3I+XG4iXX0=
@@ -0,0 +1,131 @@
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { ZITI_DATA_SERVICE } from "../../../services/ziti-data.service";
3
+ import { isEmpty, keys } from "lodash";
4
+ import { GrowlerModel } from "../../messaging/growler.model";
5
+ import { SHAREDZ_EXTENSION } from "../../extendable/extensions-noop.service";
6
+ import { Terminator } from "../../../models/terminator";
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "../../messaging/growler.service";
9
+ import * as i2 from "../../../services/validation.service";
10
+ import * as i3 from "../../../services/ziti-data.service";
11
+ class TerminatorFormService {
12
+ constructor(dataService, extService, growlerService, validationService) {
13
+ this.dataService = dataService;
14
+ this.extService = extService;
15
+ this.growlerService = growlerService;
16
+ this.validationService = validationService;
17
+ this.items = [];
18
+ this.errors = [];
19
+ this.saveDisabled = false;
20
+ this.serviceNamedAttributes = [];
21
+ this.identityNamedAttributes = [];
22
+ this.routerNamedAttributes = [];
23
+ this.selectedServiceNamedAttributes = [];
24
+ this.selectedIdentityNamedAttributes = [];
25
+ this.selectedRouterNamedAttributes = [];
26
+ this.serviceNamedAttributesMap = {};
27
+ this.identityNamedAttributesMap = {};
28
+ this.routerNamedAttributesMap = {};
29
+ }
30
+ save(formData) {
31
+ const isUpdate = !isEmpty(formData.id);
32
+ const data = this.getTerminatorDataModel(formData, isUpdate);
33
+ let prom;
34
+ if (isUpdate) {
35
+ prom = this.dataService.patch('terminators', data, formData.id, true);
36
+ }
37
+ else {
38
+ prom = this.dataService.post('terminators', data, true);
39
+ }
40
+ return prom.then(async (result) => {
41
+ const id = isUpdate ? formData.id : (result?.data?.id || result?.id);
42
+ let config = await this.dataService.getSubdata('terminators', id, '').then((svcData) => {
43
+ return svcData.data;
44
+ });
45
+ return this.extService.formDataSaved(config).then((formSavedResult) => {
46
+ if (!formSavedResult) {
47
+ return config;
48
+ }
49
+ const growlerData = new GrowlerModel('success', 'Success', `Terminator ${isUpdate ? 'Updated' : 'Created'}`, `Successfully ${isUpdate ? 'updated' : 'created'} Terminator: ${formData.name}`);
50
+ this.growlerService.show(growlerData);
51
+ return config;
52
+ }).catch((result) => {
53
+ return false;
54
+ });
55
+ }).catch((resp) => {
56
+ let errorMessage;
57
+ if (resp?.error?.error?.cause?.message) {
58
+ errorMessage = resp?.error?.error?.cause?.message;
59
+ }
60
+ else if (resp?.error?.error?.cause?.reason) {
61
+ errorMessage = resp?.error?.error?.cause?.reason;
62
+ }
63
+ else if (resp?.error?.message) {
64
+ errorMessage = resp?.error?.message;
65
+ }
66
+ else {
67
+ errorMessage = 'An unknown error occurred';
68
+ }
69
+ const growlerData = new GrowlerModel('error', 'Error', `Error Creating Terminator`, errorMessage);
70
+ this.growlerService.show(growlerData);
71
+ throw resp;
72
+ });
73
+ }
74
+ getTerminatorDataModel(formData, isUpdate) {
75
+ const saveModel = new Terminator();
76
+ const modelProperties = keys(saveModel);
77
+ modelProperties.forEach((prop) => {
78
+ switch (prop) {
79
+ default:
80
+ saveModel[prop] = formData[prop];
81
+ }
82
+ });
83
+ return saveModel;
84
+ }
85
+ getIdentityNamedAttributes() {
86
+ return this.dataService.get('identities', { rawFilter: true, filter: '', sort: 'name', order: 'asc', total: -1, page: 1 }, []).then((result) => {
87
+ const namedAttributes = result.data.map((identity) => {
88
+ this.identityNamedAttributesMap[identity.name] = identity.id;
89
+ return identity.name;
90
+ });
91
+ this.identityNamedAttributes = namedAttributes;
92
+ return namedAttributes;
93
+ });
94
+ }
95
+ getServiceNamedAttributes() {
96
+ return this.dataService.get('services', { rawFilter: true, filter: '', sort: 'name', order: 'asc', total: -1, page: 1 }, []).then((result) => {
97
+ const namedAttributes = result.data.map((service) => {
98
+ this.serviceNamedAttributesMap[service.name] = service.id;
99
+ return service.name;
100
+ });
101
+ this.serviceNamedAttributes = namedAttributes;
102
+ return namedAttributes;
103
+ });
104
+ }
105
+ getRouterNamedAttributes() {
106
+ return this.dataService.get('routers', { rawFilter: true, filter: '', sort: 'name', order: 'asc', total: -1, page: 1 }, []).then((result) => {
107
+ const namedAttributes = result.data.map((service) => {
108
+ this.routerNamedAttributesMap[service.name] = service.id;
109
+ return service.name;
110
+ });
111
+ this.routerNamedAttributes = namedAttributes;
112
+ return namedAttributes;
113
+ });
114
+ }
115
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormService, deps: [{ token: ZITI_DATA_SERVICE }, { token: SHAREDZ_EXTENSION }, { token: i1.GrowlerService }, { token: i2.ValidationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
116
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormService, providedIn: 'root' }); }
117
+ }
118
+ export { TerminatorFormService };
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TerminatorFormService, decorators: [{
120
+ type: Injectable,
121
+ args: [{
122
+ providedIn: 'root'
123
+ }]
124
+ }], ctorParameters: function () { return [{ type: i3.ZitiDataService, decorators: [{
125
+ type: Inject,
126
+ args: [ZITI_DATA_SERVICE]
127
+ }] }, { type: undefined, decorators: [{
128
+ type: Inject,
129
+ args: [SHAREDZ_EXTENSION]
130
+ }] }, { type: i1.GrowlerService }, { type: i2.ValidationService }]; } });
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVybWluYXRvci1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvdGVybWluYXRvci90ZXJtaW5hdG9yLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsaUJBQWlCLEVBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFHdkYsT0FBTyxFQUEyQixPQUFPLEVBQVMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUczRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFN0YsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7OztBQUV0RCxNQUdhLHFCQUFxQjtJQWtCOUIsWUFDdUMsV0FBNEIsRUFDN0IsVUFBNEIsRUFDdEQsY0FBOEIsRUFDOUIsaUJBQW9DO1FBSFQsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzdCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBQ3RELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBcEJoRCxVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLFdBQU0sR0FBVSxFQUFFLENBQUM7UUFDbkIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsMkJBQXNCLEdBQUcsRUFBRSxDQUFDO1FBQzVCLDRCQUF1QixHQUFHLEVBQUUsQ0FBQztRQUM3QiwwQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFFM0IsbUNBQThCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLG9DQUErQixH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RUFBRSxDQUFDLEVBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0SSxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNoRCxJQUFJLENBQUMsd0JBQXdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ3pELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxlQUFlLENBQUM7WUFDN0MsT0FBTyxlQUFlLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQXpIUSxxQkFBcUIsa0JBbUJsQixpQkFBaUIsYUFDakIsaUJBQWlCO21IQXBCcEIscUJBQXFCLGNBRmxCLE1BQU07O1NBRVQscUJBQXFCOzRGQUFyQixxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFvQlEsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7WklUSV9EQVRBX1NFUlZJQ0UsIFppdGlEYXRhU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3ppdGktZGF0YS5zZXJ2aWNlXCI7XG5pbXBvcnQge1Jlc29sdmVyfSBmcm9tIFwiQHN0b3BsaWdodC9qc29uLXJlZi1yZXNvbHZlclwiO1xuaW1wb3J0IHtTY2hlbWFTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvc2NoZW1hLnNlcnZpY2VcIjtcbmltcG9ydCB7ZGVmZXIsIGludmVydCwgaXNCb29sZWFuLCBpc0VtcHR5LCBpc05pbCwga2V5c30gZnJvbSBcImxvZGFzaFwiO1xuaW1wb3J0IHtHcm93bGVyTW9kZWx9IGZyb20gXCIuLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5tb2RlbFwiO1xuaW1wb3J0IHtHcm93bGVyU2VydmljZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLnNlcnZpY2VcIjtcbmltcG9ydCB7Q29uZmlnfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzL2NvbmZpZ1wiO1xuaW1wb3J0IHtFeHRlbnNpb25TZXJ2aWNlLCBTSEFSRURaX0VYVEVOU0lPTn0gZnJvbSBcIi4uLy4uL2V4dGVuZGFibGUvZXh0ZW5zaW9ucy1ub29wLnNlcnZpY2VcIjtcbmltcG9ydCB7VmFsaWRhdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7VGVybWluYXRvcn0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy90ZXJtaW5hdG9yXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgVGVybWluYXRvckZvcm1TZXJ2aWNlIHtcblxuICAgIGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgIGVycm9yczogYW55W10gPSBbXTtcbiAgICBzYXZlRGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIHNlcnZpY2VOYW1lZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICBpZGVudGl0eU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHJvdXRlck5hbWVkQXR0cmlidXRlcyA9IFtdO1xuXG4gICAgc2VsZWN0ZWRTZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzID0gW107XG4gICAgc2VsZWN0ZWRJZGVudGl0eU5hbWVkQXR0cmlidXRlcyA9IFtdO1xuICAgIHNlbGVjdGVkUm91dGVyTmFtZWRBdHRyaWJ1dGVzID0gW107XG5cbiAgICBzZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzTWFwOiBhbnkgPSB7fTtcbiAgICBpZGVudGl0eU5hbWVkQXR0cmlidXRlc01hcDogYW55ID0ge307XG4gICAgcm91dGVyTmFtZWRBdHRyaWJ1dGVzTWFwOiBhbnkgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFpJVElfREFUQV9TRVJWSUNFKSBwcml2YXRlIGRhdGFTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoU0hBUkVEWl9FWFRFTlNJT04pcHJpdmF0ZSBleHRTZXJ2aWNlOiBFeHRlbnNpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGdyb3dsZXJTZXJ2aWNlOiBHcm93bGVyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB2YWxpZGF0aW9uU2VydmljZTogVmFsaWRhdGlvblNlcnZpY2VcbiAgICApIHtcbiAgICB9XG5cbiAgICBzYXZlKGZvcm1EYXRhKSB7XG4gICAgICAgIGNvbnN0IGlzVXBkYXRlID0gIWlzRW1wdHkoZm9ybURhdGEuaWQpO1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB0aGlzLmdldFRlcm1pbmF0b3JEYXRhTW9kZWwoZm9ybURhdGEsIGlzVXBkYXRlKTtcbiAgICAgICAgbGV0IHByb207XG4gICAgICAgIGlmIChpc1VwZGF0ZSkge1xuICAgICAgICAgICAgcHJvbSA9IHRoaXMuZGF0YVNlcnZpY2UucGF0Y2goJ3Rlcm1pbmF0b3JzJywgZGF0YSwgZm9ybURhdGEuaWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvbSA9IHRoaXMuZGF0YVNlcnZpY2UucG9zdCgndGVybWluYXRvcnMnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9tLnRoZW4oYXN5bmMgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGlzVXBkYXRlID8gZm9ybURhdGEuaWQgOiAocmVzdWx0Py5kYXRhPy5pZCB8fCByZXN1bHQ/LmlkKTtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldFN1YmRhdGEoJ3Rlcm1pbmF0b3JzJywgaWQsICcnKS50aGVuKChzdmNEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN2Y0RhdGEuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0U2VydmljZS5mb3JtRGF0YVNhdmVkKGNvbmZpZykudGhlbigoZm9ybVNhdmVkUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1TYXZlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICBgVGVybWluYXRvciAke2lzVXBkYXRlID8gJ1VwZGF0ZWQnIDogJ0NyZWF0ZWQnfWAsXG4gICAgICAgICAgICAgICAgICAgIGBTdWNjZXNzZnVsbHkgJHtpc1VwZGF0ZSA/ICd1cGRhdGVkJyA6ICdjcmVhdGVkJ30gVGVybWluYXRvcjogJHtmb3JtRGF0YS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3dsZXJTZXJ2aWNlLnNob3coZ3Jvd2xlckRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9KS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKChyZXNwKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgaWYgKHJlc3A/LmVycm9yPy5lcnJvcj8uY2F1c2U/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5tZXNzYWdlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5yZWFzb247XG4gICAgICAgICAgICB9ZWxzZSBpZiAocmVzcD8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8ubWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICBgRXJyb3IgQ3JlYXRpbmcgVGVybWluYXRvcmAsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gICAgICAgICAgICB0aHJvdyByZXNwO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldFRlcm1pbmF0b3JEYXRhTW9kZWwoZm9ybURhdGEsIGlzVXBkYXRlKSB7XG4gICAgICAgIGNvbnN0IHNhdmVNb2RlbCA9IG5ldyBUZXJtaW5hdG9yKCk7XG4gICAgICAgIGNvbnN0IG1vZGVsUHJvcGVydGllcyA9IGtleXMoc2F2ZU1vZGVsKTtcbiAgICAgICAgbW9kZWxQcm9wZXJ0aWVzLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgICAgIHN3aXRjaChwcm9wKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgc2F2ZU1vZGVsW3Byb3BdID0gZm9ybURhdGFbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2F2ZU1vZGVsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJZGVudGl0eU5hbWVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZ2V0KCdpZGVudGl0aWVzJywge3Jhd0ZpbHRlcjogdHJ1ZSwgZmlsdGVyOiAnJywgc29ydDogJ25hbWUnLCBvcmRlcjogJ2FzYycsIHRvdGFsOiAtMSwgcGFnZTogMX0sIFtdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVkQXR0cmlidXRlcyA9IHJlc3VsdC5kYXRhLm1hcCgoaWRlbnRpdHkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aXR5TmFtZWRBdHRyaWJ1dGVzTWFwW2lkZW50aXR5Lm5hbWVdID0gaWRlbnRpdHkuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5Lm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaWRlbnRpdHlOYW1lZEF0dHJpYnV0ZXMgPSBuYW1lZEF0dHJpYnV0ZXM7XG4gICAgICAgICAgICByZXR1cm4gbmFtZWRBdHRyaWJ1dGVzO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VydmljZU5hbWVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZ2V0KCdzZXJ2aWNlcycsIHtyYXdGaWx0ZXI6IHRydWUsIGZpbHRlcjogJycsIHNvcnQ6ICduYW1lJywgb3JkZXI6ICdhc2MnLCB0b3RhbDogLTEsIHBhZ2U6IDF9LCBbXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYW1lZEF0dHJpYnV0ZXMgPSByZXN1bHQuZGF0YS5tYXAoKHNlcnZpY2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlcnZpY2VOYW1lZEF0dHJpYnV0ZXNNYXBbc2VydmljZS5uYW1lXSA9IHNlcnZpY2UuaWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2UubmFtZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZWRBdHRyaWJ1dGVzID0gbmFtZWRBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVkQXR0cmlidXRlcztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJvdXRlck5hbWVkQXR0cmlidXRlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZ2V0KCdyb3V0ZXJzJywge3Jhd0ZpbHRlcjogdHJ1ZSwgZmlsdGVyOiAnJywgc29ydDogJ25hbWUnLCBvcmRlcjogJ2FzYycsIHRvdGFsOiAtMSwgcGFnZTogMX0sIFtdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVkQXR0cmlidXRlcyA9IHJlc3VsdC5kYXRhLm1hcCgoc2VydmljZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyTmFtZWRBdHRyaWJ1dGVzTWFwW3NlcnZpY2UubmFtZV0gPSBzZXJ2aWNlLmlkO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMucm91dGVyTmFtZWRBdHRyaWJ1dGVzID0gbmFtZWRBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVkQXR0cmlidXRlcztcbiAgICAgICAgfSk7XG4gICAgfVxuXG59XG4iXX0=