@sunbird-cb/toc 0.0.10 → 0.0.11-mauritius

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/esm2022/lib/_collection/_common/ai-tutor/ai-tutor.component.mjs +1169 -0
  2. package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
  3. package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
  4. package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
  5. package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
  6. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +115 -12
  7. package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +5 -1
  8. package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +3 -3
  9. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +32 -12
  10. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +59 -16
  11. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +132 -76
  12. package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +25 -37
  13. package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +7 -2
  14. package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +70 -3
  15. package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +3 -3
  16. package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +6 -3
  17. package/esm2022/lib/_services/viewer-route-util.mjs +2 -2
  18. package/esm2022/lib/_services/widget-content.model.mjs +8 -1
  19. package/esm2022/lib/_services/widget-content.service.mjs +8 -8
  20. package/esm2022/lib/app-toc-lib.module.mjs +16 -7
  21. package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +55 -8
  22. package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +3 -3
  23. package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +3 -3
  24. package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +7 -6
  25. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +160 -81
  26. package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +22 -6
  27. package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +5 -3
  28. package/esm2022/lib/models/user-profile.model.mjs +1 -1
  29. package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
  30. package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +1 -1
  31. package/esm2022/lib/services/app-toc-v2.service.mjs +106 -70
  32. package/esm2022/lib/services/app-toc.service.mjs +154 -223
  33. package/esm2022/lib/services/certificate.service.mjs +54 -9
  34. package/esm2022/lib/services/discuss-utils.service.mjs +30 -43
  35. package/esm2022/lib/services/netcore.service.mjs +116 -46
  36. package/esm2022/lib/services/nps-grid.service.mjs +34 -22
  37. package/esm2022/lib/services/otp.service.mjs +63 -25
  38. package/esm2022/lib/services/profile-v2.service.mjs +47 -19
  39. package/esm2022/lib/services/root.service.mjs +106 -0
  40. package/esm2022/lib/services/user-profile.service.mjs +160 -35
  41. package/esm2022/lib/services/viewer-data.service.mjs +1 -1
  42. package/esm2022/lib/services/viewer-util.service.mjs +62 -34
  43. package/esm2022/public-api.mjs +9 -1
  44. package/fesm2022/sunbird-cb-toc.mjs +9190 -7009
  45. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  46. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +140 -0
  47. package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts.map +1 -0
  48. package/lib/_collection/_common/ai-tutor/socket.service.d.ts +20 -0
  49. package/lib/_collection/_common/ai-tutor/socket.service.d.ts.map +1 -0
  50. package/lib/_collection/_common/card-competency/card-competency.component.d.ts +15 -0
  51. package/lib/_collection/_common/card-competency/card-competency.component.d.ts.map +1 -0
  52. package/lib/_collection/_common/card-competency/card-competency.module.d.ts +9 -0
  53. package/lib/_collection/_common/card-competency/card-competency.module.d.ts.map +1 -0
  54. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +45 -0
  55. package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts.map +1 -0
  56. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +11 -2
  57. package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +1 -1
  58. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +12 -11
  59. package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +1 -1
  60. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +1 -1
  61. package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +1 -1
  62. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +7 -3
  63. package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +1 -1
  64. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +6 -0
  65. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -1
  66. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +24 -3
  67. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
  68. package/lib/_collection/_common/content-toc/content-toc.component.d.ts +6 -3
  69. package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +1 -1
  70. package/lib/_collection/_common/content-toc/content-toc.module.d.ts +29 -28
  71. package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +1 -1
  72. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +4 -1
  73. package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +1 -1
  74. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +2 -1
  75. package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +1 -1
  76. package/lib/_services/widget-content.model.d.ts +6 -0
  77. package/lib/_services/widget-content.model.d.ts.map +1 -1
  78. package/lib/app-toc-lib.module.d.ts +2 -1
  79. package/lib/app-toc-lib.module.d.ts.map +1 -1
  80. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +5 -0
  81. package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +1 -1
  82. package/lib/components/app-toc-home/app-toc-home.component.d.ts +3 -2
  83. package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +1 -1
  84. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +7 -3
  85. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
  86. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +2 -0
  87. package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +1 -1
  88. package/lib/components/public-survey-form/public-survey-form.component.d.ts +1 -0
  89. package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +1 -1
  90. package/lib/models/user-profile.model.d.ts +87 -0
  91. package/lib/models/user-profile.model.d.ts.map +1 -1
  92. package/lib/registration-toc-lib.config.d.ts +5 -0
  93. package/lib/registration-toc-lib.config.d.ts.map +1 -0
  94. package/lib/services/app-toc-v2.service.d.ts +1 -0
  95. package/lib/services/app-toc-v2.service.d.ts.map +1 -1
  96. package/lib/services/app-toc.service.d.ts +5 -55
  97. package/lib/services/app-toc.service.d.ts.map +1 -1
  98. package/lib/services/certificate.service.d.ts +5 -6
  99. package/lib/services/certificate.service.d.ts.map +1 -1
  100. package/lib/services/discuss-utils.service.d.ts +5 -27
  101. package/lib/services/discuss-utils.service.d.ts.map +1 -1
  102. package/lib/services/netcore.service.d.ts +16 -28
  103. package/lib/services/netcore.service.d.ts.map +1 -1
  104. package/lib/services/nps-grid.service.d.ts +11 -10
  105. package/lib/services/nps-grid.service.d.ts.map +1 -1
  106. package/lib/services/otp.service.d.ts +5 -10
  107. package/lib/services/otp.service.d.ts.map +1 -1
  108. package/lib/services/profile-v2.service.d.ts +7 -10
  109. package/lib/services/profile-v2.service.d.ts.map +1 -1
  110. package/lib/services/root.service.d.ts +27 -0
  111. package/lib/services/root.service.d.ts.map +1 -0
  112. package/lib/services/user-profile.service.d.ts +35 -15
  113. package/lib/services/user-profile.service.d.ts.map +1 -1
  114. package/lib/services/viewer-data.service.d.ts +9 -5
  115. package/lib/services/viewer-data.service.d.ts.map +1 -1
  116. package/lib/services/viewer-util.service.d.ts.map +1 -1
  117. package/package.json +3 -3
  118. package/public-api.d.ts +7 -0
  119. package/public-api.d.ts.map +1 -1
