@sunbird-cb/cbp-ai 0.1.8 → 0.1.9

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 (25) hide show
  1. package/esm2022/lib/ai-cbp.module.mjs +18 -5
  2. package/esm2022/lib/components/publish-request-form/publish-request-form.component.mjs +392 -0
  3. package/esm2022/lib/components/reject-item-request-form/reject-item-request-form.component.mjs +392 -0
  4. package/esm2022/lib/components/reject-request-form/reject-request-form.component.mjs +392 -0
  5. package/esm2022/lib/components/review-request/review-request.component.mjs +179 -18
  6. package/esm2022/lib/modules/shared/services/shared.service.mjs +22 -1
  7. package/esm2022/public-api.mjs +4 -1
  8. package/fesm2022/sunbird-cb-cbp-ai.mjs +10368 -9057
  9. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
  10. package/lib/ai-cbp.module.d.ts +39 -36
  11. package/lib/ai-cbp.module.d.ts.map +1 -1
  12. package/lib/components/publish-request-form/publish-request-form.component.d.ts +48 -0
  13. package/lib/components/publish-request-form/publish-request-form.component.d.ts.map +1 -0
  14. package/lib/components/reject-item-request-form/reject-item-request-form.component.d.ts +48 -0
  15. package/lib/components/reject-item-request-form/reject-item-request-form.component.d.ts.map +1 -0
  16. package/lib/components/reject-request-form/reject-request-form.component.d.ts +48 -0
  17. package/lib/components/reject-request-form/reject-request-form.component.d.ts.map +1 -0
  18. package/lib/components/review-request/review-request.component.d.ts +10 -2
  19. package/lib/components/review-request/review-request.component.d.ts.map +1 -1
  20. package/lib/modules/shared/services/shared.service.d.ts +3 -0
  21. package/lib/modules/shared/services/shared.service.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/public-api.d.ts +3 -0
  24. package/public-api.d.ts.map +1 -1
  25. package/sunbird-cb-cbp-ai-0.1.9.tgz +0 -0
