@sunbird-cb/cbp-ai 0.1.118 → 0.1.120
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/esm2022/lib/components/edit-cbp-plan/edit-cbp-plan.component.mjs +43 -11
- package/esm2022/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.mjs +347 -89
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +43 -2
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +41 -35
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +2 -2
- package/esm2022/lib/components/view-cbp-plan/view-cbp-plan.component.mjs +2 -2
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +2 -2
- package/fesm2022/sunbird-cb-cbp-ai.mjs +474 -137
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
- package/lib/components/edit-cbp-plan/edit-cbp-plan.component.d.ts.map +1 -1
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts +70 -6
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -1
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts +1 -0
- package/lib/components/generate-course-recommendation/generate-course-recommendation.component.d.ts.map +1 -1
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +1 -1
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/sunbird-cb-cbp-ai-0.1.120.tgz +0 -0
- package/sunbird-cb-cbp-ai-0.1.118.tgz +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { Component, Input } from '@angular/core';
|
|
2
|
-
import { data } from 'jquery';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
import * as i1 from "../../modules/shared/services/shared.service";
|
|
5
4
|
import * as i2 from "@angular/material/dialog";
|
|
@@ -13,52 +12,42 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
13
12
|
this.loading = false;
|
|
14
13
|
this.recommended_course_id = '';
|
|
15
14
|
this.searchText = '';
|
|
15
|
+
this.filterdCourses = [];
|
|
16
16
|
this.selectFilterCourses = [];
|
|
17
|
-
this.competenciesCount = {
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
this.competenciesCount = {
|
|
18
|
+
total: 0,
|
|
19
|
+
public_courses: 0,
|
|
20
|
+
igot: 0
|
|
21
|
+
};
|
|
22
|
+
this.expandedCompetencies = {};
|
|
23
|
+
// Gap results for each course, keyed by course index.
|
|
24
|
+
this.courseGapResults = {};
|
|
20
25
|
}
|
|
21
26
|
ngOnInit() {
|
|
22
27
|
this.loading = true;
|
|
23
28
|
this.cbpPlanData = this.sharedService.cbpPlanFinalObj;
|
|
24
|
-
// this.sharedService.getRecommendedCourse(this.planData.id).subscribe((res)=>{
|
|
25
|
-
// this.loading = false
|
|
26
|
-
// console.log('res', res)
|
|
27
|
-
// this.recommended_course_id = res.id
|
|
28
|
-
// let allCourses = []
|
|
29
|
-
// if(res && res.filtered_courses && res.filtered_courses.length) {
|
|
30
|
-
// res.filtered_courses.forEach((item)=>{
|
|
31
|
-
// if(item?.relevancy > 85) {
|
|
32
|
-
// allCourses.push(item)
|
|
33
|
-
// }
|
|
34
|
-
// })
|
|
35
|
-
// }
|
|
36
|
-
// this.filterdCourses = allCourses
|
|
37
|
-
// console.log('this.filterdCourses', this.filterdCourses)
|
|
38
|
-
// this.updateCompetencyCounts()
|
|
39
|
-
// this.getUserCourse()
|
|
40
|
-
// })
|
|
41
29
|
this.sharedService.getRecommendedCourse(this.planData.id).subscribe({
|
|
42
30
|
next: (res) => {
|
|
43
|
-
this.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
let allCourses = [];
|
|
47
|
-
if (res && res.filtered_courses && res.filtered_courses.length) {
|
|
31
|
+
this.recommended_course_id = res?.id || '';
|
|
32
|
+
const allCourses = [];
|
|
33
|
+
if (Array.isArray(res?.filtered_courses)) {
|
|
48
34
|
res.filtered_courses.forEach((item) => {
|
|
49
|
-
|
|
35
|
+
// Relevancy remains the initial course recommendation filter.
|
|
36
|
+
// Gap analysis is performed separately using Area + Theme +
|
|
37
|
+
// Subtheme + course_level.
|
|
38
|
+
if (Number(item?.relevancy || 0) > 75) {
|
|
50
39
|
allCourses.push(item);
|
|
51
40
|
}
|
|
52
41
|
});
|
|
53
42
|
}
|
|
54
43
|
this.filterdCourses = allCourses;
|
|
55
|
-
console.log('this.filterdCourses', this.filterdCourses);
|
|
56
44
|
this.updateCompetencyCounts();
|
|
45
|
+
this.calculateAllCourseGaps();
|
|
57
46
|
this.getUserCourse();
|
|
58
47
|
},
|
|
59
48
|
error: (error) => {
|
|
60
49
|
this.loading = false;
|
|
61
|
-
this.snackBar.open(error?.error?.detail, 'X', {
|
|
50
|
+
this.snackBar.open(error?.error?.detail || 'Unable to load recommended courses.', 'X', {
|
|
62
51
|
duration: 3000,
|
|
63
52
|
panelClass: ['snackbar-error']
|
|
64
53
|
});
|
|
@@ -66,92 +55,360 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
66
55
|
});
|
|
67
56
|
}
|
|
68
57
|
updateCompetencyCounts() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
this.
|
|
73
|
-
|
|
74
|
-
this.competenciesCount.public_courses++;
|
|
75
|
-
if (!c.is_public)
|
|
76
|
-
this.competenciesCount.igot++;
|
|
77
|
-
});
|
|
58
|
+
this.competenciesCount = {
|
|
59
|
+
total: this.filterdCourses.length,
|
|
60
|
+
public_courses: this.filterdCourses.filter(c => c?.is_public).length,
|
|
61
|
+
igot: this.filterdCourses.filter(c => !c?.is_public).length
|
|
62
|
+
};
|
|
78
63
|
}
|
|
79
64
|
getUserCourse() {
|
|
80
|
-
|
|
65
|
+
const role_mapping_id = this.planData.id;
|
|
81
66
|
this.loading = true;
|
|
82
67
|
this.sharedService.getUserCourse(role_mapping_id).subscribe({
|
|
83
68
|
next: (res) => {
|
|
84
|
-
// Success handling
|
|
85
69
|
this.loading = false;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
70
|
+
if (Array.isArray(res) && res.length) {
|
|
71
|
+
res.forEach((course) => {
|
|
72
|
+
this.filterdCourses.push(course);
|
|
73
|
+
});
|
|
89
74
|
}
|
|
90
|
-
|
|
75
|
+
this.updateCompetencyCounts();
|
|
76
|
+
this.calculateAllCourseGaps();
|
|
91
77
|
console.log('filterdCourses after adding user courses:', this.filterdCourses);
|
|
92
|
-
//this.successRoleMapping.emit(this.roleMappingForm)
|
|
93
78
|
},
|
|
94
79
|
error: (error) => {
|
|
95
80
|
console.log('error', error);
|
|
96
81
|
this.loading = false;
|
|
97
|
-
// Handle 409 Conflict here
|
|
98
|
-
// alert('Conflict detected: The resource already exists or action conflicts.');
|
|
99
|
-
//this.get
|
|
100
|
-
// Or you can set a UI error message variable
|
|
101
|
-
this.loading = false;
|
|
102
|
-
//this.alreadyAvailableRoleMapping.emit(this.roleMappingForm)
|
|
103
82
|
}
|
|
104
83
|
});
|
|
105
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns competencies from either competencies or competencies_v6.
|
|
87
|
+
*/
|
|
88
|
+
getCourseCompetencies(course) {
|
|
89
|
+
if (Array.isArray(course?.competencies)) {
|
|
90
|
+
return course.competencies;
|
|
91
|
+
}
|
|
92
|
+
if (Array.isArray(course?.competencies_v6)) {
|
|
93
|
+
return course.competencies_v6;
|
|
94
|
+
}
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
normalize(value) {
|
|
98
|
+
return String(value ?? '')
|
|
99
|
+
.trim()
|
|
100
|
+
.toLowerCase()
|
|
101
|
+
.replace(/\s+/g, ' ');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Gets the first available value from the supplied keys.
|
|
105
|
+
*/
|
|
106
|
+
getValue(object, keys) {
|
|
107
|
+
if (!object) {
|
|
108
|
+
return '';
|
|
109
|
+
}
|
|
110
|
+
for (const key of keys) {
|
|
111
|
+
if (object[key] !== undefined &&
|
|
112
|
+
object[key] !== null &&
|
|
113
|
+
String(object[key]).trim() !== '') {
|
|
114
|
+
return object[key];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return '';
|
|
118
|
+
}
|
|
119
|
+
getCompetencyArea(competency) {
|
|
120
|
+
return this.getValue(competency, [
|
|
121
|
+
'competencyAreaName',
|
|
122
|
+
'area',
|
|
123
|
+
'competency_area',
|
|
124
|
+
'competencyArea'
|
|
125
|
+
]);
|
|
126
|
+
}
|
|
127
|
+
getCompetencyTheme(competency) {
|
|
128
|
+
return this.getValue(competency, [
|
|
129
|
+
'competencyThemeName',
|
|
130
|
+
'theme',
|
|
131
|
+
'competency_theme',
|
|
132
|
+
'competencyTheme'
|
|
133
|
+
]);
|
|
134
|
+
}
|
|
135
|
+
getCompetencySubtheme(competency) {
|
|
136
|
+
return this.getValue(competency, [
|
|
137
|
+
'competencySubthemeName',
|
|
138
|
+
'subtheme',
|
|
139
|
+
'competency_subtheme',
|
|
140
|
+
'competencySubtheme'
|
|
141
|
+
]);
|
|
142
|
+
}
|
|
143
|
+
getProficiencyLevel(competency) {
|
|
144
|
+
return this.getValue(competency, [
|
|
145
|
+
'proficiency_level',
|
|
146
|
+
'proficiencyLevel',
|
|
147
|
+
'requiredProficiency',
|
|
148
|
+
'required_proficiency',
|
|
149
|
+
'currentProficiency',
|
|
150
|
+
'current_proficiency'
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* IMPORTANT:
|
|
155
|
+
* course_level is the authoritative STO level of a course.
|
|
156
|
+
*/
|
|
157
|
+
getCourseLevel(course, competency) {
|
|
158
|
+
return this.getValue(course, ['course_level']) ||
|
|
159
|
+
this.getValue(competency, ['course_level']);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Finds role competency data from planData / cbpPlanData.
|
|
163
|
+
*/
|
|
164
|
+
getRequiredCompetencies() {
|
|
165
|
+
const possibleSources = [
|
|
166
|
+
this.planData?.competencies,
|
|
167
|
+
this.planData?.competency,
|
|
168
|
+
this.planData?.competency_data,
|
|
169
|
+
this.planData?.role_competencies,
|
|
170
|
+
this.planData?.competencies_v6,
|
|
171
|
+
this.cbpPlanData?.competencies,
|
|
172
|
+
this.cbpPlanData?.competency,
|
|
173
|
+
this.cbpPlanData?.role_competencies
|
|
174
|
+
];
|
|
175
|
+
for (const source of possibleSources) {
|
|
176
|
+
if (Array.isArray(source) && source.length) {
|
|
177
|
+
return source;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
getRequiredLevel(competency) {
|
|
183
|
+
return this.getValue(competency, [
|
|
184
|
+
'requiredProficiency',
|
|
185
|
+
'required_proficiency',
|
|
186
|
+
'requiredLevel',
|
|
187
|
+
'required_level',
|
|
188
|
+
'proficiencyLevel',
|
|
189
|
+
'proficiency_level',
|
|
190
|
+
'level',
|
|
191
|
+
'stoLevel',
|
|
192
|
+
'sto_level'
|
|
193
|
+
]);
|
|
194
|
+
}
|
|
195
|
+
getCurrentLevel(competency) {
|
|
196
|
+
return this.getValue(competency, [
|
|
197
|
+
'currentProficiency',
|
|
198
|
+
'current_proficiency',
|
|
199
|
+
'currentLevel',
|
|
200
|
+
'current_level',
|
|
201
|
+
'currentProficiencyLevel',
|
|
202
|
+
'current_proficiency_level'
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* STO hierarchy:
|
|
207
|
+
* Operational < Tactical < Strategic
|
|
208
|
+
*/
|
|
209
|
+
getLevelRank(level) {
|
|
210
|
+
switch (this.normalize(level)) {
|
|
211
|
+
case 'operational':
|
|
212
|
+
return 1;
|
|
213
|
+
case 'tactical':
|
|
214
|
+
return 2;
|
|
215
|
+
case 'strategic':
|
|
216
|
+
return 3;
|
|
217
|
+
default:
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Match course competency to role competency using:
|
|
223
|
+
* Area -> Theme -> Subtheme
|
|
224
|
+
*
|
|
225
|
+
* Then compare the course's course_level with the required level.
|
|
226
|
+
*/
|
|
227
|
+
calculateCourseGaps(course) {
|
|
228
|
+
const requiredCompetencies = this.getRequiredCompetencies();
|
|
229
|
+
if (!requiredCompetencies.length) {
|
|
230
|
+
return [];
|
|
231
|
+
}
|
|
232
|
+
const courseCompetencies = this.getCourseCompetencies(course);
|
|
233
|
+
const results = [];
|
|
234
|
+
courseCompetencies.forEach((courseCompetency) => {
|
|
235
|
+
const courseArea = this.normalize(this.getCompetencyArea(courseCompetency));
|
|
236
|
+
const courseTheme = this.normalize(this.getCompetencyTheme(courseCompetency));
|
|
237
|
+
const courseSubtheme = this.normalize(this.getCompetencySubtheme(courseCompetency));
|
|
238
|
+
if (!courseTheme || !courseSubtheme) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
const courseLevel = this.getCourseLevel(course, courseCompetency);
|
|
242
|
+
requiredCompetencies.forEach((requiredCompetency) => {
|
|
243
|
+
const requiredArea = this.normalize(this.getCompetencyArea(requiredCompetency));
|
|
244
|
+
const requiredTheme = this.normalize(this.getCompetencyTheme(requiredCompetency));
|
|
245
|
+
const requiredSubtheme = this.normalize(this.getCompetencySubtheme(requiredCompetency));
|
|
246
|
+
const requiredProficiencyLevel = this.normalize(this.getProficiencyLevel(requiredCompetency));
|
|
247
|
+
if (!requiredTheme || !requiredSubtheme) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
const courseProficiencyLevel = this.normalize(this.getProficiencyLevel(courseCompetency));
|
|
251
|
+
/*
|
|
252
|
+
* Match:
|
|
253
|
+
* Area + Theme + Subtheme + Proficiency Level
|
|
254
|
+
*/
|
|
255
|
+
const areaMatches = !courseArea ||
|
|
256
|
+
!requiredArea ||
|
|
257
|
+
courseArea === requiredArea;
|
|
258
|
+
const themeMatches = courseTheme === requiredTheme;
|
|
259
|
+
const subthemeMatches = courseSubtheme === requiredSubtheme;
|
|
260
|
+
const proficiencyLevelMatches = courseProficiencyLevel === requiredProficiencyLevel;
|
|
261
|
+
/*
|
|
262
|
+
* All 4 parameters must match.
|
|
263
|
+
*
|
|
264
|
+
* If all 4 match:
|
|
265
|
+
* NOT part of gap
|
|
266
|
+
*
|
|
267
|
+
* If any one does not match:
|
|
268
|
+
* PART of gap
|
|
269
|
+
*/
|
|
270
|
+
const allFourMatch = areaMatches &&
|
|
271
|
+
themeMatches &&
|
|
272
|
+
subthemeMatches &&
|
|
273
|
+
proficiencyLevelMatches;
|
|
274
|
+
const requiredLevel = this.getRequiredLevel(requiredCompetency);
|
|
275
|
+
const currentLevel = this.getCurrentLevel(requiredCompetency);
|
|
276
|
+
const requiredRank = this.getLevelRank(requiredLevel);
|
|
277
|
+
const courseRank = this.getLevelRank(courseLevel);
|
|
278
|
+
let status;
|
|
279
|
+
let reason;
|
|
280
|
+
if (allFourMatch) {
|
|
281
|
+
/*
|
|
282
|
+
* All four competency attributes match.
|
|
283
|
+
* Therefore this competency is NOT part of the gap.
|
|
284
|
+
*/
|
|
285
|
+
status = 'FULL';
|
|
286
|
+
reason =
|
|
287
|
+
'Competency Area, Theme, Subtheme and Proficiency Level all match. This competency is not part of the gap.';
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
/*
|
|
291
|
+
* At least one of the four attributes does not match.
|
|
292
|
+
* Therefore this competency is part of the gap.
|
|
293
|
+
*/
|
|
294
|
+
const mismatches = [];
|
|
295
|
+
if (!areaMatches) {
|
|
296
|
+
mismatches.push('Competency Area');
|
|
297
|
+
}
|
|
298
|
+
if (!themeMatches) {
|
|
299
|
+
mismatches.push('Theme');
|
|
300
|
+
}
|
|
301
|
+
if (!subthemeMatches) {
|
|
302
|
+
mismatches.push('Subtheme');
|
|
303
|
+
}
|
|
304
|
+
if (!proficiencyLevelMatches) {
|
|
305
|
+
mismatches.push('Proficiency Level');
|
|
306
|
+
}
|
|
307
|
+
status = 'NO_MATCH';
|
|
308
|
+
reason =
|
|
309
|
+
`${mismatches.join(', ')} ${mismatches.length === 1 ? 'does' : 'do'} not match. This competency is part of the gap.`;
|
|
310
|
+
}
|
|
311
|
+
results.push({
|
|
312
|
+
area: this.getCompetencyArea(requiredCompetency),
|
|
313
|
+
theme: this.getCompetencyTheme(requiredCompetency),
|
|
314
|
+
subtheme: this.getCompetencySubtheme(requiredCompetency),
|
|
315
|
+
proficiencyLevel: this.getProficiencyLevel(requiredCompetency),
|
|
316
|
+
currentLevel,
|
|
317
|
+
requiredLevel,
|
|
318
|
+
courseLevel,
|
|
319
|
+
status,
|
|
320
|
+
reason
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
return this.removeDuplicateGapResults(results);
|
|
325
|
+
}
|
|
326
|
+
removeDuplicateGapResults(results) {
|
|
327
|
+
const unique = new Map();
|
|
328
|
+
results.forEach(result => {
|
|
329
|
+
const key = [
|
|
330
|
+
this.normalize(result.area),
|
|
331
|
+
this.normalize(result.theme),
|
|
332
|
+
this.normalize(result.subtheme),
|
|
333
|
+
this.normalize(result.proficiencyLevel),
|
|
334
|
+
this.normalize(result.requiredLevel),
|
|
335
|
+
this.normalize(result.courseLevel)
|
|
336
|
+
].join('|');
|
|
337
|
+
if (!unique.has(key)) {
|
|
338
|
+
unique.set(key, result);
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
return Array.from(unique.values());
|
|
342
|
+
}
|
|
343
|
+
calculateAllCourseGaps() {
|
|
344
|
+
this.courseGapResults = {};
|
|
345
|
+
this.filterdCourses.forEach((course, index) => {
|
|
346
|
+
this.courseGapResults[index] = this.calculateCourseGaps(course);
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
getCourseGapResults(index) {
|
|
350
|
+
return this.courseGapResults[index] || [];
|
|
351
|
+
}
|
|
352
|
+
getFullMatches(index) {
|
|
353
|
+
return this.getCourseGapResults(index)
|
|
354
|
+
.filter(result => result.status === 'FULL');
|
|
355
|
+
}
|
|
356
|
+
getPartialMatches(index) {
|
|
357
|
+
return this.getCourseGapResults(index)
|
|
358
|
+
.filter(result => result.status === 'PARTIAL');
|
|
359
|
+
}
|
|
360
|
+
getNoMatches(index) {
|
|
361
|
+
return this.getCourseGapResults(index)
|
|
362
|
+
.filter(result => result.status === 'NO_MATCH');
|
|
363
|
+
}
|
|
364
|
+
hasGapMatch(index) {
|
|
365
|
+
return this.getCourseGapResults(index).some(result => result.status === 'FULL' ||
|
|
366
|
+
result.status === 'PARTIAL');
|
|
367
|
+
}
|
|
368
|
+
getCourseGapStatus(index) {
|
|
369
|
+
const results = this.getCourseGapResults(index);
|
|
370
|
+
if (results.some(result => result.status === 'FULL')) {
|
|
371
|
+
return 'FULL';
|
|
372
|
+
}
|
|
373
|
+
if (results.some(result => result.status === 'PARTIAL')) {
|
|
374
|
+
return 'PARTIAL';
|
|
375
|
+
}
|
|
376
|
+
return 'NO_MATCH';
|
|
377
|
+
}
|
|
378
|
+
getCourseGapStatusLabel(index) {
|
|
379
|
+
switch (this.getCourseGapStatus(index)) {
|
|
380
|
+
case 'FULL':
|
|
381
|
+
return 'Full Gap Match';
|
|
382
|
+
case 'PARTIAL':
|
|
383
|
+
return 'Partial Gap Match';
|
|
384
|
+
default:
|
|
385
|
+
return 'No Gap Match';
|
|
386
|
+
}
|
|
387
|
+
}
|
|
106
388
|
getCompetenciesByType(type, index) {
|
|
107
389
|
const course = this.filterdCourses[index];
|
|
108
390
|
if (!course) {
|
|
109
391
|
console.log(`No course found at index ${index}`);
|
|
110
392
|
return [];
|
|
111
393
|
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Manually Suggested - iGOT courses use 'competencies_v6'
|
|
115
|
-
// User Added courses use 'competencies'
|
|
116
|
-
let competencies = [];
|
|
117
|
-
if (course.competencies && Array.isArray(course.competencies)) {
|
|
118
|
-
competencies = course.competencies;
|
|
119
|
-
// console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) using 'competencies' property:`, competencies);
|
|
120
|
-
}
|
|
121
|
-
else if (course.competencies_v6 && Array.isArray(course.competencies_v6)) {
|
|
122
|
-
competencies = course.competencies_v6;
|
|
123
|
-
// console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) using 'competencies_v6' property:`, competencies);
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
// console.log(`Course ${index} (${course.course_type || course.name || 'Unknown'}) has no valid competencies property:`, {
|
|
127
|
-
// hasCompetencies: !!course.competencies,
|
|
128
|
-
// competenciesType: typeof course.competencies,
|
|
129
|
-
// hasCompetenciesV6: !!course.competencies_v6,
|
|
130
|
-
// competenciesV6Type: typeof course.competencies_v6,
|
|
131
|
-
// courseKeys: Object.keys(course)
|
|
132
|
-
// });
|
|
133
|
-
}
|
|
134
|
-
if (competencies.length === 0) {
|
|
394
|
+
const competencies = this.getCourseCompetencies(course);
|
|
395
|
+
if (!competencies.length) {
|
|
135
396
|
console.log(`No competencies found for course ${index} and type ${type}`);
|
|
136
397
|
return [];
|
|
137
398
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (!c || !c.competencyAreaName) {
|
|
142
|
-
console.log(`Invalid competency structure in course ${index}:`, c);
|
|
399
|
+
const normalizedType = this.normalize(type);
|
|
400
|
+
return competencies.filter((c) => {
|
|
401
|
+
if (!c || !this.getCompetencyArea(c)) {
|
|
143
402
|
return false;
|
|
144
403
|
}
|
|
145
|
-
const competencyArea =
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return competencyArea === 'behavioral' ||
|
|
404
|
+
const competencyArea = this.normalize(this.getCompetencyArea(c));
|
|
405
|
+
if (normalizedType === 'behavioural' ||
|
|
406
|
+
normalizedType === 'behavioral') {
|
|
407
|
+
return (competencyArea === 'behavioral' ||
|
|
408
|
+
competencyArea === 'behavioural');
|
|
149
409
|
}
|
|
150
|
-
// For other types, do case-insensitive comparison
|
|
151
410
|
return competencyArea === normalizedType;
|
|
152
411
|
});
|
|
153
|
-
// console.log(`Found ${matchedCompetencies.length} competencies of type ${type} for course ${index}:`, matchedCompetencies);
|
|
154
|
-
return matchedCompetencies;
|
|
155
412
|
}
|
|
156
413
|
getDisplayedCompetencies(type, index) {
|
|
157
414
|
const competencies = this.getCompetenciesByType(type, index);
|
|
@@ -163,7 +420,8 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
163
420
|
}
|
|
164
421
|
toggleCompetencies(type, index) {
|
|
165
422
|
const key = `${index}-${type}`;
|
|
166
|
-
this.expandedCompetencies[key] =
|
|
423
|
+
this.expandedCompetencies[key] =
|
|
424
|
+
!this.expandedCompetencies[key];
|
|
167
425
|
}
|
|
168
426
|
isExpanded(type, index) {
|
|
169
427
|
const key = `${index}-${type}`;
|
|
@@ -174,7 +432,7 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
174
432
|
}
|
|
175
433
|
getRemainingCount(type, index) {
|
|
176
434
|
const totalCount = this.getCompetenciesByType(type, index).length;
|
|
177
|
-
return totalCount - 2;
|
|
435
|
+
return Math.max(totalCount - 2, 0);
|
|
178
436
|
}
|
|
179
437
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: GapAnalysisRecommendedCourseComponent, deps: [{ token: i1.SharedService }, { token: i2.MatDialog }, { token: i3.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
180
438
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: GapAnalysisRecommendedCourseComponent, selector: "app-gap-analysis-recommended-course", inputs: { planData: "planData" }, ngImport: i0, template: "<div class=\"section-container mt-2\">\n <div class=\"competency-container\">\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Total Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.total}}\n </div>\n </div>\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n iGOT Platform Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.igot}}\n </div>\n </div>\n <div class=\"outside-layer-total\">\n <div class=\"inside-layer\">\n Public Courses\n </div>\n <div class=\"count\">\n {{competenciesCount?.public_courses}}\n\n </div>\n </div>\n\n </div>\n <div class=\"my-4\">\n\n <div class=\"course-list-container\">\n <div class=\"course-list-item\" *ngFor=\"let item of filterdCourses;let i=index\">\n <div class=\"course-header\">\n <div class=\"checked-course-container\">\n\n <div>\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">\n <span><img src=\"assets/icons/course.svg\"></span> <span>Course</span>\n </div>\n </div>\n </div>\n\n </div>\n\n <!-- <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <span>AI Recommended</span>\n\n </div>\n </div>\n </div> -->\n <div *ngIf=\"item?.rationale && !item?.is_public\">\n <div class=\"ai-recommened-pill-green\">\n <div class=\"ai-recommened-pill-green-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"item?.rationale && item?.is_public\">\n <div class=\"ai-recommened-pill-public\">\n <div class=\"ai-recommened-pill-public-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>AI Recommended - Public </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n <div *ngIf=\"!item?.rationale\">\n <div class=\"ai-recommened-pill-gray\">\n <div class=\"ai-recommened-pill-gray-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n\n <span>Manually Suggested - iGOT </span>\n\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.platform\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <a class=\"cursor-pointer\" [href]=\"item?.public_link\" target=\"_blank\"><span>Platform -\n {{item?.platform}}</span></a>\n </div>\n </div>\n <div class=\"ai-recommened-pill-orange mt-2\" *ngIf=\"item?.organisation?.length\">\n <div class=\"ai-recommened-pill-orange-text\">\n <span class=\"ai-loader-icon\"><img\n src=\"assets/icons/ai-loader.gif\"></span>\n <span>Provider - {{item?.organisation[0]}}</span>\n </div>\n </div>\n </div>\n </div>\n <div class=\"course-title mt-4\">\n <div>\n <div *ngIf=\"item?.course\">{{item?.course}}</div>\n <div *ngIf=\"item?.name\">{{item?.name}}</div>\n </div>\n </div>\n <div class=\"course-desc mt-2\">\n <div>\n <div>{{item?.rationale}}</div>\n </div>\n </div>\n <div class=\"mt-3\" *ngIf=\"getCompetenciesByType('Behavioural',i)?.length\">\n <div class=\"competency-sub-heading\">Behavioral Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"behavioural-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Behavioural',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Behavioural',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Behavioural',i)\">\n {{ isExpanded('Behavioural',i) ? 'Show Less' : '+' +\n getRemainingCount('Behavioural',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Functional',i)?.length\">\n <div class=\"competency-sub-heading\">Functional Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"functional-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Functional',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Functional',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Functional',i)\">\n {{ isExpanded('Functional',i) ? 'Show Less' : '+' +\n getRemainingCount('Functional',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\" *ngIf=\"getCompetenciesByType('Domain',i)?.length\">\n <div class=\"competency-sub-heading\">Domain Competencies</div>\n <ul class=\"competency-list mt-1\">\n <li class=\"domain-pill\" *ngFor=\"let comp of getDisplayedCompetencies('Domain',i)\">\n <span class=\"competency-text\"> {{ comp.competencyThemeName }} -\n {{\n comp.competencySubThemeName }} </span>\n </li>\n <li *ngIf=\"hasMoreThanTwo('Domain',i)\" class=\"show-more-competency\">\n <span class=\"show-more-link cursor-pointer\" (click)=\"toggleCompetencies('Domain',i)\">\n {{ isExpanded('Domain',i) ? 'Show Less' : '+' +\n getRemainingCount('Domain',i) + ' More' }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"mt-2\">\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\" *ngIf=\"item?.relevancy\">{{item?.relevancy}}%</div>\n <div class=\"percentage\" *ngIf=\"!item?.relevancy\">N/A</div>\n </div>\n </div>\n <!-- <div>\n <div class=\"competencies-matched-container\">\n <div class=\"competencies-matched\">Competencies Matched</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">80%</div>\n </div>\n </div> -->\n </div>\n <!-- <div class=\"course-list-item\">\n <div class=\"course-header\">\n <div>\n <div class=\"course-pill\">\n <div class=\"course-pill-text\">Course</div>\n </div>\n </div>\n <div>\n <div class=\"ai-recommened-pill\">\n <div class=\"ai-recommened-pill-text\">\n <span class=\"ai-loader-icon\"><img src=\"assets/icons/ai-loader.gif\"></span>\n <span>AI Recommended</span>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"course-title\">\n <div>\n <div>Maternal, Infant And Young Child Nutrition</div>\n </div>\n </div>\n <div class=\"course-desc\">\n <div>\n <div>This Course directly addresses a primary responsibility of Anganwandi Care takers,\n which is\n to provide and educate on nutrition for mother and young children</div>\n </div>\n </div>\n <div>\n <div class=\"relevancy-container\">\n <div class=\"relevancy\">Relevancy</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">90%</div>\n </div>\n </div>\n <div>\n <div class=\"competencies-matched-container\">\n <div class=\"competencies-matched\">Competencies Matched</div>\n <div class=\"dash\">-</div>\n <div class=\"percentage\">80%</div>\n </div>\n </div>\n </div> -->\n\n </div>\n </div>\n</div>", styles: ["@charset \"UTF-8\";.container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.ministry-heading{color:#1b4ca1;font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal}.radio-label{color:#000;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.radio-btn-group{display:flex;width:32px;height:32px;padding:2px;gap:10px}.label{color:var(--Body-Text-Body-Color, #212529);font-family:Lato;font-size:16px;font-style:normal;font-weight:700;line-height:150%}::ng-deep mat-form-field{background-color:#fff!important;border-radius:25px!important;padding-left:12px;padding-right:12px;height:42px;width:100%}::ng-deep mat-select{border-radius:25px!important;background-color:#fff!important}::ng-deep .mat-select-panel{background-color:#fff!important}::ng-deep .mat-select-panel .mat-option{border-radius:0!important}::ng-deep mat-form-field .mat-form-field-underline{display:none!important}::ng-deep mat-select .mat-select-placeholder{color:#0006;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}::ng-deep mat-select .mat-select-value-text{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;line-height:normal!important;padding-top:0!important;padding-bottom:0!important}::ng-deep mat-select .mat-select-value{display:flex!important;align-items:center!important;height:100%!important}.additional-details textarea{display:flex;padding:16px 16px 0;flex-direction:column;align-items:flex-start;gap:10px;flex:1 0 0;align-self:stretch;width:100%;color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;resize:none}.section-header{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.btn-disable{border-radius:var(--Radius-Full-Round, 9999999px);opacity:.4;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.btn-group{display:flex;flex-direction:row;justify-content:space-between}.pl-2{padding-left:5px}.search-filter-section{display:flex;flex-direction:row;justify-content:space-between}.search .rsearch{position:relative}.search .search-icon{position:absolute;top:15px;font-size:20px;left:10px}.search .sinput{border-radius:32px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato;width:800px}.select-map-route-container{display:flex;flex-direction:row}.selected-mapping-route p{color:#1b4ca1;font-family:Lato;font-size:20px;font-style:normal;font-weight:400;line-height:normal;text-decoration-line:underline;text-decoration-style:solid;-webkit-text-decoration-skip:ink;text-decoration-skip-ink:auto;text-decoration-thickness:auto;text-underline-offset:auto;text-underline-position:from-font}.edit-plan{display:flex;padding:4px;justify-content:center;align-items:center;gap:8px;border-radius:4px;background:#1b4ca129;color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;margin-left:10px}.search-container{display:flex;flex-direction:row}.course-container{display:flex;width:100%;padding:16px;flex-direction:column;align-items:flex-start;gap:24px;grid-row:2/span 1;grid-column:1/span 1;border-radius:12px;border:1px solid var(--borders-black-border-16-black, rgba(0, 0, 0, .16));background:#fff}.course-header{display:flex;flex-direction:row;justify-content:space-between;width:100%}.course-pill{display:flex;height:24px;padding:8px;align-items:center;gap:4px;border-radius:16px;border:1px solid var(--borders-border-fill-focussed-4-light-100, #EF951E);background:#fefaf4}.ai-recommened-pill-green{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#0080001c}.ai-recommened-pill-green-text{color:#006400;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-public{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#1b4ca129}.ai-recommened-pill-public-text{color:#1b4ca1;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-gray{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#d3d3d3}.ai-recommened-pill-gray-text{color:#000;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);background:#ffa50052}.ai-recommened-pill-orange-text{color:#5a3f0d;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.ai-recommened-pill-orange-text a{color:#5a3f0d!important;font-family:Lato;font-size:11px;font-style:normal;font-weight:600;line-height:normal}.igot-platform-pill{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #EF951E;background:#ef951e29}.course-title{color:var(--Primary-KB-Primary-Light, #1B4CA1);font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:22px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:1.4;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis}.relevancy,.competencies-matched{color:#6c757d;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;align-items:center}.percentage{color:#1b4ca1;font-family:Lato;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.relevancy-container,.competencies-matched-container{display:flex;flex-direction:row;align-items:center}.dash{padding:0 5px}::ng-deep .mat-radio-checked .mat-radio-inner-circle{background:#1b4ca1!important}.course-list-container{display:flex;flex-wrap:wrap;gap:16px;width:100%;padding:1rem}.course-list-item{flex:1 1 calc(50% - 10px);min-width:350px;max-width:500px;box-sizing:border-box;border:1px solid #e0e0e0;padding:16px;background-color:#fff;border-radius:12px;min-height:auto;box-shadow:0 2px 4px #0000001a;transition:box-shadow .2s ease;display:flex;flex-direction:column}.course-list-item:hover{box-shadow:0 4px 8px #00000026}.course-list-item:only-child{flex:1 1 auto;max-width:800px}.checked-course-container{display:flex;width:60%}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.igot-platform-pill-text{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:700;line-height:normal}.course-pill-text{color:var(--accessbility-shades-without-opacity-kb-greys-black-87, #212121);text-align:center;font-family:Poppins;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.ai-loader-icon img,.igot-platform-icon img{width:15.714px;height:15.714px;flex-shrink:0}.competency-container{display:flex;justify-content:normal;gap:16px;flex-direction:row;margin-left:20px}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #1B4CA1;background:#edf1f8;width:132px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #E24577;background:#f8d2de;width:132px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #7B47A4;background:#dfd3e9;width:132px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px 4px 4px 12px;border-left:2px solid #F8B861;background:#fde8cc;width:132px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:16px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.suggest-courses-header{display:flex;flex-direction:row;justify-content:space-between}.suggest-course-control{display:flex;flex-direction:row}.course-card-container{width:172px;border-radius:3.307px;border:.827px solid var(--borders-border-8-black, rgba(0, 0, 0, .08));background-color:#fff}.highlight-ai{font-family:Montserrat;font-size:24px;font-style:normal;font-weight:600;line-height:normal;background:linear-gradient(90deg,#3b27ff,#2de3d6);background-clip:text;-webkit-background-clip:text;color:transparent;-webkit-text-fill-color:transparent;display:inline-block}.ai-loader-icon-medium img{width:40px;height:40px;flex-shrink:0}.heading{color:#000;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.pdf-heading{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0;text-align:center}.popup-header{display:flex;justify-content:space-between;align-items:center;padding:16px;border-bottom:1px solid #e0e0e0}.header-left{flex:1}.header-actions{display:flex;align-items:center;gap:12px}.regenerate-btn{display:flex;align-items:center;gap:8px;padding:8px 16px;border-radius:6px;font-size:14px;font-weight:500;min-width:auto}.regenerate-btn .mat-icon{margin:0;font-size:18px;width:18px;height:18px}.regenerate-btn .mat-spinner{margin:0}.regenerate-btn:disabled{opacity:.7;cursor:not-allowed}.close-btn{padding:8px;border-radius:4px;transition:background-color .2s ease}.close-btn:hover{background-color:#f5f5f5}.close-btn .mat-icon{font-size:20px;width:20px;height:20px}.progress-popup{display:flex;flex-direction:column;justify-content:center;align-items:center}.progress-popup .desc{color:#000000de;text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.behavioural-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.functional-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.domain-pill{display:flex;padding:2px 6px;justify-content:center;align-items:center;gap:4px;border-radius:16px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:2px 4px 2px 0;font-size:12px}.popup-header{display:flex;flex-direction:row;justify-content:space-between}.popup-footer{display:flex;flex-direction:row;justify-content:end}.view-cbp-plan{margin:10px;padding:10px}.view-cbp-plan-popup{padding:24px;max-height:70vh;overflow-y:auto}.section{border-radius:8px;background:#1b4ca114;padding:16px}.popup-header{display:flex;justify-content:space-between;align-items:center;border-bottom:1px solid #ddd;font-weight:700;flex-shrink:0}.popup-footer{display:flex;justify-content:flex-end;gap:16px;padding:16px 24px;border-top:1px solid #ddd;background-color:#fff;flex-shrink:0;position:sticky;bottom:0}.section-container{overflow-y:auto;flex:1 1 auto}.competency-list{display:flex;flex-direction:row;gap:0px;flex-wrap:wrap;margin:0;padding:0;list-style:none}.competency-text{color:#000;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal;padding:3px 6px}.competency-text-behavioral{color:#654321;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-functional{color:#b01669;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-text-domain{color:#301934;font-family:Lato;font-size:14px;font-style:normal;line-height:normal;font-weight:550}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:14px;font-style:normal;font-weight:600;line-height:normal}.cursor-pointer{cursor:pointer}.btn-active{border-radius:var(--Radius-Full-Round, 9999999px);opacity:1;background:var(--Primary-KB-Primary-Light, #1B4CA1);color:var(--white-kb-white-100, #FFF);text-align:center;font-family:Lato;font-size:14px;font-style:normal;font-weight:700;line-height:normal;display:flex;height:32px;padding:0 16px;justify-content:center;align-items:center;gap:8px;border:none}.custom-textarea{color:#000;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.overlay-loader{position:fixed;top:0;left:0;width:100vw;height:100vh;background:#ffffffbf;z-index:9999;display:flex;justify-content:center;align-items:center}.competencis-grid{display:flex;flex-direction:row;justify-content:space-between;gap:16px}.grid-list-item-behavioral div{border-left:2px solid darkorange}.grid-list-item-functional div{border-left:2px solid #ff1493}.grid-list-item-domain div{border-left:2px solid #6b21a8}.competencies-grid-3{width:33%}.bg-blue-50{background-color:#fde8cc;border-radius:4px}.bg-green-50{background-color:#f8d2de;border-radius:4px}.bg-purple-50{background-color:#dfd3e9;border-radius:4px}.grid-list-item div{padding:5px 10px;margin:10px 0}.course-pill-container{display:flex;gap:8px}.relevancy-pill-green{display:flex;padding:4px 8px;align-items:center;gap:4px;border-radius:16px;border:1px solid #e0e0e0;background:#f8f9fa}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.show-more-competency{display:inline-flex;align-items:center}.show-more-link{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:500;line-height:normal;margin:2px 4px 2px 0;text-decoration:none}.show-more-link:hover{text-decoration:underline}.course-content{flex:1;display:flex;flex-direction:column}.course-footer{margin-top:auto;padding-top:12px;display:flex;justify-content:space-between}::ng-deep .mdc-tab__text-label{font-weight:700;font-family:Montserrat!important;font-size:16px;color:#000!important;text-transform:capitalize}.competency-tag{display:inline-block;padding:.25rem .75rem;border-radius:9999px;font-size:.75rem;font-weight:500;margin-right:.5rem;margin-bottom:.5rem}.menu-list-item.active{background-color:#1b4ca1;color:#fff}.menu-list-item:hover{background-color:#1b4ca1;color:#fff;border-color:#1b4ca1}.gray-bg{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc}.div-count{font-family:Lato;font-size:20px;font-weight:700}.green-bg{background-color:#0080001c;border:1px solid #006400;border-radius:8px}.div-green-count{font-family:Lato;font-size:20px;font-weight:700;color:#006400}.div-green-label{color:#006400;font-family:Montserrat;font-size:16px;font-style:normal;font-weight:600;line-height:normal}.gray-bg-item{background-color:rgb(248,250,252,var(--tw-bg-opacity, 1));border-radius:8px;border:1px solid #ccc;padding:4px 8px;margin:10px}.add-btn{color:#1b4ca1;font-size:14px;font-family:Lato}.list-flex{display:flex;flex-direction:row;justify-content:space-between}.all-category-list .mat-icon{vertical-align:middle}.course-list-container-flex{display:flex;align-items:flex-start;gap:2rem}.left-panel{flex:0 0 250px;font-weight:700;text-align:left}.right-panel{flex:1;display:flex;flex-direction:row;flex-wrap:wrap;gap:20px;align-content:flex-start;justify-content:flex-start}.category-list-item{font-weight:400;font-size:16px;font-family:Lato;padding:5px}.right-panel-flex{display:flex;flex:0 0 100%;width:100%;flex-direction:row;flex-wrap:wrap;gap:20px;justify-content:flex-start}.course-list-container-right-flex{display:flex}.no-gaps-message{display:flex;flex-direction:column;align-items:center;padding:24px;background:linear-gradient(135deg,#4caf501a,#81c7841a);border:2px solid #4CAF50;border-radius:16px;margin:16px 0}.no-gaps-message .success-icon{font-size:25px;color:#4caf50;margin-bottom:16px}.no-gaps-message h4{color:#2e7d32;font-family:Montserrat;font-size:20px;font-weight:600;margin:0 0 8px;text-align:center}.no-gaps-message p{color:#388e3c;font-family:Lato;font-size:14px;font-weight:400;margin:0;text-align:center;line-height:1.5}.section-header-improved{display:flex;flex-direction:column;gap:16px}.search-and-buttons-container{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap}.search-container-compact{flex:0 0 auto;min-width:280px}.search-container-compact .rsearch{position:relative;display:flex;align-items:center}.search-container-compact .search-icon{position:absolute;left:12px;color:#666;font-size:20px;z-index:1}.search-container-compact .sinput-compact{border-radius:25px;border:1px solid #d5d0d0;padding:8px 12px 8px 40px;height:32px;width:100%;font:400 14px Lato;box-sizing:border-box;transition:border-color .3s ease}.search-container-compact .sinput-compact:focus{outline:none;border-color:#1b4ca1;box-shadow:0 0 0 2px #1b4ca11a}.search-container-compact .sinput-compact::placeholder{color:#999}.btn-group-compact{display:flex;gap:8px;flex:0 0 auto}.category-list-item{padding:8px 12px!important;border-radius:6px;border:1px solid transparent;transition:all .3s ease;background:#f8f9fa;color:#333;font-family:Lato;font-size:14px!important;font-weight:400!important}.category-list-item:hover{background:#1b4ca10d;border-color:#1b4ca133}.category-list-item.selected-theme{background:#1b4ca11a;border-color:#1b4ca1;color:#1b4ca1;font-weight:600!important}.category-list-item.selected-theme:before{content:\"\\2713 \";color:#1b4ca1;font-weight:700}.theme-filter-controls{margin-bottom:8px}.clear-filter-btn{background:#f8f9fa;border:1px solid #ddd;border-radius:20px;padding:4px 12px;font-size:12px;color:#666;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;gap:4px}.clear-filter-btn:hover{background:#e9ecef;border-color:#adb5bd}.clear-filter-btn mat-icon{font-size:16px;width:16px;height:16px}.no-course-found-container{display:flex;justify-content:center;align-items:center;min-height:300px;padding:20px}.no-course-card{background:linear-gradient(135deg,#f8f9fa,#e9ecef);border:2px dashed #ced4da;border-radius:16px;padding:40px;text-align:center;max-width:500px;box-shadow:0 4px 12px #0000000d}.no-course-card .no-course-icon{margin-bottom:20px}.no-course-card .no-course-icon mat-icon{font-size:48px;width:48px;height:48px;color:#6c757d}.no-course-card .no-course-content h4{color:#495057;font-family:Montserrat;font-size:24px;font-weight:600;margin-bottom:12px}.no-course-card .no-course-content p{color:#6c757d;font-family:Lato;font-size:16px;line-height:1.5;margin-bottom:12px}.no-course-card .no-course-content p strong{color:#1b4ca1;font-weight:600}.no-course-card .suggest-course-btn{background:linear-gradient(135deg,#1b4ca1,#164080);color:#fff;border:none;border-radius:25px;padding:12px 24px;font-family:Lato;font-size:14px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;margin:20px auto 0;transition:all .3s ease;box-shadow:0 4px 12px #1b4ca14d}.no-course-card .suggest-course-btn:hover{background:linear-gradient(135deg,#164080,#0f2f5f);transform:translateY(-2px);box-shadow:0 6px 16px #1b4ca166}.no-course-card .suggest-course-btn:active{transform:translateY(0)}.no-course-card .suggest-course-btn mat-icon{font-size:18px;width:18px;height:18px}.left-panel{flex:0 0 280px!important;background:#f8f9fa;border-radius:12px;padding:16px;border:1px solid #e9ecef;max-height:600px;overflow-y:auto;font-weight:400!important}@media (max-width: 1200px){.search-and-buttons-container{flex-direction:column;align-items:stretch}.search-container-compact{min-width:auto;width:100%}.btn-group-compact{justify-content:center;flex-wrap:wrap}}@media (max-width: 1200px) and (min-width: 769px){.course-list-item{flex:1 1 calc(50% - 10px);min-width:300px;max-width:none}}@media (max-width: 768px){.course-list-container-flex{flex-direction:column}.left-panel{flex:none!important;max-height:300px}.course-list-item{flex:0 0 100%;max-width:100%}.no-course-card{padding:20px}.no-course-card .no-course-content h4{font-size:20px}.no-course-card .no-course-content p{font-size:14px}}::ng-deep .error-snackbar{background-color:#f44336!important;color:#fff!important;font-weight:500}::ng-deep .error-snackbar .mat-simple-snackbar-action{color:#fff!important}::ng-deep .session-expired-snackbar{background-color:#ff9800!important;color:#fff!important;font-weight:600}::ng-deep .session-expired-snackbar .mat-simple-snackbar-action{color:#fff!important;font-weight:700}.download-pdf{justify-content:end;display:flex;flex-direction:row}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
@@ -185,4 +443,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
185
443
|
}], ctorParameters: function () { return [{ type: i1.SharedService }, { type: i2.MatDialog }, { type: i3.MatSnackBar }]; }, propDecorators: { planData: [{
|
|
186
444
|
type: Input
|
|
187
445
|
}] } });
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR2pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7Ozs7OztBQVE5QixNQUFNLE9BQU8scUNBQXFDO0lBTWhELFlBQXFCLGFBQTRCLEVBQVUsTUFBaUIsRUFBVSxRQUFxQjtRQUF0RixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLFdBQU0sR0FBTixNQUFNLENBQVc7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBSDNHLFlBQU8sR0FBQyxLQUFLLENBQUE7UUFDYiwwQkFBcUIsR0FBQyxFQUFFLENBQUE7UUFLeEIsZUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVmLHdCQUFtQixHQUFPLEVBQUUsQ0FBQTtRQUM1QixzQkFBaUIsR0FBRyxFQUFDLEtBQUssRUFBQyxDQUFDLEVBQUUsY0FBYyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxFQUFDLENBQUE7UUFDdkQseUJBQW9CLEdBQVEsRUFBRSxDQUFDLENBQUMsMkRBQTJEO1FBTnZGLElBQUksQ0FBQyxRQUFR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QUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUNsRSxPQUFPLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQzsrR0FyTVUscUNBQXFDO21HQUFyQyxxQ0FBcUMsNkdDWGxELG1xYUEwUE07OzRGRC9PTyxxQ0FBcUM7a0JBTGpELFNBQVM7K0JBQ0UscUNBQXFDO3NKQU10QyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IGRhdGEgfSBmcm9tICdqcXVlcnknO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHYXBBbmFseXNpc1JlY29tbWVuZGVkQ291cnNlQ29tcG9uZW50IHtcblxuICBASW5wdXQoKSBwbGFuRGF0YTphbnlcbiAgbG9hZGluZz1mYWxzZVxuICByZWNvbW1lbmRlZF9jb3Vyc2VfaWQ9JydcbiAgY2JwUGxhbkRhdGE6YW55XG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyKSB7XG4gICAgICB0aGlzLnBsYW5EYXRhID0gZGF0YVxuICAgIH1cbiAgc2VhcmNoVGV4dCA9ICcnXG4gIGZpbHRlcmRDb3Vyc2VzIDphbnlcbiAgc2VsZWN0RmlsdGVyQ291cnNlczphbnkgPSBbXVxuICBjb21wZXRlbmNpZXNDb3VudCA9IHt0b3RhbDowLCBwdWJsaWNfY291cnNlczowLCBpZ290OjB9XG4gIGV4cGFuZGVkQ29tcGV0ZW5jaWVzOiBhbnkgPSB7fTsgLy8gVHJhY2sgZXhwYW5kZWQgc3RhdGUgZm9yIGVhY2ggY291cnNlIGFuZCBjb21wZXRlbmN5IHR5cGVcbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuY2JwUGxhbkRhdGEgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqXG4gICAgLy8gdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHRoaXMucGxhbkRhdGEuaWQpLnN1YnNjcmliZSgocmVzKT0+e1xuICAgIC8vICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAvLyAgIGNvbnNvbGUubG9nKCdyZXMnLCByZXMpXG4gICAgLy8gICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgIC8vICAgbGV0IGFsbENvdXJzZXMgPSBbXVxuICAgIC8vICAgaWYocmVzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzICYmIHJlcy5maWx0ZXJlZF9jb3Vyc2VzLmxlbmd0aCkge1xuICAgIC8vICAgICByZXMuZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKT0+e1xuICAgIC8vICAgICAgIGlmKGl0ZW0/LnJlbGV2YW5jeSA+IDg1KSB7XG4gICAgLy8gICAgICAgICBhbGxDb3Vyc2VzLnB1c2goaXRlbSlcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH0pXG4gICAgLy8gICB9XG4gICAgLy8gICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQ291cnNlc1xuICAgIC8vICAgY29uc29sZS5sb2coJ3RoaXMuZmlsdGVyZENvdXJzZXMnLCB0aGlzLmZpbHRlcmRDb3Vyc2VzKVxuICAgIC8vICAgdGhpcy51cGRhdGVDb21wZXRlbmN5Q291bnRzKClcbiAgICAvLyAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpXG4gICAgLy8gfSlcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSZWNvbW1lbmRlZENvdXJzZSh0aGlzLnBsYW5EYXRhLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICBjb25zb2xlLmxvZygncmVzJywgcmVzKVxuICAgICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcy5pZFxuICAgICAgICBsZXQgYWxsQ291cnNlcyA9IFtdXG4gICAgICAgIGlmKHJlcyAmJiByZXMuZmlsdGVyZWRfY291cnNlcyAmJiByZXMuZmlsdGVyZWRfY291cnNlcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXMuZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtKT0+e1xuICAgICAgICAgICAgaWYoaXRlbT8ucmVsZXZhbmN5ID4gNzUpIHtcbiAgICAgICAgICAgICAgYWxsQ291cnNlcy5wdXNoKGl0ZW0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQ291cnNlc1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5maWx0ZXJkQ291cnNlcycsIHRoaXMuZmlsdGVyZENvdXJzZXMpXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpXG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpXG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKSB7XG4gICAvLyBjb25zdCBjb21wcyA9IHRoaXMuY29tcGV0ZW5jaWVzQXJyYXkudmFsdWU7XG4gICAgdGhpcy5jb21wZXRlbmNpZXNDb3VudCA9IHt0b3RhbDogMCwgcHVibGljX2NvdXJzZXM6IDAsIGlnb3Q6IDB9O1xuICAgIHRoaXMuZmlsdGVyZENvdXJzZXMuZm9yRWFjaChjID0+IHtcbiAgICAgIHRoaXMuY29tcGV0ZW5jaWVzQ291bnQudG90YWwrKztcbiAgICAgIGlmIChjLmlzX3B1YmxpYykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5wdWJsaWNfY291cnNlcysrO1xuICAgICAgaWYgKCFjLmlzX3B1YmxpYykgdGhpcy5jb21wZXRlbmNpZXNDb3VudC5pZ290Kys7XG4gICAgfSk7XG4gIH1cblxuXG5cblxuXG4gIGdldFVzZXJDb3Vyc2UoKSB7XG4gICAgbGV0IHJvbGVfbWFwcGluZ19pZCA9IHRoaXMucGxhbkRhdGEuaWRcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFVzZXJDb3Vyc2Uocm9sZV9tYXBwaW5nX2lkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAvLyBTdWNjZXNzIGhhbmRsaW5nXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlXG4gICAgICAgIFxuICAgICAgICAvLyBQcm9jZXNzIHVzZXItYWRkZWQgY291cnNlcyB0byBlbnN1cmUgcHJvcGVyIHN0cnVjdHVyZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXMucHVzaChyZXNbaV0pXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFJlYnVpbGQgZmlsdGVyZENvdXJzZXMgdG8gaW5jbHVkZSBhbGwgY291cnNlIHR5cGVzXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coJ2ZpbHRlcmRDb3Vyc2VzIGFmdGVyIGFkZGluZyB1c2VyIGNvdXJzZXM6JywgdGhpcy5maWx0ZXJkQ291cnNlcyk7XG4gICAgICAgIC8vdGhpcy5zdWNjZXNzUm9sZU1hcHBpbmcuZW1pdCh0aGlzLnJvbGVNYXBwaW5nRm9ybSlcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvLyBIYW5kbGUgNDA5IENvbmZsaWN0IGhlcmVcbiAgICAgICAgLy8gYWxlcnQoJ0NvbmZsaWN0IGRldGVjdGVkOiBUaGUgcmVzb3VyY2UgYWxyZWFkeSBleGlzdHMgb3IgYWN0aW9uIGNvbmZsaWN0cy4nKTtcbiAgICAgICAgLy90aGlzLmdldFxuICAgICAgICAvLyBPciB5b3UgY2FuIHNldCBhIFVJIGVycm9yIG1lc3NhZ2UgdmFyaWFibGVcblxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAvL3RoaXMuYWxyZWFkeUF2YWlsYWJsZVJvbGVNYXBwaW5nLmVtaXQodGhpcy5yb2xlTWFwcGluZ0Zvcm0pXG4gICAgICB9XG5cblxuICAgIH0pXG4gIH1cblxuICBnZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZTogc3RyaW5nLCBpbmRleCk6IGFueVtdIHtcbiAgICBjb25zdCBjb3Vyc2UgPSB0aGlzLmZpbHRlcmRDb3Vyc2VzW2luZGV4XTtcbiAgICBpZiAoIWNvdXJzZSkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvdXJzZSBmb3VuZCBhdCBpbmRleCAke2luZGV4fWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBcbiAgICAvLyBIYW5kbGUgZGlmZmVyZW50IGNvbXBldGVuY3kgcHJvcGVydHkgbmFtZXNcbiAgICAvLyBBSSBSZWNvbW1lbmRlZCAmIFB1YmxpYyBjb3Vyc2VzIHVzZSAnY29tcGV0ZW5jaWVzJ1xuICAgIC8vIE1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgY291cnNlcyB1c2UgJ2NvbXBldGVuY2llc192NidcbiAgICAvLyBVc2VyIEFkZGVkIGNvdXJzZXMgdXNlICdjb21wZXRlbmNpZXMnXG4gICAgbGV0IGNvbXBldGVuY2llcyA9IFtdO1xuICAgIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llcykpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXM7XG4vLyAgICAgIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXMnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIGlmIChjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2ICYmIEFycmF5LmlzQXJyYXkoY291cnNlLmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIGNvbXBldGVuY2llcyA9IGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgLy8gIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIHVzaW5nICdjb21wZXRlbmNpZXNfdjYnIHByb3BlcnR5OmAsIGNvbXBldGVuY2llcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtpbmRleH0gKCR7Y291cnNlLmNvdXJzZV90eXBlIHx8IGNvdXJzZS5uYW1lIHx8ICdVbmtub3duJ30pIGhhcyBubyB2YWxpZCBjb21wZXRlbmNpZXMgcHJvcGVydHk6YCwge1xuICAgICAgLy8gICBoYXNDb21wZXRlbmNpZXM6ICEhY291cnNlLmNvbXBldGVuY2llcyxcbiAgICAgIC8vICAgY29tcGV0ZW5jaWVzVHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXMsXG4gICAgICAvLyAgIGhhc0NvbXBldGVuY2llc1Y2OiAhIWNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvbXBldGVuY2llc1Y2VHlwZTogdHlwZW9mIGNvdXJzZS5jb21wZXRlbmNpZXNfdjYsXG4gICAgICAvLyAgIGNvdXJzZUtleXM6IE9iamVjdC5rZXlzKGNvdXJzZSlcbiAgICAgIC8vIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoY29tcGV0ZW5jaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvbXBldGVuY2llcyBmb3VuZCBmb3IgY291cnNlICR7aW5kZXh9IGFuZCB0eXBlICR7dHlwZX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgXG4gICAgLy8gTm9ybWFsaXplIHRoZSB0eXBlIGZvciBjb21wYXJpc29uIChjYXNlLWluc2Vuc2l0aXZlICsgaGFuZGxlIHNwZWxsaW5nIHZhcmlhdGlvbnMpXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0eXBlLnRvTG93ZXJDYXNlKCkudHJpbSgpO1xuICAgIFxuICAgIGNvbnN0IG1hdGNoZWRDb21wZXRlbmNpZXMgPSBjb21wZXRlbmNpZXMuZmlsdGVyKGMgPT4ge1xuICAgICAgaWYgKCFjIHx8ICFjLmNvbXBldGVuY3lBcmVhTmFtZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgSW52YWxpZCBjb21wZXRlbmN5IHN0cnVjdHVyZSBpbiBjb3Vyc2UgJHtpbmRleH06YCwgYyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY29tcGV0ZW5jeUFyZWEgPSBjLmNvbXBldGVuY3lBcmVhTmFtZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgIFxuICAgICAgLy8gSGFuZGxlIGJvdGggXCJiZWhhdmlvcmFsXCIgYW5kIFwiYmVoYXZpb3VyYWxcIiBzcGVsbGluZ3NcbiAgICAgIGlmIChub3JtYWxpemVkVHlwZSA9PT0gJ2JlaGF2aW91cmFsJyB8fCBub3JtYWxpemVkVHlwZSA9PT0gJ2JlaGF2aW9yYWwnKSB7XG4gICAgICAgIHJldHVybiBjb21wZXRlbmN5QXJlYSA9PT0gJ2JlaGF2aW9yYWwnIHx8IGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3VyYWwnO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBGb3Igb3RoZXIgdHlwZXMsIGRvIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIGNvbXBldGVuY3lBcmVhID09PSBub3JtYWxpemVkVHlwZTtcbiAgICB9KTtcbiAgICBcbi8vICAgIGNvbnNvbGUubG9nKGBGb3VuZCAke21hdGNoZWRDb21wZXRlbmNpZXMubGVuZ3RofSBjb21wZXRlbmNpZXMgb2YgdHlwZSAke3R5cGV9IGZvciBjb3Vyc2UgJHtpbmRleH06YCwgbWF0Y2hlZENvbXBldGVuY2llcyk7XG4gICAgcmV0dXJuIG1hdGNoZWRDb21wZXRlbmNpZXM7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG5cbiAgICBpZiAodGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldKSB7XG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuc2xpY2UoMCwgMik7XG4gIH1cblxuICB0b2dnbGVDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSA9ICF0aGlzLmV4cGFuZGVkQ29tcGV0ZW5jaWVzW2tleV07XG4gIH1cblxuICBpc0V4cGFuZGVkKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtleSA9IGAke2luZGV4fS0ke3R5cGV9YDtcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldIHx8IGZhbHNlO1xuICB9XG5cbiAgaGFzTW9yZVRoYW5Ud28odHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KS5sZW5ndGggPiAyO1xuICB9XG5cbiAgZ2V0UmVtYWluaW5nQ291bnQodHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0b3RhbENvdW50ID0gdGhpcy5nZXRDb21wZXRlbmNpZXNCeVR5cGUodHlwZSwgaW5kZXgpLmxlbmd0aDtcbiAgICByZXR1cm4gdG90YWxDb3VudCAtIDI7XG4gIH1cblxuXG59XG4iLCI8ZGl2IGNsYXNzPVwic2VjdGlvbi1jb250YWluZXIgbXQtMlwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci10b3RhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2lkZS1sYXllclwiPlxuICAgICAgICAgICAgICAgIFRvdGFsIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8udG90YWx9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwib3V0c2lkZS1sYXllci10b3RhbFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluc2lkZS1sYXllclwiPlxuICAgICAgICAgICAgICAgIGlHT1QgUGxhdGZvcm0gQ291cnNlc1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICB7e2NvbXBldGVuY2llc0NvdW50Py5pZ290fX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBQdWJsaWMgQ291cnNlc1xuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRcIj5cbiAgICAgICAgICAgICAgICB7e2NvbXBldGVuY2llc0NvdW50Py5wdWJsaWNfY291cnNlc319XG5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJteS00XCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJkQ291cnNlcztsZXQgaT1pbmRleFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2VkLWNvdXJzZS1jb250YWluZXJcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2NvdXJzZS5zdmdcIj48L3NwYW4+Jm5ic3A7PHNwYW4+Q291cnNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZSAmJiAhaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlbi10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFJIFJlY29tbWVuZGVkIC0gaUdPVCA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb25bMF19fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LnJhdGlvbmFsZSAmJiBpdGVtPy5pc19wdWJsaWNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1wdWJsaWMtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIFB1YmxpYyA8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ucGxhdGZvcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgW2hyZWZdPVwiaXRlbT8ucHVibGljX2xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj48c3Bhbj5QbGF0Zm9ybSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtPy5wbGF0Zm9ybX19PC9zcGFuPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UgbXQtMlwiICpuZ0lmPVwiaXRlbT8ub3JnYW5pc2F0aW9uPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPlByb3ZpZGVyIC0ge3tpdGVtPy5vcmdhbmlzYXRpb25bMF19fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpdGVtPy5yYXRpb25hbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JheS10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPk1hbnVhbGx5IFN1Z2dlc3RlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS10aXRsZSBtdC00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbT8uY291cnNlXCI+e3tpdGVtPy5jb3Vyc2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/Lm5hbWVcIj57e2l0ZW0/Lm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2MgbXQtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj57e2l0ZW0/LnJhdGlvbmFsZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0JlaGF2aW91cmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+QmVoYXZpb3JhbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImJlaGF2aW91cmFsLXBpbGxcIiAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0JlaGF2aW91cmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0JlaGF2aW91cmFsJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnQmVoYXZpb3VyYWwnLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0JlaGF2aW91cmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0JlaGF2aW91cmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0Z1bmN0aW9uYWwnLGkpPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY3ktc3ViLWhlYWRpbmdcIj5GdW5jdGlvbmFsIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZnVuY3Rpb25hbC1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29tcGV0ZW5jeS10ZXh0XCI+IHt7IGNvbXAuY29tcGV0ZW5jeVRoZW1lTmFtZSB9fSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAuY29tcGV0ZW5jeVN1YlRoZW1lTmFtZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0lmPVwiaGFzTW9yZVRoYW5Ud28oJ0Z1bmN0aW9uYWwnLGkpXCIgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdGdW5jdGlvbmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdGdW5jdGlvbmFsJyxpKSA/ICdTaG93IExlc3MnIDogJysnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nQ291bnQoJ0Z1bmN0aW9uYWwnLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIiAqbmdJZj1cImdldENvbXBldGVuY2llc0J5VHlwZSgnRG9tYWluJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RG9tYWluIENvbXBldGVuY2llczwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjb21wZXRlbmN5LWxpc3QgbXQtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiZG9tYWluLXBpbGxcIiAqbmdGb3I9XCJsZXQgY29tcCBvZiBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXMoJ0RvbWFpbicsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdEb21haW4nLGkpXCIgY2xhc3M9XCJzaG93LW1vcmUtY29tcGV0ZW5jeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1tb3JlLWxpbmsgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGlzRXhwYW5kZWQoJ0RvbWFpbicsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdEb21haW4nLGkpICsgJyBNb3JlJyB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIiAqbmdJZj1cIml0ZW0/LnJlbGV2YW5jeVwiPnt7aXRlbT8ucmVsZXZhbmN5fX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiICpuZ0lmPVwiIWl0ZW0/LnJlbGV2YW5jeVwiPk4vQTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jaWVzLW1hdGNoZWQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkXCI+Q29tcGV0ZW5jaWVzIE1hdGNoZWQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPjgwJTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiY291cnNlLWxpc3QtaXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsLXRleHRcIj5Db3Vyc2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS10aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pk1hdGVybmFsLCBJbmZhbnQgQW5kIFlvdW5nIENoaWxkIE51dHJpdGlvbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWRlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5UaGlzIENvdXJzZSBkaXJlY3RseSBhZGRyZXNzZXMgYSBwcmltYXJ5IHJlc3BvbnNpYmlsaXR5IG9mIEFuZ2Fud2FuZGkgQ2FyZSB0YWtlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgYW5kIGVkdWNhdGUgb24gbnV0cml0aW9uIGZvciBtb3RoZXIgYW5kIHlvdW5nIGNoaWxkcmVuPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3lcIj5SZWxldmFuY3k8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZVwiPjkwJTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZFwiPkNvbXBldGVuY2llcyBNYXRjaGVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj44MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|
|
446
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUF3QnpELE1BQU0sT0FBTyxxQ0FBcUM7SUF1QmhELFlBQ1UsYUFBNEIsRUFDNUIsTUFBaUIsRUFDakIsUUFBcUI7UUFGckIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBdEIvQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUczQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBQzNCLHdCQUFtQixHQUFVLEVBQUUsQ0FBQztRQUVoQyxzQkFBaUIsR0FBRztZQUNsQixLQUFLLEVBQUUsQ0FBQztZQUNSLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQztRQUVGLHlCQUFvQixHQUErQixFQUFFLENBQUM7UUFFdEQsc0RBQXNEO1FBQ3RELHFCQUFnQixHQUE2QyxFQUFF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QUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQztZQUM1QixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNqRCxDQUFDO0lBRUQsY0FBYyxDQUFDLElBQVksRUFBRSxLQUFhO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxJQUFZLEVBQUUsS0FBYTtRQUMzQyxNQUFNLFVBQVUsR0FDZCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUVqRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDOytHQWhrQlUscUNBQXFDO21HQUFyQyxxQ0FBcUMsNkdDeEJsRCxtcWFBMFBNOzs0RkRsT08scUNBQXFDO2tCQUxqRCxTQUFTOytCQUNFLHFDQUFxQztzSkFNdEMsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5cbnR5cGUgR2FwU3RhdHVzID0gJ0ZVTEwnIHwgJ1BBUlRJQUwnIHwgJ05PX01BVENIJztcblxuaW50ZXJmYWNlIEdhcEFuYWx5c2lzUmVzdWx0IHtcbiAgYXJlYTogc3RyaW5nO1xuICB0aGVtZTogc3RyaW5nO1xuICBzdWJ0aGVtZTogc3RyaW5nO1xuICBwcm9maWNpZW5jeUxldmVsOiBzdHJpbmc7XG4gIGN1cnJlbnRMZXZlbDogc3RyaW5nO1xuICByZXF1aXJlZExldmVsOiBzdHJpbmc7XG4gIGNvdXJzZUxldmVsOiBzdHJpbmc7XG4gIHN0YXR1czogR2FwU3RhdHVzO1xuICByZWFzb246IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWdhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBHYXBBbmFseXNpc1JlY29tbWVuZGVkQ291cnNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwbGFuRGF0YTogYW55O1xuXG4gIGxvYWRpbmcgPSBmYWxzZTtcbiAgcmVjb21tZW5kZWRfY291cnNlX2lkID0gJyc7XG4gIGNicFBsYW5EYXRhOiBhbnk7XG5cbiAgc2VhcmNoVGV4dCA9ICcnO1xuICBmaWx0ZXJkQ291cnNlczogYW55W10gPSBbXTtcbiAgc2VsZWN0RmlsdGVyQ291cnNlczogYW55W10gPSBbXTtcblxuICBjb21wZXRlbmNpZXNDb3VudCA9IHtcbiAgICB0b3RhbDogMCxcbiAgICBwdWJsaWNfY291cnNlczogMCxcbiAgICBpZ290OiAwXG4gIH07XG5cbiAgZXhwYW5kZWRDb21wZXRlbmNpZXM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG5cbiAgLy8gR2FwIHJlc3VsdHMgZm9yIGVhY2ggY291cnNlLCBrZXllZCBieSBjb3Vyc2UgaW5kZXguXG4gIGNvdXJzZUdhcFJlc3VsdHM6IHsgW2luZGV4OiBudW1iZXJdOiBHYXBBbmFseXNpc1Jlc3VsdFtdIH0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhclxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNicFBsYW5EYXRhID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iajtcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSZWNvbW1lbmRlZENvdXJzZSh0aGlzLnBsYW5EYXRhLmlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGVkX2NvdXJzZV9pZCA9IHJlcz8uaWQgfHwgJyc7XG5cbiAgICAgICAgY29uc3QgYWxsQ291cnNlczogYW55W10gPSBbXTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXM/LmZpbHRlcmVkX2NvdXJzZXMpKSB7XG4gICAgICAgICAgcmVzLmZpbHRlcmVkX2NvdXJzZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBSZWxldmFuY3kgcmVtYWlucyB0aGUgaW5pdGlhbCBjb3Vyc2UgcmVjb21tZW5kYXRpb24gZmlsdGVyLlxuICAgICAgICAgICAgLy8gR2FwIGFuYWx5c2lzIGlzIHBlcmZvcm1lZCBzZXBhcmF0ZWx5IHVzaW5nIEFyZWEgKyBUaGVtZSArXG4gICAgICAgICAgICAvLyBTdWJ0aGVtZSArIGNvdXJzZV9sZXZlbC5cbiAgICAgICAgICAgIGlmIChOdW1iZXIoaXRlbT8ucmVsZXZhbmN5IHx8IDApID4gNzUpIHtcbiAgICAgICAgICAgICAgYWxsQ291cnNlcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcyA9IGFsbENvdXJzZXM7XG5cbiAgICAgICAgdGhpcy51cGRhdGVDb21wZXRlbmN5Q291bnRzKCk7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlQWxsQ291cnNlR2FwcygpO1xuICAgICAgICB0aGlzLmdldFVzZXJDb3Vyc2UoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXG4gICAgICAgICAgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VuYWJsZSB0byBsb2FkIHJlY29tbWVuZGVkIGNvdXJzZXMuJyxcbiAgICAgICAgICAnWCcsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLWVycm9yJ11cbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVDb21wZXRlbmN5Q291bnRzKCk6IHZvaWQge1xuICAgIHRoaXMuY29tcGV0ZW5jaWVzQ291bnQgPSB7XG4gICAgICB0b3RhbDogdGhpcy5maWx0ZXJkQ291cnNlcy5sZW5ndGgsXG4gICAgICBwdWJsaWNfY291cnNlczogdGhpcy5maWx0ZXJkQ291cnNlcy5maWx0ZXIoYyA9PiBjPy5pc19wdWJsaWMpLmxlbmd0aCxcbiAgICAgIGlnb3Q6IHRoaXMuZmlsdGVyZENvdXJzZXMuZmlsdGVyKGMgPT4gIWM/LmlzX3B1YmxpYykubGVuZ3RoXG4gICAgfTtcbiAgfVxuXG4gIGdldFVzZXJDb3Vyc2UoKTogdm9pZCB7XG4gICAgY29uc3Qgcm9sZV9tYXBwaW5nX2lkID0gdGhpcy5wbGFuRGF0YS5pZDtcblxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0VXNlckNvdXJzZShyb2xlX21hcHBpbmdfaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcykgJiYgcmVzLmxlbmd0aCkge1xuICAgICAgICAgIHJlcy5mb3JFYWNoKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5maWx0ZXJkQ291cnNlcy5wdXNoKGNvdXJzZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk7XG5cbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgJ2ZpbHRlcmRDb3Vyc2VzIGFmdGVyIGFkZGluZyB1c2VyIGNvdXJzZXM6JyxcbiAgICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3InLCBlcnJvcik7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29tcGV0ZW5jaWVzIGZyb20gZWl0aGVyIGNvbXBldGVuY2llcyBvciBjb21wZXRlbmNpZXNfdjYuXG4gICAqL1xuICBnZXRDb3Vyc2VDb21wZXRlbmNpZXMoY291cnNlOiBhbnkpOiBhbnlbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY291cnNlPy5jb21wZXRlbmNpZXMpKSB7XG4gICAgICByZXR1cm4gY291cnNlLmNvbXBldGVuY2llcztcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb3Vyc2U/LmNvbXBldGVuY2llc192NikpIHtcbiAgICAgIHJldHVybiBjb3Vyc2UuY29tcGV0ZW5jaWVzX3Y2O1xuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIG5vcm1hbGl6ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlID8/ICcnKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgZmlyc3QgYXZhaWxhYmxlIHZhbHVlIGZyb20gdGhlIHN1cHBsaWVkIGtleXMuXG4gICAqL1xuICBnZXRWYWx1ZShvYmplY3Q6IGFueSwga2V5czogc3RyaW5nW10pOiBhbnkge1xuICAgIGlmICghb2JqZWN0KSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKFxuICAgICAgICBvYmplY3Rba2V5XSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIG9iamVjdFtrZXldICE9PSBudWxsICYmXG4gICAgICAgIFN0cmluZyhvYmplY3Rba2V5XSkudHJpbSgpICE9PSAnJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Rba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBnZXRDb21wZXRlbmN5QXJlYShjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjb21wZXRlbmN5QXJlYU5hbWUnLFxuICAgICAgJ2FyZWEnLFxuICAgICAgJ2NvbXBldGVuY3lfYXJlYScsXG4gICAgICAnY29tcGV0ZW5jeUFyZWEnXG4gICAgXSk7XG4gIH1cblxuICBnZXRDb21wZXRlbmN5VGhlbWUoY29tcGV0ZW5jeTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbXG4gICAgICAnY29tcGV0ZW5jeVRoZW1lTmFtZScsXG4gICAgICAndGhlbWUnLFxuICAgICAgJ2NvbXBldGVuY3lfdGhlbWUnLFxuICAgICAgJ2NvbXBldGVuY3lUaGVtZSdcbiAgICBdKTtcbiAgfVxuXG4gIGdldENvbXBldGVuY3lTdWJ0aGVtZShjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjb21wZXRlbmN5U3VidGhlbWVOYW1lJyxcbiAgICAgICdzdWJ0aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeV9zdWJ0aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeVN1YnRoZW1lJ1xuICAgIF0pO1xuICB9XG5cbiAgZ2V0UHJvZmljaWVuY3lMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdwcm9maWNpZW5jeV9sZXZlbCcsXG4gICAgICAncHJvZmljaWVuY3lMZXZlbCcsXG4gICAgICAncmVxdWlyZWRQcm9maWNpZW5jeScsXG4gICAgICAncmVxdWlyZWRfcHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRQcm9maWNpZW5jeScsXG4gICAgICAnY3VycmVudF9wcm9maWNpZW5jeSdcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJTVBPUlRBTlQ6XG4gICAqIGNvdXJzZV9sZXZlbCBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBTVE8gbGV2ZWwgb2YgYSBjb3Vyc2UuXG4gICAqL1xuICBnZXRDb3Vyc2VMZXZlbChjb3Vyc2U6IGFueSwgY29tcGV0ZW5jeT86IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoY291cnNlLCBbJ2NvdXJzZV9sZXZlbCddKSB8fFxuICAgICAgdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbJ2NvdXJzZV9sZXZlbCddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyByb2xlIGNvbXBldGVuY3kgZGF0YSBmcm9tIHBsYW5EYXRhIC8gY2JwUGxhbkRhdGEuXG4gICAqL1xuICBnZXRSZXF1aXJlZENvbXBldGVuY2llcygpOiBhbnlbXSB7XG4gICAgY29uc3QgcG9zc2libGVTb3VyY2VzID0gW1xuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jeSxcbiAgICAgIHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY3lfZGF0YSxcbiAgICAgIHRoaXMucGxhbkRhdGE/LnJvbGVfY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5wbGFuRGF0YT8uY29tcGV0ZW5jaWVzX3Y2LFxuICAgICAgdGhpcy5jYnBQbGFuRGF0YT8uY29tcGV0ZW5jaWVzLFxuICAgICAgdGhpcy5jYnBQbGFuRGF0YT8uY29tcGV0ZW5jeSxcbiAgICAgIHRoaXMuY2JwUGxhbkRhdGE/LnJvbGVfY29tcGV0ZW5jaWVzXG4gICAgXTtcblxuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHBvc3NpYmxlU291cmNlcykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSAmJiBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgZ2V0UmVxdWlyZWRMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdyZXF1aXJlZFByb2ZpY2llbmN5JyxcbiAgICAgICdyZXF1aXJlZF9wcm9maWNpZW5jeScsXG4gICAgICAncmVxdWlyZWRMZXZlbCcsXG4gICAgICAncmVxdWlyZWRfbGV2ZWwnLFxuICAgICAgJ3Byb2ZpY2llbmN5TGV2ZWwnLFxuICAgICAgJ3Byb2ZpY2llbmN5X2xldmVsJyxcbiAgICAgICdsZXZlbCcsXG4gICAgICAnc3RvTGV2ZWwnLFxuICAgICAgJ3N0b19sZXZlbCdcbiAgICBdKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRMZXZlbChjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjdXJyZW50UHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRfcHJvZmljaWVuY3knLFxuICAgICAgJ2N1cnJlbnRMZXZlbCcsXG4gICAgICAnY3VycmVudF9sZXZlbCcsXG4gICAgICAnY3VycmVudFByb2ZpY2llbmN5TGV2ZWwnLFxuICAgICAgJ2N1cnJlbnRfcHJvZmljaWVuY3lfbGV2ZWwnXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogU1RPIGhpZXJhcmNoeTpcbiAgICogT3BlcmF0aW9uYWwgPCBUYWN0aWNhbCA8IFN0cmF0ZWdpY1xuICAgKi9cbiAgZ2V0TGV2ZWxSYW5rKGxldmVsOiBhbnkpOiBudW1iZXIge1xuICAgIHN3aXRjaCAodGhpcy5ub3JtYWxpemUobGV2ZWwpKSB7XG4gICAgICBjYXNlICdvcGVyYXRpb25hbCc6XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgY2FzZSAndGFjdGljYWwnOlxuICAgICAgICByZXR1cm4gMjtcbiAgICAgIGNhc2UgJ3N0cmF0ZWdpYyc6XG4gICAgICAgIHJldHVybiAzO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hdGNoIGNvdXJzZSBjb21wZXRlbmN5IHRvIHJvbGUgY29tcGV0ZW5jeSB1c2luZzpcbiAgICogQXJlYSAtPiBUaGVtZSAtPiBTdWJ0aGVtZVxuICAgKlxuICAgKiBUaGVuIGNvbXBhcmUgdGhlIGNvdXJzZSdzIGNvdXJzZV9sZXZlbCB3aXRoIHRoZSByZXF1aXJlZCBsZXZlbC5cbiAgICovXG4gIGNhbGN1bGF0ZUNvdXJzZUdhcHMoY291cnNlOiBhbnkpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICBjb25zdCByZXF1aXJlZENvbXBldGVuY2llcyA9IHRoaXMuZ2V0UmVxdWlyZWRDb21wZXRlbmNpZXMoKTtcblxuICAgIGlmICghcmVxdWlyZWRDb21wZXRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgY291cnNlQ29tcGV0ZW5jaWVzID0gdGhpcy5nZXRDb3Vyc2VDb21wZXRlbmNpZXMoY291cnNlKTtcbiAgICBjb25zdCByZXN1bHRzOiBHYXBBbmFseXNpc1Jlc3VsdFtdID0gW107XG5cbiAgICBjb3Vyc2VDb21wZXRlbmNpZXMuZm9yRWFjaCgoY291cnNlQ29tcGV0ZW5jeTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjb3Vyc2VBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEoY291cnNlQ29tcGV0ZW5jeSlcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3Vyc2VUaGVtZSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lUaGVtZShjb3Vyc2VDb21wZXRlbmN5KVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGNvdXJzZVN1YnRoZW1lID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKGNvdXJzZUNvbXBldGVuY3kpXG4gICAgICApO1xuXG4gICAgICBpZiAoIWNvdXJzZVRoZW1lIHx8ICFjb3Vyc2VTdWJ0aGVtZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvdXJzZUxldmVsID0gdGhpcy5nZXRDb3Vyc2VMZXZlbChjb3Vyc2UsIGNvdXJzZUNvbXBldGVuY3kpO1xuXG4gICAgICByZXF1aXJlZENvbXBldGVuY2llcy5mb3JFYWNoKChyZXF1aXJlZENvbXBldGVuY3k6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcmVxdWlyZWRBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEocmVxdWlyZWRDb21wZXRlbmN5KVxuICAgICAgKTtcblxuICAgICAgY29uc3QgcmVxdWlyZWRUaGVtZSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lUaGVtZShyZXF1aXJlZENvbXBldGVuY3kpXG4gICAgICApO1xuXG4gICAgICBjb25zdCByZXF1aXJlZFN1YnRoZW1lID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKHJlcXVpcmVkQ29tcGV0ZW5jeSlcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkUHJvZmljaWVuY3lMZXZlbCA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldFByb2ZpY2llbmN5TGV2ZWwocmVxdWlyZWRDb21wZXRlbmN5KVxuICAgICAgKTtcblxuICAgICAgaWYgKCFyZXF1aXJlZFRoZW1lIHx8ICFyZXF1aXJlZFN1YnRoZW1lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY291cnNlUHJvZmljaWVuY3lMZXZlbCA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldFByb2ZpY2llbmN5TGV2ZWwoY291cnNlQ29tcGV0ZW5jeSlcbiAgICAgICk7XG5cbiAgICAgIC8qXG4gICAgICAqIE1hdGNoOlxuICAgICAgKiBBcmVhICsgVGhlbWUgKyBTdWJ0aGVtZSArIFByb2ZpY2llbmN5IExldmVsXG4gICAgICAqL1xuXG4gICAgICBjb25zdCBhcmVhTWF0Y2hlcyA9XG4gICAgICAgICFjb3Vyc2VBcmVhIHx8XG4gICAgICAgICFyZXF1aXJlZEFyZWEgfHxcbiAgICAgICAgY291cnNlQXJlYSA9PT0gcmVxdWlyZWRBcmVhO1xuXG4gICAgICBjb25zdCB0aGVtZU1hdGNoZXMgPVxuICAgICAgICBjb3Vyc2VUaGVtZSA9PT0gcmVxdWlyZWRUaGVtZTtcblxuICAgICAgY29uc3Qgc3VidGhlbWVNYXRjaGVzID1cbiAgICAgICAgY291cnNlU3VidGhlbWUgPT09IHJlcXVpcmVkU3VidGhlbWU7XG5cbiAgICAgIGNvbnN0IHByb2ZpY2llbmN5TGV2ZWxNYXRjaGVzID1cbiAgICAgICAgY291cnNlUHJvZmljaWVuY3lMZXZlbCA9PT0gcmVxdWlyZWRQcm9maWNpZW5jeUxldmVsO1xuXG4gICAgICAvKlxuICAgICAgKiBBbGwgNCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2guXG4gICAgICAqXG4gICAgICAqIElmIGFsbCA0IG1hdGNoOlxuICAgICAgKiAgICAgTk9UIHBhcnQgb2YgZ2FwXG4gICAgICAqXG4gICAgICAqIElmIGFueSBvbmUgZG9lcyBub3QgbWF0Y2g6XG4gICAgICAqICAgICBQQVJUIG9mIGdhcFxuICAgICAgKi9cbiAgICAgIGNvbnN0IGFsbEZvdXJNYXRjaCA9XG4gICAgICAgIGFyZWFNYXRjaGVzICYmXG4gICAgICAgIHRoZW1lTWF0Y2hlcyAmJlxuICAgICAgICBzdWJ0aGVtZU1hdGNoZXMgJiZcbiAgICAgICAgcHJvZmljaWVuY3lMZXZlbE1hdGNoZXM7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkTGV2ZWwgPSB0aGlzLmdldFJlcXVpcmVkTGV2ZWwocmVxdWlyZWRDb21wZXRlbmN5KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0Q3VycmVudExldmVsKHJlcXVpcmVkQ29tcGV0ZW5jeSk7XG5cbiAgICAgIGNvbnN0IHJlcXVpcmVkUmFuayA9IHRoaXMuZ2V0TGV2ZWxSYW5rKHJlcXVpcmVkTGV2ZWwpO1xuICAgICAgY29uc3QgY291cnNlUmFuayA9IHRoaXMuZ2V0TGV2ZWxSYW5rKGNvdXJzZUxldmVsKTtcblxuICAgICAgbGV0IHN0YXR1czogR2FwU3RhdHVzO1xuICAgICAgbGV0IHJlYXNvbjogc3RyaW5nO1xuXG4gICAgICBpZiAoYWxsRm91ck1hdGNoKSB7XG4gICAgICAgIC8qXG4gICAgICAgICogQWxsIGZvdXIgY29tcGV0ZW5jeSBhdHRyaWJ1dGVzIG1hdGNoLlxuICAgICAgICAqIFRoZXJlZm9yZSB0aGlzIGNvbXBldGVuY3kgaXMgTk9UIHBhcnQgb2YgdGhlIGdhcC5cbiAgICAgICAgKi9cbiAgICAgICAgc3RhdHVzID0gJ0ZVTEwnO1xuXG4gICAgICAgIHJlYXNvbiA9XG4gICAgICAgICAgJ0NvbXBldGVuY3kgQXJlYSwgVGhlbWUsIFN1YnRoZW1lIGFuZCBQcm9maWNpZW5jeSBMZXZlbCBhbGwgbWF0Y2guIFRoaXMgY29tcGV0ZW5jeSBpcyBub3QgcGFydCBvZiB0aGUgZ2FwLic7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qXG4gICAgICAgICogQXQgbGVhc3Qgb25lIG9mIHRoZSBmb3VyIGF0dHJpYnV0ZXMgZG9lcyBub3QgbWF0Y2guXG4gICAgICAgICogVGhlcmVmb3JlIHRoaXMgY29tcGV0ZW5jeSBpcyBwYXJ0IG9mIHRoZSBnYXAuXG4gICAgICAgICovXG5cbiAgICAgICAgY29uc3QgbWlzbWF0Y2hlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBpZiAoIWFyZWFNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdDb21wZXRlbmN5IEFyZWEnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhlbWVNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdUaGVtZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFzdWJ0aGVtZU1hdGNoZXMpIHtcbiAgICAgICAgICBtaXNtYXRjaGVzLnB1c2goJ1N1YnRoZW1lJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2ZpY2llbmN5TGV2ZWxNYXRjaGVzKSB7XG4gICAgICAgICAgbWlzbWF0Y2hlcy5wdXNoKCdQcm9maWNpZW5jeSBMZXZlbCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdHVzID0gJ05PX01BVENIJztcblxuICAgICAgICByZWFzb24gPVxuICAgICAgICAgIGAke21pc21hdGNoZXMuam9pbignLCAnKX0gJHttaXNtYXRjaGVzLmxlbmd0aCA9PT0gMSA/ICdkb2VzJyA6ICdkbyd9IG5vdCBtYXRjaC4gVGhpcyBjb21wZXRlbmN5IGlzIHBhcnQgb2YgdGhlIGdhcC5gO1xuICAgICAgfVxuXG4gICAgICByZXN1bHRzLnB1c2goe1xuICAgICAgICBhcmVhOiB0aGlzLmdldENvbXBldGVuY3lBcmVhKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgIHRoZW1lOiB0aGlzLmdldENvbXBldGVuY3lUaGVtZShyZXF1aXJlZENvbXBldGVuY3kpLFxuICAgICAgICBzdWJ0aGVtZTogdGhpcy5nZXRDb21wZXRlbmN5U3VidGhlbWUocmVxdWlyZWRDb21wZXRlbmN5KSxcbiAgICAgICAgcHJvZmljaWVuY3lMZXZlbDogdGhpcy5nZXRQcm9maWNpZW5jeUxldmVsKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgIGN1cnJlbnRMZXZlbCxcbiAgICAgICAgcmVxdWlyZWRMZXZlbCxcbiAgICAgICAgY291cnNlTGV2ZWwsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgICAgcmVhc29uXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLnJlbW92ZUR1cGxpY2F0ZUdhcFJlc3VsdHMocmVzdWx0cyk7XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVHYXBSZXN1bHRzKFxuICAgIHJlc3VsdHM6IEdhcEFuYWx5c2lzUmVzdWx0W11cbiAgKTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIEdhcEFuYWx5c2lzUmVzdWx0PigpO1xuXG4gICAgcmVzdWx0cy5mb3JFYWNoKHJlc3VsdCA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBbXG4gICAgICAgIHRoaXMubm9ybWFsaXplKHJlc3VsdC5hcmVhKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnRoZW1lKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnN1YnRoZW1lKSxcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LnByb2ZpY2llbmN5TGV2ZWwpLFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZShyZXN1bHQucmVxdWlyZWRMZXZlbCksXG4gICAgICAgIHRoaXMubm9ybWFsaXplKHJlc3VsdC5jb3Vyc2VMZXZlbClcbiAgICAgIF0uam9pbignfCcpO1xuXG4gICAgICBpZiAoIXVuaXF1ZS5oYXMoa2V5KSkge1xuICAgICAgICB1bmlxdWUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSk7XG4gIH1cblxuICBjYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY291cnNlR2FwUmVzdWx0cyA9IHt9O1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcy5mb3JFYWNoKChjb3Vyc2UsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLmNvdXJzZUdhcFJlc3VsdHNbaW5kZXhdID0gdGhpcy5jYWxjdWxhdGVDb3Vyc2VHYXBzKGNvdXJzZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb3Vyc2VHYXBSZXN1bHRzW2luZGV4XSB8fCBbXTtcbiAgfVxuXG4gIGdldEZ1bGxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ0ZVTEwnKTtcbiAgfVxuXG4gIGdldFBhcnRpYWxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ1BBUlRJQUwnKTtcbiAgfVxuXG4gIGdldE5vTWF0Y2hlcyhpbmRleDogbnVtYmVyKTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q291cnNlR2FwUmVzdWx0cyhpbmRleClcbiAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdOT19NQVRDSCcpO1xuICB9XG5cbiAgaGFzR2FwTWF0Y2goaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvdXJzZUdhcFJlc3VsdHMoaW5kZXgpLnNvbWUoXG4gICAgICByZXN1bHQgPT5cbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9PT0gJ0ZVTEwnIHx8XG4gICAgICAgIHJlc3VsdC5zdGF0dXMgPT09ICdQQVJUSUFMJ1xuICAgICk7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBTdGF0dXMoaW5kZXg6IG51bWJlcik6IEdhcFN0YXR1cyB7XG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ2V0Q291cnNlR2FwUmVzdWx0cyhpbmRleCk7XG5cbiAgICBpZiAocmVzdWx0cy5zb21lKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnRlVMTCcpKSB7XG4gICAgICByZXR1cm4gJ0ZVTEwnO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHRzLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdQQVJUSUFMJykpIHtcbiAgICAgIHJldHVybiAnUEFSVElBTCc7XG4gICAgfVxuXG4gICAgcmV0dXJuICdOT19NQVRDSCc7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBTdGF0dXNMYWJlbChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuZ2V0Q291cnNlR2FwU3RhdHVzKGluZGV4KSkge1xuICAgICAgY2FzZSAnRlVMTCc6XG4gICAgICAgIHJldHVybiAnRnVsbCBHYXAgTWF0Y2gnO1xuICAgICAgY2FzZSAnUEFSVElBTCc6XG4gICAgICAgIHJldHVybiAnUGFydGlhbCBHYXAgTWF0Y2gnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdObyBHYXAgTWF0Y2gnO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBhbnlbXSB7XG4gICAgY29uc3QgY291cnNlID0gdGhpcy5maWx0ZXJkQ291cnNlc1tpbmRleF07XG5cbiAgICBpZiAoIWNvdXJzZSkge1xuICAgICAgY29uc29sZS5sb2coYE5vIGNvdXJzZSBmb3VuZCBhdCBpbmRleCAke2luZGV4fWApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q291cnNlQ29tcGV0ZW5jaWVzKGNvdXJzZSk7XG5cbiAgICBpZiAoIWNvbXBldGVuY2llcy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBObyBjb21wZXRlbmNpZXMgZm91bmQgZm9yIGNvdXJzZSAke2luZGV4fSBhbmQgdHlwZSAke3R5cGV9YCk7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFR5cGUgPSB0aGlzLm5vcm1hbGl6ZSh0eXBlKTtcblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuZmlsdGVyKChjOiBhbnkpID0+IHtcbiAgICAgIGlmICghYyB8fCAhdGhpcy5nZXRDb21wZXRlbmN5QXJlYShjKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBldGVuY3lBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgIHRoaXMuZ2V0Q29tcGV0ZW5jeUFyZWEoYylcbiAgICAgICk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgbm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvdXJhbCcgfHxcbiAgICAgICAgbm9ybWFsaXplZFR5cGUgPT09ICdiZWhhdmlvcmFsJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY29tcGV0ZW5jeUFyZWEgPT09ICdiZWhhdmlvcmFsJyB8fFxuICAgICAgICAgIGNvbXBldGVuY3lBcmVhID09PSAnYmVoYXZpb3VyYWwnXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb21wZXRlbmN5QXJlYSA9PT0gbm9ybWFsaXplZFR5cGU7XG4gICAgfSk7XG4gIH1cblxuICBnZXREaXNwbGF5ZWRDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogYW55W10ge1xuICAgIGNvbnN0IGNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKHR5cGUsIGluZGV4KTtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG5cbiAgICBpZiAodGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldKSB7XG4gICAgICByZXR1cm4gY29tcGV0ZW5jaWVzO1xuICAgIH1cblxuICAgIHJldHVybiBjb21wZXRlbmNpZXMuc2xpY2UoMCwgMik7XG4gIH1cblxuICB0b2dnbGVDb21wZXRlbmNpZXModHlwZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gYCR7aW5kZXh9LSR7dHlwZX1gO1xuICAgIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSA9XG4gICAgICAhdGhpcy5leHBhbmRlZENvbXBldGVuY2llc1trZXldO1xuICB9XG5cbiAgaXNFeHBhbmRlZCh0eXBlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBrZXkgPSBgJHtpbmRleH0tJHt0eXBlfWA7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRDb21wZXRlbmNpZXNba2V5XSB8fCBmYWxzZTtcbiAgfVxuXG4gIGhhc01vcmVUaGFuVHdvKHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoID4gMjtcbiAgfVxuXG4gIGdldFJlbWFpbmluZ0NvdW50KHR5cGU6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgdG90YWxDb3VudCA9XG4gICAgICB0aGlzLmdldENvbXBldGVuY2llc0J5VHlwZSh0eXBlLCBpbmRleCkubGVuZ3RoO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KHRvdGFsQ291bnQgLSAyLCAwKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInNlY3Rpb24tY29udGFpbmVyIG10LTJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBUb3RhbCBDb3Vyc2VzXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudFwiPlxuICAgICAgICAgICAgICAgIHt7Y29tcGV0ZW5jaWVzQ291bnQ/LnRvdGFsfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm91dHNpZGUtbGF5ZXItdG90YWxcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnNpZGUtbGF5ZXJcIj5cbiAgICAgICAgICAgICAgICBpR09UIFBsYXRmb3JtIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8uaWdvdH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvdXRzaWRlLWxheWVyLXRvdGFsXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5zaWRlLWxheWVyXCI+XG4gICAgICAgICAgICAgICAgUHVibGljIENvdXJzZXNcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50XCI+XG4gICAgICAgICAgICAgICAge3tjb21wZXRlbmNpZXNDb3VudD8ucHVibGljX2NvdXJzZXN9fVxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibXktNFwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZENvdXJzZXM7bGV0IGk9aW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291cnNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tlZC1jb3Vyc2UtY29udGFpbmVyXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9jb3Vyc2Uuc3ZnXCI+PC9zcGFuPiZuYnNwOzxzcGFuPkNvdXJzZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQ8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgIWl0ZW0/LmlzX3B1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1ncmVlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtZ3JlZW4tdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BSSBSZWNvbW1lbmRlZCAtIGlHT1QgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5yYXRpb25hbGUgJiYgaXRlbT8uaXNfcHVibGljXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXB1YmxpY1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtcHVibGljLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQgLSBQdWJsaWMgPC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/LnBsYXRmb3JtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIFtocmVmXT1cIml0ZW0/LnB1YmxpY19saW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4+UGxhdGZvcm0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbT8ucGxhdGZvcm19fTwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlIG10LTJcIiAqbmdJZj1cIml0ZW0/Lm9yZ2FuaXNhdGlvbj8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbC1vcmFuZ2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5Qcm92aWRlciAtIHt7aXRlbT8ub3JnYW5pc2F0aW9uWzBdfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXRlbT8ucmF0aW9uYWxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLWdyYXktdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWxvYWRlci1pY29uXCI+PGltZyBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NYW51YWxseSBTdWdnZXN0ZWQgLSBpR09UIDwvc3Bhbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5wbGF0Zm9ybVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL2FpLWxvYWRlci5naWZcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiBbaHJlZl09XCJpdGVtPy5wdWJsaWNfbGlua1wiIHRhcmdldD1cIl9ibGFua1wiPjxzcGFuPlBsYXRmb3JtIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0/LnBsYXRmb3JtfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLW9yYW5nZSBtdC0yXCIgKm5nSWY9XCJpdGVtPy5vcmdhbmlzYXRpb24/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1yZWNvbW1lbmVkLXBpbGwtb3JhbmdlLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1sb2FkZXItaWNvblwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJhc3NldHMvaWNvbnMvYWktbG9hZGVyLmdpZlwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UHJvdmlkZXIgLSB7e2l0ZW0/Lm9yZ2FuaXNhdGlvblswXX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGUgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0/LmNvdXJzZVwiPnt7aXRlbT8uY291cnNlfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtPy5uYW1lXCI+e3tpdGVtPy5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjIG10LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+e3tpdGVtPy5yYXRpb25hbGV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdCZWhhdmlvdXJhbCcsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImNvbXBldGVuY3ktbGlzdCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJiZWhhdmlvdXJhbC1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdCZWhhdmlvdXJhbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdCZWhhdmlvdXJhbCcsaSlcIiBjbGFzcz1cInNob3ctbW9yZS1jb21wZXRlbmN5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LW1vcmUtbGluayBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJ0b2dnbGVDb21wZXRlbmNpZXMoJ0JlaGF2aW91cmFsJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdCZWhhdmlvdXJhbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdCZWhhdmlvdXJhbCcsaSkgKyAnIE1vcmUnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMlwiICpuZ0lmPVwiZ2V0Q29tcGV0ZW5jaWVzQnlUeXBlKCdGdW5jdGlvbmFsJyxpKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmN5LXN1Yi1oZWFkaW5nXCI+RnVuY3Rpb25hbCBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZ1bmN0aW9uYWwtcGlsbFwiICpuZ0Zvcj1cImxldCBjb21wIG9mIGdldERpc3BsYXllZENvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbXBldGVuY3ktdGV4dFwiPiB7eyBjb21wLmNvbXBldGVuY3lUaGVtZU5hbWUgfX0gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLmNvbXBldGVuY3lTdWJUaGVtZU5hbWUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImhhc01vcmVUaGFuVHdvKCdGdW5jdGlvbmFsJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRnVuY3Rpb25hbCcsaSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgaXNFeHBhbmRlZCgnRnVuY3Rpb25hbCcsaSkgPyAnU2hvdyBMZXNzJyA6ICcrJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlbWFpbmluZ0NvdW50KCdGdW5jdGlvbmFsJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCIgKm5nSWY9XCJnZXRDb21wZXRlbmNpZXNCeVR5cGUoJ0RvbWFpbicsaSk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jeS1zdWItaGVhZGluZ1wiPkRvbWFpbiBDb21wZXRlbmNpZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiY29tcGV0ZW5jeS1saXN0IG10LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRvbWFpbi1waWxsXCIgKm5nRm9yPVwibGV0IGNvbXAgb2YgZ2V0RGlzcGxheWVkQ29tcGV0ZW5jaWVzKCdEb21haW4nLGkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb21wZXRlbmN5LXRleHRcIj4ge3sgY29tcC5jb21wZXRlbmN5VGhlbWVOYW1lIH19IC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5jb21wZXRlbmN5U3ViVGhlbWVOYW1lIH19IDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nSWY9XCJoYXNNb3JlVGhhblR3bygnRG9tYWluJyxpKVwiIGNsYXNzPVwic2hvdy1tb3JlLWNvbXBldGVuY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNob3ctbW9yZS1saW5rIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbXBldGVuY2llcygnRG9tYWluJyxpKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBpc0V4cGFuZGVkKCdEb21haW4nLGkpID8gJ1Nob3cgTGVzcycgOiAnKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZW1haW5pbmdDb3VudCgnRG9tYWluJyxpKSArICcgTW9yZScgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZWxldmFuY3ktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+UmVsZXZhbmN5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGFzaFwiPi08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCIgKm5nSWY9XCJpdGVtPy5yZWxldmFuY3lcIj57e2l0ZW0/LnJlbGV2YW5jeX19JTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIiAqbmdJZj1cIiFpdGVtPy5yZWxldmFuY3lcIj5OL0E8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBldGVuY2llcy1tYXRjaGVkLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZFwiPkNvbXBldGVuY2llcyBNYXRjaGVkPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj44MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvdXJzZS1saXN0LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1waWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtcGlsbC10ZXh0XCI+Q291cnNlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXJlY29tbWVuZWQtcGlsbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktcmVjb21tZW5lZC1waWxsLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktbG9hZGVyLWljb25cIj48aW1nIHNyYz1cImFzc2V0cy9pY29ucy9haS1sb2FkZXIuZ2lmXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+QUkgUmVjb21tZW5kZWQ8L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3Vyc2UtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5NYXRlcm5hbCwgSW5mYW50IEFuZCBZb3VuZyBDaGlsZCBOdXRyaXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdXJzZS1kZXNjXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+VGhpcyBDb3Vyc2UgZGlyZWN0bHkgYWRkcmVzc2VzIGEgcHJpbWFyeSByZXNwb25zaWJpbGl0eSBvZiBBbmdhbndhbmRpIENhcmUgdGFrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGljaCBpc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm92aWRlIGFuZCBlZHVjYXRlIG9uIG51dHJpdGlvbiBmb3IgbW90aGVyIGFuZCB5b3VuZyBjaGlsZHJlbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2YW5jeS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZhbmN5XCI+UmVsZXZhbmN5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhc2hcIj4tPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmNlbnRhZ2VcIj45MCU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wZXRlbmNpZXMtbWF0Y2hlZC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGV0ZW5jaWVzLW1hdGNoZWRcIj5Db21wZXRlbmNpZXMgTWF0Y2hlZDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXNoXCI+LTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlXCI+ODAlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
|