@@ -30,7 +30,7 @@ export class AppTocV2Service {
30
30
  "identifier": milestone.id,
31
31
  "description": milestone.description,
32
32
  "mimeType": "application/vnd.ekstep.content-collection",
33
- "duration": "3600",
33
+ "duration": "0",
34
34
  "primaryCategory": "Milestone",
35
35
  "courseCategory": "Milestone",
36
36
  "createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
@@ -56,6 +56,7 @@ export class AppTocV2Service {
56
56
  // Set parent reference for courses inside milestone
57
57
  mileStoneCourse.parent = milestone.id;
58
58
  mileStoneCourse['moduleCount'] = 0;
59
+ mileStoneData['duration'] = String(Number(mileStoneData['duration']) + Number(mileStoneCourse?.duration || 0));
59
60
  this.tocSvc.mapModuleCount(mileStoneCourse);
60
61
  if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
61
62
  leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
@@ -78,7 +79,7 @@ export class AppTocV2Service {
78
79
  milestoneIndex++;
79
80
  });
80
81
  contentHeirarchy['leafNodes'] = [...leafNodes];
81
- console.log('content Heirarchy', contentHeirarchy);
82
+ contentHeirarchy['leafNodesCount'] = leafNodes.length;
82
83
  return contentHeirarchy;
83
84
  }
84
85
  mapModuleCount(content) {
@@ -94,21 +95,20 @@ export class AppTocV2Service {
94
95
  }
95
96
  }
96
97
  mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
97
- console.log('=== mapContentHierarchyProgressUpdate ===');
98
- console.log('Content hierarchy:', contentHeirarchyData?.name, contentHeirarchyData?.identifier);
99
- console.log('Enrollment list data:', enrollmentListData);
100
98
  if (contentHeirarchyData && contentHeirarchyData.children) {
101
99
  let totalLeafNodes = 0;
102
100
  let totalCompletedLeafNodes = 0;
101
+ let LPenrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
103
102
  // First pass: Update progress for all content
104
103
  contentHeirarchyData.children.forEach((child) => {
105
104
  if (child.primaryCategory === 'Milestone') {
106
105
  this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
107
- totalLeafNodes += child.leafNodesCount || 0;
108
- totalCompletedLeafNodes += child.completedLeafNodesCount || 0;
106
+ // Only count mandatory course resources and milestone assessments
107
+ totalLeafNodes += child.mandatoryLeafNodesCount || 0;
108
+ totalCompletedLeafNodes += child.mandatoryCompletedLeafNodesCount || 0;
109
109
  }
110
110
  else {
111
- // For pre-assessment and other root-level content
111
+ // For pre-assessment and other root-level content (always count these)
112
112
  // Try to find enrollment with parent identifier first, then with child's own identifier
113
113
  let enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
114
114
  if (!enrollment) {
@@ -120,22 +120,25 @@ export class AppTocV2Service {
120
120
  totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
121
121
  }
122
122
  });
123
- if (totalLeafNodes > 0) {
124
- const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
125
- contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
126
- contentHeirarchyData.completionStatus = Number(contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0));
123
+ if (LPenrollment && LPenrollment.completionPercentage === 100) {
124
+ contentHeirarchyData.completionPercentage = 100;
125
+ contentHeirarchyData.completionStatus = 2;
126
+ }
127
+ else {
128
+ if (totalLeafNodes > 0) {
129
+ const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
130
+ contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
131
+ contentHeirarchyData.completionStatus = Number(contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0));
132
+ }
127
133
  }
128
- // NOTE: Milestone locking is computed AFTER hashmap is built
129
- // See app-toc-home-v2.component.ts -> fetchContentHierarchy() flow:
130
- // 1. mapContentHierarchyProgressUpdate (this method) - updates progress on content tree
131
- // 2. callHirarchyProgressHashmap() - builds hashmap from content tree
132
- // 3. computeMilestoneLockingStatus() - computes locks using hashmap
133
134
  }
134
135
  return contentHeirarchyData;
135
136
  }
136
137
  updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
137
138
  let totalLeafNodes = 0;
138
139
  let totalCompletedLeafNodes = 0;
140
+ let mandatoryLeafNodes = 0;
141
+ let mandatoryCompletedLeafNodes = 0;
139
142
  let completedCourses = 0;
140
143
  let totalCourses = 0;
141
144
  if (milestone.children) {
@@ -143,31 +146,46 @@ export class AppTocV2Service {
143
146
  if (child.primaryCategory === 'Course') {
144
147
  totalCourses += 1;
145
148
  this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
146
- // Check both status and completionStatus for completion
147
- if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
149
+ const childLeafNodes = child.leafNodesCount || 1;
150
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
151
+ // Count all course leaf nodes for overall tracking
152
+ totalLeafNodes += childLeafNodes;
153
+ if (isCompleted) {
148
154
  completedCourses += 1;
155
+ totalCompletedLeafNodes += childLeafNodes;
156
+ }
157
+ // Only count mandatory courses for LP completion percentage
158
+ if (child.isMandatory === true || child.mandatory === true) {
159
+ mandatoryLeafNodes += childLeafNodes;
160
+ // Count individual completed resources within mandatory courses
161
+ const completedCount = this.getCompletedLeafNodesCount(child);
162
+ mandatoryCompletedLeafNodes += completedCount;
149
163
  }
150
164
  }
151
165
  else {
152
- // For assessments and other content, try multiple enrollment sources
153
- // First try parent Learning Pathway enrollment
166
+ // For assessments - always count them as mandatory
167
+ // Try multiple enrollment sources
154
168
  let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
155
169
  if (!enrollment) {
156
- // Try milestone enrollment
157
170
  enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
158
171
  }
159
172
  this.updateNodeProgress(child, enrollment);
160
- }
161
- const leafNodes = child.leafNodesCount || 1;
162
- totalLeafNodes += leafNodes;
163
- // Check both status and completionStatus for completion
164
- if (child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100) {
165
- totalCompletedLeafNodes += leafNodes;
173
+ const leafNodes = child.leafNodesCount || 1;
174
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
175
+ // Count assessments in both total and mandatory
176
+ totalLeafNodes += leafNodes;
177
+ mandatoryLeafNodes += leafNodes;
178
+ if (isCompleted) {
179
+ totalCompletedLeafNodes += leafNodes;
180
+ mandatoryCompletedLeafNodes += leafNodes;
181
+ }
166
182
  }
167
183
  });