@@ -0,0 +1,392 @@
1
+ import { MAT_DIALOG_DATA } from '@angular/material/dialog';
2
+ import { Component, ElementRef, Inject, ViewChild } from '@angular/core';
3
+ import { Validators } from '@angular/forms';
4
+ import { debounceTime, distinctUntilChanged, finalize, startWith } from 'rxjs/operators';
5
+ import _ from 'lodash';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/material/dialog";
8
+ import * as i2 from "@angular/forms";
9
+ import * as i3 from "../../modules/shared/services/shared.service";
10
+ import * as i4 from "@angular/material/snack-bar";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "@angular/material/legacy-card";
13
+ import * as i7 from "@angular/material/legacy-form-field";
14
+ import * as i8 from "@angular/material/icon";
15
+ import * as i9 from "@angular/material/legacy-select";
16
+ import * as i10 from "@angular/material/legacy-core";
17
+ import * as i11 from "@angular/material/progress-spinner";
18
+ export class RejectRequestFormComponent {
19
+ constructor(dialogRef, data, fb, cdRef, sharedService, snackBar) {
20
+ this.dialogRef = dialogRef;
21
+ this.data = data;
22
+ this.fb = fb;
23
+ this.cdRef = cdRef;
24
+ this.sharedService = sharedService;
25
+ this.snackBar = snackBar;
26
+ this.loading = false;
27
+ this.mdoFilterEnable = false;
28
+ this.isLoadingMoremdos = false;
29
+ this.mdoOffset = 0;
30
+ this.odcsmdoCount = 0;
31
+ this.defaultSearchmdoCount = 0;
32
+ this.mdoListLoadCount = 50;
33
+ this.mdoDefaultLoadCount = 50;
34
+ this.noMoreLegacymdos = false;
35
+ this.mdoSearchText = '';
36
+ this.mdoInitInProgress = false;
37
+ this.scrollListenerAttached = false;
38
+ this.masterData = {};
39
+ this.role_mapping_ids = [];
40
+ this.role_mapping_ids = data;
41
+ this.masterData = {
42
+ mdoBackup: [],
43
+ mdoFiltered: [], // filtered search results
44
+ };
45
+ }
46
+ ngOnInit() {
47
+ this.initializeForm();
48
+ console.log('this.role_mapping_ids--', this.role_mapping_ids);
49
+ const searchControl = this.rejectRequestForm.get('searchmdo');
50
+ if (searchControl) {
51
+ searchControl.valueChanges
52
+ .pipe(debounceTime(100), distinctUntilChanged(), startWith(''))
53
+ .subscribe(res => {
54
+ const txt = res?.toString()?.trim() ?? '';
55
+ if (txt?.length) {
56
+ this.mdoFilterEnable = true;
57
+ this.masterData.mdoFiltered =
58
+ this.masterData.mdoBackup.filter((item) => item.name.toLowerCase().includes(txt.toLowerCase()));
59
+ // show initial page of filtered results
60
+ this.masterData.mdo = this.masterData.mdoFiltered.slice(0, this.mdoListLoadCount);
61
+ }
62
+ else {
63
+ this.mdoFilterEnable = false;
64
+ // show first page from backup
65
+ this.masterData.mdo = this.masterData.mdoBackup.slice(0, this.mdoDefaultLoadCount);
66
+ this.mdoListLoadCount = this.mdoDefaultLoadCount;
67
+ this.mdoOffset = 0;
68
+ }
69
+ });
70
+ }
71
+ console.log(this.masterData['mdoBackup']);
72
+ if (!this.masterData['mdoBackup'].length) {
73
+ this.getmdoSafe();
74
+ }
75
+ }
76
+ getmdoSafe() {
77
+ if (this.mdoInitInProgress || this.isLoadingMoremdos) {
78
+ return;
79
+ }
80
+ this.mdoInitInProgress = true;
81
+ this.getmdo();
82
+ }
83
+ initializeForm() {
84
+ this.rejectRequestForm = this.fb.group({
85
+ mdo_name: ['', Validators.required],
86
+ request_name: ['', Validators.required],
87
+ searchmdo: [''],
88
+ });
89
+ }
90
+ cancelForm() {
91
+ this.dialogRef.close();
92
+ }
93
+ savemdo() {
94
+ const selectedmdo = this.rejectRequestForm.get('mdo_name')?.value;
95
+ if (!selectedmdo) {
96
+ this.snackBar.open('Please select an mdo leader/admin', 'X', { duration: 3000 });
97
+ return;
98
+ }
99
+ this.loading = true;
100
+ const baseObj = {
101
+ state_center_id: this.sharedService.cbpPlanFinalObj.ministry.identifier,
102
+ // state_center_name: this.sharedService.cbpPlanFinalObj.ministry.orgName,
103
+ role_mapping_ids: this.role_mapping_ids.map((item) => item.id),
104
+ request_name: this.rejectRequestForm.value.request_name,
105
+ };
106
+ if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'state' && this.sharedService.cbpPlanFinalObj.department_name) {
107
+ baseObj['department_id'] = this.sharedService.cbpPlanFinalObj.departments;
108
+ // baseObj['department_name'] = this.sharedService.cbpPlanFinalObj.department_name;
109
+ }
110
+ if (this.sharedService.cbpPlanFinalObj?.ministry?.sbOrgType === 'ministry' && this.sharedService.cbpPlanFinalObj.department_name) {
111
+ baseObj['department_id'] = this.sharedService.cbpPlanFinalObj.departments;
112
+ // baseObj['department_name'] = this.sharedService.cbpPlanFinalObj.department_name;
113
+ }
114
+ // Create an array of observables, one per mdo
115
+ const req = {
116
+ ...baseObj,
117
+ mdo_id: selectedmdo
118
+ };
119
+ this.sharedService.saveApprovalRequest(req)
120
+ .pipe(finalize(() => this.loading = false))
121
+ .subscribe({
122
+ next: () => {
123
+ this.snackBar.open('Request sent successfully', 'X', {
124
+ duration: 3000,
125
+ panelClass: ['snackbar-success']
126
+ });
127
+ this.dialogRef.close('saved');
128
+ },
129
+ error: (error) => {
130
+ console.log('error', error);
131
+ this.snackBar.open((error?.error?.detail || 'Failed to send request'), 'X', {
132
+ duration: 3000,
133
+ panelClass: ['snackbar-error']
134
+ });
135
+ }
136
+ });
137
+ }
138
+ closeDialog() {
139
+ this.dialogRef.close();
140
+ }
141
+ getmdo(searchText, offset) {
142
+ // clear any previous debug hooks
143
+ if (!searchText || searchText?.length === 0) {
144
+ // noop
145
+ }
146
+ const reqOffset = (typeof offset === 'number') ? offset : this.mdoOffset;
147
+ let reqLimit = this.mdoDefaultLoadCount;
148
+ const pageIndex = reqLimit > 0 ? Math.floor(reqOffset / reqLimit) : 0;
149
+ // if we're requesting from first page, clear the no-more-data guard
150
+ if (pageIndex === 0) {
151
+ this.noMoreLegacymdos = false;
152
+ reqLimit = 50;
153
+ }
154
+ // const requestBody: any = {
155
+ // filterCriteriaMap: {
156
+ // status: 'Active'
157
+ // },
158
+ // requestedFields: [],
159
+ // pageNumber: pageIndex,
160
+ // pageSize: reqLimit,
161
+ // }
162
+ const requestBody = {
163
+ "request": {
164
+ "filters": {
165
+ "organisations.roles": [
166
+ "MDO_LEADER",
167
+ "MDO_ADMIN"
168
+ ],
169
+ "rootOrgId": this.sharedService.cbpPlanFinalObj.departments ? this.sharedService.cbpPlanFinalObj.departments : this.sharedService.cbpPlanFinalObj.ministry.identifier
170
+ },
171
+ "fields": [
172
+ "firstName",
173
+ "lastName",
174
+ "id",
175
+ "rootOrgId",
176
+ "organisations",
177
+ "roles"
178
+ ],
179
+ pageNumber: pageIndex,
180
+ pageSize: reqLimit,
181
+ }
182
+ };
183
+ if (searchText?.length) {
184
+ requestBody['searchString'] = searchText;
185
+ // when searching, start from first page
186
+ requestBody.pageNumber = 0;
187
+ // allow larger page for search if needed
188
+ requestBody.pageSize = pageIndex === 0 ? 50 : this.mdoListLoadCount;
189
+ // reset guard when performing a fresh search
190
+ this.noMoreLegacymdos = false;
191
+ }
192
+ // indicate loading state so scroll handlers don't trigger parallel calls
193
+ this.isLoadingMoremdos = true;
194
+ console.log('requestBody', requestBody);
195
+ this.sharedService.searchPublicmdo(requestBody).pipe(finalize(() => {
196
+ this.isLoadingMoremdos = false;
197
+ this.mdoInitInProgress = false;
198
+ }))
199
+ .subscribe({
200
+ next: (res) => {
201
+ const content = _.get(res, 'admins', []);
202
+ console.log('content--', content);
203
+ const mapped = content.map((item) => ({
204
+ id: item?.id,
205
+ name: `${item?.first_name} ${item?.last_name}` || '',
206
+ status: item?.status || 'Active',
207
+ role_type: item?.role_type,
208
+ department_name: item?.department_name
209
+ }));
210
+ // total count may be present in different keys depending on API version.
211
+ // Prefer 'result.result.totalcount' (legacy lower-case) then data.totalCount, then totalCount
212
+ const total = _.get(res, 'count', _.get(res, 'count', _.get(res, 'count', 0)));
213
+ this.defaultSearchmdoCount = total;
214
+ // If offset is zero (first page) replace backup, otherwise append + dedupe
215
+ if (!this.masterData['mdoBackup'] || reqOffset === 0) {
216
+ this.masterData['mdoBackup'] = mapped;
217
+ }
218
+ else {
219
+ const combined = (this.masterData['mdoBackup'] || []).concat(mapped);
220
+ this.masterData['mdoBackup'] = _.uniqBy(combined, (it) => (it?.name || '').toLowerCase());
221
+ }
222
+ // If server returned no new items, mark as no-more-data to stop further scroll requests
223
+ if (!mapped || mapped?.length === 0) {
224
+ this.noMoreLegacymdos = true;
225
+ }
226
+ // If we've loaded at least the total count, mark no-more-data
227
+ if (this.defaultSearchmdoCount && (this.masterData['mdoBackup'] || []).length >= this.defaultSearchmdoCount) {
228
+ this.noMoreLegacymdos = true;
229
+ }
230
+ // Ensure visible list matches the requested display count
231
+ this.masterData['mdo'] = (this.masterData['mdoBackup'] || []).slice(0, this.mdoListLoadCount);
232
+ // loading flag cleared in finalize()
233
+ this.checkCurrentmdoPresent();
234
+ },
235
+ error: () => {
236
+ // Stop further automatic calls on repeated errors to avoid tight loops
237
+ // loading flag cleared in finalize()
238
+ this.noMoreLegacymdos = true;
239
+ // this.matSnackBar.open('Unable to fetch mdo details, please try again later!')
240
+ }
241
+ });
242
+ }
243
+ checkCurrentmdoPresent() {
244
+ const selectedmdo = this.rejectRequestForm.get('mdo_name')?.value;
245
+ if (!selectedmdo || !this.masterData?.mdo)
246
+ return;
247
+ const exists = this.masterData.mdo.some((item) => item?.name?.toLowerCase() === selectedmdo?.toLowerCase());
248
+ if (!exists) {
249
+ const newmdo = {
250
+ name: selectedmdo,
251
+ status: 'Active',
252
+ id: 'custom-' + Date.now()
253
+ };
254
+ this.masterData.mdoBackup = this.masterData.mdoBackup || [];
255
+ this.masterData.mdoBackup.unshift(newmdo);
256
+ this.masterData.mdo.unshift(newmdo);
257
+ }
258
+ }
259
+ onmdoDropdownClosed() {
260
+ // Keep the mdo value but clear the search input
261
+ const currentmdo = this.rejectRequestForm.get('mdo_name').value;
262
+ setTimeout(() => {
263
+ if (this.rejectRequestForm.get('searchmdo')) {
264
+ this.rejectRequestForm.get('searchmdo').setValue('');
265
+ }
266
+ // Ensure the mdo value remains selected
267
+ if (currentmdo) {
268
+ const mdoControl = this.rejectRequestForm.get('mdo_name');
269
+ if (mdoControl) {
270
+ mdoControl.setValue(currentmdo);
271
+ }
272
+ }
273
+ }, 100);
274
+ }
275
+ mdoSearch(evt) {
276
+ const searchText = evt?.target?.value;
277
+ const txt = (searchText || '').toString().trim();
278
+ if (this.isLoadingMoremdos)
279
+ return;
280
+ this.mdoSearchText = txt;
281
+ if (txt?.length) {
282
+ this.mdoFilterEnable = true;
283
+ this.isLoadingMoremdos = true;
284
+ this.getmdo(txt, 0);
285
+ }
286
+ else if (this.masterData && this.masterData?.mdoBackup) {
287
+ this.masterData.mdo = this.masterData?.mdoBackup.slice(0, this.mdoDefaultLoadCount);
288
+ this.mdoFilterEnable = false;
289
+ this.checkCurrentmdoPresent();
290
+ }
291
+ }
292
+ setupScrollListener(opened) {
293
+ if (opened) {
294
+ if (!this.scrollListenerAttached) {
295
+ this.scrollListenerAttached = true;
296
+ this.mdoFilterEnable = false;
297
+ this.mdoListLoadCount = this.mdoDefaultLoadCount;
298
+ this.mdoOffset = 0;
299
+ this.isLoadingMoremdos = true;
300
+ this.getmdo(undefined, 0);
301
+ // Clear search box once
302
+ if (this.rejectRequestForm.get('searchmdo')) {
303
+ this.rejectRequestForm.get('searchmdo').setValue('');
304
+ }
305
+ setTimeout(() => {
306
+ const searchInput = document.querySelector('.search-input');
307
+ if (searchInput) {
308
+ searchInput.focus();
309
+ }
310
+ }, 100);
311
+ // Attach scroll listener safely
312
+ setTimeout(() => {
313
+ const panel = document.querySelector('.mat-select-panel.search-panel');
314
+ if (panel) {
315
+ // align panel width to trigger
316
+ try {
317
+ const triggerEl = this.mdoRef && this.mdoRef.nativeElement;
318
+ if (triggerEl) {
319
+ const rect = triggerEl.getBoundingClientRect();
320
+ // set width and left so panel aligns exactly below the trigger
321
+ panel.style.width = `${Math.round(rect.width)}px`;
322
+ // leave left to overlay positioning but nudge if necessary
323
+ // compute left relative to viewport and apply to panel
324
+ const overlayLeft = rect.left;
325
+ panel.style.left = `${Math.round(overlayLeft)}px`;
326
+ }
327
+ }
328
+ catch (e) {
329
+ // ignore DOM errors in SSR or unexpected cases
330
+ }
331
+ const scrollHandler = this.onmdoSelectScroll.bind(this);
332
+ panel.addEventListener('scroll', scrollHandler, { passive: true });
333
+ }
334
+ }, 150);
335
+ }
336
+ }
337
+ else {
338
+ // Dropdown closed — reset scroll flag so it can reattach next time
339
+ this.scrollListenerAttached = false;
340
+ }
341
+ }
342
+ onmdoSelectScroll(event) {
343
+ const element = event?.target;
344
+ if (!this.mdoFilterEnable) {
345
+ // Check if user has scrolled to the bottom (with a small threshold)
346
+ if (element.scrollTop + element?.clientHeight >= element?.scrollHeight - 5) {
347
+ // Only load more if not already loading and if there are potentially more items
348
+ if (!this.isLoadingMoremdos) {
349
+ // If org uses IGOT mdo taxonomy, request more from the API by increasing the limit
350
+ if (this.masterData?.mdoBackup?.length > this.masterData?.mdo?.length) {
351
+ // Local pagination: expand the sliced list
352
+ this.isLoadingMoremdos = true;
353
+ this.mdoListLoadCount += this.mdoDefaultLoadCount;
354
+ // Update the filtered list with more items
355
+ setTimeout(() => {
356
+ this.masterData.mdo = this.masterData?.mdoBackup?.slice(0, this.mdoListLoadCount);
357
+ this.checkCurrentmdoPresent();
358
+ this.isLoadingMoremdos = false;
359
+ }, 500); // Small timeout to simulate loading and prevent multiple triggers
360
+ }
361
+ else {
362
+ // Legacy (server) pagination: request next page if total not reached
363
+ const loadedLegacy = (this.masterData?.mdoBackup || []).length;
364
+ if (!this.noMoreLegacymdos && this.defaultSearchmdoCount && loadedLegacy < this.defaultSearchmdoCount) {
365
+ this.isLoadingMoremdos = true;
366
+ this.mdoOffset = (this.mdoOffset || 0) + this.mdoDefaultLoadCount;
367
+ // increase display count to include newly fetched items
368
+ this.mdoListLoadCount += this.mdoDefaultLoadCount;
369
+ this.getmdo(undefined, this.mdoOffset);
370
+ }
371
+ }
372
+ }
373
+ }
374
+ }
375
+ }
376
+ get searchmdoControl() {
377
+ return this.rejectRequestForm.get('searchmdo');
378
+ }
379
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RejectRequestFormComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i3.SharedService }, { token: i4.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
380
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RejectRequestFormComponent, selector: "app-reject-request-form", viewQueries: [{ propertyName: "mdoRef", first: true, predicate: ["mdo"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Send For Approval</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"approvalRequestForm\">\n <mat-card class=\"mt-1\">\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Request Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" formControlName=\"request_name\" [value]=\"\" placeholder=\"Enter a name for this request...\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width:100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Select MDO Admin/Leader</p>\n </div>\n <div class=\"section-header mt-4\">\n <!-- <input type=\"text\" formControlName=\"mdo_name\" placeholder=\"Enter mdo\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\"> -->\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n <mat-select #position formControlName=\"mdo_name\"\n placeholder=\"Select MDO Admin/Leader\" (closed)=\"onmdoDropdownClosed()\"\n panelClass=\"search-panel\" (openedChange)=\"setupScrollListener($event)\">\n\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input type=\"text\" placeholder=\"Search mdo admin/leader\"\n formControlName=\"searchmdo\" class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n (keyup)=\"mdoSearch($event)\" autocomplete=\"off\">\n <button *ngIf=\"searchmdoControl?.value\" type=\"button\" class=\"clear-button\"\n (click)=\"searchmdoControl.setValue('')\">\n \u2715 Clear Search\n </button>\n </div>\n </div>\n <!-- Options list -->\n <mat-option [value]=\"mdo?.id\" *ngFor=\"let mdo of masterData?.mdo\">\n {{mdo?.name}}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoremdos\" class=\"loading-indicator\">\n Load More...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(masterData?.mdo )?.length === 0\" disabled>\n <!-- No matches found -->\n <div class=\"mat-error txt-size\">mdo Not Found.</div>\n </mat-option>\n </mat-select>\n <!-- <mat-error class=\"text-xs\"\n *ngIf=\"approvalRequestForm?.get('mdo_name')?.touched && approvalRequestForm?.get('mdo_name')?.invalid\">\n Please select at least one mdo.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n \n <!-- <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Upload Document (PDF/Word/Excel/TXT)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span>{{ uploadedFile?.name || 'Choose a file (PDF, Word, Excel, TXT)' }}</span>\n </label>\n\n <small class=\"file-upload-hint\">Max file size: 25MB</small>\n\n <input id=\"uploadDoc\" type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n\n </mat-card>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n \n <button [disabled]=\"approvalRequestForm?.invalid\"\n [ngClass]=\"approvalRequestForm?.invalid ? 'btn-disable':'btn-active'\" type=\"button\"\n (click)=\"savemdo()\" ><mat-icon>send</mat-icon> Send Request</button>\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;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:14px;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:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.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{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.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:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;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}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.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:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.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:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;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}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}::ng-deep .mat-notched-outline{border-radius:25px!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i10.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i11.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }] }); }
381
+ }
382
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RejectRequestFormComponent, decorators: [{
383
+ type: Component,
384
+ args: [{ selector: 'app-reject-request-form', template: "<div class=\"view-cbp-plan\">\n <div class=\"popup-container\">\n <div class=\"popup-header\">\n <div>\n <div class=\"heading\">Send For Approval</div>\n </div>\n <div class=\"cursor-pointer\" (click)=\"closeDialog()\">\n <mat-icon>close</mat-icon>\n </div>\n </div>\n </div>\n <div class=\"section-container\" [formGroup]=\"approvalRequestForm\">\n <mat-card class=\"mt-1\">\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Request Name</p>\n </div>\n <div class=\"mt-4 additional-details\">\n <input type=\"text\" formControlName=\"request_name\" [value]=\"\" placeholder=\"Enter a name for this request...\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width:100%;font-size: 14px;font-family: 'Lato';\">\n </div>\n </div>\n <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Select MDO Admin/Leader</p>\n </div>\n <div class=\"section-header mt-4\">\n <!-- <input type=\"text\" formControlName=\"mdo_name\" placeholder=\"Enter mdo\" [value]=\"\"\n style=\"border-radius: 25px; border: 1px solid #ccc; padding: 8px 12px; width: 100%;font-size: 14px;font-family: 'Lato';\"> -->\n <mat-form-field appearance=\"outline\" class=\"margin-top-s w-full required-select\">\n <mat-select #position formControlName=\"mdo_name\"\n placeholder=\"Select MDO Admin/Leader\" (closed)=\"onmdoDropdownClosed()\"\n panelClass=\"search-panel\" (openedChange)=\"setupScrollListener($event)\">\n\n <!-- Sticky search input container -->\n <div class=\"sticky-search-container\" (click)=\"$event.stopPropagation()\">\n <div class=\"search-input-wrapper\">\n <input type=\"text\" placeholder=\"Search mdo admin/leader\"\n formControlName=\"searchmdo\" class=\"search-input\"\n (keydown)=\"$event.stopPropagation()\"\n (keydown.enter)=\"$event.preventDefault(); $event.stopPropagation()\"\n (keyup)=\"mdoSearch($event)\" autocomplete=\"off\">\n <button *ngIf=\"searchmdoControl?.value\" type=\"button\" class=\"clear-button\"\n (click)=\"searchmdoControl.setValue('')\">\n \u2715 Clear Search\n </button>\n </div>\n </div>\n <!-- Options list -->\n <mat-option [value]=\"mdo?.id\" *ngFor=\"let mdo of masterData?.mdo\">\n {{mdo?.name}}\n </mat-option>\n <!-- Loading indicator -->\n <div *ngIf=\"isLoadingMoremdos\" class=\"loading-indicator\">\n Load More...\n </div>\n <!-- No results message -->\n <mat-option *ngIf=\"(masterData?.mdo )?.length === 0\" disabled>\n <!-- No matches found -->\n <div class=\"mat-error txt-size\">mdo Not Found.</div>\n </mat-option>\n </mat-select>\n <!-- <mat-error class=\"text-xs\"\n *ngIf=\"approvalRequestForm?.get('mdo_name')?.touched && approvalRequestForm?.get('mdo_name')?.invalid\">\n Please select at least one mdo.\n </mat-error> -->\n </mat-form-field>\n </div>\n </div>\n\n \n <!-- <div class=\"mt-2 section\">\n <div class=\"sub-heading\">\n <p>Upload Document (PDF/Word/Excel/TXT)</p>\n </div>\n <div class=\"file-upload-wrapper\">\n <label for=\"uploadDoc\" class=\"file-upload-label\">\n <span class=\"file-upload-icon\">\uD83D\uDCCE</span>\n <span>{{ uploadedFile?.name || 'Choose a file (PDF, Word, Excel, TXT)' }}</span>\n </label>\n\n <small class=\"file-upload-hint\">Max file size: 25MB</small>\n\n <input id=\"uploadDoc\" type=\"file\" (change)=\"onFileChange($event)\"\n accept=\".pdf,.doc,.docx,.xls,.xlsx,.txt\" class=\"file-upload-input\" />\n\n <div *ngIf=\"uploadError\" class=\"error\">{{ uploadError }}</div>\n </div>\n </div> -->\n\n </mat-card>\n </div>\n <div class=\"popup-footer\">\n <div>\n <input class=\"btn-active\" type=\"button\" value=\"Cancel\" (click)=\"cancelForm()\" />\n </div>\n <div>\n \n <button [disabled]=\"approvalRequestForm?.invalid\"\n [ngClass]=\"approvalRequestForm?.invalid ? 'btn-disable':'btn-active'\" type=\"button\"\n (click)=\"savemdo()\" ><mat-icon>send</mat-icon> Send Request</button>\n </div>\n </div>\n</div>\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".container{margin:10px auto}.sub-heading p{color:#000;font-family:Montserrat;font-size:16px;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:14px;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:10px;font-size:20px;left:10px}.search .sinput{border-radius:4px;border:1px solid #d5d0d0;padding:15px 36px;font:400 14px Lato}.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{display:flex;padding:4px 8px;align-items:center;gap:8px;border-radius:var(--Radius-4, 4px);border:1px solid #1B4CA1;background:#1b4ca129}.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:20px;font-style:normal;font-weight:600;line-height:30px}.course-desc{color:#0009;font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal}.relevancy,.competencies-matched{color:var(--accessbility-shades-with-opacity-kb-greys-black-60, rgba(0, 0, 0, .6));font-family:Lato;font-size:14px;font-style:normal;font-weight:400;line-height:normal;align-items:center}.percentage{color:#1d8923;font-family:Lato;font-size:14px;font-style:normal;font-weight:800;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}.course-list-item{flex:0 0 48%;box-sizing:border-box;border:1px solid #ccc;padding:16px;background-color:#fff;border-radius:8px}.checked-course-container{display:flex}.ml-2{margin-left:8px}::ng-deep .mat-checkbox-checked .mat-checkbox-background{background:#1b4ca1!important}.ai-recommened-pill-text,.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:space-between;flex-direction:row}.outside-layer-total{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #1B4CA1;border-right:2px solid #1B4CA1;background:#edf1f8;margin:0 10px}.outside-layer-functional{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #E24577;border-right:2px solid #E24577;background:#f8d2de;margin:0 10px}.outside-layer-domain{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #7B47A4;border-right:2px solid #7B47A4;background:#dfd3e9;margin:0 10px}.outside-layer-behavioral{display:flex;padding:4px 12px;justify-content:center;align-items:center;gap:16px;border-radius:12px;border-left:2px solid #F8B861;border-right:2px solid #F8B861;background:#fde8cc;margin:0 10px}.inside-layer{color:#1b4ca1;font-family:Lato;font-size:12px;font-style:normal;font-weight:400;line-height:normal}.count{color:#1b4ca1;font-family:Montserrat;font-size:16px;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:20px;font-style:normal;font-weight:600;line-height:normal;margin:10px 0}.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:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #F8B861;background:linear-gradient(0deg,#f8b86152 0% 100%),#fff;margin:5px 0}.functional-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #E24577;background:linear-gradient(0deg,#e245773d 0% 100%),#fff;margin:5px 0}.domain-pill{display:flex;padding:0 8px;justify-content:center;align-items:center;gap:10px;border-radius:32px;border:1px solid #7B47A4;background:linear-gradient(0deg,#7b47a43d 0% 100%),#fff;margin:5px 0}.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:6px}.competency-text{color:#000;font-family:Lato;font-size:10px;font-style:normal;font-weight:400;line-height:normal;padding:5px}.competency-sub-heading{color:#1b4ca1;font-family:Montserrat;font-size:12px;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}.close .mat-icon{height:18px!important;width:18px!important}:host ::ng-deep .mat-select-arrow-wrapper{height:6px!important}.file-upload-wrapper{position:relative;margin:16px 0}.file-upload-label{display:inline-flex;align-items:center;padding:10px 16px;background-color:#1b4ca1;color:#fff;font-weight:500;cursor:pointer;transition:background-color .3s;-webkit-user-select:none;user-select:none;border-radius:8px}.file-upload-label:hover{background-color:#1b4ca1}.file-upload-icon{margin-right:8px;font-size:18px}.file-upload-input{display:none}.error{color:red;margin-top:6px;font-size:.875rem}.file-upload-hint{display:block;font-size:1rem;color:#000;font-family:Lato;font-size:14px;margin-top:4px;margin-bottom:8px}::ng-deep .mat-select-panel.search-panel .search-input{flex:1 1 auto;width:100%;padding:8px 10px;border:1px solid rgba(0,0,0,.12);border-radius:4px;font-size:14px;color:#333;outline:none;box-sizing:border-box}::ng-deep .mat-select-panel.search-panel .search-input:focus{border-color:#0074b6;box-shadow:0 0 0 3px #0074b60f}::ng-deep .mat-select-panel.search-panel .clear-button{background:transparent;border:none;cursor:pointer;font-size:16px;color:#666;padding:6px;line-height:1}::ng-deep .mat-select-panel.search-panel .loading-indicator{padding:10px 12px;text-align:center;color:#666;font-size:14px}::ng-deep .mat-select-panel.search-panel .mat-option{padding-top:10px;padding-left:16px}::ng-deep .mat-select-panel.search-panel mat-option[disabled]{padding:8px 16px!important}::ng-deep .mat-select-panel.align-panel{padding:0!important;box-sizing:border-box;margin-left:0!important;min-width:340px!important;max-width:340px!important}::ng-deep .mat-select-panel.align-panel .mat-option{padding-left:16px}::ng-deep .mat-select-panel.search-panel mat-option[disabled] .mat-error,::ng-deep .mat-select-panel.search-panel .mat-error{margin:0!important;padding:0!important;font-size:14px!important;line-height:1.4!important;color:#f44336}::ng-deep .mat-form-field{width:100%}::ng-deep .mat-text-field-wrapper{background:#fff;border-radius:25px!important;height:42px}::ng-deep .mat-notched-outline{border-radius:25px!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{border-radius:25px!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start,::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-width:1px!important;min-width:0!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:transparent!important}::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:transparent!important}::ng-deep .mat-form-field-appearance-outline .mat-form-field-flex{border-radius:25px;height:42px;align-items:center;padding:0 16px;background:#fff}::ng-deep .mat-select-panel{border:1px solid rgba(0,0,0,.16);border-radius:8px;box-shadow:0 6px 18px #0000001f}\n"] }]
385
+ }], ctorParameters: function () { return [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
386
+ type: Inject,
387
+ args: [MAT_DIALOG_DATA]
388
+ }] }, { type: i2.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i3.SharedService }, { type: i4.MatSnackBar }]; }, propDecorators: { mdoRef: [{
389
+ type: ViewChild,
390
+ args: ['mdo', { read: ElementRef }]
391
+ }] } });
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVqZWN0LXJlcXVlc3QtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy9yZWplY3QtcmVxdWVzdC1mb3JtL3JlamVjdC1yZXF1ZXN0LWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvcmVqZWN0LXJlcXVlc3QtZm9ybS9yZWplY3QtcmVxdWVzdC1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFxQyxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU1RixPQUFPLEVBQWMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRyxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7Ozs7Ozs7Ozs7Ozs7QUFRdEIsTUFBTSxPQUFPLDBCQUEwQjtJQWtCckMsWUFBbUIsU0FBbUQsRUFDcEMsSUFBUyxFQUNqQyxFQUFlLEVBQ2YsS0FBd0IsRUFDeEIsYUFBNEIsRUFDNUIsUUFBcUI7UUFMWixjQUFTLEdBQVQsU0FBUyxDQUEwQztRQUNwQyxTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFhO1FBcEIvQixZQUFPLEdBQUcs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Q0FBQyxtQkFBbUIsQ0FBQTs0QkFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3lCQUN2QztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBZ0IsQ0FBQztJQUNoRSxDQUFDOytHQTVaVSwwQkFBMEIsOENBbUIzQixlQUFlO21HQW5CZCwwQkFBMEIseUlBSVgsVUFBVSw2QkNqQnRDLDZyTEEwR007OzRGRDdGTywwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0UseUJBQXlCOzswQkF1QmhDLE1BQU07MkJBQUMsZUFBZTs0SkFmZSxNQUFNO3NCQUE3QyxTQUFTO3VCQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEsIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbmplY3QsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMsIEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmluYWxpemUsIHN0YXJ0V2l0aCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2hhcmVkU2VydmljZSB9IGZyb20gJy4uLy4uL21vZHVsZXMvc2hhcmVkL3NlcnZpY2VzL3NoYXJlZC5zZXJ2aWNlJztcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZWplY3QtcmVxdWVzdC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlamVjdC1yZXF1ZXN0LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9yZWplY3QtcmVxdWVzdC1mb3JtLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgUmVqZWN0UmVxdWVzdEZvcm1Db21wb25lbnQge1xuICByZWplY3RSZXF1ZXN0Rm9ybTogRm9ybUdyb3VwO1xuICBjYnBQbGFuRmluYWxPYmo6IGFueVxuICBsb2FkaW5nID0gZmFsc2VcbiAgQFZpZXdDaGlsZCgnbWRvJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIG1kb1JlZj86IEVsZW1lbnRSZWZcbiAgbWRvRmlsdGVyRW5hYmxlID0gZmFsc2VcbiAgaXNMb2FkaW5nTW9yZW1kb3MgPSBmYWxzZTtcbiAgbWRvT2Zmc2V0ID0gMFxuICBvZGNzbWRvQ291bnQgPSAwXG4gIGRlZmF1bHRTZWFyY2htZG9Db3VudCA9IDBcbiAgbWRvTGlzdExvYWRDb3VudCA9IDUwXG4gIG1kb0RlZmF1bHRMb2FkQ291bnQgPSA1MFxuICBub01vcmVMZWdhY3ltZG9zID0gZmFsc2VcbiAgbWRvU2VhcmNoVGV4dCA9ICcnXG4gIG1kb0luaXRJblByb2dyZXNzID0gZmFsc2VcbiAgc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCA9IGZhbHNlXG4gIG1hc3RlckRhdGE6IGFueSA9IHt9XG4gIHJvbGVfbWFwcGluZ19pZHMgPSBbXVxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8UmVqZWN0UmVxdWVzdEZvcm1Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSxcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0Jhcikge1xuICAgICAgdGhpcy5yb2xlX21hcHBpbmdfaWRzID0gZGF0YVxuICAgIHRoaXMubWFzdGVyRGF0YSA9IHtcbiAgICAgIG1kb0JhY2t1cDogW10sXG4gICAgICBtZG9GaWx0ZXJlZDogW10sIC8vIGZpbHRlcmVkIHNlYXJjaCByZXN1bHRzXG4gICAgfTtcblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLnJvbGVfbWFwcGluZ19pZHMtLScsdGhpcy5yb2xlX21hcHBpbmdfaWRzKVxuXG4gICAgY29uc3Qgc2VhcmNoQ29udHJvbCA9IHRoaXMucmVqZWN0UmVxdWVzdEZvcm0uZ2V0KCdzZWFyY2htZG8nKTtcblxuICAgIGlmIChzZWFyY2hDb250cm9sKSB7XG4gICAgICBzZWFyY2hDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHN0YXJ0V2l0aCgnJylcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgdHh0ID0gcmVzPy50b1N0cmluZygpPy50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgICBpZiAodHh0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubWRvRmlsdGVyRW5hYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG9GaWx0ZXJlZCA9XG4gICAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG9CYWNrdXAuZmlsdGVyKChpdGVtOiBhbnkpID0+XG4gICAgICAgICAgICAgICAgaXRlbS5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModHh0LnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIHNob3cgaW5pdGlhbCBwYWdlIG9mIGZpbHRlcmVkIHJlc3VsdHNcbiAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG8gPSB0aGlzLm1hc3RlckRhdGEubWRvRmlsdGVyZWQuc2xpY2UoMCwgdGhpcy5tZG9MaXN0TG9hZENvdW50KTtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1kb0ZpbHRlckVuYWJsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBzaG93IGZpcnN0IHBhZ2UgZnJvbSBiYWNrdXBcbiAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG8gPSB0aGlzLm1hc3RlckRhdGEubWRvQmFja3VwLnNsaWNlKDAsIHRoaXMubWRvRGVmYXVsdExvYWRDb3VudCk7XG4gICAgICAgICAgICB0aGlzLm1kb0xpc3RMb2FkQ291bnQgPSB0aGlzLm1kb0RlZmF1bHRMb2FkQ291bnQ7XG4gICAgICAgICAgICB0aGlzLm1kb09mZnNldCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cblxuICAgIGNvbnNvbGUubG9nKHRoaXMubWFzdGVyRGF0YVsnbWRvQmFja3VwJ10pXG4gICAgaWYgKCF0aGlzLm1hc3RlckRhdGFbJ21kb0JhY2t1cCddLmxlbmd0aCkge1xuICAgICAgdGhpcy5nZXRtZG9TYWZlKClcbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgZ2V0bWRvU2FmZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZG9Jbml0SW5Qcm9ncmVzcyB8fCB0aGlzLmlzTG9hZGluZ01vcmVtZG9zKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5tZG9Jbml0SW5Qcm9ncmVzcyA9IHRydWVcbiAgICB0aGlzLmdldG1kbygpXG4gIH1cblxuICBpbml0aWFsaXplRm9ybSgpIHtcbiAgICB0aGlzLnJlamVjdFJlcXVlc3RGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBtZG9fbmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHJlcXVlc3RfbmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHNlYXJjaG1kbzogWycnXSxcbiAgICB9KTtcbiAgfVxuXG5cblxuICBjYW5jZWxGb3JtKCkge1xuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKClcbiAgfVxuXG4gIHNhdmVtZG8oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRtZG86IHN0cmluZyA9IHRoaXMucmVqZWN0UmVxdWVzdEZvcm0uZ2V0KCdtZG9fbmFtZScpPy52YWx1ZTtcblxuICAgIGlmICghc2VsZWN0ZWRtZG8pIHtcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignUGxlYXNlIHNlbGVjdCBhbiBtZG8gbGVhZGVyL2FkbWluJywgJ1gnLCB7IGR1cmF0aW9uOiAzMDAwIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG5cbiAgICBjb25zdCBiYXNlT2JqID0ge1xuICAgICAgc3RhdGVfY2VudGVyX2lkOiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5LmlkZW50aWZpZXIsXG4gICAgICAvLyBzdGF0ZV9jZW50ZXJfbmFtZTogdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5vcmdOYW1lLFxuICAgICAgcm9sZV9tYXBwaW5nX2lkczogdGhpcy5yb2xlX21hcHBpbmdfaWRzLm1hcCgoaXRlbTogYW55KSA9PiBpdGVtLmlkKSxcbiAgICAgIHJlcXVlc3RfbmFtZTogdGhpcy5yZWplY3RSZXF1ZXN0Rm9ybS52YWx1ZS5yZXF1ZXN0X25hbWUsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnc3RhdGUnICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lKSB7XG4gICAgICBiYXNlT2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAvLyBiYXNlT2JqWydkZXBhcnRtZW50X25hbWUnXSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lKSB7XG4gICAgICBiYXNlT2JqWydkZXBhcnRtZW50X2lkJ10gPSB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzO1xuICAgICAvLyBiYXNlT2JqWydkZXBhcnRtZW50X25hbWUnXSA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudF9uYW1lO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBvYnNlcnZhYmxlcywgb25lIHBlciBtZG9cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICAuLi5iYXNlT2JqLFxuICAgICAgbWRvX2lkOiBzZWxlY3RlZG1kb1xuICAgIH07XG5cbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2F2ZUFwcHJvdmFsUmVxdWVzdChyZXEpXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmxvYWRpbmcgPSBmYWxzZSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignUmVxdWVzdCBzZW50IHN1Y2Nlc3NmdWxseScsICdYJywge1xuICAgICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdzYXZlZCcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKChlcnJvcj8uZXJyb3I/LmRldGFpbCB8fCAnRmFpbGVkIHRvIHNlbmQgcmVxdWVzdCcpLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgY2xvc2VEaWFsb2coKSB7XG4gICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoKVxuICB9XG5cbiAgZ2V0bWRvKHNlYXJjaFRleHQ/OiBzdHJpbmcsIG9mZnNldD86IG51bWJlcik6IHZvaWQge1xuXG4gICAgLy8gY2xlYXIgYW55IHByZXZpb3VzIGRlYnVnIGhvb2tzXG4gICAgaWYgKCFzZWFyY2hUZXh0IHx8IHNlYXJjaFRleHQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gbm9vcFxuICAgIH1cblxuICAgIGNvbnN0IHJlcU9mZnNldCA9ICh0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJykgPyBvZmZzZXQgOiB0aGlzLm1kb09mZnNldFxuICAgIGxldCByZXFMaW1pdCA9IHRoaXMubWRvRGVmYXVsdExvYWRDb3VudFxuICAgIGNvbnN0IHBhZ2VJbmRleCA9IHJlcUxpbWl0ID4gMCA/IE1hdGguZmxvb3IocmVxT2Zmc2V0IC8gcmVxTGltaXQpIDogMFxuICAgIC8vIGlmIHdlJ3JlIHJlcXVlc3RpbmcgZnJvbSBmaXJzdCBwYWdlLCBjbGVhciB0aGUgbm8tbW9yZS1kYXRhIGd1YXJkXG4gICAgaWYgKHBhZ2VJbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5ub01vcmVMZWdhY3ltZG9zID0gZmFsc2VcbiAgICAgIHJlcUxpbWl0ID0gNTBcbiAgICB9XG4gICAgLy8gY29uc3QgcmVxdWVzdEJvZHk6IGFueSA9IHtcbiAgICAvLyAgIGZpbHRlckNyaXRlcmlhTWFwOiB7XG4gICAgLy8gICAgIHN0YXR1czogJ0FjdGl2ZSdcbiAgICAvLyAgIH0sXG4gICAgLy8gICByZXF1ZXN0ZWRGaWVsZHM6IFtdLFxuICAgIC8vICAgcGFnZU51bWJlcjogcGFnZUluZGV4LFxuICAgIC8vICAgcGFnZVNpemU6IHJlcUxpbWl0LFxuICAgIC8vIH1cblxuICAgIGNvbnN0IHJlcXVlc3RCb2R5OiBhbnkgPSB7XG4gICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICBcImZpbHRlcnNcIjoge1xuICAgICAgICAgIFwib3JnYW5pc2F0aW9ucy5yb2xlc1wiOiBbXG4gICAgICAgICAgICBcIk1ET19MRUFERVJcIixcbiAgICAgICAgICAgIFwiTURPX0FETUlOXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicm9vdE9yZ0lkXCI6IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHMgPyB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzIDogdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyIFxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc1wiOiBbXG4gICAgICAgICAgXCJmaXJzdE5hbWVcIixcbiAgICAgICAgICBcImxhc3ROYW1lXCIsXG4gICAgICAgICAgXCJpZFwiLFxuICAgICAgICAgIFwicm9vdE9yZ0lkXCIsXG4gICAgICAgICAgXCJvcmdhbmlzYXRpb25zXCIsXG4gICAgICAgICAgXCJyb2xlc1wiXG4gICAgICAgIF0sXG4gICAgICAgIHBhZ2VOdW1iZXI6IHBhZ2VJbmRleCxcbiAgICAgICAgcGFnZVNpemU6IHJlcUxpbWl0LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc2VhcmNoVGV4dD8ubGVuZ3RoKSB7XG4gICAgICByZXF1ZXN0Qm9keVsnc2VhcmNoU3RyaW5nJ10gPSBzZWFyY2hUZXh0XG4gICAgICAvLyB3aGVuIHNlYXJjaGluZywgc3RhcnQgZnJvbSBmaXJzdCBwYWdlXG4gICAgICByZXF1ZXN0Qm9keS5wYWdlTnVtYmVyID0gMFxuICAgICAgLy8gYWxsb3cgbGFyZ2VyIHBhZ2UgZm9yIHNlYXJjaCBpZiBuZWVkZWRcbiAgICAgIHJlcXVlc3RCb2R5LnBhZ2VTaXplID0gcGFnZUluZGV4ID09PSAwID8gNTAgOiB0aGlzLm1kb0xpc3RMb2FkQ291bnRcbiAgICAgIC8vIHJlc2V0IGd1YXJkIHdoZW4gcGVyZm9ybWluZyBhIGZyZXNoIHNlYXJjaFxuICAgICAgdGhpcy5ub01vcmVMZWdhY3ltZG9zID0gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBpbmRpY2F0ZSBsb2FkaW5nIHN0YXRlIHNvIHNjcm9sbCBoYW5kbGVycyBkb24ndCB0cmlnZ2VyIHBhcmFsbGVsIGNhbGxzXG4gICAgdGhpcy5pc0xvYWRpbmdNb3JlbWRvcyA9IHRydWVcbiAgICBjb25zb2xlLmxvZygncmVxdWVzdEJvZHknLCByZXF1ZXN0Qm9keSlcbiAgICB0aGlzLnNoYXJlZFNlcnZpY2Uuc2VhcmNoUHVibGljbWRvKHJlcXVlc3RCb2R5KS5waXBlKGZpbmFsaXplKCgpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZW1kb3MgPSBmYWxzZVxuICAgICAgdGhpcy5tZG9Jbml0SW5Qcm9ncmVzcyA9IGZhbHNlXG4gICAgfSkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IF8uZ2V0KHJlcywgJ2FkbWlucycsIFtdKVxuICAgICAgICAgIGNvbnNvbGUubG9nKCdjb250ZW50LS0nLCBjb250ZW50KVxuICAgICAgICAgIGNvbnN0IG1hcHBlZCA9IGNvbnRlbnQubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBpZDogaXRlbT8uaWQsXG4gICAgICAgICAgICBuYW1lOiBgJHtpdGVtPy5maXJzdF9uYW1lfSAke2l0ZW0/Lmxhc3RfbmFtZX1gIHx8ICcnLFxuICAgICAgICAgICAgc3RhdHVzOiBpdGVtPy5zdGF0dXMgfHwgJ0FjdGl2ZScsXG4gICAgICAgICAgICByb2xlX3R5cGU6IGl0ZW0/LnJvbGVfdHlwZSxcbiAgICAgICAgICAgIGRlcGFydG1lbnRfbmFtZTogaXRlbT8uZGVwYXJ0bWVudF9uYW1lXG5cbiAgICAgICAgICB9KSlcblxuICAgICAgICAgIC8vIHRvdGFsIGNvdW50IG1heSBiZSBwcmVzZW50IGluIGRpZmZlcmVudCBrZXlzIGRlcGVuZGluZyBvbiBBUEkgdmVyc2lvbi5cbiAgICAgICAgICAvLyBQcmVmZXIgJ3Jlc3VsdC5yZXN1bHQudG90YWxjb3VudCcgKGxlZ2FjeSBsb3dlci1jYXNlKSB0aGVuIGRhdGEudG90YWxDb3VudCwgdGhlbiB0b3RhbENvdW50XG4gICAgICAgICAgY29uc3QgdG90YWwgPSBfLmdldChyZXMsICdjb3VudCcsIF8uZ2V0KHJlcywgJ2NvdW50JywgXy5nZXQocmVzLCAnY291bnQnLCAwKSkpXG4gICAgICAgICAgdGhpcy5kZWZhdWx0U2VhcmNobWRvQ291bnQgPSB0b3RhbFxuXG4gICAgICAgICAgLy8gSWYgb2Zmc2V0IGlzIHplcm8gKGZpcnN0IHBhZ2UpIHJlcGxhY2UgYmFja3VwLCBvdGhlcndpc2UgYXBwZW5kICsgZGVkdXBlXG4gICAgICAgICAgaWYgKCF0aGlzLm1hc3RlckRhdGFbJ21kb0JhY2t1cCddIHx8IHJlcU9mZnNldCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhWydtZG9CYWNrdXAnXSA9IG1hcHBlZFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZCA9ICh0aGlzLm1hc3RlckRhdGFbJ21kb0JhY2t1cCddIHx8IFtdKS5jb25jYXQobWFwcGVkKVxuICAgICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhWydtZG9CYWNrdXAnXSA9IF8udW5pcUJ5KGNvbWJpbmVkLCAoaXQ6IGFueSkgPT4gKGl0Py5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHNlcnZlciByZXR1cm5lZCBubyBuZXcgaXRlbXMsIG1hcmsgYXMgbm8tbW9yZS1kYXRhIHRvIHN0b3AgZnVydGhlciBzY3JvbGwgcmVxdWVzdHNcbiAgICAgICAgICBpZiAoIW1hcHBlZCB8fCBtYXBwZWQ/Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5ub01vcmVMZWdhY3ltZG9zID0gdHJ1ZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIElmIHdlJ3ZlIGxvYWRlZCBhdCBsZWFzdCB0aGUgdG90YWwgY291bnQsIG1hcmsgbm8tbW9yZS1kYXRhXG4gICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFNlYXJjaG1kb0NvdW50ICYmICh0aGlzLm1hc3RlckRhdGFbJ21kb0JhY2t1cCddIHx8IFtdKS5sZW5ndGggPj0gdGhpcy5kZWZhdWx0U2VhcmNobWRvQ291bnQpIHtcbiAgICAgICAgICAgIHRoaXMubm9Nb3JlTGVnYWN5bWRvcyA9IHRydWVcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbnN1cmUgdmlzaWJsZSBsaXN0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCBkaXNwbGF5IGNvdW50XG4gICAgICAgICAgdGhpcy5tYXN0ZXJEYXRhWydtZG8nXSA9ICh0aGlzLm1hc3RlckRhdGFbJ21kb0JhY2t1cCddIHx8IFtdKS5zbGljZSgwLCB0aGlzLm1kb0xpc3RMb2FkQ291bnQpXG4gICAgICAgICAgLy8gbG9hZGluZyBmbGFnIGNsZWFyZWQgaW4gZmluYWxpemUoKVxuICAgICAgICAgIHRoaXMuY2hlY2tDdXJyZW50bWRvUHJlc2VudCgpXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gU3RvcCBmdXJ0aGVyIGF1dG9tYXRpYyBjYWxscyBvbiByZXBlYXRlZCBlcnJvcnMgdG8gYXZvaWQgdGlnaHQgbG9vcHNcbiAgICAgICAgICAvLyBsb2FkaW5nIGZsYWcgY2xlYXJlZCBpbiBmaW5hbGl6ZSgpXG4gICAgICAgICAgdGhpcy5ub01vcmVMZWdhY3ltZG9zID0gdHJ1ZVxuICAgICAgICAgIC8vIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIG1kbyBkZXRhaWxzLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cbmNoZWNrQ3VycmVudG1kb1ByZXNlbnQoKSB7XG4gIGNvbnN0IHNlbGVjdGVkbWRvID0gdGhpcy5yZWplY3RSZXF1ZXN0Rm9ybS5nZXQoJ21kb19uYW1lJyk/LnZhbHVlO1xuXG4gIGlmICghc2VsZWN0ZWRtZG8gfHwgIXRoaXMubWFzdGVyRGF0YT8ubWRvKSByZXR1cm47XG5cbiAgY29uc3QgZXhpc3RzID0gdGhpcy5tYXN0ZXJEYXRhLm1kby5zb21lKFxuICAgIChpdGVtOiBhbnkpID0+IGl0ZW0/Lm5hbWU/LnRvTG93ZXJDYXNlKCkgPT09IHNlbGVjdGVkbWRvPy50b0xvd2VyQ2FzZSgpXG4gICk7XG5cbiAgaWYgKCFleGlzdHMpIHtcbiAgICBjb25zdCBuZXdtZG8gPSB7XG4gICAgICBuYW1lOiBzZWxlY3RlZG1kbyxcbiAgICAgIHN0YXR1czogJ0FjdGl2ZScsXG4gICAgICBpZDogJ2N1c3RvbS0nICsgRGF0ZS5ub3coKVxuICAgIH07XG5cbiAgICB0aGlzLm1hc3RlckRhdGEubWRvQmFja3VwID0gdGhpcy5tYXN0ZXJEYXRhLm1kb0JhY2t1cCB8fCBbXTtcbiAgICB0aGlzLm1hc3RlckRhdGEubWRvQmFja3VwLnVuc2hpZnQobmV3bWRvKTtcbiAgICB0aGlzLm1hc3RlckRhdGEubWRvLnVuc2hpZnQobmV3bWRvKTtcbiAgfVxufVxuICBvbm1kb0Ryb3Bkb3duQ2xvc2VkKCk6IHZvaWQge1xuICAgIC8vIEtlZXAgdGhlIG1kbyB2YWx1ZSBidXQgY2xlYXIgdGhlIHNlYXJjaCBpbnB1dFxuICAgIGNvbnN0IGN1cnJlbnRtZG8gPSB0aGlzLnJlamVjdFJlcXVlc3RGb3JtLmdldCgnbWRvX25hbWUnKSEudmFsdWVcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnJlamVjdFJlcXVlc3RGb3JtLmdldCgnc2VhcmNobWRvJykpIHtcbiAgICAgICAgdGhpcy5yZWplY3RSZXF1ZXN0Rm9ybS5nZXQoJ3NlYXJjaG1kbycpIS5zZXRWYWx1ZSgnJylcbiAgICAgIH1cbiAgICAgIC8vIEVuc3VyZSB0aGUgbWRvIHZhbHVlIHJlbWFpbnMgc2VsZWN0ZWRcbiAgICAgIGlmIChjdXJyZW50bWRvKSB7XG4gICAgICAgIGNvbnN0IG1kb0NvbnRyb2wgPSB0aGlzLnJlamVjdFJlcXVlc3RGb3JtLmdldCgnbWRvX25hbWUnKTtcbiAgICAgICAgaWYgKG1kb0NvbnRyb2wpIHtcbiAgICAgICAgICBtZG9Db250cm9sLnNldFZhbHVlKGN1cnJlbnRtZG8pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCAxMDApXG4gIH1cblxuICBtZG9TZWFyY2goZXZ0OiBhbnkpIHtcbiAgICBjb25zdCBzZWFyY2hUZXh0ID0gZXZ0Py50YXJnZXQ/LnZhbHVlXG4gICAgY29uc3QgdHh0ID0gKHNlYXJjaFRleHQgfHwgJycpLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgaWYgKHRoaXMuaXNMb2FkaW5nTW9yZW1kb3MpIHJldHVyblxuXG4gICAgdGhpcy5tZG9TZWFyY2hUZXh0ID0gdHh0XG4gICAgaWYgKHR4dD8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLm1kb0ZpbHRlckVuYWJsZSA9IHRydWVcbiAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZW1kb3MgPSB0cnVlXG4gICAgICB0aGlzLmdldG1kbyh0eHQsIDApXG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlckRhdGEgJiYgdGhpcy5tYXN0ZXJEYXRhPy5tZG9CYWNrdXApIHtcbiAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG8gPSB0aGlzLm1hc3RlckRhdGE/Lm1kb0JhY2t1cC5zbGljZSgwLCB0aGlzLm1kb0RlZmF1bHRMb2FkQ291bnQpXG4gICAgICB0aGlzLm1kb0ZpbHRlckVuYWJsZSA9IGZhbHNlXG4gICAgICB0aGlzLmNoZWNrQ3VycmVudG1kb1ByZXNlbnQoKVxuICAgIH1cbiAgfVxuICBzZXR1cFNjcm9sbExpc3RlbmVyKG9wZW5lZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChvcGVuZWQpIHtcbiAgICAgIGlmICghdGhpcy5zY3JvbGxMaXN0ZW5lckF0dGFjaGVkKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCA9IHRydWVcblxuICAgICAgICB0aGlzLm1kb0ZpbHRlckVuYWJsZSA9IGZhbHNlXG4gICAgICAgIHRoaXMubWRvTGlzdExvYWRDb3VudCA9IHRoaXMubWRvRGVmYXVsdExvYWRDb3VudFxuICAgICAgICB0aGlzLm1kb09mZnNldCA9IDBcblxuICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmVtZG9zID0gdHJ1ZVxuICAgICAgICB0aGlzLmdldG1kbyh1bmRlZmluZWQsIDApXG5cbiAgICAgICAgLy8gQ2xlYXIgc2VhcmNoIGJveCBvbmNlXG4gICAgICAgIGlmICh0aGlzLnJlamVjdFJlcXVlc3RGb3JtLmdldCgnc2VhcmNobWRvJykpIHtcbiAgICAgICAgICB0aGlzLnJlamVjdFJlcXVlc3RGb3JtLmdldCgnc2VhcmNobWRvJykhLnNldFZhbHVlKCcnKVxuICAgICAgICB9XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VhcmNoSW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc2VhcmNoLWlucHV0JykgYXMgSFRNTElucHV0RWxlbWVudFxuICAgICAgICAgIGlmIChzZWFyY2hJbnB1dCkge1xuICAgICAgICAgICAgc2VhcmNoSW5wdXQuZm9jdXMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKVxuXG4gICAgICAgIC8vIEF0dGFjaCBzY3JvbGwgbGlzdGVuZXIgc2FmZWx5XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1hdC1zZWxlY3QtcGFuZWwuc2VhcmNoLXBhbmVsJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsXG4gICAgICAgICAgaWYgKHBhbmVsKSB7XG4gICAgICAgICAgICAvLyBhbGlnbiBwYW5lbCB3aWR0aCB0byB0cmlnZ2VyXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyRWwgPSB0aGlzLm1kb1JlZiAmJiB0aGlzLm1kb1JlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50XG4gICAgICAgICAgICAgIGlmICh0cmlnZ2VyRWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWN0ID0gdHJpZ2dlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgICAgICAgICAgICAgLy8gc2V0IHdpZHRoIGFuZCBsZWZ0IHNvIHBhbmVsIGFsaWducyBleGFjdGx5IGJlbG93IHRoZSB0cmlnZ2VyXG4gICAgICAgICAgICAgICAgcGFuZWwuc3R5bGUud2lkdGggPSBgJHtNYXRoLnJvdW5kKHJlY3Qud2lkdGgpfXB4YFxuICAgICAgICAgICAgICAgIC8vIGxlYXZlIGxlZnQgdG8gb3ZlcmxheSBwb3NpdGlvbmluZyBidXQgbnVkZ2UgaWYgbmVjZXNzYXJ5XG4gICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBsZWZ0IHJlbGF0aXZlIHRvIHZpZXdwb3J0IGFuZCBhcHBseSB0byBwYW5lbFxuICAgICAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlMZWZ0ID0gcmVjdC5sZWZ0XG4gICAgICAgICAgICAgICAgcGFuZWwuc3R5bGUubGVmdCA9IGAke01hdGgucm91bmQob3ZlcmxheUxlZnQpfXB4YFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIC8vIGlnbm9yZSBET00gZXJyb3JzIGluIFNTUiBvciB1bmV4cGVjdGVkIGNhc2VzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbEhhbmRsZXIgPSB0aGlzLm9ubWRvU2VsZWN0U2Nyb2xsLmJpbmQodGhpcylcbiAgICAgICAgICAgIHBhbmVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgMTUwKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEcm9wZG93biBjbG9zZWQg4oCUIHJlc2V0IHNjcm9sbCBmbGFnIHNvIGl0IGNhbiByZWF0dGFjaCBuZXh0IHRpbWVcbiAgICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXJBdHRhY2hlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgb25tZG9TZWxlY3RTY3JvbGwoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBldmVudD8udGFyZ2V0XG4gICAgaWYgKCF0aGlzLm1kb0ZpbHRlckVuYWJsZSkge1xuICAgICAgLy8gQ2hlY2sgaWYgdXNlciBoYXMgc2Nyb2xsZWQgdG8gdGhlIGJvdHRvbSAod2l0aCBhIHNtYWxsIHRocmVzaG9sZClcbiAgICAgIGlmIChlbGVtZW50LnNjcm9sbFRvcCArIGVsZW1lbnQ/LmNsaWVudEhlaWdodCA+PSBlbGVtZW50Py5zY3JvbGxIZWlnaHQgLSA1KSB7XG4gICAgICAgIC8vIE9ubHkgbG9hZCBtb3JlIGlmIG5vdCBhbHJlYWR5IGxvYWRpbmcgYW5kIGlmIHRoZXJlIGFyZSBwb3RlbnRpYWxseSBtb3JlIGl0ZW1zXG4gICAgICAgIGlmICghdGhpcy5pc0xvYWRpbmdNb3JlbWRvcykge1xuICAgICAgICAgIC8vIElmIG9yZyB1c2VzIElHT1QgbWRvIHRheG9ub215LCByZXF1ZXN0IG1vcmUgZnJvbSB0aGUgQVBJIGJ5IGluY3JlYXNpbmcgdGhlIGxpbWl0XG4gICAgICAgICAgaWYgKHRoaXMubWFzdGVyRGF0YT8ubWRvQmFja3VwPy5sZW5ndGggPiB0aGlzLm1hc3RlckRhdGE/Lm1kbz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBMb2NhbCBwYWdpbmF0aW9uOiBleHBhbmQgdGhlIHNsaWNlZCBsaXN0XG4gICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmVtZG9zID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5tZG9MaXN0TG9hZENvdW50ICs9IHRoaXMubWRvRGVmYXVsdExvYWRDb3VudFxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBmaWx0ZXJlZCBsaXN0IHdpdGggbW9yZSBpdGVtc1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWFzdGVyRGF0YS5tZG8gPSB0aGlzLm1hc3RlckRhdGE/Lm1kb0JhY2t1cD8uc2xpY2UoMCwgdGhpcy5tZG9MaXN0TG9hZENvdW50KVxuICAgICAgICAgICAgICB0aGlzLmNoZWNrQ3VycmVudG1kb1ByZXNlbnQoKVxuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZ01vcmVtZG9zID0gZmFsc2VcbiAgICAgICAgICAgIH0sIDUwMCkgLy8gU21hbGwgdGltZW91dCB0byBzaW11bGF0ZSBsb2FkaW5nIGFuZCBwcmV2ZW50IG11bHRpcGxlIHRyaWdnZXJzXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIExlZ2FjeSAoc2VydmVyKSBwYWdpbmF0aW9uOiByZXF1ZXN0IG5leHQgcGFnZSBpZiB0b3RhbCBub3QgcmVhY2hlZFxuICAgICAgICAgICAgY29uc3QgbG9hZGVkTGVnYWN5ID0gKHRoaXMubWFzdGVyRGF0YT8ubWRvQmFja3VwIHx8IFtdKS5sZW5ndGhcbiAgICAgICAgICAgIGlmICghdGhpcy5ub01vcmVMZWdhY3ltZG9zICYmIHRoaXMuZGVmYXVsdFNlYXJjaG1kb0NvdW50ICYmIGxvYWRlZExlZ2FjeSA8IHRoaXMuZGVmYXVsdFNlYXJjaG1kb0NvdW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nTW9yZW1kb3MgPSB0cnVlXG4gICAgICAgICAgICAgIHRoaXMubWRvT2Zmc2V0ID0gKHRoaXMubWRvT2Zmc2V0IHx8IDApICsgdGhpcy5tZG9EZWZhdWx0TG9hZENvdW50XG4gICAgICAgICAgICAgIC8vIGluY3JlYXNlIGRpc3BsYXkgY291bnQgdG8gaW5jbHVkZSBuZXdseSBmZXRjaGVkIGl0ZW1zXG4gICAgICAgICAgICAgIHRoaXMubWRvTGlzdExvYWRDb3VudCArPSB0aGlzLm1kb0RlZmF1bHRMb2FkQ291bnRcbiAgICAgICAgICAgICAgdGhpcy5nZXRtZG8odW5kZWZpbmVkLCB0aGlzLm1kb09mZnNldClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc2VhcmNobWRvQ29udHJvbCgpOiBGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMucmVqZWN0UmVxdWVzdEZvcm0uZ2V0KCdzZWFyY2htZG8nKSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJ2aWV3LWNicC1wbGFuXCI+XG4gICAgPGRpdiBjbGFzcz1cInBvcHVwLWNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9wdXAtaGVhZGVyXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCI+U2VuZCBGb3IgQXBwcm92YWw8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImNsb3NlRGlhbG9nKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwiYXBwcm92YWxSZXF1ZXN0Rm9ybVwiPlxuICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtdC0xXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBzZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1Yi1oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwPlJlcXVlc3QgTmFtZTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNCBhZGRpdGlvbmFsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVxdWVzdF9uYW1lXCIgW3ZhbHVlXT1cIlwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBuYW1lIGZvciB0aGlzIHJlcXVlc3QuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjOyBwYWRkaW5nOiA4cHggMTJweDsgd2lkdGg6MTAwJTtmb250LXNpemU6IDE0cHg7Zm9udC1mYW1pbHk6ICdMYXRvJztcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8cD5TZWxlY3QgTURPIEFkbWluL0xlYWRlcjwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXIgbXQtNFwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxpbnB1dCB0eXBlPVwidGV4dFwiIGZvcm1Db250cm9sTmFtZT1cIm1kb19uYW1lXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBtZG9cIiBbdmFsdWVdPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYm9yZGVyLXJhZGl1czogMjVweDsgYm9yZGVyOiAxcHggc29saWQgI2NjYzsgcGFkZGluZzogOHB4IDEycHg7IHdpZHRoOiAxMDAlO2ZvbnQtc2l6ZTogMTRweDtmb250LWZhbWlseTogJ0xhdG8nO1wiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgY2xhc3M9XCJtYXJnaW4tdG9wLXMgdy1mdWxsIHJlcXVpcmVkLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgI3Bvc2l0aW9uIGZvcm1Db250cm9sTmFtZT1cIm1kb19uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBNRE8gQWRtaW4vTGVhZGVyXCIgKGNsb3NlZCk9XCJvbm1kb0Ryb3Bkb3duQ2xvc2VkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M9XCJzZWFyY2gtcGFuZWxcIiAob3BlbmVkQ2hhbmdlKT1cInNldHVwU2Nyb2xsTGlzdGVuZXIoJGV2ZW50KVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTdGlja3kgc2VhcmNoIGlucHV0IGNvbnRhaW5lciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2t5LXNlYXJjaC1jb250YWluZXJcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggbWRvIGFkbWluL2xlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VhcmNobWRvXCIgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwKT1cIm1kb1NlYXJjaCgkZXZlbnQpXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwic2VhcmNobWRvQ29udHJvbD8udmFsdWVcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbGVhci1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWFyY2htZG9Db250cm9sLnNldFZhbHVlKCcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKclSBDbGVhciBTZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE9wdGlvbnMgbGlzdCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwibWRvPy5pZFwiICpuZ0Zvcj1cImxldCBtZG8gb2YgbWFzdGVyRGF0YT8ubWRvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bWRvPy5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBMb2FkaW5nIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nTW9yZW1kb3NcIiBjbGFzcz1cImxvYWRpbmctaW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWQgTW9yZS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm8gcmVzdWx0cyBtZXNzYWdlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0lmPVwiKG1hc3RlckRhdGE/Lm1kbyApPy5sZW5ndGggPT09IDBcIiBkaXNhYmxlZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBObyBtYXRjaGVzIGZvdW5kIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWF0LWVycm9yIHR4dC1zaXplXCI+bWRvIE5vdCBGb3VuZC48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtZXJyb3IgY2xhc3M9XCJ0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImFwcHJvdmFsUmVxdWVzdEZvcm0/LmdldCgnbWRvX25hbWUnKT8udG91Y2hlZCAmJiBhcHByb3ZhbFJlcXVlc3RGb3JtPy5nZXQoJ21kb19uYW1lJyk/LmludmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugc2VsZWN0IGF0IGxlYXN0IG9uZSBtZG8uXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJtdC0yIHNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3ViLWhlYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+VXBsb2FkIERvY3VtZW50IChQREYvV29yZC9FeGNlbC9UWFQpPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLXVwbG9hZC13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJ1cGxvYWREb2NcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbGUtdXBsb2FkLWljb25cIj7wn5OOPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdXBsb2FkZWRGaWxlPy5uYW1lIHx8ICdDaG9vc2UgYSBmaWxlIChQREYsIFdvcmQsIEV4Y2VsLCBUWFQpJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJmaWxlLXVwbG9hZC1oaW50XCI+TWF4IGZpbGUgc2l6ZTogMjVNQjwvc21hbGw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPVwidXBsb2FkRG9jXCIgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cIi5wZGYsLmRvYywuZG9jeCwueGxzLC54bHN4LC50eHRcIiBjbGFzcz1cImZpbGUtdXBsb2FkLWlucHV0XCIgLz5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidXBsb2FkRXJyb3JcIiBjbGFzcz1cImVycm9yXCI+e3sgdXBsb2FkRXJyb3IgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICA8L21hdC1jYXJkPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJwb3B1cC1mb290ZXJcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImJ0bi1hY3RpdmVcIiB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJDYW5jZWxcIiAoY2xpY2spPVwiY2FuY2VsRm9ybSgpXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImFwcHJvdmFsUmVxdWVzdEZvcm0/LmludmFsaWRcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFwcHJvdmFsUmVxdWVzdEZvcm0/LmludmFsaWQgPyAnYnRuLWRpc2FibGUnOididG4tYWN0aXZlJ1wiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlbWRvKClcIiA+PG1hdC1pY29uPnNlbmQ8L21hdC1pY29uPiBTZW5kIFJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PiJdfQ==