@sunbird-cb/cbp-ai 0.1.117 → 0.1.119
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 +313 -89
- package/esm2022/lib/components/generate-course-recommendation/generate-course-recommendation.component.mjs +3 -3
- 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-course-recommendation/view-course-recommendation.component.mjs +3 -3
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +2 -2
- package/fesm2022/sunbird-cb-cbp-ai.mjs +364 -108
- 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 +68 -6
- package/lib/components/gap-analysis-recommended-course/gap-analysis-recommended-course.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/sunbird-cb-cbp-ai-0.1.119.tgz +0 -0
- package/sunbird-cb-cbp-ai-0.1.117.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,326 @@ 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
|
+
/**
|
|
144
|
+
* IMPORTANT:
|
|
145
|
+
* course_level is the authoritative STO level of a course.
|
|
146
|
+
*/
|
|
147
|
+
getCourseLevel(course, competency) {
|
|
148
|
+
return this.getValue(course, ['course_level']) ||
|
|
149
|
+
this.getValue(competency, ['course_level']);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Finds role competency data from planData / cbpPlanData.
|
|
153
|
+
*/
|
|
154
|
+
getRequiredCompetencies() {
|
|
155
|
+
const possibleSources = [
|
|
156
|
+
this.planData?.competencies,
|
|
157
|
+
this.planData?.competency,
|
|
158
|
+
this.planData?.competency_data,
|
|
159
|
+
this.planData?.role_competencies,
|
|
160
|
+
this.planData?.competencies_v6,
|
|
161
|
+
this.cbpPlanData?.competencies,
|
|
162
|
+
this.cbpPlanData?.competency,
|
|
163
|
+
this.cbpPlanData?.role_competencies
|
|
164
|
+
];
|
|
165
|
+
for (const source of possibleSources) {
|
|
166
|
+
if (Array.isArray(source) && source.length) {
|
|
167
|
+
return source;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
getRequiredLevel(competency) {
|
|
173
|
+
return this.getValue(competency, [
|
|
174
|
+
'requiredProficiency',
|
|
175
|
+
'required_proficiency',
|
|
176
|
+
'requiredLevel',
|
|
177
|
+
'required_level',
|
|
178
|
+
'proficiencyLevel',
|
|
179
|
+
'proficiency_level',
|
|
180
|
+
'level',
|
|
181
|
+
'stoLevel',
|
|
182
|
+
'sto_level'
|
|
183
|
+
]);
|
|
184
|
+
}
|
|
185
|
+
getCurrentLevel(competency) {
|
|
186
|
+
return this.getValue(competency, [
|
|
187
|
+
'currentProficiency',
|
|
188
|
+
'current_proficiency',
|
|
189
|
+
'currentLevel',
|
|
190
|
+
'current_level',
|
|
191
|
+
'currentProficiencyLevel',
|
|
192
|
+
'current_proficiency_level'
|
|
193
|
+
]);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* STO hierarchy:
|
|
197
|
+
* Operational < Tactical < Strategic
|
|
198
|
+
*/
|
|
199
|
+
getLevelRank(level) {
|
|
200
|
+
switch (this.normalize(level)) {
|
|
201
|
+
case 'operational':
|
|
202
|
+
return 1;
|
|
203
|
+
case 'tactical':
|
|
204
|
+
return 2;
|
|
205
|
+
case 'strategic':
|
|
206
|
+
return 3;
|
|
207
|
+
default:
|
|
208
|
+
return 0;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Match course competency to role competency using:
|
|
213
|
+
* Area -> Theme -> Subtheme
|
|
214
|
+
*
|
|
215
|
+
* Then compare the course's course_level with the required level.
|
|
216
|
+
*/
|
|
217
|
+
calculateCourseGaps(course) {
|
|
218
|
+
const requiredCompetencies = this.getRequiredCompetencies();
|
|
219
|
+
if (!requiredCompetencies.length) {
|
|
220
|
+
return [];
|
|
221
|
+
}
|
|
222
|
+
const courseCompetencies = this.getCourseCompetencies(course);
|
|
223
|
+
const results = [];
|
|
224
|
+
courseCompetencies.forEach((courseCompetency) => {
|
|
225
|
+
const courseArea = this.normalize(this.getCompetencyArea(courseCompetency));
|
|
226
|
+
const courseTheme = this.normalize(this.getCompetencyTheme(courseCompetency));
|
|
227
|
+
const courseSubtheme = this.normalize(this.getCompetencySubtheme(courseCompetency));
|
|
228
|
+
if (!courseTheme || !courseSubtheme) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
const courseLevel = this.getCourseLevel(course, courseCompetency);
|
|
232
|
+
requiredCompetencies.forEach((requiredCompetency) => {
|
|
233
|
+
const requiredArea = this.normalize(this.getCompetencyArea(requiredCompetency));
|
|
234
|
+
const requiredTheme = this.normalize(this.getCompetencyTheme(requiredCompetency));
|
|
235
|
+
const requiredSubtheme = this.normalize(this.getCompetencySubtheme(requiredCompetency));
|
|
236
|
+
if (!requiredTheme || !requiredSubtheme) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
/*
|
|
240
|
+
* Area:
|
|
241
|
+
* If both course and role contain Area, they must match.
|
|
242
|
+
* If Area is absent on either side, Theme + Subtheme remain
|
|
243
|
+
* the matching keys.
|
|
244
|
+
*/
|
|
245
|
+
const areaMatches = !courseArea ||
|
|
246
|
+
!requiredArea ||
|
|
247
|
+
courseArea === requiredArea;
|
|
248
|
+
const themeMatches = courseTheme === requiredTheme;
|
|
249
|
+
const subthemeMatches = courseSubtheme === requiredSubtheme;
|
|
250
|
+
if (!areaMatches || !themeMatches || !subthemeMatches) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const requiredLevel = this.getRequiredLevel(requiredCompetency);
|
|
254
|
+
const currentLevel = this.getCurrentLevel(requiredCompetency);
|
|
255
|
+
const requiredRank = this.getLevelRank(requiredLevel);
|
|
256
|
+
const courseRank = this.getLevelRank(courseLevel);
|
|
257
|
+
let status;
|
|
258
|
+
let reason;
|
|
259
|
+
if (!courseLevel || !requiredLevel || !requiredRank || !courseRank) {
|
|
260
|
+
status = 'NO_MATCH';
|
|
261
|
+
reason =
|
|
262
|
+
'Area, Theme and Subtheme match, but the required level or course_level is missing or invalid.';
|
|
263
|
+
}
|
|
264
|
+
else if (courseRank >= requiredRank) {
|
|
265
|
+
status = 'FULL';
|
|
266
|
+
reason =
|
|
267
|
+
`Course covers the ${courseLevel} level, which meets or exceeds the required ${requiredLevel} level for this competency.`;
|
|
268
|
+
}
|
|
269
|
+
else if (courseRank === requiredRank - 1) {
|
|
270
|
+
status = 'PARTIAL';
|
|
271
|
+
reason =
|
|
272
|
+
`Course covers the ${courseLevel} level, which is one level below the required ${requiredLevel} level.`;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
status = 'NO_MATCH';
|
|
276
|
+
reason =
|
|
277
|
+
`Course covers the ${courseLevel} level, which is below the required ${requiredLevel} level.`;
|
|
278
|
+
}
|
|
279
|
+
results.push({
|
|
280
|
+
area: this.getCompetencyArea(requiredCompetency),
|
|
281
|
+
theme: this.getCompetencyTheme(requiredCompetency),
|
|
282
|
+
subtheme: this.getCompetencySubtheme(requiredCompetency),
|
|
283
|
+
currentLevel,
|
|
284
|
+
requiredLevel,
|
|
285
|
+
courseLevel,
|
|
286
|
+
status,
|
|
287
|
+
reason
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
return this.removeDuplicateGapResults(results);
|
|
292
|
+
}
|
|
293
|
+
removeDuplicateGapResults(results) {
|
|
294
|
+
const unique = new Map();
|
|
295
|
+
results.forEach(result => {
|
|
296
|
+
const key = [
|
|
297
|
+
this.normalize(result.area),
|
|
298
|
+
this.normalize(result.theme),
|
|
299
|
+
this.normalize(result.subtheme),
|
|
300
|
+
this.normalize(result.requiredLevel),
|
|
301
|
+
this.normalize(result.courseLevel)
|
|
302
|
+
].join('|');
|
|
303
|
+
if (!unique.has(key)) {
|
|
304
|
+
unique.set(key, result);
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
return Array.from(unique.values());
|
|
308
|
+
}
|
|
309
|
+
calculateAllCourseGaps() {
|
|
310
|
+
this.courseGapResults = {};
|
|
311
|
+
this.filterdCourses.forEach((course, index) => {
|
|
312
|
+
this.courseGapResults[index] = this.calculateCourseGaps(course);
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
getCourseGapResults(index) {
|
|
316
|
+
return this.courseGapResults[index] || [];
|
|
317
|
+
}
|
|
318
|
+
getFullMatches(index) {
|
|
319
|
+
return this.getCourseGapResults(index)
|
|
320
|
+
.filter(result => result.status === 'FULL');
|
|
321
|
+
}
|
|
322
|
+
getPartialMatches(index) {
|
|
323
|
+
return this.getCourseGapResults(index)
|
|
324
|
+
.filter(result => result.status === 'PARTIAL');
|
|
325
|
+
}
|
|
326
|
+
getNoMatches(index) {
|
|
327
|
+
return this.getCourseGapResults(index)
|
|
328
|
+
.filter(result => result.status === 'NO_MATCH');
|
|
329
|
+
}
|
|
330
|
+
hasGapMatch(index) {
|
|
331
|
+
return this.getCourseGapResults(index).some(result => result.status === 'FULL' ||
|
|
332
|
+
result.status === 'PARTIAL');
|
|
333
|
+
}
|
|
334
|
+
getCourseGapStatus(index) {
|
|
335
|
+
const results = this.getCourseGapResults(index);
|
|
336
|
+
if (results.some(result => result.status === 'FULL')) {
|
|
337
|
+
return 'FULL';
|
|
338
|
+
}
|
|
339
|
+
if (results.some(result => result.status === 'PARTIAL')) {
|
|
340
|
+
return 'PARTIAL';
|
|
341
|
+
}
|
|
342
|
+
return 'NO_MATCH';
|
|
343
|
+
}
|
|
344
|
+
getCourseGapStatusLabel(index) {
|
|
345
|
+
switch (this.getCourseGapStatus(index)) {
|
|
346
|
+
case 'FULL':
|
|
347
|
+
return 'Full Gap Match';
|
|
348
|
+
case 'PARTIAL':
|
|
349
|
+
return 'Partial Gap Match';
|
|
350
|
+
default:
|
|
351
|
+
return 'No Gap Match';
|
|
352
|
+
}
|
|
353
|
+
}
|
|
106
354
|
getCompetenciesByType(type, index) {
|
|
107
355
|
const course = this.filterdCourses[index];
|
|
108
356
|
if (!course) {
|
|
109
357
|
console.log(`No course found at index ${index}`);
|
|
110
358
|
return [];
|
|
111
359
|
}
|
|
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) {
|
|
360
|
+
const competencies = this.getCourseCompetencies(course);
|
|
361
|
+
if (!competencies.length) {
|
|
135
362
|
console.log(`No competencies found for course ${index} and type ${type}`);
|
|
136
363
|
return [];
|
|
137
364
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if (!c || !c.competencyAreaName) {
|
|
142
|
-
console.log(`Invalid competency structure in course ${index}:`, c);
|
|
365
|
+
const normalizedType = this.normalize(type);
|
|
366
|
+
return competencies.filter((c) => {
|
|
367
|
+
if (!c || !this.getCompetencyArea(c)) {
|
|
143
368
|
return false;
|
|
144
369
|
}
|
|
145
|
-
const competencyArea =
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
return competencyArea === 'behavioral' ||
|
|
370
|
+
const competencyArea = this.normalize(this.getCompetencyArea(c));
|
|
371
|
+
if (normalizedType === 'behavioural' ||
|
|
372
|
+
normalizedType === 'behavioral') {
|
|
373
|
+
return (competencyArea === 'behavioral' ||
|
|
374
|
+
competencyArea === 'behavioural');
|
|
149
375
|
}
|
|
150
|
-
// For other types, do case-insensitive comparison
|
|
151
376
|
return competencyArea === normalizedType;
|
|
152
377
|
});
|
|
153
|
-
// console.log(`Found ${matchedCompetencies.length} competencies of type ${type} for course ${index}:`, matchedCompetencies);
|
|
154
|
-
return matchedCompetencies;
|
|
155
378
|
}
|
|
156
379
|
getDisplayedCompetencies(type, index) {
|
|
157
380
|
const competencies = this.getCompetenciesByType(type, index);
|
|
@@ -163,7 +386,8 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
163
386
|
}
|
|
164
387
|
toggleCompetencies(type, index) {
|
|
165
388
|
const key = `${index}-${type}`;
|
|
166
|
-
this.expandedCompetencies[key] =
|
|
389
|
+
this.expandedCompetencies[key] =
|
|
390
|
+
!this.expandedCompetencies[key];
|
|
167
391
|
}
|
|
168
392
|
isExpanded(type, index) {
|
|
169
393
|
const key = `${index}-${type}`;
|
|
@@ -174,7 +398,7 @@ export class GapAnalysisRecommendedCourseComponent {
|
|
|
174
398
|
}
|
|
175
399
|
getRemainingCount(type, index) {
|
|
176
400
|
const totalCount = this.getCompetenciesByType(type, index).length;
|
|
177
|
-
return totalCount - 2;
|
|
401
|
+
return Math.max(totalCount - 2, 0);
|
|
178
402
|
}
|
|
179
403
|
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
404
|
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 +409,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
185
409
|
}], ctorParameters: function () { return [{ type: i1.SharedService }, { type: i2.MatDialog }, { type: i3.MatSnackBar }]; }, propDecorators: { planData: [{
|
|
186
410
|
type: Input
|
|
187
411
|
}] } });
|
|
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=
|
|
412
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlL2dhcC1hbmFseXNpcy1yZWNvbW1lbmRlZC1jb3Vyc2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUF1QnpELE1BQU0sT0FBTyxxQ0FBcUM7SUF1QmhELFlBQ1UsYUFBNEIsRUFDNUIsTUFBaUIsRUFDakIsUUFBcUI7UUFGckIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBdEIvQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDBCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUczQixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBQzNCLHdCQUFtQixHQUFVLEVBQUUsQ0FBQztRQUVoQyxzQkFBaUIsR0FBRztZQUNsQixLQUFLLEVBQUUsQ0FBQztZQUNSLGNBQWMsRUFBRSxDQUFDO1lBQ2pCLElBQUksRUFBRSxDQUFDO1NBQ1IsQ0FBQztRQUVGLHlCQUFvQixHQUErQixFQUFFLENBQUM7UUFFdEQsc0RBQXNEO1FBQ3RELHFCQUFnQixHQUE2QyxFQUFF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dGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuXG50eXBlIEdhcFN0YXR1cyA9ICdGVUxMJyB8ICdQQVJUSUFMJyB8ICdOT19NQVRDSCc7XG5cbmludGVyZmFjZSBHYXBBbmFseXNpc1Jlc3VsdCB7XG4gIGFyZWE6IHN0cmluZztcbiAgdGhlbWU6IHN0cmluZztcbiAgc3VidGhlbWU6IHN0cmluZztcbiAgY3VycmVudExldmVsOiBzdHJpbmc7XG4gIHJlcXVpcmVkTGV2ZWw6IHN0cmluZztcbiAgY291cnNlTGV2ZWw6IHN0cmluZztcbiAgc3RhdHVzOiBHYXBTdGF0dXM7XG4gIHJlYXNvbjogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9nYXAtYW5hbHlzaXMtcmVjb21tZW5kZWQtY291cnNlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2FwLWFuYWx5c2lzLXJlY29tbWVuZGVkLWNvdXJzZS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEdhcEFuYWx5c2lzUmVjb21tZW5kZWRDb3Vyc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHBsYW5EYXRhOiBhbnk7XG5cbiAgbG9hZGluZyA9IGZhbHNlO1xuICByZWNvbW1lbmRlZF9jb3Vyc2VfaWQgPSAnJztcbiAgY2JwUGxhbkRhdGE6IGFueTtcblxuICBzZWFyY2hUZXh0ID0gJyc7XG4gIGZpbHRlcmRDb3Vyc2VzOiBhbnlbXSA9IFtdO1xuICBzZWxlY3RGaWx0ZXJDb3Vyc2VzOiBhbnlbXSA9IFtdO1xuXG4gIGNvbXBldGVuY2llc0NvdW50ID0ge1xuICAgIHRvdGFsOiAwLFxuICAgIHB1YmxpY19jb3Vyc2VzOiAwLFxuICAgIGlnb3Q6IDBcbiAgfTtcblxuICBleHBhbmRlZENvbXBldGVuY2llczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcblxuICAvLyBHYXAgcmVzdWx0cyBmb3IgZWFjaCBjb3Vyc2UsIGtleWVkIGJ5IGNvdXJzZSBpbmRleC5cbiAgY291cnNlR2FwUmVzdWx0czogeyBbaW5kZXg6IG51bWJlcl06IEdhcEFuYWx5c2lzUmVzdWx0W10gfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIHRoaXMuY2JwUGxhbkRhdGEgPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqO1xuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJlY29tbWVuZGVkQ291cnNlKHRoaXMucGxhbkRhdGEuaWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIHRoaXMucmVjb21tZW5kZWRfY291cnNlX2lkID0gcmVzPy5pZCB8fCAnJztcblxuICAgICAgICBjb25zdCBhbGxDb3Vyc2VzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcz8uZmlsdGVyZWRfY291cnNlcykpIHtcbiAgICAgICAgICByZXMuZmlsdGVyZWRfY291cnNlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIFJlbGV2YW5jeSByZW1haW5zIHRoZSBpbml0aWFsIGNvdXJzZSByZWNvbW1lbmRhdGlvbiBmaWx0ZXIuXG4gICAgICAgICAgICAvLyBHYXAgYW5hbHlzaXMgaXMgcGVyZm9ybWVkIHNlcGFyYXRlbHkgdXNpbmcgQXJlYSArIFRoZW1lICtcbiAgICAgICAgICAgIC8vIFN1YnRoZW1lICsgY291cnNlX2xldmVsLlxuICAgICAgICAgICAgaWYgKE51bWJlcihpdGVtPy5yZWxldmFuY3kgfHwgMCkgPiA3NSkge1xuICAgICAgICAgICAgICBhbGxDb3Vyc2VzLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzID0gYWxsQ291cnNlcztcblxuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKTtcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk7XG4gICAgICAgIHRoaXMuZ2V0VXNlckNvdXJzZSgpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihcbiAgICAgICAgICBlcnJvcj8uZXJyb3I/LmRldGFpbCB8fCAnVW5hYmxlIHRvIGxvYWQgcmVjb21tZW5kZWQgY291cnNlcy4nLFxuICAgICAgICAgICdYJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZUNvbXBldGVuY3lDb3VudHMoKTogdm9pZCB7XG4gICAgdGhpcy5jb21wZXRlbmNpZXNDb3VudCA9IHtcbiAgICAgIHRvdGFsOiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmxlbmd0aCxcbiAgICAgIHB1YmxpY19jb3Vyc2VzOiB0aGlzLmZpbHRlcmRDb3Vyc2VzLmZpbHRlcihjID0+IGM/LmlzX3B1YmxpYykubGVuZ3RoLFxuICAgICAgaWdvdDogdGhpcy5maWx0ZXJkQ291cnNlcy5maWx0ZXIoYyA9PiAhYz8uaXNfcHVibGljKS5sZW5ndGhcbiAgICB9O1xuICB9XG5cbiAgZ2V0VXNlckNvdXJzZSgpOiB2b2lkIHtcbiAgICBjb25zdCByb2xlX21hcHBpbmdfaWQgPSB0aGlzLnBsYW5EYXRhLmlkO1xuXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRVc2VyQ291cnNlKHJvbGVfbWFwcGluZ19pZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSAmJiByZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzLmZvckVhY2goKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmRDb3Vyc2VzLnB1c2goY291cnNlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ29tcGV0ZW5jeUNvdW50cygpO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFsbENvdXJzZUdhcHMoKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAnZmlsdGVyZENvdXJzZXMgYWZ0ZXIgYWRkaW5nIHVzZXIgY291cnNlczonLFxuICAgICAgICAgIHRoaXMuZmlsdGVyZENvdXJzZXNcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBjb21wZXRlbmNpZXMgZnJvbSBlaXRoZXIgY29tcGV0ZW5jaWVzIG9yIGNvbXBldGVuY2llc192Ni5cbiAgICovXG4gIGdldENvdXJzZUNvbXBldGVuY2llcyhjb3Vyc2U6IGFueSk6IGFueVtdIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb3Vyc2U/LmNvbXBldGVuY2llcykpIHtcbiAgICAgIHJldHVybiBjb3Vyc2UuY29tcGV0ZW5jaWVzO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGNvdXJzZT8uY29tcGV0ZW5jaWVzX3Y2KSkge1xuICAgICAgcmV0dXJuIGNvdXJzZS5jb21wZXRlbmNpZXNfdjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbm9ybWFsaXplKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUgPz8gJycpXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1xccysvZywgJyAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBhdmFpbGFibGUgdmFsdWUgZnJvbSB0aGUgc3VwcGxpZWQga2V5cy5cbiAgICovXG4gIGdldFZhbHVlKG9iamVjdDogYW55LCBrZXlzOiBzdHJpbmdbXSk6IGFueSB7XG4gICAgaWYgKCFvYmplY3QpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBpZiAoXG4gICAgICAgIG9iamVjdFtrZXldICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgb2JqZWN0W2tleV0gIT09IG51bGwgJiZcbiAgICAgICAgU3RyaW5nKG9iamVjdFtrZXldKS50cmltKCkgIT09ICcnXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldENvbXBldGVuY3lBcmVhKGNvbXBldGVuY3k6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoY29tcGV0ZW5jeSwgW1xuICAgICAgJ2NvbXBldGVuY3lBcmVhTmFtZScsXG4gICAgICAnYXJlYScsXG4gICAgICAnY29tcGV0ZW5jeV9hcmVhJyxcbiAgICAgICdjb21wZXRlbmN5QXJlYSdcbiAgICBdKTtcbiAgfVxuXG4gIGdldENvbXBldGVuY3lUaGVtZShjb21wZXRlbmN5OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvbXBldGVuY3ksIFtcbiAgICAgICdjb21wZXRlbmN5VGhlbWVOYW1lJyxcbiAgICAgICd0aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeV90aGVtZScsXG4gICAgICAnY29tcGV0ZW5jeVRoZW1lJ1xuICAgIF0pO1xuICB9XG5cbiAgZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKGNvbXBldGVuY3k6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoY29tcGV0ZW5jeSwgW1xuICAgICAgJ2NvbXBldGVuY3lTdWJ0aGVtZU5hbWUnLFxuICAgICAgJ3N1YnRoZW1lJyxcbiAgICAgICdjb21wZXRlbmN5X3N1YnRoZW1lJyxcbiAgICAgICdjb21wZXRlbmN5U3VidGhlbWUnXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogSU1QT1JUQU5UOlxuICAgKiBjb3Vyc2VfbGV2ZWwgaXMgdGhlIGF1dGhvcml0YXRpdmUgU1RPIGxldmVsIG9mIGEgY291cnNlLlxuICAgKi9cbiAgZ2V0Q291cnNlTGV2ZWwoY291cnNlOiBhbnksIGNvbXBldGVuY3k/OiBhbnkpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFZhbHVlKGNvdXJzZSwgWydjb3Vyc2VfbGV2ZWwnXSkgfHxcbiAgICAgIHRoaXMuZ2V0VmFsdWUoY29tcGV0ZW5jeSwgWydjb3Vyc2VfbGV2ZWwnXSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgcm9sZSBjb21wZXRlbmN5IGRhdGEgZnJvbSBwbGFuRGF0YSAvIGNicFBsYW5EYXRhLlxuICAgKi9cbiAgZ2V0UmVxdWlyZWRDb21wZXRlbmNpZXMoKTogYW55W10ge1xuICAgIGNvbnN0IHBvc3NpYmxlU291cmNlcyA9IFtcbiAgICAgIHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llcyxcbiAgICAgIHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY3ksXG4gICAgICB0aGlzLnBsYW5EYXRhPy5jb21wZXRlbmN5X2RhdGEsXG4gICAgICB0aGlzLnBsYW5EYXRhPy5yb2xlX2NvbXBldGVuY2llcyxcbiAgICAgIHRoaXMucGxhbkRhdGE/LmNvbXBldGVuY2llc192NixcbiAgICAgIHRoaXMuY2JwUGxhbkRhdGE/LmNvbXBldGVuY2llcyxcbiAgICAgIHRoaXMuY2JwUGxhbkRhdGE/LmNvbXBldGVuY3ksXG4gICAgICB0aGlzLmNicFBsYW5EYXRhPy5yb2xlX2NvbXBldGVuY2llc1xuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBwb3NzaWJsZVNvdXJjZXMpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkgJiYgc291cmNlLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gc291cmNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGdldFJlcXVpcmVkTGV2ZWwoY29tcGV0ZW5jeTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbXG4gICAgICAncmVxdWlyZWRQcm9maWNpZW5jeScsXG4gICAgICAncmVxdWlyZWRfcHJvZmljaWVuY3knLFxuICAgICAgJ3JlcXVpcmVkTGV2ZWwnLFxuICAgICAgJ3JlcXVpcmVkX2xldmVsJyxcbiAgICAgICdwcm9maWNpZW5jeUxldmVsJyxcbiAgICAgICdwcm9maWNpZW5jeV9sZXZlbCcsXG4gICAgICAnbGV2ZWwnLFxuICAgICAgJ3N0b0xldmVsJyxcbiAgICAgICdzdG9fbGV2ZWwnXG4gICAgXSk7XG4gIH1cblxuICBnZXRDdXJyZW50TGV2ZWwoY29tcGV0ZW5jeTogYW55KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWYWx1ZShjb21wZXRlbmN5LCBbXG4gICAgICAnY3VycmVudFByb2ZpY2llbmN5JyxcbiAgICAgICdjdXJyZW50X3Byb2ZpY2llbmN5JyxcbiAgICAgICdjdXJyZW50TGV2ZWwnLFxuICAgICAgJ2N1cnJlbnRfbGV2ZWwnLFxuICAgICAgJ2N1cnJlbnRQcm9maWNpZW5jeUxldmVsJyxcbiAgICAgICdjdXJyZW50X3Byb2ZpY2llbmN5X2xldmVsJ1xuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNUTyBoaWVyYXJjaHk6XG4gICAqIE9wZXJhdGlvbmFsIDwgVGFjdGljYWwgPCBTdHJhdGVnaWNcbiAgICovXG4gIGdldExldmVsUmFuayhsZXZlbDogYW55KTogbnVtYmVyIHtcbiAgICBzd2l0Y2ggKHRoaXMubm9ybWFsaXplKGxldmVsKSkge1xuICAgICAgY2FzZSAnb3BlcmF0aW9uYWwnOlxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGNhc2UgJ3RhY3RpY2FsJzpcbiAgICAgICAgcmV0dXJuIDI7XG4gICAgICBjYXNlICdzdHJhdGVnaWMnOlxuICAgICAgICByZXR1cm4gMztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBjb3Vyc2UgY29tcGV0ZW5jeSB0byByb2xlIGNvbXBldGVuY3kgdXNpbmc6XG4gICAqIEFyZWEgLT4gVGhlbWUgLT4gU3VidGhlbWVcbiAgICpcbiAgICogVGhlbiBjb21wYXJlIHRoZSBjb3Vyc2UncyBjb3Vyc2VfbGV2ZWwgd2l0aCB0aGUgcmVxdWlyZWQgbGV2ZWwuXG4gICAqL1xuICBjYWxjdWxhdGVDb3Vyc2VHYXBzKGNvdXJzZTogYW55KTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgY29uc3QgcmVxdWlyZWRDb21wZXRlbmNpZXMgPSB0aGlzLmdldFJlcXVpcmVkQ29tcGV0ZW5jaWVzKCk7XG5cbiAgICBpZiAoIXJlcXVpcmVkQ29tcGV0ZW5jaWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdXJzZUNvbXBldGVuY2llcyA9IHRoaXMuZ2V0Q291cnNlQ29tcGV0ZW5jaWVzKGNvdXJzZSk7XG4gICAgY29uc3QgcmVzdWx0czogR2FwQW5hbHlzaXNSZXN1bHRbXSA9IFtdO1xuXG4gICAgY291cnNlQ29tcGV0ZW5jaWVzLmZvckVhY2goKGNvdXJzZUNvbXBldGVuY3k6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY291cnNlQXJlYSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lBcmVhKGNvdXJzZUNvbXBldGVuY3kpXG4gICAgICApO1xuICAgICAgY29uc3QgY291cnNlVGhlbWUgPSB0aGlzLm5vcm1hbGl6ZShcbiAgICAgICAgdGhpcy5nZXRDb21wZXRlbmN5VGhlbWUoY291cnNlQ29tcGV0ZW5jeSlcbiAgICAgICk7XG4gICAgICBjb25zdCBjb3Vyc2VTdWJ0aGVtZSA9IHRoaXMubm9ybWFsaXplKFxuICAgICAgICB0aGlzLmdldENvbXBldGVuY3lTdWJ0aGVtZShjb3Vyc2VDb21wZXRlbmN5KVxuICAgICAgKTtcblxuICAgICAgaWYgKCFjb3Vyc2VUaGVtZSB8fCAhY291cnNlU3VidGhlbWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb3Vyc2VMZXZlbCA9IHRoaXMuZ2V0Q291cnNlTGV2ZWwoY291cnNlLCBjb3Vyc2VDb21wZXRlbmN5KTtcblxuICAgICAgcmVxdWlyZWRDb21wZXRlbmNpZXMuZm9yRWFjaCgocmVxdWlyZWRDb21wZXRlbmN5OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgcmVxdWlyZWRBcmVhID0gdGhpcy5ub3JtYWxpemUoXG4gICAgICAgICAgdGhpcy5nZXRDb21wZXRlbmN5QXJlYShyZXF1aXJlZENvbXBldGVuY3kpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGhlbWUgPSB0aGlzLm5vcm1hbGl6ZShcbiAgICAgICAgICB0aGlzLmdldENvbXBldGVuY3lUaGVtZShyZXF1aXJlZENvbXBldGVuY3kpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkU3VidGhlbWUgPSB0aGlzLm5vcm1hbGl6ZShcbiAgICAgICAgICB0aGlzLmdldENvbXBldGVuY3lTdWJ0aGVtZShyZXF1aXJlZENvbXBldGVuY3kpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFyZXF1aXJlZFRoZW1lIHx8ICFyZXF1aXJlZFN1YnRoZW1lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQXJlYTpcbiAgICAgICAgICogSWYgYm90aCBjb3Vyc2UgYW5kIHJvbGUgY29udGFpbiBBcmVhLCB0aGV5IG11c3QgbWF0Y2guXG4gICAgICAgICAqIElmIEFyZWEgaXMgYWJzZW50IG9uIGVpdGhlciBzaWRlLCBUaGVtZSArIFN1YnRoZW1lIHJlbWFpblxuICAgICAgICAgKiB0aGUgbWF0Y2hpbmcga2V5cy5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGFyZWFNYXRjaGVzID1cbiAgICAgICAgICAhY291cnNlQXJlYSB8fFxuICAgICAgICAgICFyZXF1aXJlZEFyZWEgfHxcbiAgICAgICAgICBjb3Vyc2VBcmVhID09PSByZXF1aXJlZEFyZWE7XG5cbiAgICAgICAgY29uc3QgdGhlbWVNYXRjaGVzID0gY291cnNlVGhlbWUgPT09IHJlcXVpcmVkVGhlbWU7XG4gICAgICAgIGNvbnN0IHN1YnRoZW1lTWF0Y2hlcyA9IGNvdXJzZVN1YnRoZW1lID09PSByZXF1aXJlZFN1YnRoZW1lO1xuXG4gICAgICAgIGlmICghYXJlYU1hdGNoZXMgfHwgIXRoZW1lTWF0Y2hlcyB8fCAhc3VidGhlbWVNYXRjaGVzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxdWlyZWRMZXZlbCA9IHRoaXMuZ2V0UmVxdWlyZWRMZXZlbChyZXF1aXJlZENvbXBldGVuY3kpO1xuICAgICAgICBjb25zdCBjdXJyZW50TGV2ZWwgPSB0aGlzLmdldEN1cnJlbnRMZXZlbChyZXF1aXJlZENvbXBldGVuY3kpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVpcmVkUmFuayA9IHRoaXMuZ2V0TGV2ZWxSYW5rKHJlcXVpcmVkTGV2ZWwpO1xuICAgICAgICBjb25zdCBjb3Vyc2VSYW5rID0gdGhpcy5nZXRMZXZlbFJhbmsoY291cnNlTGV2ZWwpO1xuXG4gICAgICAgIGxldCBzdGF0dXM6IEdhcFN0YXR1cztcbiAgICAgICAgbGV0IHJlYXNvbjogc3RyaW5nO1xuXG4gICAgICAgIGlmICghY291cnNlTGV2ZWwgfHwgIXJlcXVpcmVkTGV2ZWwgfHwgIXJlcXVpcmVkUmFuayB8fCAhY291cnNlUmFuaykge1xuICAgICAgICAgIHN0YXR1cyA9ICdOT19NQVRDSCc7XG4gICAgICAgICAgcmVhc29uID1cbiAgICAgICAgICAgICdBcmVhLCBUaGVtZSBhbmQgU3VidGhlbWUgbWF0Y2gsIGJ1dCB0aGUgcmVxdWlyZWQgbGV2ZWwgb3IgY291cnNlX2xldmVsIGlzIG1pc3Npbmcgb3IgaW52YWxpZC4nO1xuICAgICAgICB9IGVsc2UgaWYgKGNvdXJzZVJhbmsgPj0gcmVxdWlyZWRSYW5rKSB7XG4gICAgICAgICAgc3RhdHVzID0gJ0ZVTEwnO1xuICAgICAgICAgIHJlYXNvbiA9XG4gICAgICAgICAgICBgQ291cnNlIGNvdmVycyB0aGUgJHtjb3Vyc2VMZXZlbH0gbGV2ZWwsIHdoaWNoIG1lZXRzIG9yIGV4Y2VlZHMgdGhlIHJlcXVpcmVkICR7cmVxdWlyZWRMZXZlbH0gbGV2ZWwgZm9yIHRoaXMgY29tcGV0ZW5jeS5gO1xuICAgICAgICB9IGVsc2UgaWYgKGNvdXJzZVJhbmsgPT09IHJlcXVpcmVkUmFuayAtIDEpIHtcbiAgICAgICAgICBzdGF0dXMgPSAnUEFSVElBTCc7XG4gICAgICAgICAgcmVhc29uID1cbiAgICAgICAgICAgIGBDb3Vyc2UgY292ZXJzIHRoZSAke2NvdXJzZUxldmVsfSBsZXZlbCwgd2hpY2ggaXMgb25lIGxldmVsIGJlbG93IHRoZSByZXF1aXJlZCAke3JlcXVpcmVkTGV2ZWx9IGxldmVsLmA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RhdHVzID0gJ05PX01BVENIJztcbiAgICAgICAgICByZWFzb24gPVxuICAgICAgICAgICAgYENvdXJzZSBjb3ZlcnMgdGhlICR7Y291cnNlTGV2ZWx9IGxldmVsLCB3aGljaCBpcyBiZWxvdyB0aGUgcmVxdWlyZWQgJHtyZXF1aXJlZExldmVsfSBsZXZlbC5gO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICBhcmVhOiB0aGlzLmdldENvbXBldGVuY3lBcmVhKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgICAgdGhlbWU6IHRoaXMuZ2V0Q29tcGV0ZW5jeVRoZW1lKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgICAgc3VidGhlbWU6IHRoaXMuZ2V0Q29tcGV0ZW5jeVN1YnRoZW1lKHJlcXVpcmVkQ29tcGV0ZW5jeSksXG4gICAgICAgICAgY3VycmVudExldmVsLFxuICAgICAgICAgIHJlcXVpcmVkTGV2ZWwsXG4gICAgICAgICAgY291cnNlTGV2ZWwsXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHJlYXNvblxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlRHVwbGljYXRlR2FwUmVzdWx0cyhyZXN1bHRzKTtcbiAgfVxuXG4gIHJlbW92ZUR1cGxpY2F0ZUdhcFJlc3VsdHMoXG4gICAgcmVzdWx0czogR2FwQW5hbHlzaXNSZXN1bHRbXVxuICApOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICBjb25zdCB1bmlxdWUgPSBuZXcgTWFwPHN0cmluZywgR2FwQW5hbHlzaXNSZXN1bHQ+KCk7XG5cbiAgICByZXN1bHRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IFtcbiAgICAgICAgdGhpcy5ub3JtYWxpemUocmVzdWx0LmFyZWEpLFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZShyZXN1bHQudGhlbWUpLFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZShyZXN1bHQuc3VidGhlbWUpLFxuICAgICAgICB0aGlzLm5vcm1hbGl6ZShyZXN1bHQucmVxdWlyZWRMZXZlbCksXG4gICAgICAgIHRoaXMubm9ybWFsaXplKHJlc3VsdC5jb3Vyc2VMZXZlbClcbiAgICAgIF0uam9pbignfCcpO1xuXG4gICAgICBpZiAoIXVuaXF1ZS5oYXMoa2V5KSkge1xuICAgICAgICB1bmlxdWUuc2V0KGtleSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBBcnJheS5mcm9tKHVuaXF1ZS52YWx1ZXMoKSk7XG4gIH1cblxuICBjYWxjdWxhdGVBbGxDb3Vyc2VHYXBzKCk6IHZvaWQge1xuICAgIHRoaXMuY291cnNlR2FwUmVzdWx0cyA9IHt9O1xuXG4gICAgdGhpcy5maWx0ZXJkQ291cnNlcy5mb3JFYWNoKChjb3Vyc2UsIGluZGV4KSA9PiB7XG4gICAgICB0aGlzLmNvdXJzZUdhcFJlc3VsdHNbaW5kZXhdID0gdGhpcy5jYWxjdWxhdGVDb3Vyc2VHYXBzKGNvdXJzZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb3Vyc2VHYXBSZXN1bHRzW2luZGV4XSB8fCBbXTtcbiAgfVxuXG4gIGdldEZ1bGxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ0ZVTEwnKTtcbiAgfVxuXG4gIGdldFBhcnRpYWxNYXRjaGVzKGluZGV4OiBudW1iZXIpOiBHYXBBbmFseXNpc1Jlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDb3Vyc2VHYXBSZXN1bHRzKGluZGV4KVxuICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ1BBUlRJQUwnKTtcbiAgfVxuXG4gIGdldE5vTWF0Y2hlcyhpbmRleDogbnVtYmVyKTogR2FwQW5hbHlzaXNSZXN1bHRbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Q291cnNlR2FwUmVzdWx0cyhpbmRleClcbiAgICAgIC5maWx0ZXIocmVzdWx0ID0+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
|