@piserve-tech/form-submission 1.3.267 → 1.3.269
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.
|
@@ -34,7 +34,7 @@ export class FormService {
|
|
|
34
34
|
.set('progressiveLoading', progressiveLoading);
|
|
35
35
|
return this.http.get(`${this.apiUrl}/api/public/forms/${moduleName}`, {
|
|
36
36
|
headers,
|
|
37
|
-
params
|
|
37
|
+
params,
|
|
38
38
|
});
|
|
39
39
|
}
|
|
40
40
|
fetchDataFromDatabase(database) {
|
|
@@ -52,54 +52,137 @@ export class FormService {
|
|
|
52
52
|
apiConfig.params?.some((p) => p.valueSource === 'PAGE_SIZE');
|
|
53
53
|
// ---------------------- HEADERS ----------------------
|
|
54
54
|
let headers = new HttpHeaders();
|
|
55
|
+
// helper: resolve a value (or values) based on valueSource
|
|
56
|
+
// Apply to headers (assuming `headers` is an HttpHeaders instance)
|
|
55
57
|
if (apiConfig.headers) {
|
|
56
58
|
apiConfig.headers.forEach((header) => {
|
|
57
|
-
if (header.keyName)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
59
|
+
if (!header.keyName)
|
|
60
|
+
return;
|
|
61
|
+
const rawValue = resolveValueFromSource(header.valueSource, header.inputValue, selectedValues);
|
|
62
|
+
if (header.valueSource === 'SELECTED_VALUES') {
|
|
63
|
+
// Only add header if we have selected values
|
|
64
|
+
if (Array.isArray(rawValue) && rawValue.length > 0) {
|
|
65
|
+
if (header.inputValue === 'SINGLE_VALUE') {
|
|
66
|
+
headers = headers.set(header.keyName, String(rawValue[0]));
|
|
66
67
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (header.keyName.toLowerCase() === 'authorization') {
|
|
71
|
-
headers = headers.set(header.keyName, 'Bearer ' + header.inputValue);
|
|
68
|
+
else if (header.inputValue === 'ARRAY_OF_VALUES') {
|
|
69
|
+
// join by comma for headers (common pattern)
|
|
70
|
+
headers = headers.set(header.keyName, rawValue.join(','));
|
|
72
71
|
}
|
|
73
72
|
else {
|
|
74
|
-
|
|
73
|
+
// fallback: join
|
|
74
|
+
headers = headers.set(header.keyName, rawValue.join(','));
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
|
+
// no selected values -> skip header
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// For non-selected sources: skip when unresolved
|
|
81
|
+
if (rawValue === null || rawValue === undefined)
|
|
82
|
+
return;
|
|
83
|
+
// If rawValue is array -> join by comma (headers expect single string)
|
|
84
|
+
const headerValue = Array.isArray(rawValue)
|
|
85
|
+
? rawValue.join(',')
|
|
86
|
+
: String(rawValue);
|
|
87
|
+
if (header.keyName.toLowerCase() === 'authorization') {
|
|
88
|
+
// add Bearer only when headerValue is truthy (and not already prefixed)
|
|
89
|
+
const token = headerValue.startsWith('Bearer ')
|
|
90
|
+
? headerValue
|
|
91
|
+
: `Bearer ${headerValue}`;
|
|
92
|
+
headers = headers.set(header.keyName, token);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
headers = headers.set(header.keyName, headerValue);
|
|
77
96
|
}
|
|
78
97
|
});
|
|
79
98
|
}
|
|
80
99
|
// ---------------------- PARAMS ----------------------
|
|
81
100
|
let params = new HttpParams();
|
|
101
|
+
// helper: resolve a value (or values) based on valueSource
|
|
102
|
+
function resolveValueFromSource(valueSource, inputValue, selectedValues = []) {
|
|
103
|
+
if (!valueSource)
|
|
104
|
+
return null;
|
|
105
|
+
switch (valueSource) {
|
|
106
|
+
case 'LOCAL_STORAGE':
|
|
107
|
+
return localStorage.getItem(inputValue); // string or null
|
|
108
|
+
case 'SESSION_STORAGE':
|
|
109
|
+
return sessionStorage.getItem(inputValue); // string or null
|
|
110
|
+
case 'CUSTOM_INPUT':
|
|
111
|
+
case 'QUESTION':
|
|
112
|
+
case 'PAGE_INDEX':
|
|
113
|
+
case 'PAGE_SIZE':
|
|
114
|
+
// inputValue may be a single value or an array/CSV depending on usage
|
|
115
|
+
return inputValue;
|
|
116
|
+
case 'SELECTED_VALUES':
|
|
117
|
+
// For SELECTED_VALUES, return the selectedValues array (caller decides SINGLE/ARRAY behavior)
|
|
118
|
+
return Array.isArray(selectedValues) ? selectedValues : [];
|
|
119
|
+
default:
|
|
120
|
+
console.warn(`Unsupported valueSource for params: ${valueSource}`);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Usage: build params (assuming `params` is an HttpParams instance)
|
|
82
125
|
if (apiConfig.params) {
|
|
83
126
|
apiConfig.params.forEach((param) => {
|
|
84
|
-
if (param.keyName)
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
127
|
+
if (!param.keyName)
|
|
128
|
+
return;
|
|
129
|
+
// Resolve raw value based on source
|
|
130
|
+
const rawValue = resolveValueFromSource(param.valueSource, param.inputValue, selectedValues);
|
|
131
|
+
// If param expects selected values, handle SINGLE_VALUE vs ARRAY_OF_VALUES
|
|
132
|
+
if (param.valueSource === 'SELECTED_VALUES') {
|
|
133
|
+
// Only add if there are actual selected values
|
|
134
|
+
if (Array.isArray(rawValue) && rawValue.length > 0) {
|
|
135
|
+
if (param.inputValue === 'SINGLE_VALUE') {
|
|
136
|
+
// set to first selected value
|
|
137
|
+
params = params.set(param.keyName, rawValue[0]);
|
|
138
|
+
}
|
|
139
|
+
else if (param.inputValue === 'ARRAY_OF_VALUES') {
|
|
140
|
+
// append each selected value as repeated param
|
|
141
|
+
rawValue.forEach((val) => {
|
|
142
|
+
params = params.append(param.keyName, val);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// if inputValue not provided, default to array behavior
|
|
147
|
+
rawValue.forEach((val) => {
|
|
148
|
+
params = params.append(param.keyName, val);
|
|
149
|
+
});
|
|
96
150
|
}
|
|
97
|
-
// ❌ If no values, do nothing (skip param entirely)
|
|
98
151
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
152
|
+
// if no selected values, skip adding this param
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
// For non-selected valueSources: rawValue could be null/undefined/string/array
|
|
156
|
+
if (rawValue === null || rawValue === undefined) {
|
|
157
|
+
// skip adding param when value not found
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// If inputValue indicates array-of-values (e.g., param.inputValue === 'ARRAY_OF_VALUES'),
|
|
161
|
+
// accept either an array or a comma-separated string
|
|
162
|
+
if (param.inputValue === 'ARRAY_OF_VALUES') {
|
|
163
|
+
if (Array.isArray(rawValue)) {
|
|
164
|
+
rawValue.forEach((val) => {
|
|
165
|
+
params = params.append(param.keyName, val);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else if (typeof rawValue === 'string') {
|
|
169
|
+
// support comma separated string
|
|
170
|
+
rawValue
|
|
171
|
+
.split(',')
|
|
172
|
+
.map((s) => s.trim())
|
|
173
|
+
.filter(Boolean)
|
|
174
|
+
.forEach((val) => {
|
|
175
|
+
params = params.append(param.keyName, val);
|
|
176
|
+
});
|
|
102
177
|
}
|
|
178
|
+
else {
|
|
179
|
+
// fallback: convert to string and append
|
|
180
|
+
params = params.append(param.keyName, String(rawValue));
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
// default: set single value
|
|
185
|
+
params = params.set(param.keyName, String(rawValue));
|
|
103
186
|
}
|
|
104
187
|
});
|
|
105
188
|
}
|
|
@@ -107,8 +190,25 @@ export class FormService {
|
|
|
107
190
|
let url = apiConfig.url;
|
|
108
191
|
if (apiConfig.pathVariables) {
|
|
109
192
|
apiConfig.pathVariables.forEach((pathVar) => {
|
|
110
|
-
if (pathVar.keyName
|
|
111
|
-
|
|
193
|
+
if (pathVar.keyName) {
|
|
194
|
+
let valueToBind = null;
|
|
195
|
+
switch (pathVar.valueSource) {
|
|
196
|
+
case 'LOCAL_STORAGE':
|
|
197
|
+
valueToBind = localStorage.getItem(pathVar.inputValue);
|
|
198
|
+
break;
|
|
199
|
+
case 'SESSION_STORAGE':
|
|
200
|
+
valueToBind = sessionStorage.getItem(pathVar.inputValue);
|
|
201
|
+
break;
|
|
202
|
+
case 'CUSTOM_INPUT':
|
|
203
|
+
case 'QUESTION':
|
|
204
|
+
valueToBind = pathVar.inputValue;
|
|
205
|
+
break;
|
|
206
|
+
default:
|
|
207
|
+
console.warn(`Unsupported valueSource: ${pathVar.valueSource}`);
|
|
208
|
+
}
|
|
209
|
+
if (valueToBind !== null && valueToBind !== undefined) {
|
|
210
|
+
url = url.replace(`{${pathVar.keyName}}`, valueToBind);
|
|
211
|
+
}
|
|
112
212
|
}
|
|
113
213
|
});
|
|
114
214
|
}
|
|
@@ -124,7 +224,7 @@ export class FormService {
|
|
|
124
224
|
formData.append('recaptchaToken', reCAPTCHAToken);
|
|
125
225
|
}
|
|
126
226
|
return this.http.post(url, formData, {
|
|
127
|
-
headers
|
|
227
|
+
headers,
|
|
128
228
|
});
|
|
129
229
|
}
|
|
130
230
|
getSubmittedForm(moduleName, submissionId, pageNumber = 1, rowSet = 0, navigateTo) {
|
|
@@ -153,7 +253,7 @@ export class FormService {
|
|
|
153
253
|
formData.append('recaptchaToken', reCAPTCHAToken);
|
|
154
254
|
}
|
|
155
255
|
return this.http.put(url, formData, {
|
|
156
|
-
headers
|
|
256
|
+
headers,
|
|
157
257
|
});
|
|
158
258
|
}
|
|
159
259
|
previewFile(url) {
|
|
@@ -170,8 +270,9 @@ export class FormService {
|
|
|
170
270
|
return this.http.get(this.apiUrl + `/api/cdn/preview${fullUrl}`, options);
|
|
171
271
|
}
|
|
172
272
|
getSubformSubmissions(subFormData) {
|
|
173
|
-
if (!subFormData?.moduleName ||
|
|
174
|
-
|
|
273
|
+
if (!subFormData?.moduleName ||
|
|
274
|
+
!subFormData?.duplicateSubmission?.sourceSubmissionIds) {
|
|
275
|
+
console.error('Invalid subFormData', subFormData);
|
|
175
276
|
return;
|
|
176
277
|
}
|
|
177
278
|
// Extract data
|
|
@@ -179,8 +280,8 @@ export class FormService {
|
|
|
179
280
|
const submissionIds = subFormData.duplicateSubmission.sourceSubmissionIds;
|
|
180
281
|
// Build query string
|
|
181
282
|
const queryParams = submissionIds
|
|
182
|
-
.map(id => `submissionIds=${encodeURIComponent(id)}`)
|
|
183
|
-
.join(
|
|
283
|
+
.map((id) => `submissionIds=${encodeURIComponent(id)}`)
|
|
284
|
+
.join('&');
|
|
184
285
|
// Final URL
|
|
185
286
|
const url = `${this.apiUrl}/api/public/${moduleName}/subform-submissions?${queryParams}`;
|
|
186
287
|
// Now make API call
|
|
@@ -195,4 +296,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
195
296
|
providedIn: 'root',
|
|
196
297
|
}]
|
|
197
298
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.DataService }]; } });
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzNFLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCLEVBQVUsV0FBd0I7UUFBbEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTDlELFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUtmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FB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QkFBcUI7UUFDckIsTUFBTSxXQUFXLEdBQUcsYUFBYTthQUM5QixHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsa0JBQWtCLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzthQUNwRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixZQUFZO1FBQ1osTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxlQUFlLFVBQVUsd0JBQXdCLFdBQVcsRUFBRSxDQUFDO1FBRXpGLG9CQUFvQjtRQUNwQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLENBQUM7K0dBL01VLFdBQVc7bUhBQVgsV0FBVyxjQUZWLE1BQU07OzRGQUVQLFdBQVc7a0JBSHZCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBEYXRhU2VydmljZSB9IGZyb20gJy4vZGF0YS5zZXJ2aWNlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBhcGlVcmw6IHN0cmluZyA9ICcnO1xuICBoZWFkZXI6IGFueSA9IHt9O1xuICBwYXJlbnRRdWVzdGlvbnM6IGFueTtcbiAgc3ViZm9ybURhdGE6YW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2UpIHtcbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmFwaVVybCQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmFwaVVybCA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLmhlYWRlciQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmhlYWRlciA9IGRhdGE7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnBhcmVudFF1ZXN0aW9ucyQuc3Vic2NyaWJlKChxdWVzdGlvbnMpID0+IHtcbiAgICAgIGlmIChxdWVzdGlvbnMpIHtcbiAgICAgICAgdGhpcy5wYXJlbnRRdWVzdGlvbnMgPSBxdWVzdGlvbnM7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTZXJ2aWNlLnN1YmZvcm0kLnN1YnNjcmliZSgoZGF0YSk9PntcbiAgICAgIHRoaXMuc3ViZm9ybURhdGEgPSBkYXRhO1xuICAgIH0pXG4gIH1cblxuICBnZXRRdWVzdGlvbnMobW9kdWxlTmFtZTogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIgPSAxLCByb3dTZXQ6IG51bWJlciA9IDAsIHByb2dyZXNzaXZlTG9hZGluZzogYm9vbGVhbj10cnVlKSB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKVxuICAgICAgICAuc2V0KCdyb3dTZXQnLCByb3dTZXQudG9TdHJpbmcoKSlcbiAgICAgICAgLnNldCgncHJvZ3Jlc3NpdmVMb2FkaW5nJywgcHJvZ3Jlc3NpdmVMb2FkaW5nKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfWAsIHtcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcGFyYW1zXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRGF0YWJhc2UoZGF0YWJhc2U6IGFueSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuYXBpVXJsfS9hcGkvbG9hZC1mcm9tLWRiYCwgZGF0YWJhc2UsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tTG9va3VwKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9sb29rdXAvJHt0YWJsZU5hbWV9YCk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRXh0ZXJuYWxBUEkoYXBpQ29uZmlnOiBhbnksIHNlbGVjdGVkVmFsdWVzOiBhbnlbXSA9IFtdKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIC8vIOKchSBDaGVjayBpZiBwYWdpbmF0aW9uIGV4aXN0c1xuICAgIGNvbnN0IGhhc1BhZ2luYXRpb24gPVxuICAgICAgYXBpQ29uZmlnLnBhcmFtcz8uc29tZSgocDogYW55KSA9PiBwLnZhbHVlU291cmNlID09PSAnUEFHRV9JTkRFWCcpICYmXG4gICAgICBhcGlDb25maWcucGFyYW1zPy5zb21lKChwOiBhbnkpID0+IHAudmFsdWVTb3VyY2UgPT09ICdQQUdFX1NJWkUnKTtcblxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIRUFERVJTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIGlmIChhcGlDb25maWcuaGVhZGVycykge1xuICAgICAgYXBpQ29uZmlnLmhlYWRlcnMuZm9yRWFjaCgoaGVhZGVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGhlYWRlci5rZXlOYW1lKSB7XG4gICAgICAgICAgaWYgKGhlYWRlci52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ1NJTkdMRV9WQUxVRScpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIHNlbGVjdGVkVmFsdWVzWzBdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIHNlbGVjdGVkVmFsdWVzLmpvaW4oJywnKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOKdjCBlbHNlIHNraXBcbiAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaGVhZGVyLmtleU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChcbiAgICAgICAgICAgICAgICBoZWFkZXIua2V5TmFtZSxcbiAgICAgICAgICAgICAgICAnQmVhcmVyICcgKyBoZWFkZXIuaW5wdXRWYWx1ZVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCBoZWFkZXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBUkFNUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgbGV0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7XG4gICAgaWYgKGFwaUNvbmZpZy5wYXJhbXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXJhbXMuZm9yRWFjaCgocGFyYW06IGFueSkgPT4ge1xuICAgICAgICBpZiAocGFyYW0ua2V5TmFtZSkge1xuICAgICAgICAgIGlmIChwYXJhbS52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAgIC8vIOKchSBPbmx5IGFkZCBzZWxlY3RlZElkcyBpZiB2YWx1ZXMgZXhpc3RcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGlmIChwYXJhbS5pbnB1dFZhbHVlID09PSAnU0lOR0xFX1ZBTFVFJykge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQocGFyYW0ua2V5TmFtZSwgc2VsZWN0ZWRWYWx1ZXNbMF0pO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWYWx1ZXMuZm9yRWFjaCgodmFsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOKdjCBJZiBubyB2YWx1ZXMsIGRvIG5vdGhpbmcgKHNraXAgcGFyYW0gZW50aXJlbHkpXG4gICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5pbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBOb3JtYWwgY3VzdG9tIG9yIHNlYXJjaCBwYXJhbXNcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5zZXQocGFyYW0ua2V5TmFtZSwgcGFyYW0uaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBVEggVkFSSUFCTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgdXJsID0gYXBpQ29uZmlnLnVybDtcbiAgICBpZiAoYXBpQ29uZmlnLnBhdGhWYXJpYWJsZXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXRoVmFyaWFibGVzLmZvckVhY2goKHBhdGhWYXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGF0aFZhci5rZXlOYW1lICYmIHBhdGhWYXIuaW5wdXRWYWx1ZSkge1xuICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKGB7JHtwYXRoVmFyLmtleU5hbWV9fWAsIHBhdGhWYXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRklOQUwgQ0FMTCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55Pih1cmwsIHsgaGVhZGVycywgcGFyYW1zIH0pO1xuICB9XG5cbiAgc3VibWl0Rm9ybShtb2R1bGVOYW1lOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgcmVDQVBUQ0hBVG9rZW4/OnN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfS9zdWJtaXNzaW9uc2A7XG4gICAgaWYgKHJlQ0FQVENIQVRva2VuKSB7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ3JlY2FwdGNoYVRva2VuJywgcmVDQVBUQ0hBVG9rZW4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCBmb3JtRGF0YSwge1xuICAgICAgaGVhZGVyc1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3VibWl0dGVkRm9ybShtb2R1bGVOYW1lOiBzdHJpbmcsIHN1Ym1pc3Npb25JZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIgPSAxLCByb3dTZXQ6IG51bWJlciA9IDAsbmF2aWdhdGVUbz86c3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgLnNldCgncGFnZU51bWJlcicsIHBhZ2VOdW1iZXIudG9TdHJpbmcoKSlcbiAgICAgIC5zZXQoJ3Jvd1NldCcsIHJvd1NldC50b1N0cmluZygpKTtcbiAgICAgIGlmKG5hdmlnYXRlVG8pe1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYXZpZ2F0ZUlkJywgbmF2aWdhdGVUbyk7XG4gICAgICB9XG5cbiAgICBpZiAodGhpcy5wYXJlbnRRdWVzdGlvbnMpIHtcbiAgICAgIHRoaXMucGFyZW50UXVlc3Rpb25zLmZvckVhY2goKHE6IGFueSkgPT4ge1xuICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKCdwYXJlbnRRdWVzdGlvbnMnLCBxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zLyR7c3VibWlzc2lvbklkfWAsIHtoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cblxuICB1cGRhdGVGb3JtKG1vZHVsZU5hbWU6IHN0cmluZywgc3VibWlzc2lvbklkOiBzdHJpbmcsIGZvcm1EYXRhOiBGb3JtRGF0YSwgcmVDQVBUQ0hBVG9rZW4/OnN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfS9zdWJtaXNzaW9ucy8ke3N1Ym1pc3Npb25JZH1gO1xuICAgIGlmIChyZUNBUFRDSEFUb2tlbikge1xuICAgICAgZm9ybURhdGEuYXBwZW5kKCdyZWNhcHRjaGFUb2tlbicsIHJlQ0FQVENIQVRva2VuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQ8YW55Pih1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzXG4gICAgfSk7XG4gIH1cbiAgcHJldmlld0ZpbGUodXJsOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6IHRoaXMuaGVhZGVyLmNvbnRlbnRUeXBlLFxuICAgICAgJ2F1dGgtdXNlcic6IHRoaXMuaGVhZGVyLmF1dGhVc2VyLFxuICAgIH0pO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgIH07XG4gICAgY29uc3QgZmlsZVVybCA9IHVybDtcbiAgICBjb25zdCBlbmNvZGVkRmlsZVVybCA9IGVuY29kZVVSSUNvbXBvbmVudChmaWxlVXJsKTtcbiAgICBjb25zdCBmdWxsVXJsID0gYD91cmw9JHtlbmNvZGVkRmlsZVVybH1gO1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4odGhpcy5hcGlVcmwgKyBgL2FwaS9jZG4vcHJldmlldyR7ZnVsbFVybH1gLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldFN1YmZvcm1TdWJtaXNzaW9ucyhzdWJGb3JtRGF0YTogYW55KSB7XG4gICAgaWYgKCFzdWJGb3JtRGF0YT8ubW9kdWxlTmFtZSB8fCAhc3ViRm9ybURhdGE/LmR1cGxpY2F0ZVN1Ym1pc3Npb24/LnNvdXJjZVN1Ym1pc3Npb25JZHMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbnZhbGlkIHN1YkZvcm1EYXRhXCIsIHN1YkZvcm1EYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cblxuICAgIC8vIEV4dHJhY3QgZGF0YVxuICAgIGNvbnN0IG1vZHVsZU5hbWUgPSBzdWJGb3JtRGF0YS5tb2R1bGVOYW1lO1xuICAgIGNvbnN0IHN1Ym1pc3Npb25JZHM6IHN0cmluZ1tdID0gc3ViRm9ybURhdGEuZHVwbGljYXRlU3VibWlzc2lvbi5zb3VyY2VTdWJtaXNzaW9uSWRzO1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgc3RyaW5nXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSBzdWJtaXNzaW9uSWRzXG4gICAgICAubWFwKGlkID0+IGBzdWJtaXNzaW9uSWRzPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gKVxuICAgICAgLmpvaW4oXCImXCIpO1xuXG4gICAgLy8gRmluYWwgVVJMXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvJHttb2R1bGVOYW1lfS9zdWJmb3JtLXN1Ym1pc3Npb25zPyR7cXVlcnlQYXJhbXN9YDtcblxuICAgIC8vIE5vdyBtYWtlIEFQSSBjYWxsXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKTtcbiAgfVxuXG5cbn1cbiJdfQ==
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZm9ybS1zdWJtaXNzaW9uL3NyYy9zZXJ2aWNlcy9mb3JtLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7O0FBTzNFLE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQW9CLElBQWdCLEVBQVUsV0FBd0I7UUFBbEQsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBTDlELFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDNUIsV0FBTSxHQUFRLEVBQUUsQ0FBQztRQUtmLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3hELElBQUksU0FBUyxFQUFFO2dCQUNiLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO2FBQ2xDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FB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RUFBRSxXQUFXLENBQUMsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFFRCxlQUFlO1FBQ2YsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUMxQyxNQUFNLGFBQWEsR0FDakIsV0FBVyxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDO1FBRXRELHFCQUFxQjtRQUNyQixNQUFNLFdBQVcsR0FBRyxhQUFhO2FBQzlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsaUJBQWlCLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7YUFDdEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWIsWUFBWTtRQUNaLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sZUFBZSxVQUFVLHdCQUF3QixXQUFXLEVBQUUsQ0FBQztRQUV6RixvQkFBb0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDOytHQXhXVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRGF0YVNlcnZpY2UgfSBmcm9tICcuL2RhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtU2VydmljZSB7XG4gIHByaXZhdGUgYXBpVXJsOiBzdHJpbmcgPSAnJztcbiAgaGVhZGVyOiBhbnkgPSB7fTtcbiAgcGFyZW50UXVlc3Rpb25zOiBhbnk7XG4gIHN1YmZvcm1EYXRhOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGRhdGFTZXJ2aWNlOiBEYXRhU2VydmljZSkge1xuICAgIHRoaXMuZGF0YVNlcnZpY2UuYXBpVXJsJC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuYXBpVXJsID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UuaGVhZGVyJC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuaGVhZGVyID0gZGF0YTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2UucGFyZW50UXVlc3Rpb25zJC5zdWJzY3JpYmUoKHF1ZXN0aW9ucykgPT4ge1xuICAgICAgaWYgKHF1ZXN0aW9ucykge1xuICAgICAgICB0aGlzLnBhcmVudFF1ZXN0aW9ucyA9IHF1ZXN0aW9ucztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNlcnZpY2Uuc3ViZm9ybSQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLnN1YmZvcm1EYXRhID0gZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFF1ZXN0aW9ucyhcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyID0gMSxcbiAgICByb3dTZXQ6IG51bWJlciA9IDAsXG4gICAgcHJvZ3Jlc3NpdmVMb2FkaW5nOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiB0aGlzLmhlYWRlci5hY2NlcHRlZExhbmd1YWdlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgLnNldCgncGFnZU51bWJlcicsIHBhZ2VOdW1iZXIudG9TdHJpbmcoKSlcbiAgICAgIC5zZXQoJ3Jvd1NldCcsIHJvd1NldC50b1N0cmluZygpKVxuICAgICAgLnNldCgncHJvZ3Jlc3NpdmVMb2FkaW5nJywgcHJvZ3Jlc3NpdmVMb2FkaW5nKTtcblxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PGFueT4oYCR7dGhpcy5hcGlVcmx9L2FwaS9wdWJsaWMvZm9ybXMvJHttb2R1bGVOYW1lfWAsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgICBwYXJhbXMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRGF0YWJhc2UoZGF0YWJhc2U6IGFueSkge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KGAke3RoaXMuYXBpVXJsfS9hcGkvbG9hZC1mcm9tLWRiYCwgZGF0YWJhc2UsIHtcbiAgICAgIGhlYWRlcnMsXG4gICAgfSk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tTG9va3VwKHRhYmxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9sb29rdXAvJHt0YWJsZU5hbWV9YCk7XG4gIH1cblxuICBmZXRjaERhdGFGcm9tRXh0ZXJuYWxBUEkoXG4gICAgYXBpQ29uZmlnOiBhbnksXG4gICAgc2VsZWN0ZWRWYWx1ZXM6IGFueVtdID0gW11cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAvLyDinIUgQ2hlY2sgaWYgcGFnaW5hdGlvbiBleGlzdHNcbiAgICBjb25zdCBoYXNQYWdpbmF0aW9uID1cbiAgICAgIGFwaUNvbmZpZy5wYXJhbXM/LnNvbWUoKHA6IGFueSkgPT4gcC52YWx1ZVNvdXJjZSA9PT0gJ1BBR0VfSU5ERVgnKSAmJlxuICAgICAgYXBpQ29uZmlnLnBhcmFtcz8uc29tZSgocDogYW55KSA9PiBwLnZhbHVlU291cmNlID09PSAnUEFHRV9TSVpFJyk7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhFQURFUlMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgLy8gaGVscGVyOiByZXNvbHZlIGEgdmFsdWUgKG9yIHZhbHVlcykgYmFzZWQgb24gdmFsdWVTb3VyY2VcblxuICAgIC8vIEFwcGx5IHRvIGhlYWRlcnMgKGFzc3VtaW5nIGBoZWFkZXJzYCBpcyBhbiBIdHRwSGVhZGVycyBpbnN0YW5jZSlcbiAgICBpZiAoYXBpQ29uZmlnLmhlYWRlcnMpIHtcbiAgICAgIGFwaUNvbmZpZy5oZWFkZXJzLmZvckVhY2goKGhlYWRlcjogYW55KSA9PiB7XG4gICAgICAgIGlmICghaGVhZGVyLmtleU5hbWUpIHJldHVybjtcblxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgaGVhZGVyLnZhbHVlU291cmNlLFxuICAgICAgICAgIGhlYWRlci5pbnB1dFZhbHVlLFxuICAgICAgICAgIHNlbGVjdGVkVmFsdWVzXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGhlYWRlci52YWx1ZVNvdXJjZSA9PT0gJ1NFTEVDVEVEX1ZBTFVFUycpIHtcbiAgICAgICAgICAvLyBPbmx5IGFkZCBoZWFkZXIgaWYgd2UgaGF2ZSBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkgJiYgcmF3VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGhlYWRlci5pbnB1dFZhbHVlID09PSAnU0lOR0xFX1ZBTFVFJykge1xuICAgICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoaGVhZGVyLmtleU5hbWUsIFN0cmluZyhyYXdWYWx1ZVswXSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIuaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgLy8gam9pbiBieSBjb21tYSBmb3IgaGVhZGVycyAoY29tbW9uIHBhdHRlcm4pXG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChoZWFkZXIua2V5TmFtZSwgcmF3VmFsdWUuam9pbignLCcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIGZhbGxiYWNrOiBqb2luXG4gICAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldChoZWFkZXIua2V5TmFtZSwgcmF3VmFsdWUuam9pbignLCcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gbm8gc2VsZWN0ZWQgdmFsdWVzIC0+IHNraXAgaGVhZGVyXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9yIG5vbi1zZWxlY3RlZCBzb3VyY2VzOiBza2lwIHdoZW4gdW5yZXNvbHZlZFxuICAgICAgICBpZiAocmF3VmFsdWUgPT09IG51bGwgfHwgcmF3VmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHJhd1ZhbHVlIGlzIGFycmF5IC0+IGpvaW4gYnkgY29tbWEgKGhlYWRlcnMgZXhwZWN0IHNpbmdsZSBzdHJpbmcpXG4gICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gQXJyYXkuaXNBcnJheShyYXdWYWx1ZSlcbiAgICAgICAgICA/IHJhd1ZhbHVlLmpvaW4oJywnKVxuICAgICAgICAgIDogU3RyaW5nKHJhd1ZhbHVlKTtcblxuICAgICAgICBpZiAoaGVhZGVyLmtleU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2F1dGhvcml6YXRpb24nKSB7XG4gICAgICAgICAgLy8gYWRkIEJlYXJlciBvbmx5IHdoZW4gaGVhZGVyVmFsdWUgaXMgdHJ1dGh5IChhbmQgbm90IGFscmVhZHkgcHJlZml4ZWQpXG4gICAgICAgICAgY29uc3QgdG9rZW4gPSBoZWFkZXJWYWx1ZS5zdGFydHNXaXRoKCdCZWFyZXIgJylcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWVcbiAgICAgICAgICAgIDogYEJlYXJlciAke2hlYWRlclZhbHVlfWA7XG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCB0b2tlbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KGhlYWRlci5rZXlOYW1lLCBoZWFkZXJWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUEFSQU1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKTtcbiAgICAvLyBoZWxwZXI6IHJlc29sdmUgYSB2YWx1ZSAob3IgdmFsdWVzKSBiYXNlZCBvbiB2YWx1ZVNvdXJjZVxuICAgIGZ1bmN0aW9uIHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICB2YWx1ZVNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgaW5wdXRWYWx1ZTogYW55LFxuICAgICAgc2VsZWN0ZWRWYWx1ZXM6IGFueVtdID0gW11cbiAgICApIHtcbiAgICAgIGlmICghdmFsdWVTb3VyY2UpIHJldHVybiBudWxsO1xuXG4gICAgICBzd2l0Y2ggKHZhbHVlU291cmNlKSB7XG4gICAgICAgIGNhc2UgJ0xPQ0FMX1NUT1JBR0UnOlxuICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShpbnB1dFZhbHVlKTsgLy8gc3RyaW5nIG9yIG51bGxcblxuICAgICAgICBjYXNlICdTRVNTSU9OX1NUT1JBR0UnOlxuICAgICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGlucHV0VmFsdWUpOyAvLyBzdHJpbmcgb3IgbnVsbFxuXG4gICAgICAgIGNhc2UgJ0NVU1RPTV9JTlBVVCc6XG4gICAgICAgIGNhc2UgJ1FVRVNUSU9OJzpcbiAgICAgICAgY2FzZSAnUEFHRV9JTkRFWCcgOlxuICAgICAgICBjYXNlICdQQUdFX1NJWkUnIDogXG4gICAgICAgICAgLy8gaW5wdXRWYWx1ZSBtYXkgYmUgYSBzaW5nbGUgdmFsdWUgb3IgYW4gYXJyYXkvQ1NWIGRlcGVuZGluZyBvbiB1c2FnZVxuICAgICAgICAgIHJldHVybiBpbnB1dFZhbHVlO1xuXG4gICAgICAgIGNhc2UgJ1NFTEVDVEVEX1ZBTFVFUyc6XG4gICAgICAgICAgLy8gRm9yIFNFTEVDVEVEX1ZBTFVFUywgcmV0dXJuIHRoZSBzZWxlY3RlZFZhbHVlcyBhcnJheSAoY2FsbGVyIGRlY2lkZXMgU0lOR0xFL0FSUkFZIGJlaGF2aW9yKVxuICAgICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHNlbGVjdGVkVmFsdWVzKSA/IHNlbGVjdGVkVmFsdWVzIDogW107XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFVuc3VwcG9ydGVkIHZhbHVlU291cmNlIGZvciBwYXJhbXM6ICR7dmFsdWVTb3VyY2V9YCk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXNhZ2U6IGJ1aWxkIHBhcmFtcyAoYXNzdW1pbmcgYHBhcmFtc2AgaXMgYW4gSHR0cFBhcmFtcyBpbnN0YW5jZSlcbiAgICBpZiAoYXBpQ29uZmlnLnBhcmFtcykge1xuICAgICAgYXBpQ29uZmlnLnBhcmFtcy5mb3JFYWNoKChwYXJhbTogYW55KSA9PiB7XG4gICAgICAgIGlmICghcGFyYW0ua2V5TmFtZSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFJlc29sdmUgcmF3IHZhbHVlIGJhc2VkIG9uIHNvdXJjZVxuICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHJlc29sdmVWYWx1ZUZyb21Tb3VyY2UoXG4gICAgICAgICAgcGFyYW0udmFsdWVTb3VyY2UsXG4gICAgICAgICAgcGFyYW0uaW5wdXRWYWx1ZSxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIElmIHBhcmFtIGV4cGVjdHMgc2VsZWN0ZWQgdmFsdWVzLCBoYW5kbGUgU0lOR0xFX1ZBTFVFIHZzIEFSUkFZX09GX1ZBTFVFU1xuICAgICAgICBpZiAocGFyYW0udmFsdWVTb3VyY2UgPT09ICdTRUxFQ1RFRF9WQUxVRVMnKSB7XG4gICAgICAgICAgLy8gT25seSBhZGQgaWYgdGhlcmUgYXJlIGFjdHVhbCBzZWxlY3RlZCB2YWx1ZXNcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkgJiYgcmF3VmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdTSU5HTEVfVkFMVUUnKSB7XG4gICAgICAgICAgICAgIC8vIHNldCB0byBmaXJzdCBzZWxlY3RlZCB2YWx1ZVxuICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KHBhcmFtLmtleU5hbWUsIHJhd1ZhbHVlWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uaW5wdXRWYWx1ZSA9PT0gJ0FSUkFZX09GX1ZBTFVFUycpIHtcbiAgICAgICAgICAgICAgLy8gYXBwZW5kIGVhY2ggc2VsZWN0ZWQgdmFsdWUgYXMgcmVwZWF0ZWQgcGFyYW1cbiAgICAgICAgICAgICAgcmF3VmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gaWYgaW5wdXRWYWx1ZSBub3QgcHJvdmlkZWQsIGRlZmF1bHQgdG8gYXJyYXkgYmVoYXZpb3JcbiAgICAgICAgICAgICAgcmF3VmFsdWUuZm9yRWFjaCgodmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiBubyBzZWxlY3RlZCB2YWx1ZXMsIHNraXAgYWRkaW5nIHRoaXMgcGFyYW1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igbm9uLXNlbGVjdGVkIHZhbHVlU291cmNlczogcmF3VmFsdWUgY291bGQgYmUgbnVsbC91bmRlZmluZWQvc3RyaW5nL2FycmF5XG4gICAgICAgIGlmIChyYXdWYWx1ZSA9PT0gbnVsbCB8fCByYXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gc2tpcCBhZGRpbmcgcGFyYW0gd2hlbiB2YWx1ZSBub3QgZm91bmRcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpbnB1dFZhbHVlIGluZGljYXRlcyBhcnJheS1vZi12YWx1ZXMgKGUuZy4sIHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSxcbiAgICAgICAgLy8gYWNjZXB0IGVpdGhlciBhbiBhcnJheSBvciBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmdcbiAgICAgICAgaWYgKHBhcmFtLmlucHV0VmFsdWUgPT09ICdBUlJBWV9PRl9WQUxVRVMnKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmF3VmFsdWUpKSB7XG4gICAgICAgICAgICByYXdWYWx1ZS5mb3JFYWNoKCh2YWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuYXBwZW5kKHBhcmFtLmtleU5hbWUsIHZhbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByYXdWYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgY29tbWEgc2VwYXJhdGVkIHN0cmluZ1xuICAgICAgICAgICAgcmF3VmFsdWVcbiAgICAgICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAgICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgLmZvckVhY2goKHZhbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZChwYXJhbS5rZXlOYW1lLCB2YWwpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmFsbGJhY2s6IGNvbnZlcnQgdG8gc3RyaW5nIGFuZCBhcHBlbmRcbiAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtcy5hcHBlbmQocGFyYW0ua2V5TmFtZSwgU3RyaW5nKHJhd1ZhbHVlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGRlZmF1bHQ6IHNldCBzaW5nbGUgdmFsdWVcbiAgICAgICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KHBhcmFtLmtleU5hbWUsIFN0cmluZyhyYXdWYWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBBVEggVkFSSUFCTEVTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBsZXQgdXJsID0gYXBpQ29uZmlnLnVybDtcbiAgICBpZiAoYXBpQ29uZmlnLnBhdGhWYXJpYWJsZXMpIHtcbiAgICAgIGFwaUNvbmZpZy5wYXRoVmFyaWFibGVzLmZvckVhY2goKHBhdGhWYXI6IGFueSkgPT4ge1xuICAgICAgICBpZiAocGF0aFZhci5rZXlOYW1lKSB7XG4gICAgICAgICAgbGV0IHZhbHVlVG9CaW5kOiBhbnkgPSBudWxsO1xuXG4gICAgICAgICAgc3dpdGNoIChwYXRoVmFyLnZhbHVlU291cmNlKSB7XG4gICAgICAgICAgICBjYXNlICdMT0NBTF9TVE9SQUdFJzpcbiAgICAgICAgICAgICAgdmFsdWVUb0JpbmQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShwYXRoVmFyLmlucHV0VmFsdWUpO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnU0VTU0lPTl9TVE9SQUdFJzpcbiAgICAgICAgICAgICAgdmFsdWVUb0JpbmQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHBhdGhWYXIuaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdDVVNUT01fSU5QVVQnOlxuICAgICAgICAgICAgY2FzZSAnUVVFU1RJT04nOlxuICAgICAgICAgICAgICB2YWx1ZVRvQmluZCA9IHBhdGhWYXIuaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgdmFsdWVTb3VyY2U6ICR7cGF0aFZhci52YWx1ZVNvdXJjZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWVUb0JpbmQgIT09IG51bGwgJiYgdmFsdWVUb0JpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoYHske3BhdGhWYXIua2V5TmFtZX19YCwgdmFsdWVUb0JpbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBGSU5BTCBDQUxMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVybCwgeyBoZWFkZXJzLCBwYXJhbXMgfSk7XG4gIH1cblxuICBzdWJtaXRGb3JtKFxuICAgIG1vZHVsZU5hbWU6IHN0cmluZyxcbiAgICBmb3JtRGF0YTogRm9ybURhdGEsXG4gICAgcmVDQVBUQ0hBVG9rZW4/OiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICdBdXRoLXVzZXInOiB0aGlzLmhlYWRlci5hdXRoVXNlcixcbiAgICB9KTtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zYDtcbiAgICBpZiAocmVDQVBUQ0hBVG9rZW4pIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgncmVjYXB0Y2hhVG9rZW4nLCByZUNBUFRDSEFUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh1cmwsIGZvcm1EYXRhLCB7XG4gICAgICBoZWFkZXJzLFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0U3VibWl0dGVkRm9ybShcbiAgICBtb2R1bGVOYW1lOiBzdHJpbmcsXG4gICAgc3VibWlzc2lvbklkOiBzdHJpbmcsXG4gICAgcGFnZU51bWJlcjogbnVtYmVyID0gMSxcbiAgICByb3dTZXQ6IG51bWJlciA9IDAsXG4gICAgbmF2aWdhdGVUbz86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGxldCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAuc2V0KCdwYWdlTnVtYmVyJywgcGFnZU51bWJlci50b1N0cmluZygpKVxuICAgICAgLnNldCgncm93U2V0Jywgcm93U2V0LnRvU3RyaW5nKCkpO1xuICAgIGlmIChuYXZpZ2F0ZVRvKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMuc2V0KCduYXZpZ2F0ZUlkJywgbmF2aWdhdGVUbyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGFyZW50UXVlc3Rpb25zKSB7XG4gICAgICB0aGlzLnBhcmVudFF1ZXN0aW9ucy5mb3JFYWNoKChxOiBhbnkpID0+IHtcbiAgICAgICAgcGFyYW1zID0gcGFyYW1zLmFwcGVuZCgncGFyZW50UXVlc3Rpb25zJywgcSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQWNjZXB0LUxhbmd1YWdlJzogdGhpcy5oZWFkZXIuYWNjZXB0ZWRMYW5ndWFnZSxcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KFxuICAgICAgYCR7dGhpcy5hcGlVcmx9L2FwaS9mb3Jtcy8ke21vZHVsZU5hbWV9L3N1Ym1pc3Npb25zLyR7c3VibWlzc2lvbklkfWAsXG4gICAgICB7IGhlYWRlcnMsIHBhcmFtcyB9XG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZUZvcm0oXG4gICAgbW9kdWxlTmFtZTogc3RyaW5nLFxuICAgIHN1Ym1pc3Npb25JZDogc3RyaW5nLFxuICAgIGZvcm1EYXRhOiBGb3JtRGF0YSxcbiAgICByZUNBUFRDSEFUb2tlbj86IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgJ0F1dGgtdXNlcic6IHRoaXMuaGVhZGVyLmF1dGhVc2VyLFxuICAgIH0pO1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpVXJsfS9hcGkvcHVibGljL2Zvcm1zLyR7bW9kdWxlTmFtZX0vc3VibWlzc2lvbnMvJHtzdWJtaXNzaW9uSWR9YDtcbiAgICBpZiAocmVDQVBUQ0hBVG9rZW4pIHtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgncmVjYXB0Y2hhVG9rZW4nLCByZUNBUFRDSEFUb2tlbik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmh0dHAucHV0PGFueT4odXJsLCBmb3JtRGF0YSwge1xuICAgICAgaGVhZGVycyxcbiAgICB9KTtcbiAgfVxuICBwcmV2aWV3RmlsZSh1cmw6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAnQ29udGVudC1UeXBlJzogdGhpcy5oZWFkZXIuY29udGVudFR5cGUsXG4gICAgICAnYXV0aC11c2VyJzogdGhpcy5oZWFkZXIuYXV0aFVzZXIsXG4gICAgfSk7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgfTtcbiAgICBjb25zdCBmaWxlVXJsID0gdXJsO1xuICAgIGNvbnN0IGVuY29kZWRGaWxlVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVVcmwpO1xuICAgIGNvbnN0IGZ1bGxVcmwgPSBgP3VybD0ke2VuY29kZWRGaWxlVXJsfWA7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihcbiAgICAgIHRoaXMuYXBpVXJsICsgYC9hcGkvY2RuL3ByZXZpZXcke2Z1bGxVcmx9YCxcbiAgICAgIG9wdGlvbnNcbiAgICApO1xuICB9XG5cbiAgZ2V0U3ViZm9ybVN1Ym1pc3Npb25zKHN1YkZvcm1EYXRhOiBhbnkpIHtcbiAgICBpZiAoXG4gICAgICAhc3ViRm9ybURhdGE/Lm1vZHVsZU5hbWUgfHxcbiAgICAgICFzdWJGb3JtRGF0YT8uZHVwbGljYXRlU3VibWlzc2lvbj8uc291cmNlU3VibWlzc2lvbklkc1xuICAgICkge1xuICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBzdWJGb3JtRGF0YScsIHN1YkZvcm1EYXRhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBFeHRyYWN0IGRhdGFcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gc3ViRm9ybURhdGEubW9kdWxlTmFtZTtcbiAgICBjb25zdCBzdWJtaXNzaW9uSWRzOiBzdHJpbmdbXSA9XG4gICAgICBzdWJGb3JtRGF0YS5kdXBsaWNhdGVTdWJtaXNzaW9uLnNvdXJjZVN1Ym1pc3Npb25JZHM7XG5cbiAgICAvLyBCdWlsZCBxdWVyeSBzdHJpbmdcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHN1Ym1pc3Npb25JZHNcbiAgICAgIC5tYXAoKGlkKSA9PiBgc3VibWlzc2lvbklkcz0ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YClcbiAgICAgIC5qb2luKCcmJyk7XG5cbiAgICAvLyBGaW5hbCBVUkxcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmFwaVVybH0vYXBpL3B1YmxpYy8ke21vZHVsZU5hbWV9L3N1YmZvcm0tc3VibWlzc2lvbnM/JHtxdWVyeVBhcmFtc31gO1xuXG4gICAgLy8gTm93IG1ha2UgQVBJIGNhbGxcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpO1xuICB9XG59XG4iXX0=
|
|
@@ -1093,7 +1093,7 @@ class FormService {
|
|
|
1093
1093
|
.set('progressiveLoading', progressiveLoading);
|
|
1094
1094
|
return this.http.get(`${this.apiUrl}/api/public/forms/${moduleName}`, {
|
|
1095
1095
|
headers,
|
|
1096
|
-
params
|
|
1096
|
+
params,
|
|
1097
1097
|
});
|
|
1098
1098
|
}
|
|
1099
1099
|
fetchDataFromDatabase(database) {
|
|
@@ -1111,63 +1111,163 @@ class FormService {
|
|
|
1111
1111
|
apiConfig.params?.some((p) => p.valueSource === 'PAGE_SIZE');
|
|
1112
1112
|
// ---------------------- HEADERS ----------------------
|
|
1113
1113
|
let headers = new HttpHeaders();
|
|
1114
|
+
// helper: resolve a value (or values) based on valueSource
|
|
1115
|
+
// Apply to headers (assuming `headers` is an HttpHeaders instance)
|
|
1114
1116
|
if (apiConfig.headers) {
|
|
1115
1117
|
apiConfig.headers.forEach((header) => {
|
|
1116
|
-
if (header.keyName)
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
}
|
|
1118
|
+
if (!header.keyName)
|
|
1119
|
+
return;
|
|
1120
|
+
const rawValue = resolveValueFromSource(header.valueSource, header.inputValue, selectedValues);
|
|
1121
|
+
if (header.valueSource === 'SELECTED_VALUES') {
|
|
1122
|
+
// Only add header if we have selected values
|
|
1123
|
+
if (Array.isArray(rawValue) && rawValue.length > 0) {
|
|
1124
|
+
if (header.inputValue === 'SINGLE_VALUE') {
|
|
1125
|
+
headers = headers.set(header.keyName, String(rawValue[0]));
|
|
1125
1126
|
}
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
if (header.keyName.toLowerCase() === 'authorization') {
|
|
1130
|
-
headers = headers.set(header.keyName, 'Bearer ' + header.inputValue);
|
|
1127
|
+
else if (header.inputValue === 'ARRAY_OF_VALUES') {
|
|
1128
|
+
// join by comma for headers (common pattern)
|
|
1129
|
+
headers = headers.set(header.keyName, rawValue.join(','));
|
|
1131
1130
|
}
|
|
1132
1131
|
else {
|
|
1133
|
-
|
|
1132
|
+
// fallback: join
|
|
1133
|
+
headers = headers.set(header.keyName, rawValue.join(','));
|
|
1134
1134
|
}
|
|
1135
1135
|
}
|
|
1136
|
+
// no selected values -> skip header
|
|
1137
|
+
return;
|
|
1138
|
+
}
|
|
1139
|
+
// For non-selected sources: skip when unresolved
|
|
1140
|
+
if (rawValue === null || rawValue === undefined)
|
|
1141
|
+
return;
|
|
1142
|
+
// If rawValue is array -> join by comma (headers expect single string)
|
|
1143
|
+
const headerValue = Array.isArray(rawValue)
|
|
1144
|
+
? rawValue.join(',')
|
|
1145
|
+
: String(rawValue);
|
|
1146
|
+
if (header.keyName.toLowerCase() === 'authorization') {
|
|
1147
|
+
// add Bearer only when headerValue is truthy (and not already prefixed)
|
|
1148
|
+
const token = headerValue.startsWith('Bearer ')
|
|
1149
|
+
? headerValue
|
|
1150
|
+
: `Bearer ${headerValue}`;
|
|
1151
|
+
headers = headers.set(header.keyName, token);
|
|
1152
|
+
}
|
|
1153
|
+
else {
|
|
1154
|
+
headers = headers.set(header.keyName, headerValue);
|
|
1136
1155
|
}
|
|
1137
1156
|
});
|
|
1138
1157
|
}
|
|
1139
1158
|
// ---------------------- PARAMS ----------------------
|
|
1140
1159
|
let params = new HttpParams();
|
|
1160
|
+
// helper: resolve a value (or values) based on valueSource
|
|
1161
|
+
function resolveValueFromSource(valueSource, inputValue, selectedValues = []) {
|
|
1162
|
+
if (!valueSource)
|
|
1163
|
+
return null;
|
|
1164
|
+
switch (valueSource) {
|
|
1165
|
+
case 'LOCAL_STORAGE':
|
|
1166
|
+
return localStorage.getItem(inputValue); // string or null
|
|
1167
|
+
case 'SESSION_STORAGE':
|
|
1168
|
+
return sessionStorage.getItem(inputValue); // string or null
|
|
1169
|
+
case 'CUSTOM_INPUT':
|
|
1170
|
+
case 'QUESTION':
|
|
1171
|
+
case 'PAGE_INDEX':
|
|
1172
|
+
case 'PAGE_SIZE':
|
|
1173
|
+
// inputValue may be a single value or an array/CSV depending on usage
|
|
1174
|
+
return inputValue;
|
|
1175
|
+
case 'SELECTED_VALUES':
|
|
1176
|
+
// For SELECTED_VALUES, return the selectedValues array (caller decides SINGLE/ARRAY behavior)
|
|
1177
|
+
return Array.isArray(selectedValues) ? selectedValues : [];
|
|
1178
|
+
default:
|
|
1179
|
+
console.warn(`Unsupported valueSource for params: ${valueSource}`);
|
|
1180
|
+
return null;
|
|
1181
|
+
}
|
|
1182
|
+
}
|
|
1183
|
+
// Usage: build params (assuming `params` is an HttpParams instance)
|
|
1141
1184
|
if (apiConfig.params) {
|
|
1142
1185
|
apiConfig.params.forEach((param) => {
|
|
1143
|
-
if (param.keyName)
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1186
|
+
if (!param.keyName)
|
|
1187
|
+
return;
|
|
1188
|
+
// Resolve raw value based on source
|
|
1189
|
+
const rawValue = resolveValueFromSource(param.valueSource, param.inputValue, selectedValues);
|
|
1190
|
+
// If param expects selected values, handle SINGLE_VALUE vs ARRAY_OF_VALUES
|
|
1191
|
+
if (param.valueSource === 'SELECTED_VALUES') {
|
|
1192
|
+
// Only add if there are actual selected values
|
|
1193
|
+
if (Array.isArray(rawValue) && rawValue.length > 0) {
|
|
1194
|
+
if (param.inputValue === 'SINGLE_VALUE') {
|
|
1195
|
+
// set to first selected value
|
|
1196
|
+
params = params.set(param.keyName, rawValue[0]);
|
|
1197
|
+
}
|
|
1198
|
+
else if (param.inputValue === 'ARRAY_OF_VALUES') {
|
|
1199
|
+
// append each selected value as repeated param
|
|
1200
|
+
rawValue.forEach((val) => {
|
|
1201
|
+
params = params.append(param.keyName, val);
|
|
1202
|
+
});
|
|
1155
1203
|
}
|
|
1156
|
-
|
|
1204
|
+
else {
|
|
1205
|
+
// if inputValue not provided, default to array behavior
|
|
1206
|
+
rawValue.forEach((val) => {
|
|
1207
|
+
params = params.append(param.keyName, val);
|
|
1208
|
+
});
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
// if no selected values, skip adding this param
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
// For non-selected valueSources: rawValue could be null/undefined/string/array
|
|
1215
|
+
if (rawValue === null || rawValue === undefined) {
|
|
1216
|
+
// skip adding param when value not found
|
|
1217
|
+
return;
|
|
1218
|
+
}
|
|
1219
|
+
// If inputValue indicates array-of-values (e.g., param.inputValue === 'ARRAY_OF_VALUES'),
|
|
1220
|
+
// accept either an array or a comma-separated string
|
|
1221
|
+
if (param.inputValue === 'ARRAY_OF_VALUES') {
|
|
1222
|
+
if (Array.isArray(rawValue)) {
|
|
1223
|
+
rawValue.forEach((val) => {
|
|
1224
|
+
params = params.append(param.keyName, val);
|
|
1225
|
+
});
|
|
1157
1226
|
}
|
|
1158
|
-
else if (
|
|
1159
|
-
//
|
|
1160
|
-
|
|
1227
|
+
else if (typeof rawValue === 'string') {
|
|
1228
|
+
// support comma separated string
|
|
1229
|
+
rawValue
|
|
1230
|
+
.split(',')
|
|
1231
|
+
.map((s) => s.trim())
|
|
1232
|
+
.filter(Boolean)
|
|
1233
|
+
.forEach((val) => {
|
|
1234
|
+
params = params.append(param.keyName, val);
|
|
1235
|
+
});
|
|
1236
|
+
}
|
|
1237
|
+
else {
|
|
1238
|
+
// fallback: convert to string and append
|
|
1239
|
+
params = params.append(param.keyName, String(rawValue));
|
|
1161
1240
|
}
|
|
1162
1241
|
}
|
|
1242
|
+
else {
|
|
1243
|
+
// default: set single value
|
|
1244
|
+
params = params.set(param.keyName, String(rawValue));
|
|
1245
|
+
}
|
|
1163
1246
|
});
|
|
1164
1247
|
}
|
|
1165
1248
|
// ---------------------- PATH VARIABLES ----------------------
|
|
1166
1249
|
let url = apiConfig.url;
|
|
1167
1250
|
if (apiConfig.pathVariables) {
|
|
1168
1251
|
apiConfig.pathVariables.forEach((pathVar) => {
|
|
1169
|
-
if (pathVar.keyName
|
|
1170
|
-
|
|
1252
|
+
if (pathVar.keyName) {
|
|
1253
|
+
let valueToBind = null;
|
|
1254
|
+
switch (pathVar.valueSource) {
|
|
1255
|
+
case 'LOCAL_STORAGE':
|
|
1256
|
+
valueToBind = localStorage.getItem(pathVar.inputValue);
|
|
1257
|
+
break;
|
|
1258
|
+
case 'SESSION_STORAGE':
|
|
1259
|
+
valueToBind = sessionStorage.getItem(pathVar.inputValue);
|
|
1260
|
+
break;
|
|
1261
|
+
case 'CUSTOM_INPUT':
|
|
1262
|
+
case 'QUESTION':
|
|
1263
|
+
valueToBind = pathVar.inputValue;
|
|
1264
|
+
break;
|
|
1265
|
+
default:
|
|
1266
|
+
console.warn(`Unsupported valueSource: ${pathVar.valueSource}`);
|
|
1267
|
+
}
|
|
1268
|
+
if (valueToBind !== null && valueToBind !== undefined) {
|
|
1269
|
+
url = url.replace(`{${pathVar.keyName}}`, valueToBind);
|
|
1270
|
+
}
|
|
1171
1271
|
}
|
|
1172
1272
|
});
|
|
1173
1273
|
}
|
|
@@ -1183,7 +1283,7 @@ class FormService {
|
|
|
1183
1283
|
formData.append('recaptchaToken', reCAPTCHAToken);
|
|
1184
1284
|
}
|
|
1185
1285
|
return this.http.post(url, formData, {
|
|
1186
|
-
headers
|
|
1286
|
+
headers,
|
|
1187
1287
|
});
|
|
1188
1288
|
}
|
|
1189
1289
|
getSubmittedForm(moduleName, submissionId, pageNumber = 1, rowSet = 0, navigateTo) {
|
|
@@ -1212,7 +1312,7 @@ class FormService {
|
|
|
1212
1312
|
formData.append('recaptchaToken', reCAPTCHAToken);
|
|
1213
1313
|
}
|
|
1214
1314
|
return this.http.put(url, formData, {
|
|
1215
|
-
headers
|
|
1315
|
+
headers,
|
|
1216
1316
|
});
|
|
1217
1317
|
}
|
|
1218
1318
|
previewFile(url) {
|
|
@@ -1229,8 +1329,9 @@ class FormService {
|
|
|
1229
1329
|
return this.http.get(this.apiUrl + `/api/cdn/preview${fullUrl}`, options);
|
|
1230
1330
|
}
|
|
1231
1331
|
getSubformSubmissions(subFormData) {
|
|
1232
|
-
if (!subFormData?.moduleName ||
|
|
1233
|
-
|
|
1332
|
+
if (!subFormData?.moduleName ||
|
|
1333
|
+
!subFormData?.duplicateSubmission?.sourceSubmissionIds) {
|
|
1334
|
+
console.error('Invalid subFormData', subFormData);
|
|
1234
1335
|
return;
|
|
1235
1336
|
}
|
|
1236
1337
|
// Extract data
|
|
@@ -1238,8 +1339,8 @@ class FormService {
|
|
|
1238
1339
|
const submissionIds = subFormData.duplicateSubmission.sourceSubmissionIds;
|
|
1239
1340
|
// Build query string
|
|
1240
1341
|
const queryParams = submissionIds
|
|
1241
|
-
.map(id => `submissionIds=${encodeURIComponent(id)}`)
|
|
1242
|
-
.join(
|
|
1342
|
+
.map((id) => `submissionIds=${encodeURIComponent(id)}`)
|
|
1343
|
+
.join('&');
|
|
1243
1344
|
// Final URL
|
|
1244
1345
|
const url = `${this.apiUrl}/api/public/${moduleName}/subform-submissions?${queryParams}`;
|
|
1245
1346
|
// Now make API call
|