168
184
  }
169
185
  milestone.leafNodesCount = totalLeafNodes;
170
186
  milestone.completedLeafNodesCount = totalCompletedLeafNodes;
187
+ milestone.mandatoryLeafNodesCount = mandatoryLeafNodes;
188
+ milestone.mandatoryCompletedLeafNodesCount = mandatoryCompletedLeafNodes;
171
189
  milestone.totalCourses = totalCourses;
172
190
  milestone.completedCourses = completedCourses;
173
191
  if (totalLeafNodes > 0) {
@@ -200,58 +218,44 @@ export class AppTocV2Service {
200
218
  node.completionPercentage = progress;
201
219
  node.completionStatus = status;
202
220
  node.status = status;
203
- console.log(`Direct enrollment found for ${node.identifier}:`, {
204
- completionPercentage: progress,
205
- completionStatus: status,
206
- enrollmentData: {
207
- progress: enrollment.progress,
208
- completionPercentage: enrollment.completionPercentage,
209
- status: enrollment.status
210
- }
211
- });
212
221
  return;
213
222
  }
214
- // Try both contentId and collectionId as the API response may use either field
215
- const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
216
- console.log(`Updating node progress for ${node.identifier} (${node.name}):`, {
217
- hasEnrollment: !!enrollment,
218
- hasNodeEnrollData: !!nodeEnrollData,
219
- nodeEnrollData,
220
- currentCompletionStatus: node.completionStatus,
221
- currentCompletionPercentage: node.completionPercentage
222
- });
223
- if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
224
- node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
225
- node.completionStatus = Number(nodeEnrollData.status) || 0;
226
- node.status = Number(nodeEnrollData.status) || 0;
227
- }
228
- else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
223
+ if (enrollment?.status === 2) {
229
224
  node.completionPercentage = 100;
230
225
  node.completionStatus = 2;
231
226
  node.status = 2;
232
227
  }
233
- else if (enrollment && !nodeEnrollData) {
234
- // Enrollment exists but this node is not in contentList
235
- // This can happen for completed assessments - preserve their completion data from content hierarchy
236
- // Only reset to 0 if there's no completion data at all
237
- if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
228
+ else {
229
+ // Try both contentId and collectionId as the API response may use either field
230
+ const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
231
+ if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
232
+ node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
233
+ node.completionStatus = Number(nodeEnrollData.status) || 0;
234
+ node.status = Number(nodeEnrollData.status) || 0;
235
+ }
236
+ else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
237
+ node.completionPercentage = 100;
238
+ node.completionStatus = 2;
239
+ node.status = 2;
240
+ }
241
+ else if (enrollment && !nodeEnrollData) {
242
+ // Enrollment exists but this node is not in contentList
243
+ // This can happen for completed assessments - preserve their completion data from content hierarchy
244
+ // Only reset to 0 if there's no completion data at all
245
+ if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
246
+ node.completionPercentage = 0;
247
+ node.completionStatus = 0;
248
+ node.status = 0;
249
+ }
250
+ // Otherwise keep existing values from content hierarchy
251
+ }
252
+ else {
253
+ // No enrollment at all - reset to 0
238
254
  node.completionPercentage = 0;
239
255
  node.completionStatus = 0;
240
256
  node.status = 0;
241
257
  }
242
- // Otherwise keep existing values from content hierarchy
243
258
  }
244
- else {
245
- // No enrollment at all - reset to 0
246
- node.completionPercentage = 0;
247
- node.completionStatus = 0;
248
- node.status = 0;
249
- }
250
- console.log(`Updated node progress for ${node.identifier}:`, {
251
- completionStatus: node.completionStatus,
252
- completionPercentage: node.completionPercentage,
253
- status: node.status
254
- });
255
259
  }
256
260
  updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
257
261
  const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
@@ -259,6 +263,11 @@ export class AppTocV2Service {
259
263
  // Enrollment shows 100% - mark course as complete
260
264
  course.completionPercentage = 100;
261
265
  course.completionStatus = 2;
266
+ if (enrollment.issuedCertificates.length > 0) {
267
+ const certificate = enrollment.issuedCertificates.sort((a, b) => new Date(a.lastIssuedOn).getTime() - new Date(b.lastIssuedOn).getTime());
268
+ const certId = certificate[0].identifier;
269
+ course.issuedCertificatesId = certId;
270
+ }
262
271
  this.tocSvc.mapCompletionChildPercentageProgram(course);
263
272
  }
264
273
  else if (enrollment && enrollment.completionPercentage > 0) {
@@ -315,6 +324,33 @@ export class AppTocV2Service {
315
324
  }
316
325
  }
317
326
  }
327
+ getCompletedLeafNodesCount(node) {
328
+ let completedCount = 0;
329
+ // If it's a leaf node (resource)
330
+ if (!node.children || node.children.length === 0) {
331
+ const isCompleted = node.status === 2 || node.completionStatus === 2 || node.completionPercentage >= 100;
332
+ return isCompleted ? (node.leafNodesCount || 1) : 0;
333
+ }
334
+ // If it has children, recursively count completed leaf nodes
335
+ node.children.forEach((child) => {
336
+ if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children) {
337
+ // Module - recurse through its children
338
+ completedCount += this.getCompletedLeafNodesCount(child);
339
+ }
340
+ else if (!child.children || child.children.length === 0) {
341
+ // Resource (leaf node)
342
+ const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
343
+ if (isCompleted) {
344
+ completedCount += child.leafNodesCount || 1;
345
+ }
346
+ }
347
+ else {
348
+ // Other collection type - recurse
349
+ completedCount += this.getCompletedLeafNodesCount(child);
350
+ }
351
+ });
352
+ return completedCount;
353
+ }
318
354
  findEnrollment(enrollmentList, identifier) {
319
355
  if (!enrollmentList || !enrollmentList.length)
320
356
  return null;
@@ -329,4 +365,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
329
365
  providedIn: 'root'
330
366
  }]
