@openziti/ziti-console-lib 0.5.0 → 0.6.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.
- package/assets/scripts/growler.js +4 -0
- package/assets/styles/forms.css +7 -7
- package/assets/styles/global.scss +187 -20
- package/assets/styles/header.css +1 -1
- package/assets/styles/ziti.css +47 -40
- package/esm2022/lib/features/card/card.component.mjs +2 -2
- package/esm2022/lib/features/custom-tags/custom-tags.component.mjs +5 -2
- package/esm2022/lib/features/data-table/cells/table-cell-menu/table-cell-menu.component.mjs +2 -2
- package/esm2022/lib/features/data-table/column-headers/table-column-default/table-column-default.component.mjs +4 -4
- package/esm2022/lib/features/data-table/column-headers/table-column-menu/table-column-menu.component.mjs +2 -2
- package/esm2022/lib/features/data-table/data-table.component.mjs +8 -8
- package/esm2022/lib/features/data-table/data-table.service.mjs +5 -5
- package/esm2022/lib/features/dynamic-widgets/object/object.component.mjs +2 -2
- package/esm2022/lib/features/dynamic-widgets/text-list/text-list-input.component.mjs +2 -2
- package/esm2022/lib/features/json-view/json-view.component.mjs +2 -2
- package/esm2022/lib/features/multi-action-button/multi-action-button.component.mjs +2 -2
- package/esm2022/lib/features/overrides/overrides.component.mjs +2 -2
- package/esm2022/lib/features/preview-list/preview-list.component.mjs +3 -3
- package/esm2022/lib/features/projectable-forms/configuration/configuration-form.component.mjs +12 -9
- package/esm2022/lib/features/projectable-forms/edge-router/edge-router-form.component.mjs +3 -4
- package/esm2022/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.mjs +13 -11
- package/esm2022/lib/features/projectable-forms/form-field-container/form-field-container.component.mjs +2 -2
- package/esm2022/lib/features/projectable-forms/form-header/form-header.component.mjs +2 -2
- package/esm2022/lib/features/projectable-forms/identity/identity-form.component.mjs +9 -10
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.mjs +280 -0
- package/esm2022/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.mjs +92 -0
- package/esm2022/lib/features/projectable-forms/projectable-form.class.mjs +8 -1
- package/esm2022/lib/features/projectable-forms/service/service-form.component.mjs +83 -23
- package/esm2022/lib/features/projectable-forms/service/service-form.service.mjs +32 -11
- package/esm2022/lib/features/projectable-forms/service/simple-service/simple-service.component.mjs +14 -11
- package/esm2022/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.mjs +13 -11
- package/esm2022/lib/features/projectable-forms/service-policy/service-policy-form.component.mjs +14 -12
- package/esm2022/lib/features/reset-enrollment/reset-enrollment.component.mjs +2 -2
- package/esm2022/lib/features/sidebars/side-navbar/side-navbar.component.mjs +2 -2
- package/esm2022/lib/features/tag-selector/tag-selector.component.mjs +2 -2
- package/esm2022/lib/features/visualizer/network-visualizer/network-visualizer.component.mjs +2 -2
- package/esm2022/lib/features/wrappers/zac-wrapper-service.class.mjs +4 -1
- package/esm2022/lib/features/wrappers/zac-wrapper.component.mjs +5 -4
- package/esm2022/lib/features/wrappers/zac-wrapper.service.mjs +3 -3
- package/esm2022/lib/models/config.mjs +2 -1
- package/esm2022/lib/models/edge-router-policy.mjs +2 -1
- package/esm2022/lib/models/jwt-signer.mjs +17 -0
- package/esm2022/lib/models/service-edge-router-policy.mjs +2 -1
- package/esm2022/lib/models/service-policy.mjs +2 -1
- package/esm2022/lib/pages/edge-routers/edge-routers-page.component.mjs +2 -2
- package/esm2022/lib/pages/identities/identities-page.component.mjs +2 -2
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.component.mjs +96 -0
- package/esm2022/lib/pages/jwt-signers/jwt-signers-page.service.mjs +177 -0
- package/esm2022/lib/pages/services/services-page.component.mjs +2 -2
- package/esm2022/lib/services/login-service.class.mjs +1 -1
- package/esm2022/lib/services/node-data.service.mjs +6 -3
- package/esm2022/lib/services/noop-login.service.mjs +1 -4
- package/esm2022/lib/services/settings-service.class.mjs +2 -2
- package/esm2022/lib/services/settings.service.mjs +6 -1
- package/esm2022/lib/services/validation.service.mjs +14 -1
- package/esm2022/lib/services/ziti-data.service.mjs +4 -4
- package/esm2022/lib/shared/list-page-component.class.mjs +2 -2
- package/esm2022/lib/ziti-console-lib.module.mjs +15 -5
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/openziti-ziti-console-lib.mjs +1102 -379
- package/fesm2022/openziti-ziti-console-lib.mjs.map +1 -1
- package/lib/features/custom-tags/custom-tags.component.d.ts +3 -2
- package/lib/features/custom-tags/custom-tags.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/configuration/configuration-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts +0 -1
- package/lib/features/projectable-forms/edge-router/edge-router-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts +0 -1
- package/lib/features/projectable-forms/edge-router-policy/edge-router-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts +0 -1
- package/lib/features/projectable-forms/identity/identity-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts +60 -0
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.component.d.ts.map +1 -0
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts +21 -0
- package/lib/features/projectable-forms/jwt-signer/jwt-signer-form.service.d.ts.map +1 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts +7 -0
- package/lib/features/projectable-forms/projectable-form.class.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts +3 -1
- package/lib/features/projectable-forms/service/service-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts +5 -1
- package/lib/features/projectable-forms/service/service-form.service.d.ts.map +1 -1
- package/lib/features/projectable-forms/service/simple-service/simple-service.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts +0 -1
- package/lib/features/projectable-forms/service-edge-router-policy/service-edge-router-policy-form.component.d.ts.map +1 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts +0 -1
- package/lib/features/projectable-forms/service-policy/service-policy-form.component.d.ts.map +1 -1
- package/lib/features/wrappers/zac-wrapper-service.class.d.ts.map +1 -1
- package/lib/features/wrappers/zac-wrapper.component.d.ts.map +1 -1
- package/lib/features/wrappers/zac-wrapper.service.d.ts +1 -0
- package/lib/features/wrappers/zac-wrapper.service.d.ts.map +1 -1
- package/lib/models/config.d.ts +1 -0
- package/lib/models/config.d.ts.map +1 -1
- package/lib/models/edge-router-policy.d.ts +1 -0
- package/lib/models/edge-router-policy.d.ts.map +1 -1
- package/lib/models/jwt-signer.d.ts +14 -0
- package/lib/models/jwt-signer.d.ts.map +1 -0
- package/lib/models/service-edge-router-policy.d.ts +1 -0
- package/lib/models/service-edge-router-policy.d.ts.map +1 -1
- package/lib/models/service-policy.d.ts +1 -0
- package/lib/models/service-policy.d.ts.map +1 -1
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts +29 -0
- package/lib/pages/jwt-signers/jwt-signers-page.component.d.ts.map +1 -0
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts +31 -0
- package/lib/pages/jwt-signers/jwt-signers-page.service.d.ts.map +1 -0
- package/lib/services/login-service.class.d.ts +0 -1
- package/lib/services/login-service.class.d.ts.map +1 -1
- package/lib/services/node-data.service.d.ts.map +1 -1
- package/lib/services/noop-login.service.d.ts +0 -1
- package/lib/services/noop-login.service.d.ts.map +1 -1
- package/lib/services/settings-service.class.d.ts +1 -0
- package/lib/services/settings-service.class.d.ts.map +1 -1
- package/lib/services/settings.service.d.ts +1 -0
- package/lib/services/settings.service.d.ts.map +1 -1
- package/lib/services/validation.service.d.ts +1 -0
- package/lib/services/validation.service.d.ts.map +1 -1
- package/lib/services/ziti-data.service.d.ts +3 -3
- package/lib/services/ziti-data.service.d.ts.map +1 -1
- package/lib/ziti-console-lib.module.d.ts +19 -17
- package/lib/ziti-console-lib.module.d.ts.map +1 -1
- package/package.json +3 -3
- package/public-api.d.ts +4 -0
- package/public-api.d.ts.map +1 -1
|
@@ -0,0 +1,280 @@
|
|
|
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, ViewChild, } from '@angular/core';
|
|
17
|
+
import { ProjectableForm } from "../projectable-form.class";
|
|
18
|
+
import { SHAREDZ_EXTENSION } from "../../extendable/extensions-noop.service";
|
|
19
|
+
import { cloneDeep, delay, forOwn, isEmpty, unset } from 'lodash';
|
|
20
|
+
import { GrowlerModel } from "../../messaging/growler.model";
|
|
21
|
+
import { SETTINGS_SERVICE } from "../../../services/settings.service";
|
|
22
|
+
import { ZITI_DATA_SERVICE } from "../../../services/ziti-data.service";
|
|
23
|
+
import { JwtSigner } from "../../../models/jwt-signer";
|
|
24
|
+
import * as i0 from "@angular/core";
|
|
25
|
+
import * as i1 from "./jwt-signer-form.service";
|
|
26
|
+
import * as i2 from "../../../services/schema.service";
|
|
27
|
+
import * as i3 from "../../messaging/growler.service";
|
|
28
|
+
import * as i4 from "@angular/router";
|
|
29
|
+
import * as i5 from "@angular/common";
|
|
30
|
+
import * as i6 from "../../../services/validation.service";
|
|
31
|
+
import * as i7 from "@angular/forms";
|
|
32
|
+
import * as i8 from "@angular/material/tooltip";
|
|
33
|
+
import * as i9 from "../form-header/form-header.component";
|
|
34
|
+
import * as i10 from "../form-field-container/form-field-container.component";
|
|
35
|
+
import * as i11 from "../../loading-indicator/loading-indicator.component";
|
|
36
|
+
import * as i12 from "../form-field-toggle/form-field-toggle.component";
|
|
37
|
+
import * as i13 from "../../json-view/json-view.component";
|
|
38
|
+
import * as i14 from "../../custom-tags/custom-tags.component";
|
|
39
|
+
import * as i15 from "../../../services/settings.service";
|
|
40
|
+
import * as i16 from "../../../services/ziti-data.service";
|
|
41
|
+
class JwtSignerFormComponent extends ProjectableForm {
|
|
42
|
+
constructor(svc, schemaSvc, growlerService, extService, settingsService, zitiService, router, route, location, validationService) {
|
|
43
|
+
super(growlerService, extService, zitiService, router, route, location);
|
|
44
|
+
this.svc = svc;
|
|
45
|
+
this.schemaSvc = schemaSvc;
|
|
46
|
+
this.settingsService = settingsService;
|
|
47
|
+
this.zitiService = zitiService;
|
|
48
|
+
this.router = router;
|
|
49
|
+
this.route = route;
|
|
50
|
+
this.validationService = validationService;
|
|
51
|
+
this.formData = {};
|
|
52
|
+
this.errors = {};
|
|
53
|
+
this.close = new EventEmitter();
|
|
54
|
+
this.formView = 'simple';
|
|
55
|
+
this.options = [];
|
|
56
|
+
this.isEditing = !isEmpty(this.formData.id);
|
|
57
|
+
this.formDataInvalid = false;
|
|
58
|
+
this.editMode = false;
|
|
59
|
+
this.items = [];
|
|
60
|
+
this.settings = {};
|
|
61
|
+
this.fileSelectOpening = false;
|
|
62
|
+
this.entityType = 'external-jwt-signers';
|
|
63
|
+
this.entityClass = JwtSigner;
|
|
64
|
+
this._apiData = {};
|
|
65
|
+
}
|
|
66
|
+
ngOnInit() {
|
|
67
|
+
super.ngOnInit();
|
|
68
|
+
this.settingsService.settingsChange.subscribe((results) => {
|
|
69
|
+
this.settings = results;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
entityUpdated() {
|
|
73
|
+
super.entityUpdated();
|
|
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
|
+
const labels = [];
|
|
133
|
+
const growlers = [];
|
|
134
|
+
if (isEmpty(this.formData.name)) {
|
|
135
|
+
this.errors.name = true;
|
|
136
|
+
labels.push('Name');
|
|
137
|
+
}
|
|
138
|
+
if (isEmpty(this.formData.issuer)) {
|
|
139
|
+
this.errors.issuer = true;
|
|
140
|
+
labels.push('Issuer');
|
|
141
|
+
}
|
|
142
|
+
if (isEmpty(this.formData.certPem)) {
|
|
143
|
+
this.errors.certPem = true;
|
|
144
|
+
labels.push('Cert PEM');
|
|
145
|
+
}
|
|
146
|
+
if (!isEmpty(this.errors)) {
|
|
147
|
+
let missingFields = labels.join(', ');
|
|
148
|
+
growlers.push(new GrowlerModel('error', 'Invalid', `Missing Form Data`, `Please enter a value for the highlighted fields: ${missingFields}`));
|
|
149
|
+
}
|
|
150
|
+
if (!isEmpty(this.formData.certPem?.trim()) && !this.validationService.isValidPEM(this.formData.certPem?.trim())) {
|
|
151
|
+
this.errors.certPem = true;
|
|
152
|
+
growlers.push(new GrowlerModel('error', 'Invalid', `Cert PEM Invalid`, `The value you have entered for the Cert PEM field is invalid. Please check your input and try again.`));
|
|
153
|
+
}
|
|
154
|
+
growlers.forEach((growlerData) => {
|
|
155
|
+
this.growlerService.show(growlerData);
|
|
156
|
+
});
|
|
157
|
+
return isEmpty(this.errors);
|
|
158
|
+
}
|
|
159
|
+
get apiCallURL() {
|
|
160
|
+
return this.settings.selectedEdgeController + '/edge/management/v1/external-jwt-signers' + (this.formData.id ? `/${this.formData.id}` : '');
|
|
161
|
+
}
|
|
162
|
+
get apiData() {
|
|
163
|
+
const data = {
|
|
164
|
+
name: this.formData.name || '',
|
|
165
|
+
audience: this.formData.audience || '',
|
|
166
|
+
issuer: this.formData.issuer || '',
|
|
167
|
+
certPem: this.formData.certPem || '',
|
|
168
|
+
claimsProperty: this.formData.claimsProperty || '',
|
|
169
|
+
enabled: this.formData.enabled,
|
|
170
|
+
useExternalId: this.formData.useExternalId,
|
|
171
|
+
externalAuthUrl: this.formData.externalAuthUrl || '',
|
|
172
|
+
kid: this.formData.kid || '',
|
|
173
|
+
tags: this.formData.tags || {}
|
|
174
|
+
};
|
|
175
|
+
if (!isEmpty(this.formData.jwksEndpoint)) {
|
|
176
|
+
data.jwksEndpoint = this.formData.jwksEndpoint;
|
|
177
|
+
}
|
|
178
|
+
if (!isEmpty(this.formData.id)) {
|
|
179
|
+
data.id = this.formData.id;
|
|
180
|
+
}
|
|
181
|
+
if (this.formData.id) {
|
|
182
|
+
data.id = this.formData.id;
|
|
183
|
+
}
|
|
184
|
+
this._apiData = data;
|
|
185
|
+
return this._apiData;
|
|
186
|
+
}
|
|
187
|
+
set apiData(data) {
|
|
188
|
+
this._apiData = data;
|
|
189
|
+
}
|
|
190
|
+
dataChanged(event) {
|
|
191
|
+
this._apiData = cloneDeep(this.apiData);
|
|
192
|
+
}
|
|
193
|
+
toggleEnabled() {
|
|
194
|
+
this.formData.enabled = !this.formData.enabled;
|
|
195
|
+
}
|
|
196
|
+
toggleUseExternalId() {
|
|
197
|
+
this.formData.useExternalId = !this.formData.useExternalId;
|
|
198
|
+
}
|
|
199
|
+
openFileSelect(event) {
|
|
200
|
+
this.filterInput.nativeElement.click();
|
|
201
|
+
this.fileSelectOpening = true;
|
|
202
|
+
delay(() => {
|
|
203
|
+
this.fileSelectOpening = false;
|
|
204
|
+
}, 1000);
|
|
205
|
+
}
|
|
206
|
+
selectPemFile(event) {
|
|
207
|
+
console.log(event);
|
|
208
|
+
const file = event?.target?.files[0];
|
|
209
|
+
if (file) {
|
|
210
|
+
const fileReader = new FileReader();
|
|
211
|
+
fileReader.onload = (fileLoadedEvent) => {
|
|
212
|
+
const textFromSelectedFile = fileLoadedEvent.target?.result;
|
|
213
|
+
if (!this.validationService.isValidPEM(textFromSelectedFile?.trim())) {
|
|
214
|
+
this.errors.certPem = true;
|
|
215
|
+
const growlerData = new GrowlerModel('error', 'Invalid', `Cert PEM Invalid`, `The file selected for the Cert PEM field is invalid. Please check your input and try again.`);
|
|
216
|
+
this.growlerService.show(growlerData);
|
|
217
|
+
this.formData.certPem = 'Invalid PEM. Please select or enter a valid PEM certificate.';
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
unset(this.errors, 'certPem');
|
|
221
|
+
this.formData.certPem = textFromSelectedFile;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
fileReader.readAsText(file, "UTF-8");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
apiActionRequested(action) {
|
|
228
|
+
switch (action.id) {
|
|
229
|
+
case 'cli':
|
|
230
|
+
this.copyCLICommand();
|
|
231
|
+
break;
|
|
232
|
+
case 'curl':
|
|
233
|
+
this.copyCURLCommand();
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
copyCLICommand() {
|
|
238
|
+
const command = `ziti edge ${this.formData.id ? 'update' : 'create'} ext-jwt-signer ${this.formData.id ? `'${this.formData.id}'` : ''} ${this.formData.id ? '--name' : ''} '${this.formData.name}' ${this.formData.id ? '--issuer' : ''} '${this.formData.issuer}' --audience '${this.formData.audience}' --cert-pem '${this.formData.certPem}' --claims-property '${this.formData.claimsProperty}' --external-auth-url '${this.formData.externalAuthUrl}' --kid '${this.formData.kid}'`;
|
|
239
|
+
navigator.clipboard.writeText(command);
|
|
240
|
+
const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CLI command copied to clipboard`);
|
|
241
|
+
this.growlerService.show(growlerData);
|
|
242
|
+
}
|
|
243
|
+
copyCURLCommand() {
|
|
244
|
+
const command = `curl '${this.apiCallURL}' \\
|
|
245
|
+
${this.formData.id ? '--request PATCH \\' : '\\'}
|
|
246
|
+
-H 'accept: application/json' \\
|
|
247
|
+
-H 'content-type: application/json' \\
|
|
248
|
+
-H 'zt-session: ${this.settings.session.id}' \\
|
|
249
|
+
--data-raw '${JSON.stringify(this.apiData)}'`;
|
|
250
|
+
navigator.clipboard.writeText(command);
|
|
251
|
+
const growlerData = new GrowlerModel('success', 'Success', `Text Copied`, `CURL command copied to clipboard`);
|
|
252
|
+
this.growlerService.show(growlerData);
|
|
253
|
+
}
|
|
254
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormComponent, deps: [{ token: i1.JwtSignerFormService }, { 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 }, { token: i6.ValidationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
255
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JwtSignerFormComponent, selector: "lib-configuration", inputs: { formData: "formData", errors: "errors" }, outputs: { close: "close" }, viewQueries: [{ propertyName: "filterInput", first: true, predicate: ["fileSelect"], descendants: true }], 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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "issuer" field on the JWT Signer must match the "iss" field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "claimsProperty" must match the "id" field on a ziti identity (or externalId if "Use External ID" is enabled)\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property, defaults to "sub"\" [(ngModel)]=\"formData.claimsProperty\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "audience" field on the JWT Signer must match the "aud" field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Unauthenticated clients can enumerate External JWT Signers that have an "externalAuthUrl" property. Clients will receive the name of the External JWT Signer and the "externalAuthUrl" only. This information can allow clients to initiate client authentication to the target identity provider.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">Use External ID</div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Certificate Definition'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'JWKS Endpoint'\"\n [label]=\"'Optional'\"\n >\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:25px;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;background:var(--primary);border-style:solid;border-width:1px;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium)}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(1px)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:8px;height:8px;border-radius:50%;background:transparent;border-top:2px solid white;border-right:2px solid white;border-bottom:2px solid transparent;border-left:2px solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i8.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i9.FormHeaderComponent, selector: "lib-form-header", inputs: ["data", "title", "moreActions", "formView", "saveDisabled", "saveTooltip", "actionButtonText", "moreActionsText"], outputs: ["formViewChange", "actionRequested"] }, { kind: "component", type: i10.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: i11.LoadingIndicatorComponent, selector: "lib-loading-indicator", inputs: ["isLoading"] }, { kind: "component", type: i12.FormFieldToggleComponent, selector: "lib-form-field-toggle", inputs: ["label", "orientation", "labelOn", "labelOff", "toggleOn"], outputs: ["toggleOnChange"] }, { kind: "component", type: i13.JsonViewComponent, selector: "lib-json-view", inputs: ["data", "schema", "readOnly", "jsonInvalid", "showCopy"], outputs: ["dataChange", "jsonChange", "jsonInvalidChange"] }, { kind: "component", type: i14.CustomTagsComponent, selector: "lib-custom-tags", inputs: ["tags"], outputs: ["tagsChange"] }] }); }
|
|
256
|
+
}
|
|
257
|
+
export { JwtSignerFormComponent };
|
|
258
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormComponent, decorators: [{
|
|
259
|
+
type: Component,
|
|
260
|
+
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 ? 'JWT Signer Details' : 'Create JWT Signer')\"\n [moreActions]=\"formData.moreActions\"\n (actionRequested)=\"headerActionRequested($event)\"\n [(formView)]=\"formView\"\n [saveDisabled]=\"svc.saveDisabled || formDataInvalid\"\n ></lib-form-header>\n <div class=\"jwt-signer-form-container projectable-form-container\">\n <div class=\"projectable-form-main-column form-group-row\" [hidden]=\"formView !== 'simple'\">\n <div class=\"form-group-column three-fifths\">\n <lib-form-field-container\n [title]=\"'Name'\"\n [label]=\"'Required'\"\n >\n <input class=\"form-field-input read-only\" [(ngModel)]=\"formData.name\" [ngClass]=\"{error: errors['name']}\" placeholder=\"Name this JWT Signer\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [layout]=\"'column'\"\n [showHeader]=\"false\"\n >\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Issuer</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "issuer" field on the JWT Signer must match the "iss" field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <span class=\"form-field-label\" >Required</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter issuer\" [(ngModel)]=\"formData.issuer\" [ngClass]=\"{error: errors['issuer']}\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Claims Property</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "claimsProperty" must match the "id" field on a ziti identity (or externalId if "Use External ID" is enabled)\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter claims property, defaults to "sub"\" [(ngModel)]=\"formData.claimsProperty\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">Audience</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"The "audience" field on the JWT Signer must match the "aud" field on the JWT\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter audience\" [(ngModel)]=\"formData.audience\"/>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">External Auth Url</span>\n <div\n class=\"form-field-info infoicon\"\n matTooltip=\"Unauthenticated clients can enumerate External JWT Signers that have an "externalAuthUrl" property. Clients will receive the name of the External JWT Signer and the "externalAuthUrl" only. This information can allow clients to initiate client authentication to the target identity provider.\"\n matTooltipPosition=\"below\"\n ></div>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter external auth URL\" [(ngModel)]=\"formData.externalAuthUrl\"/>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [showHeader]=\"false\"\n [layout]=\"'row'\"\n >\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">ENABLED</div>\n <div\n (click)=\"toggleEnabled()\"\n [ngClass]=\"{ on: formData.enabled }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.enabled\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.enabled\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n\n <div class=\"config-item\">\n <div class=\"config-container toggle-container\">\n <div class=\"config-container-label\">Use External ID</div>\n <div\n (click)=\"toggleUseExternalId()\"\n [ngClass]=\"{ on: formData.useExternalId }\"\n class=\"toggle\"\n >\n <span [hidden]=\"!formData.useExternalId\" class=\"on-label\">YES</span>\n <span [hidden]=\"formData.useExternalId\" class=\"off-label\">NO</span>\n <div class=\"switch\"></div>\n </div>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-toggle [(toggleOn)]=\"showMore\" (toggleOnChange)=\"showMoreChanged($event)\" style=\"margin: 0px 10px\"></lib-form-field-toggle>\n <div [hidden]=\"!showMore\" class=\"form-group-column\">\n <lib-form-field-container\n [title]=\"'Custom Tags'\"\n [label]=\"'OPTIONAL'\"\n class=\"form-field-advanced\"\n >\n <lib-custom-tags [(tags)]=\"formData.tags\"></lib-custom-tags>\n </lib-form-field-container>\n </div>\n </div>\n <div class=\"form-group-column two-fifths\">\n <lib-form-field-container\n [title]=\"'Certificate Definition'\"\n [label]=\"'REQUIRED'\"\n >\n <div class=\"form-field-input-group\">\n <div class=\"form-field-label-container select-file-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">PEM</span>\n </div>\n <span class=\"select-file-button\" (click)=\"openFileSelect($event)\">\n Select File\n <div class=\"spinner\" *ngIf=\"fileSelectOpening\"></div>\n </span>\n <input #fileSelect type=\"file\" style=\"display:none\" (change)=\"selectPemFile($event)\">\n </div>\n <textarea placeholder=\"Paste pem contents or select file\" [(ngModel)]=\"formData.certPem\" [ngClass]=\"{error: errors['certPem']}\"></textarea>\n </div>\n <div class=\"form-field-label-container\">\n <div class=\"form-field-header\">\n <div class=\"form-field-title-container\">\n <span class=\"form-field-title\">KID</span>\n </div>\n <span class=\"form-field-label\" >Optional</span>\n </div>\n <input class=\"form-field-input\" placeholder=\"Enter KID\" [(ngModel)]=\"formData.kid\"/>\n </div>\n </div>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'JWKS Endpoint'\"\n [label]=\"'Optional'\"\n >\n <input class=\"form-field-input read-only\" placeholder=\"Enter endpoint URL\" [(ngModel)]=\"formData.jwksEndpoint\"/>\n </lib-form-field-container>\n <lib-form-field-container\n [title]=\"'API Calls'\"\n [headerActions]=\"apiOptions\"\n (actionRequested)=\"apiActionRequested($event)\"\n [class]=\"'api-data-no-wrap'\"\n >\n <div class=\"form-row\">\n <input class=\"form-field-input\" [value]=\"apiCallURL\"/>\n <div class=\"icon-copy copy\" (click)=\"copyToClipboard(apiCallURL)\"></div>\n </div>\n <lib-json-view *ngIf=\"formData\" [(data)]=\"apiData\" [readOnly]=\"true\" [showCopy]=\"true\"></lib-json-view>\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: ["@charset \"UTF-8\";.jwt-signer-form-container{display:flex;flex-direction:column;height:100%;width:100%;align-items:center;gap:var(--gapXL)}.jwt-signer-form-container .select-file-button{padding-left:var(--paddingMedium);padding-right:var(--paddingMedium);height:25px;width:-moz-fit-content;width:fit-content;white-space:nowrap;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:14px;background:var(--primary);border-style:solid;border-width:1px;border-color:var(--stroke);color:var(--white);cursor:pointer;border-radius:var(--inputBorderRadius);gap:var(--marginMedium)}.jwt-signer-form-container .select-file-button:hover{filter:brightness(.8)}.jwt-signer-form-container .select-file-button:active{filter:grayscale(1);transform:translateY(1px)}.jwt-signer-form-container .select-file-button .spinner{display:inline-block;width:8px;height:8px;border-radius:50%;background:transparent;border-top:2px solid white;border-right:2px solid white;border-bottom:2px solid transparent;border-left:2px solid transparent;animation:loading .5s infinite linear}.jwt-signer-form-container .select-file-label-container{gap:var(--marginMedium)}::ng-deep .jwt-signer-form-container select:disabled,::ng-deep .jwt-signer-form-container input:disabled{opacity:.75!important;cursor:text;background-color:var(--stroke)!important}::ng-deep .api-data-no-wrap .jse-text-mode{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller{width:100%}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content{width:100%;overflow:auto}::ng-deep .api-data-no-wrap .jse-text-mode .cm-editor .cm-scroller .cm-content .\\37cr{white-space:nowrap}\n"] }]
|
|
261
|
+
}], ctorParameters: function () { return [{ type: i1.JwtSignerFormService }, { type: i2.SchemaService }, { type: i3.GrowlerService }, { type: undefined, decorators: [{
|
|
262
|
+
type: Inject,
|
|
263
|
+
args: [SHAREDZ_EXTENSION]
|
|
264
|
+
}] }, { type: i15.SettingsService, decorators: [{
|
|
265
|
+
type: Inject,
|
|
266
|
+
args: [SETTINGS_SERVICE]
|
|
267
|
+
}] }, { type: i16.ZitiDataService, decorators: [{
|
|
268
|
+
type: Inject,
|
|
269
|
+
args: [ZITI_DATA_SERVICE]
|
|
270
|
+
}] }, { type: i4.Router }, { type: i4.ActivatedRoute }, { type: i5.Location }, { type: i6.ValidationService }]; }, propDecorators: { formData: [{
|
|
271
|
+
type: Input
|
|
272
|
+
}], errors: [{
|
|
273
|
+
type: Input
|
|
274
|
+
}], close: [{
|
|
275
|
+
type: Output
|
|
276
|
+
}], filterInput: [{
|
|
277
|
+
type: ViewChild,
|
|
278
|
+
args: ['fileSelect']
|
|
279
|
+
}] } });
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXNpZ25lci1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ppdGktY29uc29sZS1saWIvc3JjL2xpYi9mZWF0dXJlcy9wcm9qZWN0YWJsZS1mb3Jtcy9qd3Qtc2lnbmVyL2p3dC1zaWduZXItZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvand0LXNpZ25lci9qd3Qtc2lnbmVyLWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0VBY0U7QUFFRixPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFFRyxNQUFNLEVBQ2QsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFN0YsT0FBTyxFQUFDLFNBQVMsRUFBUyxLQUFLLEVBQUUsTUFBTSxFQUFnQixPQUFPLEVBQVMsS0FBSyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVGLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQWtCLE1BQU0sb0NBQW9DLENBQUM7QUFDckYsT0FBTyxFQUFDLGlCQUFpQixFQUFrQixNQUFNLHFDQUFxQyxDQUFDO0FBRXZGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSXJELE1BS2Esc0JBQXVCLFNBQVEsZUFBZTtJQW1CdkQsWUFDVyxHQUF5QixFQUN4QixTQUF3QixFQUNoQyxjQUE4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RUFDYixpQ0FBaUMsQ0FDcEMsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxlQUFlO1FBQ1gsTUFBTSxPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUMsVUFBVTtNQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUk7OztzQkFHOUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRTtrQkFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUUxQyxTQUFTLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FDaEMsU0FBUyxFQUNULFNBQVMsRUFDVCxhQUFhLEVBQ2Isa0NBQWtDLENBQ3JDLENBQUM7UUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDOytHQTFRUSxzQkFBc0IsaUhBdUJuQixpQkFBaUIsYUFDakIsZ0JBQWdCLGFBQ2hCLGlCQUFpQjttR0F6QnBCLHNCQUFzQiw0UUM1Q25DLGlsVkErS0E7O1NEbklhLHNCQUFzQjs0RkFBdEIsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNJLG1CQUFtQjs7MEJBMkJ4QixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQyxpQkFBaUI7cUpBdkJYLFFBQVE7c0JBQXpCLEtBQUs7Z0JBQ1ksTUFBTTtzQkFBdkIsS0FBSztnQkFDSSxLQUFLO3NCQUFkLE1BQU07Z0JBYWtCLFdBQVc7c0JBQW5DLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gICAgQ29weXJpZ2h0IE5ldEZvdW5kcnkgSW5jLlxuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LCBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlciwgSW5qZWN0LFxuICAgIElucHV0LFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtKd3RTaWduZXJGb3JtU2VydmljZX0gZnJvbSBcIi4vand0LXNpZ25lci1mb3JtLnNlcnZpY2VcIjtcbmltcG9ydCB7U2NoZW1hU2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3NjaGVtYS5zZXJ2aWNlXCI7XG5pbXBvcnQge1Byb2plY3RhYmxlRm9ybX0gZnJvbSBcIi4uL3Byb2plY3RhYmxlLWZvcm0uY2xhc3NcIjtcbmltcG9ydCB7R3Jvd2xlclNlcnZpY2V9IGZyb20gXCIuLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5zZXJ2aWNlXCI7XG5pbXBvcnQge0V4dGVuc2lvblNlcnZpY2UsIFNIQVJFRFpfRVhURU5TSU9OfSBmcm9tIFwiLi4vLi4vZXh0ZW5kYWJsZS9leHRlbnNpb25zLW5vb3Auc2VydmljZVwiO1xuXG5pbXBvcnQge2Nsb25lRGVlcCwgZGVmZXIsIGRlbGF5LCBmb3JPd24sIGtleXMsIGludmVydCwgaXNFbXB0eSwgaXNOaWwsIHVuc2V0fSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHtHcm93bGVyTW9kZWx9IGZyb20gXCIuLi8uLi9tZXNzYWdpbmcvZ3Jvd2xlci5tb2RlbFwiO1xuaW1wb3J0IHtTRVRUSU5HU19TRVJWSUNFLCBTZXR0aW5nc1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zZXR0aW5ncy5zZXJ2aWNlXCI7XG5pbXBvcnQge1pJVElfREFUQV9TRVJWSUNFLCBaaXRpRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy96aXRpLWRhdGEuc2VydmljZVwiO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQge0p3dFNpZ25lcn0gZnJvbSBcIi4uLy4uLy4uL21vZGVscy9qd3Qtc2lnbmVyXCI7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1ZhbGlkYXRpb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvdmFsaWRhdGlvbi5zZXJ2aWNlXCI7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLWNvbmZpZ3VyYXRpb24nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9qd3Qtc2lnbmVyLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2p3dC1zaWduZXItZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEp3dFNpZ25lckZvcm1Db21wb25lbnQgZXh0ZW5kcyBQcm9qZWN0YWJsZUZvcm0gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBASW5wdXQoKSBvdmVycmlkZSBmb3JtRGF0YTogYW55ID0ge307XG4gICAgQElucHV0KCkgb3ZlcnJpZGUgZXJyb3JzOiBhbnkgPSB7fTtcbiAgICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIGZvcm1WaWV3ID0gJ3NpbXBsZSc7XG4gICAgb3B0aW9uczogYW55W10gPSBbXTtcbiAgICBpc0VkaXRpbmcgPSAhaXNFbXB0eSh0aGlzLmZvcm1EYXRhLmlkKTtcbiAgICBmb3JtRGF0YUludmFsaWQgPSBmYWxzZTtcbiAgICBlZGl0TW9kZSA9IGZhbHNlO1xuICAgIGl0ZW1zOiBhbnkgPSBbXTtcbiAgICBzZXR0aW5nczogYW55ID0ge307XG4gICAgZmlsZVNlbGVjdE9wZW5pbmcgPSBmYWxzZTtcbiAgICBvdmVycmlkZSBlbnRpdHlUeXBlID0gJ2V4dGVybmFsLWp3dC1zaWduZXJzJztcbiAgICBvdmVycmlkZSBlbnRpdHlDbGFzcyA9IEp3dFNpZ25lcjtcblxuICAgIEBWaWV3Q2hpbGQoJ2ZpbGVTZWxlY3QnKSBmaWx0ZXJJbnB1dDogRWxlbWVudFJlZjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgc3ZjOiBKd3RTaWduZXJGb3JtU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBzY2hlbWFTdmM6IFNjaGVtYVNlcnZpY2UsXG4gICAgICAgIGdyb3dsZXJTZXJ2aWNlOiBHcm93bGVyU2VydmljZSxcbiAgICAgICAgQEluamVjdChTSEFSRURaX0VYVEVOU0lPTikgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICAgICAgQEluamVjdChTRVRUSU5HU19TRVJWSUNFKSBwdWJsaWMgc2V0dGluZ3NTZXJ2aWNlOiBTZXR0aW5nc1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoWklUSV9EQVRBX1NFUlZJQ0UpIG92ZXJyaWRlIHppdGlTZXJ2aWNlOiBaaXRpRGF0YVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICBwcml2YXRlIHZhbGlkYXRpb25TZXJ2aWNlOiBWYWxpZGF0aW9uU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcihncm93bGVyU2VydmljZSwgZXh0U2VydmljZSwgeml0aVNlcnZpY2UsIHJvdXRlciwgcm91dGUsIGxvY2F0aW9uKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3NDaGFuZ2Uuc3Vic2NyaWJlKChyZXN1bHRzOmFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IHJlc3VsdHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBlbnRpdHlVcGRhdGVkKCkge1xuICAgICAgICBzdXBlci5lbnRpdHlVcGRhdGVkKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2xlYXJGb3JtKCk7XG4gICAgfVxuXG4gICAgaGVhZGVyQWN0aW9uUmVxdWVzdGVkKGV2ZW50KSB7XG4gICAgICAgIHN3aXRjaChldmVudC5uYW1lKSB7XG4gICAgICAgICAgICBjYXNlICdzYXZlJzpcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmUoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY2xvc2UnOlxuICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVG9MaXN0UGFnZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAndG9nZ2xlLXZpZXcnOlxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybVZpZXcgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZm9ybURhdGEuY29uZmlnVHlwZUlkID0gJyc7XG4gICAgICAgIHRoaXMuY2xlYXJGb3JtKCk7XG4gICAgfVxuXG4gICAgY2xlYXJGb3JtKCkge1xuICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0/LmNvbXBvbmVudCkgaXRlbS5jb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5lcnJvcnMgPSB7fTtcbiAgICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmZvcm1EYXRhID0ge307XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikgdGhpcy5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBhc3luYyBzYXZlKGV2ZW50PzogYW55KSB7XG4gICAgICAgIGlmKCF0aGlzLnZhbGlkYXRlKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YWdWYWxzID0gdGhpcy5nZXRUYWdWYWx1ZXMoKTtcbiAgICAgICAgaWYgKCFpc0VtcHR5KHRhZ1ZhbHMpKSB7XG4gICAgICAgICAgICBmb3JPd24odGFnVmFscywgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1EYXRhLnRhZ3Nba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpRGF0YSA9IHRoaXMuYXBpRGF0YTtcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnN2Yy5zYXZlKGFwaURhdGEpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2RhbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbCh0cnVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmluaXREYXRhID0gdGhpcy5mb3JtRGF0YTtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucmV0dXJuVG9MaXN0UGFnZSgpO1xuICAgICAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhbGlkYXRlKCkge1xuICAgICAgICB0aGlzLmVycm9ycyA9IHt9O1xuICAgICAgICBjb25zdCBsYWJlbHMgPSBbXTtcbiAgICAgICAgY29uc3QgZ3Jvd2xlcnMgPSBbXTtcbiAgICAgICAgaWYgKGlzRW1wdHkodGhpcy5mb3JtRGF0YS5uYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMubmFtZSA9IHRydWU7XG4gICAgICAgICAgICBsYWJlbHMucHVzaCgnTmFtZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0VtcHR5KHRoaXMuZm9ybURhdGEuaXNzdWVyKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMuaXNzdWVyID0gdHJ1ZTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKCdJc3N1ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLmZvcm1EYXRhLmNlcnRQZW0pKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9ycy5jZXJ0UGVtID0gdHJ1ZTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKCdDZXJ0IFBFTScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFbXB0eSh0aGlzLmVycm9ycykpIHtcbiAgICAgICAgICAgIGxldCBtaXNzaW5nRmllbGRzID0gbGFiZWxzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICBncm93bGVycy5wdXNoKG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAnSW52YWxpZCcsXG4gICAgICAgICAgICAgICAgYE1pc3NpbmcgRm9ybSBEYXRhYCxcbiAgICAgICAgICAgICAgICBgUGxlYXNlIGVudGVyIGEgdmFsdWUgZm9yIHRoZSBoaWdobGlnaHRlZCBmaWVsZHM6ICR7bWlzc2luZ0ZpZWxkc31gLFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc0VtcHR5KHRoaXMuZm9ybURhdGEuY2VydFBlbT8udHJpbSgpKSAmJiAhdGhpcy52YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkUEVNKHRoaXMuZm9ybURhdGEuY2VydFBlbT8udHJpbSgpKSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvcnMuY2VydFBlbSA9IHRydWU7XG4gICAgICAgICAgICBncm93bGVycy5wdXNoKG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAnSW52YWxpZCcsXG4gICAgICAgICAgICAgICAgYENlcnQgUEVNIEludmFsaWRgLFxuICAgICAgICAgICAgICAgIGBUaGUgdmFsdWUgeW91IGhhdmUgZW50ZXJlZCBmb3IgdGhlIENlcnQgUEVNIGZpZWxkIGlzIGludmFsaWQuIFBsZWFzZSBjaGVjayB5b3VyIGlucHV0IGFuZCB0cnkgYWdhaW4uYCxcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3Jvd2xlcnMuZm9yRWFjaCgoZ3Jvd2xlckRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaXNFbXB0eSh0aGlzLmVycm9ycyk7XG4gICAgfVxuXG4gICAgZ2V0IGFwaUNhbGxVUkwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzLnNlbGVjdGVkRWRnZUNvbnRyb2xsZXIgKyAnL2VkZ2UvbWFuYWdlbWVudC92MS9leHRlcm5hbC1qd3Qtc2lnbmVycycgKyAodGhpcy5mb3JtRGF0YS5pZCA/IGAvJHt0aGlzLmZvcm1EYXRhLmlkfWAgOiAnJyk7XG4gICAgfVxuXG4gICAgZ2V0IGFwaURhdGEoKTogYW55IHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0ge1xuICAgICAgICAgICAgbmFtZTogdGhpcy5mb3JtRGF0YS5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgYXVkaWVuY2U6IHRoaXMuZm9ybURhdGEuYXVkaWVuY2UgfHwgJycsXG4gICAgICAgICAgICBpc3N1ZXI6IHRoaXMuZm9ybURhdGEuaXNzdWVyIHx8ICcnLFxuICAgICAgICAgICAgY2VydFBlbTogdGhpcy5mb3JtRGF0YS5jZXJ0UGVtIHx8ICcnLFxuICAgICAgICAgICAgY2xhaW1zUHJvcGVydHk6IHRoaXMuZm9ybURhdGEuY2xhaW1zUHJvcGVydHkgfHwgJycsXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmZvcm1EYXRhLmVuYWJsZWQsXG4gICAgICAgICAgICB1c2VFeHRlcm5hbElkOiB0aGlzLmZvcm1EYXRhLnVzZUV4dGVybmFsSWQsXG4gICAgICAgICAgICBleHRlcm5hbEF1dGhVcmw6IHRoaXMuZm9ybURhdGEuZXh0ZXJuYWxBdXRoVXJsIHx8ICcnLFxuICAgICAgICAgICAga2lkOiB0aGlzLmZvcm1EYXRhLmtpZCB8fCAnJyxcbiAgICAgICAgICAgIHRhZ3M6IHRoaXMuZm9ybURhdGEudGFncyB8fCB7fVxuICAgICAgICB9O1xuICAgICAgICBpZiAoIWlzRW1wdHkodGhpcy5mb3JtRGF0YS5qd2tzRW5kcG9pbnQpKSB7XG4gICAgICAgICAgICBkYXRhLmp3a3NFbmRwb2ludCA9IHRoaXMuZm9ybURhdGEuandrc0VuZHBvaW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNFbXB0eSh0aGlzLmZvcm1EYXRhLmlkKSkge1xuICAgICAgICAgICAgZGF0YS5pZCA9IHRoaXMuZm9ybURhdGEuaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZm9ybURhdGEuaWQpIHtcbiAgICAgICAgICAgIGRhdGEuaWQgPSB0aGlzLmZvcm1EYXRhLmlkO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2FwaURhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gdGhpcy5fYXBpRGF0YTtcbiAgICB9XG5cbiAgICBfYXBpRGF0YTogYW55ID0ge307XG4gICAgc2V0IGFwaURhdGEoZGF0YSkge1xuICAgICAgICB0aGlzLl9hcGlEYXRhID0gZGF0YTtcbiAgICB9XG5cbiAgICBkYXRhQ2hhbmdlZChldmVudCkge1xuICAgICAgICB0aGlzLl9hcGlEYXRhID0gY2xvbmVEZWVwKHRoaXMuYXBpRGF0YSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICAgICAgdGhpcy5mb3JtRGF0YS5lbmFibGVkID0gIXRoaXMuZm9ybURhdGEuZW5hYmxlZDtcbiAgICB9XG5cbiAgICB0b2dnbGVVc2VFeHRlcm5hbElkKCkge1xuICAgICAgICB0aGlzLmZvcm1EYXRhLnVzZUV4dGVybmFsSWQgPSAhdGhpcy5mb3JtRGF0YS51c2VFeHRlcm5hbElkO1xuICAgIH1cblxuICAgIG9wZW5GaWxlU2VsZWN0KGV2ZW50OiBhbnkpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJJbnB1dC5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgICAgIHRoaXMuZmlsZVNlbGVjdE9wZW5pbmcgPSB0cnVlO1xuICAgICAgICBkZWxheSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbGVTZWxlY3RPcGVuaW5nID0gZmFsc2U7XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIHNlbGVjdFBlbUZpbGUoZXZlbnQ6IGFueSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgIGNvbnN0IGZpbGU6IEZpbGUgPSBldmVudD8udGFyZ2V0Py5maWxlc1swXTtcblxuICAgICAgICBpZiAoZmlsZSkge1xuICAgICAgICAgICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChmaWxlTG9hZGVkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RnJvbVNlbGVjdGVkRmlsZTogYW55ID0gZmlsZUxvYWRlZEV2ZW50LnRhcmdldD8ucmVzdWx0O1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy52YWxpZGF0aW9uU2VydmljZS5pc1ZhbGlkUEVNKHRleHRGcm9tU2VsZWN0ZWRGaWxlPy50cmltKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JzLmNlcnRQZW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYENlcnQgUEVNIEludmFsaWRgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSBmaWxlIHNlbGVjdGVkIGZvciB0aGUgQ2VydCBQRU0gZmllbGQgaXMgaW52YWxpZC4gUGxlYXNlIGNoZWNrIHlvdXIgaW5wdXQgYW5kIHRyeSBhZ2Fpbi5gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdyb3dsZXJTZXJ2aWNlLnNob3coZ3Jvd2xlckRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1EYXRhLmNlcnRQZW0gPSAnSW52YWxpZCBQRU0uIFBsZWFzZSBzZWxlY3Qgb3IgZW50ZXIgYSB2YWxpZCBQRU0gY2VydGlmaWNhdGUuJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1bnNldCh0aGlzLmVycm9ycywgJ2NlcnRQZW0nKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtRGF0YS5jZXJ0UGVtID0gdGV4dEZyb21TZWxlY3RlZEZpbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZpbGVSZWFkZXIucmVhZEFzVGV4dChmaWxlLCBcIlVURi04XCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBpQWN0aW9uUmVxdWVzdGVkKGFjdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGFjdGlvbi5pZCkge1xuICAgICAgICAgICAgY2FzZSAnY2xpJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNvcHlDTElDb21tYW5kKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjdXJsJzpcbiAgICAgICAgICAgICAgICB0aGlzLmNvcHlDVVJMQ29tbWFuZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29weUNMSUNvbW1hbmQoKSB7XG4gICAgICAgIGNvbnN0IGNvbW1hbmQgPSBgeml0aSBlZGdlICR7dGhpcy5mb3JtRGF0YS5pZCA/ICd1cGRhdGUnIDogJ2NyZWF0ZSd9IGV4dC1qd3Qtc2lnbmVyICR7dGhpcy5mb3JtRGF0YS5pZCA/IGAnJHt0aGlzLmZvcm1EYXRhLmlkfSdgIDogJyd9ICR7dGhpcy5mb3JtRGF0YS5pZCA/ICctLW5hbWUnIDogJyd9ICcke3RoaXMuZm9ybURhdGEubmFtZX0nICR7dGhpcy5mb3JtRGF0YS5pZCA/ICctLWlzc3VlcicgOiAnJ30gJyR7dGhpcy5mb3JtRGF0YS5pc3N1ZXJ9JyAtLWF1ZGllbmNlICcke3RoaXMuZm9ybURhdGEuYXVkaWVuY2V9JyAtLWNlcnQtcGVtICcke3RoaXMuZm9ybURhdGEuY2VydFBlbX0nIC0tY2xhaW1zLXByb3BlcnR5ICcke3RoaXMuZm9ybURhdGEuY2xhaW1zUHJvcGVydHl9JyAtLWV4dGVybmFsLWF1dGgtdXJsICcke3RoaXMuZm9ybURhdGEuZXh0ZXJuYWxBdXRoVXJsfScgLS1raWQgJyR7dGhpcy5mb3JtRGF0YS5raWR9J2A7XG5cbiAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoY29tbWFuZCk7XG4gICAgICAgIGNvbnN0IGdyb3dsZXJEYXRhID0gbmV3IEdyb3dsZXJNb2RlbChcbiAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICdTdWNjZXNzJyxcbiAgICAgICAgICAgIGBUZXh0IENvcGllZGAsXG4gICAgICAgICAgICBgQ0xJIGNvbW1hbmQgY29waWVkIHRvIGNsaXBib2FyZGAsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gICAgfVxuXG4gICAgY29weUNVUkxDb21tYW5kKCkge1xuICAgICAgICBjb25zdCBjb21tYW5kID0gYGN1cmwgJyR7dGhpcy5hcGlDYWxsVVJMfScgXFxcXFxuICAgICR7dGhpcy5mb3JtRGF0YS5pZCA/ICctLXJlcXVlc3QgUEFUQ0ggXFxcXCcgOiAnXFxcXCd9XG4gICAgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicgXFxcXFxuICAgIC1IICdjb250ZW50LXR5cGU6IGFwcGxpY2F0aW9uL2pzb24nIFxcXFxcbiAgICAtSCAnenQtc2Vzc2lvbjogJHt0aGlzLnNldHRpbmdzLnNlc3Npb24uaWR9JyBcXFxcXG4gICAgLS1kYXRhLXJhdyAnJHtKU09OLnN0cmluZ2lmeSh0aGlzLmFwaURhdGEpfSdgO1xuXG4gICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGNvbW1hbmQpO1xuICAgICAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAnc3VjY2VzcycsXG4gICAgICAgICAgICAnU3VjY2VzcycsXG4gICAgICAgICAgICBgVGV4dCBDb3BpZWRgLFxuICAgICAgICAgICAgYENVUkwgY29tbWFuZCBjb3BpZWQgdG8gY2xpcGJvYXJkYCxcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5ncm93bGVyU2VydmljZS5zaG93KGdyb3dsZXJEYXRhKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicHJvamVjdGFibGUtZm9ybS13cmFwcGVyXCJcbiAgICAgKGtleXVwLmVudGVyKT1cInNhdmUoJGV2ZW50KVwiXG4gICAgIChrZXl1cC5lc2NhcGUpPVwiY2xvc2VNb2RhbChmYWxzZSlcIlxuICAgICB0YWJpbmRleD1cIjBcIlxuPlxuICAgIDxsaWItZm9ybS1oZWFkZXJcbiAgICAgICAgICAgIFtkYXRhXT1cImZvcm1EYXRhXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCIoZm9ybURhdGEuaWQgPyAnSldUIFNpZ25lciBEZXRhaWxzJyA6ICdDcmVhdGUgSldUIFNpZ25lcicpXCJcbiAgICAgICAgICAgIFttb3JlQWN0aW9uc109XCJmb3JtRGF0YS5tb3JlQWN0aW9uc1wiXG4gICAgICAgICAgICAoYWN0aW9uUmVxdWVzdGVkKT1cImhlYWRlckFjdGlvblJlcXVlc3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgIFsoZm9ybVZpZXcpXT1cImZvcm1WaWV3XCJcbiAgICAgICAgICAgIFtzYXZlRGlzYWJsZWRdPVwic3ZjLnNhdmVEaXNhYmxlZCB8fCBmb3JtRGF0YUludmFsaWRcIlxuICAgID48L2xpYi1mb3JtLWhlYWRlcj5cbiAgICA8ZGl2IGNsYXNzPVwiand0LXNpZ25lci1mb3JtLWNvbnRhaW5lciBwcm9qZWN0YWJsZS1mb3JtLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvamVjdGFibGUtZm9ybS1tYWluLWNvbHVtbiBmb3JtLWdyb3VwLXJvd1wiIFtoaWRkZW5dPVwiZm9ybVZpZXcgIT09ICdzaW1wbGUnXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW4gdGhyZWUtZmlmdGhzXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidOYW1lJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1JlcXVpcmVkJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0IHJlYWQtb25seVwiIFsobmdNb2RlbCldPVwiZm9ybURhdGEubmFtZVwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzWyduYW1lJ119XCIgcGxhY2Vob2xkZXI9XCJOYW1lIHRoaXMgSldUIFNpZ25lclwiLz5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGF5b3V0XT1cIidjb2x1bW4nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLWxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPklzc3Vlcjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWluZm8gaW5mb2ljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlRoZSAmcXVvdDtpc3N1ZXImcXVvdDsgZmllbGQgb24gdGhlIEpXVCBTaWduZXIgbXVzdCBtYXRjaCB0aGUgJnF1b3Q7aXNzJnF1b3Q7IGZpZWxkIG9uIHRoZSBKV1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLWxhYmVsXCIgPlJlcXVpcmVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBpc3N1ZXJcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmlzc3VlclwiIFtuZ0NsYXNzXT1cIntlcnJvcjogZXJyb3JzWydpc3N1ZXInXX1cIi8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1sYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPkNsYWltcyBQcm9wZXJ0eTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtaW5mbyBpbmZvaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVGhlICZxdW90O2NsYWltc1Byb3BlcnR5JnF1b3Q7IG11c3QgbWF0Y2ggdGhlICZxdW90O2lkJnF1b3Q7IGZpZWxkIG9uIGEgeml0aSBpZGVudGl0eSAob3IgZXh0ZXJuYWxJZCBpZiAmcXVvdDtVc2UgRXh0ZXJuYWwgSUQmcXVvdDsgaXMgZW5hYmxlZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgY2xhaW1zIHByb3BlcnR5LCBkZWZhdWx0cyB0byAmcXVvdDtzdWImcXVvdDtcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmNsYWltc1Byb3BlcnR5XCIvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtbGFiZWwtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5BdWRpZW5jZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tZmllbGQtaW5mbyBpbmZvaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiVGhlICZxdW90O2F1ZGllbmNlJnF1b3Q7IGZpZWxkIG9uIHRoZSBKV1QgU2lnbmVyIG11c3QgbWF0Y2ggdGhlICZxdW90O2F1ZCZxdW90OyBmaWVsZCBvbiB0aGUgSldUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tZmllbGQtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGF1ZGllbmNlXCIgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5hdWRpZW5jZVwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLWxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb3JtLWZpZWxkLXRpdGxlXCI+RXh0ZXJuYWwgQXV0aCBVcmw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWluZm8gaW5mb2ljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIlVuYXV0aGVudGljYXRlZCBjbGllbnRzIGNhbiBlbnVtZXJhdGUgRXh0ZXJuYWwgSldUIFNpZ25lcnMgdGhhdCBoYXZlIGFuICZxdW90O2V4dGVybmFsQXV0aFVybCZxdW90OyBwcm9wZXJ0eS4gQ2xpZW50cyB3aWxsIHJlY2VpdmUgdGhlIG5hbWUgb2YgdGhlIEV4dGVybmFsIEpXVCBTaWduZXIgYW5kIHRoZSAmcXVvdDtleHRlcm5hbEF1dGhVcmwmcXVvdDsgb25seS4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYWxsb3cgY2xpZW50cyB0byBpbml0aWF0ZSBjbGllbnQgYXV0aGVudGljYXRpb24gdG8gdGhlIHRhcmdldCBpZGVudGl0eSBwcm92aWRlci5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgZXh0ZXJuYWwgYXV0aCBVUkxcIiBbKG5nTW9kZWwpXT1cImZvcm1EYXRhLmV4dGVybmFsQXV0aFVybFwiLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dIZWFkZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xheW91dF09XCIncm93J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctY29udGFpbmVyIHRvZ2dsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLWNvbnRhaW5lci1sYWJlbFwiPkVOQUJMRUQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRW5hYmxlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgb246IGZvcm1EYXRhLmVuYWJsZWQgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaGlkZGVuXT1cIiFmb3JtRGF0YS5lbmFibGVkXCIgY2xhc3M9XCJvbi1sYWJlbFwiPllFUzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCJmb3JtRGF0YS5lbmFibGVkXCIgY2xhc3M9XCJvZmYtbGFiZWxcIj5OTzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXRjaFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1jb250YWluZXIgdG9nZ2xlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctY29udGFpbmVyLWxhYmVsXCI+VXNlIEV4dGVybmFsIElEPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVVzZUV4dGVybmFsSWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7IG9uOiBmb3JtRGF0YS51c2VFeHRlcm5hbElkIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW2hpZGRlbl09XCIhZm9ybURhdGEudXNlRXh0ZXJuYWxJZFwiIGNsYXNzPVwib24tbGFiZWxcIj5ZRVM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIFtoaWRkZW5dPVwiZm9ybURhdGEudXNlRXh0ZXJuYWxJZFwiIGNsYXNzPVwib2ZmLWxhYmVsXCI+Tk88L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2l0Y2hcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpYi1mb3JtLWZpZWxkLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bGliLWZvcm0tZmllbGQtdG9nZ2xlIFsodG9nZ2xlT24pXT1cInNob3dNb3JlXCIgKHRvZ2dsZU9uQ2hhbmdlKT1cInNob3dNb3JlQ2hhbmdlZCgkZXZlbnQpXCIgc3R5bGU9XCJtYXJnaW46IDBweCAxMHB4XCI+PC9saWItZm9ybS1maWVsZC10b2dnbGU+XG4gICAgICAgICAgICAgICAgPGRpdiBbaGlkZGVuXT1cIiFzaG93TW9yZVwiIGNsYXNzPVwiZm9ybS1ncm91cC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQ3VzdG9tIFRhZ3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09QVElPTkFMJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkLWFkdmFuY2VkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jdXN0b20tdGFncyBbKHRhZ3MpXT1cImZvcm1EYXRhLnRhZ3NcIj48L2xpYi1jdXN0b20tdGFncz5cbiAgICAgICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtbiB0d28tZmlmdGhzXCI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidDZXJ0aWZpY2F0ZSBEZWZpbml0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ1JFUVVJUkVEJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dC1ncm91cFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtbGFiZWwtY29udGFpbmVyIHNlbGVjdC1maWxlLWxhYmVsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9ybS1maWVsZC10aXRsZVwiPlBFTTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LWZpbGUtYnV0dG9uXCIgKGNsaWNrKT1cIm9wZW5GaWxlU2VsZWN0KCRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdCBGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lclwiICpuZ0lmPVwiZmlsZVNlbGVjdE9wZW5pbmdcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgI2ZpbGVTZWxlY3QgdHlwZT1cImZpbGVcIiBzdHlsZT1cImRpc3BsYXk6bm9uZVwiIChjaGFuZ2UpPVwic2VsZWN0UGVtRmlsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHBsYWNlaG9sZGVyPVwiUGFzdGUgcGVtIGNvbnRlbnRzIG9yIHNlbGVjdCBmaWxlXCIgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5jZXJ0UGVtXCIgW25nQ2xhc3NdPVwie2Vycm9yOiBlcnJvcnNbJ2NlcnRQZW0nXX1cIj48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1sYWJlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtdGl0bGVcIj5LSUQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvcm0tZmllbGQtbGFiZWxcIiA+T3B0aW9uYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgS0lEXCIgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5raWRcIi8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidKV0tTIEVuZHBvaW50J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ09wdGlvbmFsJ1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWZpZWxkLWlucHV0IHJlYWQtb25seVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgZW5kcG9pbnQgVVJMXCIgWyhuZ01vZGVsKV09XCJmb3JtRGF0YS5qd2tzRW5kcG9pbnRcIi8+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPGxpYi1mb3JtLWZpZWxkLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidBUEkgQ2FsbHMnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoZWFkZXJBY3Rpb25zXT1cImFwaU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGFjdGlvblJlcXVlc3RlZCk9XCJhcGlBY3Rpb25SZXF1ZXN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiJ2FwaS1kYXRhLW5vLXdyYXAnXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1maWVsZC1pbnB1dFwiIFt2YWx1ZV09XCJhcGlDYWxsVVJMXCIvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY29weSBjb3B5XCIgKGNsaWNrKT1cImNvcHlUb0NsaXBib2FyZChhcGlDYWxsVVJMKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1qc29uLXZpZXcgKm5nSWY9XCJmb3JtRGF0YVwiIFsoZGF0YSldPVwiYXBpRGF0YVwiIFtyZWFkT25seV09XCJ0cnVlXCIgW3Nob3dDb3B5XT1cInRydWVcIj48L2xpYi1qc29uLXZpZXc+XG4gICAgICAgICAgICAgICAgPC9saWItZm9ybS1maWVsZC1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwLWNvbHVtblwiICpuZ0lmPVwiZm9ybVZpZXcgPT09ICdyYXcnXCI+XG4gICAgICAgICAgICA8bGliLWpzb24tdmlldyAqbmdJZj1cImZvcm1EYXRhXCIgWyhkYXRhKV09XCJmb3JtRGF0YVwiPjwvbGliLWpzb24tdmlldz5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxsaWItbG9hZGluZy1pbmRpY2F0b3IgKm5nSWY9XCJpc0xvYWRpbmdcIiBbaXNMb2FkaW5nXT1cImlzTG9hZGluZ1wiPjwvbGliLWxvYWRpbmctaW5kaWNhdG9yPlxuIl19
|
|
@@ -0,0 +1,92 @@
|
|
|
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 { JwtSigner } from "../../../models/jwt-signer";
|
|
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 JwtSignerFormService {
|
|
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
|
+
}
|
|
21
|
+
save(formData) {
|
|
22
|
+
const isUpdate = !isEmpty(formData.id);
|
|
23
|
+
const data = this.getJwtSignerDataModel(formData, isUpdate);
|
|
24
|
+
let prom;
|
|
25
|
+
if (isUpdate) {
|
|
26
|
+
prom = this.dataService.patch('external-jwt-signers', data, formData.id, true);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
prom = this.dataService.post('external-jwt-signers', data, true);
|
|
30
|
+
}
|
|
31
|
+
return prom.then(async (result) => {
|
|
32
|
+
const id = isUpdate ? formData.id : (result?.data?.id || result?.id);
|
|
33
|
+
let config = await this.dataService.getSubdata('external-jwt-signers', id, '').then((svcData) => {
|
|
34
|
+
return svcData.data;
|
|
35
|
+
});
|
|
36
|
+
return this.extService.formDataSaved(config).then((formSavedResult) => {
|
|
37
|
+
if (!formSavedResult) {
|
|
38
|
+
return config;
|
|
39
|
+
}
|
|
40
|
+
const growlerData = new GrowlerModel('success', 'Success', `JWT Signer ${isUpdate ? 'Updated' : 'Created'}`, `Successfully ${isUpdate ? 'updated' : 'created'} JWT Signer: ${formData.name}`);
|
|
41
|
+
this.growlerService.show(growlerData);
|
|
42
|
+
return config;
|
|
43
|
+
}).catch((result) => {
|
|
44
|
+
return false;
|
|
45
|
+
});
|
|
46
|
+
}).catch((resp) => {
|
|
47
|
+
let errorMessage;
|
|
48
|
+
if (resp?.error?.error?.cause?.message) {
|
|
49
|
+
errorMessage = resp?.error?.error?.cause?.message;
|
|
50
|
+
}
|
|
51
|
+
else if (resp?.error?.error?.cause?.reason) {
|
|
52
|
+
errorMessage = resp?.error?.error?.cause?.reason;
|
|
53
|
+
}
|
|
54
|
+
else if (resp?.error?.message) {
|
|
55
|
+
errorMessage = resp?.error?.message;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
errorMessage = 'An unknown error occurred';
|
|
59
|
+
}
|
|
60
|
+
const growlerData = new GrowlerModel('error', 'Error', `Error Creating JWT Signer`, errorMessage);
|
|
61
|
+
this.growlerService.show(growlerData);
|
|
62
|
+
throw resp;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
getJwtSignerDataModel(formData, isUpdate) {
|
|
66
|
+
const saveModel = new JwtSigner();
|
|
67
|
+
const modelProperties = keys(saveModel);
|
|
68
|
+
modelProperties.forEach((prop) => {
|
|
69
|
+
switch (prop) {
|
|
70
|
+
default:
|
|
71
|
+
saveModel[prop] = formData[prop];
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
return saveModel;
|
|
75
|
+
}
|
|
76
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormService, deps: [{ token: ZITI_DATA_SERVICE }, { token: SHAREDZ_EXTENSION }, { token: i1.GrowlerService }, { token: i2.ValidationService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
77
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormService, providedIn: 'root' }); }
|
|
78
|
+
}
|
|
79
|
+
export { JwtSignerFormService };
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JwtSignerFormService, decorators: [{
|
|
81
|
+
type: Injectable,
|
|
82
|
+
args: [{
|
|
83
|
+
providedIn: 'root'
|
|
84
|
+
}]
|
|
85
|
+
}], ctorParameters: function () { return [{ type: i3.ZitiDataService, decorators: [{
|
|
86
|
+
type: Inject,
|
|
87
|
+
args: [ZITI_DATA_SERVICE]
|
|
88
|
+
}] }, { type: undefined, decorators: [{
|
|
89
|
+
type: Inject,
|
|
90
|
+
args: [SHAREDZ_EXTENSION]
|
|
91
|
+
}] }, { type: i1.GrowlerService }, { type: i2.ValidationService }]; } });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiand0LXNpZ25lci1mb3JtLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy96aXRpLWNvbnNvbGUtbGliL3NyYy9saWIvZmVhdHVyZXMvcHJvamVjdGFibGUtZm9ybXMvand0LXNpZ25lci9qd3Qtc2lnbmVyLWZvcm0uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsaUJBQWlCLEVBQWtCLE1BQU0scUNBQXFDLENBQUM7QUFDdkYsT0FBTyxFQUEyQixPQUFPLEVBQVMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUUzRCxPQUFPLEVBQW1CLGlCQUFpQixFQUFDLE1BQU0sMENBQTBDLENBQUM7QUFFN0YsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFDOzs7OztBQUVyRCxNQUdhLG9CQUFvQjtJQU03QixZQUN1QyxXQUE0QixFQUM3QixVQUE0QixFQUN0RCxjQUE4QixFQUM5QixpQkFBb0M7UUFIVCxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDN0IsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDdEQsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFSaEQsVUFBSyxHQUFVLEVBQUUsQ0FBQztRQUNsQixXQUFNLEdBQVUsRUFBRSxDQUFDO1FBQ25CLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBUXJCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUTtRQUNULE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLElBQUksR0FBUSxJQUFJLENBQUMscUJBQXFC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QUNOLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsUUFBUTtRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDN0IsUUFBTyxJQUFJLEVBQUU7Z0JBQ1Q7b0JBQ0ksU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN4QztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQzsrR0E1RVEsb0JBQW9CLGtCQU9qQixpQkFBaUIsYUFDakIsaUJBQWlCO21IQVJwQixvQkFBb0IsY0FGakIsTUFBTTs7U0FFVCxvQkFBb0I7NEZBQXBCLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQVFRLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1pJVElfREFUQV9TRVJWSUNFLCBaaXRpRGF0YVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy96aXRpLWRhdGEuc2VydmljZVwiO1xuaW1wb3J0IHtkZWZlciwgaW52ZXJ0LCBpc0Jvb2xlYW4sIGlzRW1wdHksIGlzTmlsLCBrZXlzfSBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge0dyb3dsZXJNb2RlbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2luZy9ncm93bGVyLm1vZGVsXCI7XG5pbXBvcnQge0dyb3dsZXJTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vbWVzc2FnaW5nL2dyb3dsZXIuc2VydmljZVwiO1xuaW1wb3J0IHtFeHRlbnNpb25TZXJ2aWNlLCBTSEFSRURaX0VYVEVOU0lPTn0gZnJvbSBcIi4uLy4uL2V4dGVuZGFibGUvZXh0ZW5zaW9ucy1ub29wLnNlcnZpY2VcIjtcbmltcG9ydCB7VmFsaWRhdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7Snd0U2lnbmVyfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzL2p3dC1zaWduZXJcIjtcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBKd3RTaWduZXJGb3JtU2VydmljZSB7XG5cbiAgICBpdGVtczogYW55W10gPSBbXTtcbiAgICBlcnJvcnM6IGFueVtdID0gW107XG4gICAgc2F2ZURpc2FibGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQEluamVjdChaSVRJX0RBVEFfU0VSVklDRSkgcHJpdmF0ZSBkYXRhU2VydmljZTogWml0aURhdGFTZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KFNIQVJFRFpfRVhURU5TSU9OKXByaXZhdGUgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBncm93bGVyU2VydmljZTogR3Jvd2xlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdmFsaWRhdGlvblNlcnZpY2U6IFZhbGlkYXRpb25TZXJ2aWNlXG4gICAgKSB7XG4gICAgfVxuXG4gICAgc2F2ZShmb3JtRGF0YSkge1xuICAgICAgICBjb25zdCBpc1VwZGF0ZSA9ICFpc0VtcHR5KGZvcm1EYXRhLmlkKTtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gdGhpcy5nZXRKd3RTaWduZXJEYXRhTW9kZWwoZm9ybURhdGEsIGlzVXBkYXRlKTtcbiAgICAgICAgbGV0IHByb207XG4gICAgICAgIGlmIChpc1VwZGF0ZSkge1xuICAgICAgICAgICAgcHJvbSA9IHRoaXMuZGF0YVNlcnZpY2UucGF0Y2goJ2V4dGVybmFsLWp3dC1zaWduZXJzJywgZGF0YSwgZm9ybURhdGEuaWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvbSA9IHRoaXMuZGF0YVNlcnZpY2UucG9zdCgnZXh0ZXJuYWwtand0LXNpZ25lcnMnLCBkYXRhLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcm9tLnRoZW4oYXN5bmMgKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IGlzVXBkYXRlID8gZm9ybURhdGEuaWQgOiAocmVzdWx0Py5kYXRhPy5pZCB8fCByZXN1bHQ/LmlkKTtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSBhd2FpdCB0aGlzLmRhdGFTZXJ2aWNlLmdldFN1YmRhdGEoJ2V4dGVybmFsLWp3dC1zaWduZXJzJywgaWQsICcnKS50aGVuKChzdmNEYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN2Y0RhdGEuZGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXh0U2VydmljZS5mb3JtRGF0YVNhdmVkKGNvbmZpZykudGhlbigoZm9ybVNhdmVkUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcm1TYXZlZFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBncm93bGVyRGF0YSA9IG5ldyBHcm93bGVyTW9kZWwoXG4gICAgICAgICAgICAgICAgICAgICdzdWNjZXNzJyxcbiAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICBgSldUIFNpZ25lciAke2lzVXBkYXRlID8gJ1VwZGF0ZWQnIDogJ0NyZWF0ZWQnfWAsXG4gICAgICAgICAgICAgICAgICAgIGBTdWNjZXNzZnVsbHkgJHtpc1VwZGF0ZSA/ICd1cGRhdGVkJyA6ICdjcmVhdGVkJ30gSldUIFNpZ25lcjogJHtmb3JtRGF0YS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3dsZXJTZXJ2aWNlLnNob3coZ3Jvd2xlckRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25maWc7XG4gICAgICAgICAgICB9KS5jYXRjaCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKChyZXNwKSA9PiB7XG4gICAgICAgICAgICBsZXQgZXJyb3JNZXNzYWdlO1xuICAgICAgICAgICAgaWYgKHJlc3A/LmVycm9yPy5lcnJvcj8uY2F1c2U/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5tZXNzYWdlO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8uZXJyb3I/LmNhdXNlPy5yZWFzb247XG4gICAgICAgICAgICB9ZWxzZSBpZiAocmVzcD8uZXJyb3I/Lm1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSByZXNwPy5lcnJvcj8ubWVzc2FnZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ0FuIHVua25vd24gZXJyb3Igb2NjdXJyZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZ3Jvd2xlckRhdGEgPSBuZXcgR3Jvd2xlck1vZGVsKFxuICAgICAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAgICAgJ0Vycm9yJyxcbiAgICAgICAgICAgICAgICBgRXJyb3IgQ3JlYXRpbmcgSldUIFNpZ25lcmAsXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuZ3Jvd2xlclNlcnZpY2Uuc2hvdyhncm93bGVyRGF0YSk7XG4gICAgICAgICAgICB0aHJvdyByZXNwO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldEp3dFNpZ25lckRhdGFNb2RlbChmb3JtRGF0YSwgaXNVcGRhdGUpIHtcbiAgICAgICAgY29uc3Qgc2F2ZU1vZGVsID0gbmV3IEp3dFNpZ25lcigpO1xuICAgICAgICBjb25zdCBtb2RlbFByb3BlcnRpZXMgPSBrZXlzKHNhdmVNb2RlbCk7XG4gICAgICAgIG1vZGVsUHJvcGVydGllcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2gocHJvcCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHNhdmVNb2RlbFtwcm9wXSA9IGZvcm1EYXRhW3Byb3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHNhdmVNb2RlbDtcbiAgICB9XG5cbn1cbiJdfQ==
|