331
367
  }], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
332
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBQ3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4vYXBwLXRvYy5zZXJ2aWNlJztcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJztcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEFwcFRvY1YyU2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UpIHsgfVxuXG4gIGNvbnN0cnVjdEhlaXJhcmNoeURhdGEoY29udGVudFJlYWREYXRhOiBhbnkpOiBhbnkge1xuICAgIGxldCBjb250ZW50SGVpcmFyY2h5OiBhbnkgPSB7IC4uLmNvbnRlbnRSZWFkRGF0YSB9XG4gICAgbGV0IGxlYWZOb2Rlczogc3RyaW5nW10gPSBbXVxuICAgIGlmIChjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXSAmJiBPYmplY3Qua2V5cyhjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXSkubGVuZ3RoID4gMCkge1xuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSA9IFtdXG4gICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgcHJlbGltaW5hcnkgYXNzZXNzbWVudCAocHJlLWFzc2Vzc21lbnQpXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXS5wYXJlbnQgPSBjb250ZW50SGVpcmFyY2h5LmlkZW50aWZpZXJcbiAgICAgIC8vIE1hcmsgdGhpcyBhcyB0aGUgcHJlLWFzc2Vzc21lbnQgZm9yIG1pbGVzdG9uZSBsb2NraW5nIGxvZ2ljXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydwcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWwnXS5pc1ByZUFzc2Vzc21lbnQgPSB0cnVlXG4gICAgICBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddLnB1c2goY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pXG4gICAgICBsZWFmTm9kZXMucHVzaChjb250ZW50UmVhZERhdGE/LnByZWxpbWluYXJ5QXNzZXNzbWVudCB8fCBjb250ZW50UmVhZERhdGE/LnByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcilcbiAgICB9XG5cbiAgICAvLyBUcmFjayBtaWxlc3RvbmUgaW5kZXggZm9yIHByb3BlciBsb2NraW5nIGxvZ2ljXG4gICAgLy8gQWxsIG1pbGVzdG9uZXMgYXJlIGxvY2tlZCBieSBkZWZhdWx0IC0gdW5sb2NraW5nIGlzIGNvbXB1dGVkIGJhc2VkIG9uIHByb2dyZXNzXG4gICAgbGV0IG1pbGVzdG9uZUluZGV4ID0gMFxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ21pbGVzdG9uZXNfdjEnXS5mb3JFYWNoKChtaWxlc3RvbmU6IGFueSkgPT4ge1xuICAgICAgLy8gQWxsIG1pbGVzdG9uZXMgYXJlIGxvY2tlZCBieSBkZWZhdWx0XG4gICAgICAvLyBNMSB1bmxvY2tzIHdoZW4gcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkXG4gICAgICAvLyBNMisgdW5sb2NrIHdoZW4gcHJldmlvdXMgbWlsZXN0b25lJ3MgbWFuZGF0b3J5IGNvbnRlbnQgKyBhc3Nlc3NtZW50IGFyZSBjb21wbGV0ZWRcbiAgICAgIGNvbnN0IHNob3VsZEJlTG9ja2VkID0gdHJ1ZVxuXG4gICAgICBsZXQgbWlsZVN0b25lRGF0YTogYW55ID0ge1xuICAgICAgICBcImlkZW50aWZpZXJcIjogbWlsZXN0b25lLmlkLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IG1pbGVzdG9uZS5kZXNjcmlwdGlvbixcbiAgICAgICAgXCJtaW1lVHlwZVwiOiBcImFwcGxpY2F0aW9uL3ZuZC5la3N0ZXAuY29udGVudC1jb2xsZWN0aW9uXCIsXG4gICAgICAgIFwiZHVyYXRpb25cIjogXCIzNjAwXCIsXG4gICAgICAgIFwicHJpbWFyeUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY291cnNlQ2F0ZWdvcnlcIjogXCJNaWxlc3RvbmVcIixcbiAgICAgICAgXCJjcmVhdGVkQnlcIjogXCIyNTMxMWE0Zi1mYTQyLTRjZjctODgyYS01ZTc5MTk4ZWRmY2JcIixcbiAgICAgICAgXCJuYW1lXCI6IG1pbGVzdG9uZS5uYW1lLFxuICAgICAgICBcImNvbnRlbnRUeXBlXCI6IFwiQ291cnNlXCIsXG4gICAgICAgIFwiaXNMb2NrZWRcIjogc2hvdWxkQmVMb2NrZWQsXG4gICAgICAgIFwibWlsZXN0b25lSW5kZXhcIjogbWlsZXN0b25lSW5kZXgsXG4gICAgICAgIFwic3RhdHVzXCI6IDAsXG4gICAgICAgIFwiY29tcGxldGlvblN0YXR1c1wiOiAwLFxuICAgICAgICBcImNvbXBsZXRpb25QZXJjZW50YWdlXCI6IDAsXG4gICAgICAgIFwibGVhZk5vZGVzXCI6IFtdLFxuICAgICAgICAvLyBQcmUtY29tcHV0ZWQgZmxhZ3MgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvblxuICAgICAgICBcImlzTWlsZXN0b25lXCI6IHRydWUsXG4gICAgICAgIFwiaXNDb2xsZWN0aW9uXCI6IHRydWUsXG4gICAgICAgIFwiaXNNb2R1bGVcIjogZmFsc2UsXG4gICAgICAgIFwiaXNSZXNvdXJjZVwiOiBmYWxzZSxcbiAgICAgICAgXCJpc0xlYXJuaW5nUGF0aHdheVwiOiBmYWxzZSxcbiAgICAgICAgXCJwYXJlbnRcIjogY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICB9XG5cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgaWYgKG1pbGVzdG9uZT8uY291cnNlcyAmJiBtaWxlc3RvbmU/LmNvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICBtaWxlc3RvbmUuY291cnNlcy5mb3JFYWNoKChtaWxlU3RvbmVDb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBjb3Vyc2VzIGluc2lkZSBtaWxlc3RvbmVcbiAgICAgICAgICBtaWxlU3RvbmVDb3Vyc2UucGFyZW50ID0gbWlsZXN0b25lLmlkXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlWydtb2R1bGVDb3VudCddID0gMFxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgICBpZiAobWlsZVN0b25lQ291cnNlICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxlYWZOb2RlcyA9IFsuLi5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG5cbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQobWlsZVN0b25lRGF0YSlcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID8gWy4uLmNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10sIG1pbGVTdG9uZURhdGFdIDogW21pbGVTdG9uZURhdGFdXG5cbiAgICAgIG1pbGVzdG9uZUluZGV4KytcbiAgICB9KVxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cbiAgICBjb25zb2xlLmxvZygnY29udGVudCBIZWlyYXJjaHknLCBjb250ZW50SGVpcmFyY2h5KVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuICAgbWFwTW9kdWxlQ291bnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xuICAgICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgY2hpbGQ/Lm1vZHVsZUNvdW50IDogXG4gICAgICAgICAgICBjaGlsZD8ubW9kdWxlQ291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgY29uc29sZS5sb2coJz09PSBtYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUgPT09JylcbiAgICBjb25zb2xlLmxvZygnQ29udGVudCBoaWVyYXJjaHk6JywgY29udGVudEhlaXJhcmNoeURhdGE/Lm5hbWUsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgIGNvbnNvbGUubG9nKCdFbnJvbGxtZW50IGxpc3QgZGF0YTonLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgXG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG5cbiAgICAgIC8vIEZpcnN0IHBhc3M6IFVwZGF0ZSBwcm9ncmVzcyBmb3IgYWxsIGNvbnRlbnRcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScpIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU1pbGVzdG9uZVByb2dyZXNzKGNoaWxkLCBjb250ZW50SGVpcmFyY2h5RGF0YT8uaWRlbnRpZmllciwgZW5yb2xsbWVudExpc3REYXRhKVxuICAgICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDBcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZC5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIHByZS1hc3Nlc3NtZW50IGFuZCBvdGhlciByb290LWxldmVsIGNvbnRlbnRcbiAgICAgICAgICAvLyBUcnkgdG8gZmluZCBlbnJvbGxtZW50IHdpdGggcGFyZW50IGlkZW50aWZpZXIgZmlyc3QsIHRoZW4gd2l0aCBjaGlsZCdzIG93biBpZGVudGlmaWVyXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIpXG4gICAgICAgICAgaWYgKCFlbnJvbGxtZW50KSB7XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNoaWxkPy5pZGVudGlmaWVyKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGNoaWxkLnN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuICAgICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBpc0NvbXBsZXRlZCA/IChjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxKSA6IDBcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xuICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKE51bWJlcih0b3RhbENvbXBsZXRlZExlYWZOb2RlcykgLyBOdW1iZXIodG90YWxMZWFmTm9kZXMpKSAqIDEwMClcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBpc05hTihjYWxjdWxhdGVkUGVyY2VudGFnZSkgPyAwIDogY2FsY3VsYXRlZFBlcmNlbnRhZ2VcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gMiA6IChjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgICB9XG5cbiAgICAgIC8vIE5PVEU6IE1pbGVzdG9uZSBsb2NraW5nIGlzIGNvbXB1dGVkIEFGVEVSIGhhc2htYXAgaXMgYnVpbHRcbiAgICAgIC8vIFNlZSBhcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIC0+IGZldGNoQ29udGVudEhpZXJhcmNoeSgpIGZsb3c6XG4gICAgICAvLyAxLiBtYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUgKHRoaXMgbWV0aG9kKSAtIHVwZGF0ZXMgcHJvZ3Jlc3Mgb24gY29udGVudCB0cmVlXG4gICAgICAvLyAyLiBjYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoKSAtIGJ1aWxkcyBoYXNobWFwIGZyb20gY29udGVudCB0cmVlXG4gICAgICAvLyAzLiBjb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cygpIC0gY29tcHV0ZXMgbG9ja3MgdXNpbmcgaGFzaG1hcFxuICAgIH1cbiAgICByZXR1cm4gY29udGVudEhlaXJhcmNoeURhdGFcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTWlsZXN0b25lUHJvZ3Jlc3MobWlsZXN0b25lOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyOiBzdHJpbmcsIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgbGV0IHRvdGFsTGVhZk5vZGVzID0gMFxuICAgIGxldCB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyA9IDBcbiAgICBsZXQgY29tcGxldGVkQ291cnNlcyA9IDBcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxuXG4gICAgaWYgKG1pbGVzdG9uZS5jaGlsZHJlbikge1xuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICB0b3RhbENvdXJzZXMgKz0gMVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgLy8gQ2hlY2sgYm90aCBzdGF0dXMgYW5kIGNvbXBsZXRpb25TdGF0dXMgZm9yIGNvbXBsZXRpb25cbiAgICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSB7XG4gICAgICAgICAgICBjb21wbGV0ZWRDb3Vyc2VzICs9IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIGFzc2Vzc21lbnRzIGFuZCBvdGhlciBjb250ZW50LCB0cnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgLy8gRmlyc3QgdHJ5IHBhcmVudCBMZWFybmluZyBQYXRod2F5IGVucm9sbG1lbnRcbiAgICAgICAgICBsZXQgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBwYXJlbnRDb250ZW50SWRlbnRpZmllcilcbiAgICAgICAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgICAgICAgIC8vIFRyeSBtaWxlc3RvbmUgZW5yb2xsbWVudFxuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBtaWxlc3RvbmU/LmlkZW50aWZpZXIpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGVhZk5vZGVzID0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBsZWFmTm9kZXNcbiAgICAgICAgLy8gQ2hlY2sgYm90aCBzdGF0dXMgYW5kIGNvbXBsZXRpb25TdGF0dXMgZm9yIGNvbXBsZXRpb25cbiAgICAgICAgaWYgKGNoaWxkLnN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCkge1xuICAgICAgICAgIHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIG1pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCA9IHRvdGFsTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50ID0gdG90YWxDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZENvdXJzZXMgPSBjb21wbGV0ZWRDb3Vyc2VzXG5cbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBOdW1iZXIobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcbiAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgIC8vIElmIG5vIGVucm9sbG1lbnQgZGF0YSwgcHJlc2VydmUgZXhpc3RpbmcgY29tcGxldGlvbiBkYXRhIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxuICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIGVucm9sbGVkIGNvbnRlbnQgKGRpcmVjdCBlbnJvbGxtZW50KVxuICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgcHJlLWFzc2Vzc21lbnRzIGFuZCBzdGFuZGFsb25lIGNvbnRlbnRcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxtZW50LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyXG4gICAgXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xuICAgICAgXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGVucm9sbG1lbnQucHJvZ3Jlc3MgfHwgMFxuICAgICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGVucm9sbG1lbnQuc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gc3RhdHVzXG4gICAgICBub2RlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgXG4gICAgICBjb25zb2xlLmxvZyhgRGlyZWN0IGVucm9sbG1lbnQgZm91bmQgZm9yICR7bm9kZS5pZGVudGlmaWVyfTpgLCB7XG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBwcm9ncmVzcyxcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogc3RhdHVzLFxuICAgICAgICBlbnJvbGxtZW50RGF0YTogeyBcbiAgICAgICAgICBwcm9ncmVzczogZW5yb2xsbWVudC5wcm9ncmVzcywgXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGVucm9sbG1lbnQuY29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAgICAgc3RhdHVzOiBlbnJvbGxtZW50LnN0YXR1cyBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFRyeSBib3RoIGNvbnRlbnRJZCBhbmQgY29sbGVjdGlvbklkIGFzIHRoZSBBUEkgcmVzcG9uc2UgbWF5IHVzZSBlaXRoZXIgZmllbGRcbiAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gXG4gICAgICBlbGU/LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IGVsZT8uY29sbGVjdGlvbklkID09PSBub2RlLmlkZW50aWZpZXJcbiAgICApXG4gICAgXG4gICAgY29uc29sZS5sb2coYFVwZGF0aW5nIG5vZGUgcHJvZ3Jlc3MgZm9yICR7bm9kZS5pZGVudGlmaWVyfSAoJHtub2RlLm5hbWV9KTpgLCB7XG4gICAgICBoYXNFbnJvbGxtZW50OiAhIWVucm9sbG1lbnQsXG4gICAgICBoYXNOb2RlRW5yb2xsRGF0YTogISFub2RlRW5yb2xsRGF0YSxcbiAgICAgIG5vZGVFbnJvbGxEYXRhLFxuICAgICAgY3VycmVudENvbXBsZXRpb25TdGF0dXM6IG5vZGUuY29tcGxldGlvblN0YXR1cyxcbiAgICAgIGN1cnJlbnRDb21wbGV0aW9uUGVyY2VudGFnZTogbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgIH0pXG4gICAgXG4gICAgaWYgKGVucm9sbG1lbnQgJiYgbm9kZUVucm9sbERhdGEgJiYgbm9kZUVucm9sbERhdGEuc3RhdHVzIDwgMikge1xuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IG5vZGVFbnJvbGxEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IG5vZGVFbnJvbGxEYXRhLnByb2dyZXNzIHx8IDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihub2RlRW5yb2xsRGF0YS5zdGF0dXMpIHx8IDBcbiAgICAgIG5vZGUuc3RhdHVzID0gTnVtYmVyKG5vZGVFbnJvbGxEYXRhLnN0YXR1cykgfHwgMFxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiAhbm9kZUVucm9sbERhdGEpIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgZXhpc3RzIGJ1dCB0aGlzIG5vZGUgaXMgbm90IGluIGNvbnRlbnRMaXN0XG4gICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAtIHByZXNlcnZlIHRoZWlyIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICAvLyBPbmx5IHJlc2V0IHRvIDAgaWYgdGhlcmUncyBubyBjb21wbGV0aW9uIGRhdGEgYXQgYWxsXG4gICAgICBpZiAobm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gdW5kZWZpbmVkICYmIG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gdW5kZWZpbmVkICYmIG5vZGUuc3RhdHVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gMFxuICAgICAgICBub2RlLnN0YXR1cyA9IDBcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSBrZWVwIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIGVucm9sbG1lbnQgYXQgYWxsIC0gcmVzZXQgdG8gMFxuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgIG5vZGUuc3RhdHVzID0gMFxuICAgIH1cbiAgICBcbiAgICBjb25zb2xlLmxvZyhgVXBkYXRlZCBub2RlIHByb2dyZXNzIGZvciAke25vZGUuaWRlbnRpZmllcn06YCwge1xuICAgICAgY29tcGxldGlvblN0YXR1czogbm9kZS5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICBzdGF0dXM6IG5vZGUuc3RhdHVzXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlKVxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDFcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvdXJzZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgXG5cbiAgICAgICAgICAvLyBJZiBjaGlsZCBpcyBhIG1vZHVsZSwgdXBkYXRlIGl0cyBjaGlsZHJlbiAocmVzb3VyY2VzKSBhcyB3ZWxsXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmIGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MocmVzb3VyY2UsIGVucm9sbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIGxldCB0b3RhbENvbXBsZXRlZCA9IDBcblxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIGNoaWxkIGlzIGEgbW9kdWxlLCB1cGRhdGUgaXRzIGNoaWxkcmVuIChyZXNvdXJjZXMpIGFzIHdlbGxcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhyZXNvdXJjZSwgZW5yb2xsbWVudClcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgcmVzb3VyY2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IHJlc291cmNlLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxuICAgICAgICBpZiAoIWVucm9sbG1lbnQgfHwgIWNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDApIHtcbiAgICAgICAgICBpZiAoIXRvdGFsTGVhZk5vZGVzKSB7XG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFlbnJvbGxtZW50TGlzdCB8fCAhZW5yb2xsbWVudExpc3QubGVuZ3RoKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBlbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIgfHwgZWwuY29udGVudElkID09PSBpZGVudGlmaWVyKVxuICB9XG5cblxuXG59XG5cbiJdfQ==
368
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBR3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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QUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCx1QkFBdUI7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQTtnQkFDM0csSUFBSSxXQUFXLEVBQUU7b0JBQ2YsY0FBYyxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFBO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLGtDQUFrQztnQkFDbEMsY0FBYyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUN6RDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxjQUFtQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUN4RyxDQUFDOytHQXBZVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cblxuICBjb25zdHJ1Y3RIZWlyYXJjaHlEYXRhKGNvbnRlbnRSZWFkRGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxuICAgIGxldCBsZWFmTm9kZXM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10gJiYgT2JqZWN0LmtleXMoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgKHByZS1hc3Nlc3NtZW50KVxuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10ucGFyZW50ID0gY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10uaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgXG4gICAgIFxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXS5wdXNoKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKVxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xuICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCAtIHVubG9ja2luZyBpcyBjb21wdXRlZCBiYXNlZCBvbiBwcm9ncmVzc1xuICAgIGxldCBtaWxlc3RvbmVJbmRleCA9IDBcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcbiAgICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgICAgLy8gTTEgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXG4gICAgICBjb25zdCBzaG91bGRCZUxvY2tlZCA9IHRydWVcblxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcbiAgICAgICAgXCJpZGVudGlmaWVyXCI6IG1pbGVzdG9uZS5pZCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBtaWxlc3RvbmUuZGVzY3JpcHRpb24sXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICBcImR1cmF0aW9uXCI6IFwiMFwiLFxuICAgICAgICBcInByaW1hcnlDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY3JlYXRlZEJ5XCI6IFwiMjUzMTFhNGYtZmE0Mi00Y2Y3LTg4MmEtNWU3OTE5OGVkZmNiXCIsXG4gICAgICAgIFwibmFtZVwiOiBtaWxlc3RvbmUubmFtZSxcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICBcImlzTG9ja2VkXCI6IHNob3VsZEJlTG9ja2VkLFxuICAgICAgICBcIm1pbGVzdG9uZUluZGV4XCI6IG1pbGVzdG9uZUluZGV4LFxuICAgICAgICBcInN0YXR1c1wiOiAwLFxuICAgICAgICBcImNvbXBsZXRpb25TdGF0dXNcIjogMCxcbiAgICAgICAgXCJjb21wbGV0aW9uUGVyY2VudGFnZVwiOiAwLFxuICAgICAgICBcImxlYWZOb2Rlc1wiOiBbXSxcbiAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgXCJpc01pbGVzdG9uZVwiOiB0cnVlLFxuICAgICAgICBcImlzQ29sbGVjdGlvblwiOiB0cnVlLFxuICAgICAgICBcImlzTW9kdWxlXCI6IGZhbHNlLFxuICAgICAgICBcImlzUmVzb3VyY2VcIjogZmFsc2UsXG4gICAgICAgIFwiaXNMZWFybmluZ1BhdGh3YXlcIjogZmFsc2UsXG4gICAgICAgIFwicGFyZW50XCI6IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgIGlmIChtaWxlc3RvbmU/LmNvdXJzZXMgJiYgbWlsZXN0b25lPy5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlLnBhcmVudCA9IG1pbGVzdG9uZS5pZFxuICAgICAgICAgIG1pbGVTdG9uZUNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IDBcbiAgICAgICAgICBtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddID0gU3RyaW5nKE51bWJlcihtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddKSArIE51bWJlcihtaWxlU3RvbmVDb3Vyc2U/LmR1cmF0aW9uIHx8IDApKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgICBpZiAobWlsZVN0b25lQ291cnNlICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxlYWZOb2RlcyA9IFsuLi5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG5cbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQobWlsZVN0b25lRGF0YSlcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID8gWy4uLmNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10sIG1pbGVTdG9uZURhdGFdIDogW21pbGVTdG9uZURhdGFdXG5cbiAgICAgIG1pbGVzdG9uZUluZGV4KytcbiAgICB9KVxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cbiAgICBjb250ZW50SGVpcmFyY2h5WydsZWFmTm9kZXNDb3VudCddID0gbGVhZk5vZGVzLmxlbmd0aFxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuICAgbWFwTW9kdWxlQ291bnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xuICAgICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgY2hpbGQ/Lm1vZHVsZUNvdW50IDogXG4gICAgICAgICAgICBjaGlsZD8ubW9kdWxlQ291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgTFBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBVcGRhdGUgcHJvZ3Jlc3MgZm9yIGFsbCBjb250ZW50XG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhjaGlsZCwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2UgcmVzb3VyY2VzIGFuZCBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5tYW5kYXRvcnlMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gY2hpbGQubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50IChhbHdheXMgY291bnQgdGhlc2UpXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZW5yb2xsbWVudCB3aXRoIHBhcmVudCBpZGVudGlmaWVyIGZpcnN0LCB0aGVuIHdpdGggY2hpbGQncyBvd24gaWRlbnRpZmllclxuICAgICAgICAgIGxldCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjaGlsZD8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gaXNDb21wbGV0ZWQgPyAoY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZihMUGVucm9sbG1lbnQgJiYgTFBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKE51bWJlcih0b3RhbENvbXBsZXRlZExlYWZOb2RlcykgLyBOdW1iZXIodG90YWxMZWFmTm9kZXMpKSAqIDEwMClcbiAgICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQZXJjZW50YWdlKSA/IDAgOiBjYWxjdWxhdGVkUGVyY2VudGFnZVxuICAgICAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBtYW5kYXRvcnlMZWFmTm9kZXMgPSAwXG4gICAgbGV0IG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyA9IDBcbiAgICBsZXQgY29tcGxldGVkQ291cnNlcyA9IDBcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxuXG4gICAgaWYgKG1pbGVzdG9uZS5jaGlsZHJlbikge1xuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICB0b3RhbENvdXJzZXMgKz0gMVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgY2hpbGRMZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3VudCBhbGwgY291cnNlIGxlYWYgbm9kZXMgZm9yIG92ZXJhbGwgdHJhY2tpbmdcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29tcGxldGVkQ291cnNlcyArPSAxXG4gICAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2VzIGZvciBMUCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAgICAgICAgICBpZiAoY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgY2hpbGQubWFuZGF0b3J5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtYW5kYXRvcnlMZWFmTm9kZXMgKz0gY2hpbGRMZWFmTm9kZXNcbiAgICAgICAgICAgIC8vIENvdW50IGluZGl2aWR1YWwgY29tcGxldGVkIHJlc291cmNlcyB3aXRoaW4gbWFuZGF0b3J5IGNvdXJzZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy5nZXRDb21wbGV0ZWRMZWFmTm9kZXNDb3VudChjaGlsZClcbiAgICAgICAgICAgIG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyArPSBjb21wbGV0ZWRDb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNzZXNzbWVudHMgLSBhbHdheXMgY291bnQgdGhlbSBhcyBtYW5kYXRvcnlcbiAgICAgICAgICAvLyBUcnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgcGFyZW50Q29udGVudElkZW50aWZpZXIpXG4gICAgICAgICAgaWYgKCFlbnJvbGxtZW50KSB7XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIG1pbGVzdG9uZT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbGVhZk5vZGVzID0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ291bnQgYXNzZXNzbWVudHMgaW4gYm90aCB0b3RhbCBhbmQgbWFuZGF0b3J5XG4gICAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgbWFuZGF0b3J5TGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgICBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIG1pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCA9IHRvdGFsTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50ID0gdG90YWxDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5TGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZENvdXJzZXMgPSBjb21wbGV0ZWRDb3Vyc2VzXG5cbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBOdW1iZXIobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcbiAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgIC8vIElmIG5vIGVucm9sbG1lbnQgZGF0YSwgcHJlc2VydmUgZXhpc3RpbmcgY29tcGxldGlvbiBkYXRhIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxuICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIGVucm9sbGVkIGNvbnRlbnQgKGRpcmVjdCBlbnJvbGxtZW50KVxuICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgcHJlLWFzc2Vzc21lbnRzIGFuZCBzdGFuZGFsb25lIGNvbnRlbnRcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxtZW50LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyXG4gICAgXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xuICAgICAgXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGVucm9sbG1lbnQucHJvZ3Jlc3MgfHwgMFxuICAgICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGVucm9sbG1lbnQuc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gc3RhdHVzXG4gICAgICBub2RlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZihlbnJvbGxtZW50Py5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgYm90aCBjb250ZW50SWQgYW5kIGNvbGxlY3Rpb25JZCBhcyB0aGUgQVBJIHJlc3BvbnNlIG1heSB1c2UgZWl0aGVyIGZpZWxkXG4gICAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gXG4gICAgICAgIGVsZT8uY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXIgfHwgZWxlPy5jb2xsZWN0aW9uSWQgPT09IG5vZGUuaWRlbnRpZmllclxuICAgICAgKVxuICAgICAgXG4gICAgICBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPCAyKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBub2RlRW5yb2xsRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBub2RlRW5yb2xsRGF0YS5wcm9ncmVzcyB8fCAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihub2RlRW5yb2xsRGF0YS5zdGF0dXMpIHx8IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSBOdW1iZXIobm9kZUVucm9sbERhdGEuc3RhdHVzKSB8fCAwXG4gICAgICB9ZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAyXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmICFub2RlRW5yb2xsRGF0YSkge1xuICAgICAgICAvLyBFbnJvbGxtZW50IGV4aXN0cyBidXQgdGhpcyBub2RlIGlzIG5vdCBpbiBjb250ZW50TGlzdFxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAtIHByZXNlcnZlIHRoZWlyIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICAgIC8vIE9ubHkgcmVzZXQgdG8gMCBpZiB0aGVyZSdzIG5vIGNvbXBsZXRpb24gZGF0YSBhdCBhbGxcbiAgICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGtlZXAgZXhpc3RpbmcgdmFsdWVzIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGVucm9sbG1lbnQgYXQgYWxsIC0gcmVzZXQgdG8gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMFxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBcbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgaWYgKGVucm9sbG1lbnQuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxtZW50Lmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0SWQ6IGFueSA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgIGNvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlKVxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDFcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvdXJzZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgXG5cbiAgICAgICAgICAvLyBJZiBjaGlsZCBpcyBhIG1vZHVsZSwgdXBkYXRlIGl0cyBjaGlsZHJlbiAocmVzb3VyY2VzKSBhcyB3ZWxsXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmIGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MocmVzb3VyY2UsIGVucm9sbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIGxldCB0b3RhbENvbXBsZXRlZCA9IDBcblxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIGNoaWxkIGlzIGEgbW9kdWxlLCB1cGRhdGUgaXRzIGNoaWxkcmVuIChyZXNvdXJjZXMpIGFzIHdlbGxcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhyZXNvdXJjZSwgZW5yb2xsbWVudClcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgcmVzb3VyY2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IHJlc291cmNlLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxuICAgICAgICBpZiAoIWVucm9sbG1lbnQgfHwgIWNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDApIHtcbiAgICAgICAgICBpZiAoIXRvdGFsTGVhZk5vZGVzKSB7XG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQobm9kZTogYW55KTogbnVtYmVyIHtcbiAgICBsZXQgY29tcGxldGVkQ291bnQgPSAwXG4gICAgXG4gICAgLy8gSWYgaXQncyBhIGxlYWYgbm9kZSAocmVzb3VyY2UpXG4gICAgaWYgKCFub2RlLmNoaWxkcmVuIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IG5vZGUuc3RhdHVzID09PSAyIHx8IG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuICAgICAgcmV0dXJuIGlzQ29tcGxldGVkID8gKG5vZGUubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgfVxuICAgIFxuICAgIC8vIElmIGl0IGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgY291bnQgY29tcGxldGVkIGxlYWYgbm9kZXNcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSAmJiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAvLyBNb2R1bGUgLSByZWN1cnNlIHRocm91Z2ggaXRzIGNoaWxkcmVuXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9IGVsc2UgaWYgKCFjaGlsZC5jaGlsZHJlbiB8fCBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmVzb3VyY2UgKGxlYWYgbm9kZSlcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVkQ291bnQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlciBjb2xsZWN0aW9uIHR5cGUgLSByZWN1cnNlXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9XG4gICAgfSlcbiAgICBcbiAgICByZXR1cm4gY29tcGxldGVkQ291bnRcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFlbnJvbGxtZW50TGlzdCB8fCAhZW5yb2xsbWVudExpc3QubGVuZ3RoKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBlbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIgfHwgZWwuY29udGVudElkID09PSBpZGVudGlmaWVyKVxuICB9XG5cblxuXG59XG5cbiJdfQ==