@csmart/ngc-smart-core 1.13.10 → 1.13.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/smart-auth/smart-auth.service.mjs +75 -60
- package/fesm2015/csmart-ngc-smart-core.mjs +74 -59
- package/fesm2015/csmart-ngc-smart-core.mjs.map +1 -1
- package/fesm2020/csmart-ngc-smart-core.mjs +74 -59
- package/fesm2020/csmart-ngc-smart-core.mjs.map +1 -1
- package/lib/smart-auth/smart-auth.service.d.ts +2 -0
- package/package.json +1 -1
|
@@ -112,7 +112,7 @@ export class SmartAuthService {
|
|
|
112
112
|
this.loginStaff = await this.xdmService.getLoginStaff();
|
|
113
113
|
}
|
|
114
114
|
const permissions = this.loginStaff.permissions;
|
|
115
|
-
const resource =
|
|
115
|
+
const resource = route.url && route.url.length > 0 ? route.url[0].path : '';
|
|
116
116
|
if (!this.selectedOffender) {
|
|
117
117
|
this.selectedOffender = await this.xdmService.getSelectedOffender();
|
|
118
118
|
}
|
|
@@ -128,8 +128,7 @@ export class SmartAuthService {
|
|
|
128
128
|
this.xdmService.setSelectedOffender(this.selectedOffender);
|
|
129
129
|
// }
|
|
130
130
|
}
|
|
131
|
-
const assignmentStaffRelationId = this.selectedOffender
|
|
132
|
-
.assignmentStaffRelationId;
|
|
131
|
+
const assignmentStaffRelationId = this.selectedOffender.assignmentStaffRelationId;
|
|
133
132
|
const elements = document.querySelectorAll('[class^="sac-"]');
|
|
134
133
|
const pattern = /^sac-(\S+)-(\S+)$/i;
|
|
135
134
|
Array.from(elements).forEach((element) => {
|
|
@@ -230,7 +229,8 @@ export class SmartAuthService {
|
|
|
230
229
|
this.loginStaff = selData.loginStaff;
|
|
231
230
|
this.selectedOffender = selData.selectedOffender;
|
|
232
231
|
let routePath = '';
|
|
233
|
-
if (accessControlConfig.route.url &&
|
|
232
|
+
if (accessControlConfig.route.url &&
|
|
233
|
+
accessControlConfig.route.url.length > 0) {
|
|
234
234
|
routePath = accessControlConfig.route.url[0].path;
|
|
235
235
|
}
|
|
236
236
|
const permissions = this.loginStaff.permissions;
|
|
@@ -244,10 +244,10 @@ export class SmartAuthService {
|
|
|
244
244
|
? 'N/A'
|
|
245
245
|
: this.selectedOffender.assignmentStaffRelationId;
|
|
246
246
|
const permission = permissions.find((p) => {
|
|
247
|
-
return (p.appModuleId === accessControlConfig.appModuleId
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
247
|
+
return (p.appModuleId === accessControlConfig.appModuleId &&
|
|
248
|
+
p.resource === resource &&
|
|
249
|
+
(!roleId || p.roleId === roleId) &&
|
|
250
|
+
(p.assignmentStaffRelationId === 'N/A' ||
|
|
251
251
|
p.assignmentStaffRelationId === assignmentStaffRelationId));
|
|
252
252
|
});
|
|
253
253
|
if (permission) {
|
|
@@ -350,72 +350,87 @@ export class SmartAuthService {
|
|
|
350
350
|
element.setAttribute('style', 'display: none;');
|
|
351
351
|
}
|
|
352
352
|
getStaff(userName) {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
totalCount
|
|
363
|
-
message
|
|
364
|
-
data {
|
|
365
|
-
staffId
|
|
366
|
-
userName
|
|
367
|
-
lastName
|
|
368
|
-
firstName
|
|
369
|
-
phone
|
|
370
|
-
email
|
|
371
|
-
roles {
|
|
372
|
-
roleId
|
|
373
|
-
role
|
|
374
|
-
}
|
|
375
|
-
permissions {
|
|
376
|
-
roleId
|
|
377
|
-
appModuleId
|
|
378
|
-
resource
|
|
379
|
-
assignmentStaffRelationId
|
|
380
|
-
readFlag
|
|
381
|
-
createFlag
|
|
382
|
-
updateFlag
|
|
383
|
-
deleteFlag
|
|
384
|
-
assignFlag
|
|
385
|
-
reopenFlag
|
|
386
|
-
closeFlag
|
|
387
|
-
expungeFlag
|
|
388
|
-
}
|
|
389
|
-
options {
|
|
390
|
-
offenderListOptionId
|
|
391
|
-
name
|
|
392
|
-
serviceApiFieldName
|
|
393
|
-
selectedFlag
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}`;
|
|
398
|
-
return this.http
|
|
399
|
-
.post(this.smartDataServiceUrl, { query: queryString }, httpOptions)
|
|
400
|
-
.pipe(take(1), map((result) => {
|
|
353
|
+
return this.query({
|
|
354
|
+
query: this.findStaffQuery,
|
|
355
|
+
variables: {
|
|
356
|
+
where: {
|
|
357
|
+
userName: userName,
|
|
358
|
+
activeFlag: true,
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
}).pipe(take(1), map((result) => {
|
|
401
362
|
if (isDevMode) {
|
|
402
363
|
console.log('##### getStaff() from service ', result);
|
|
403
364
|
}
|
|
404
|
-
if (result.
|
|
405
|
-
const data = result.
|
|
365
|
+
if (result.findvStaffs.data.length > 0) {
|
|
366
|
+
const data = result.findvStaffs.data[0];
|
|
406
367
|
this.xdmService.setLoginStaff(data);
|
|
407
368
|
this.loginStaff = data;
|
|
408
369
|
return data;
|
|
409
370
|
}
|
|
410
371
|
else {
|
|
411
372
|
return of(null);
|
|
412
|
-
// return throwError('No access right.');
|
|
413
373
|
}
|
|
414
374
|
}), catchError((error) => {
|
|
415
375
|
console.log('error ' + error);
|
|
416
376
|
return of(null);
|
|
417
377
|
}));
|
|
418
378
|
}
|
|
379
|
+
query(options) {
|
|
380
|
+
return this.http
|
|
381
|
+
.post(this.smartDataServiceUrl, {
|
|
382
|
+
query: options.query,
|
|
383
|
+
variables: options.variables,
|
|
384
|
+
}, {
|
|
385
|
+
headers: new HttpHeaders({
|
|
386
|
+
'Content-Type': 'application/json',
|
|
387
|
+
'No-Auth': 'True',
|
|
388
|
+
}),
|
|
389
|
+
})
|
|
390
|
+
.pipe(map((d) => d.data));
|
|
391
|
+
}
|
|
392
|
+
get findStaffQuery() {
|
|
393
|
+
return `
|
|
394
|
+
query findvStaffs($input: vStaffMultiInput) {
|
|
395
|
+
findvStaffs(input: $input) {
|
|
396
|
+
totalCount
|
|
397
|
+
message
|
|
398
|
+
data {
|
|
399
|
+
staffId
|
|
400
|
+
userName
|
|
401
|
+
lastName
|
|
402
|
+
firstName
|
|
403
|
+
phone
|
|
404
|
+
email
|
|
405
|
+
roles {
|
|
406
|
+
roleId
|
|
407
|
+
role
|
|
408
|
+
}
|
|
409
|
+
permissions {
|
|
410
|
+
roleId
|
|
411
|
+
appModuleId
|
|
412
|
+
resource
|
|
413
|
+
assignmentStaffRelationId
|
|
414
|
+
readFlag
|
|
415
|
+
createFlag
|
|
416
|
+
updateFlag
|
|
417
|
+
deleteFlag
|
|
418
|
+
assignFlag
|
|
419
|
+
reopenFlag
|
|
420
|
+
closeFlag
|
|
421
|
+
expungeFlag
|
|
422
|
+
}
|
|
423
|
+
options {
|
|
424
|
+
offenderListOptionId
|
|
425
|
+
name
|
|
426
|
+
serviceApiFieldName
|
|
427
|
+
selectedFlag
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
`;
|
|
433
|
+
}
|
|
419
434
|
getStaffOffenderRelation(staffId, offenderId) {
|
|
420
435
|
const queryString = `
|
|
421
436
|
{
|
|
@@ -485,4 +500,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImpor
|
|
|
485
500
|
type: Inject,
|
|
486
501
|
args: [SMART_DOMAIN_FORMAT]
|
|
487
502
|
}] }]; } });
|
|
488
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3NtYXJ0L25nYy1zbWFydC1jb3JlL3NyYy9saWIvc21hcnQtYXV0aC9zbWFydC1hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7OztBQUcxRCwyQ0FBMkM7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUNVLElBQWdCLEVBQ2hCLFlBQXlCLEVBQ3pCLFVBQXNCLEVBQ1UsbUJBQW1CLEVBQ3RCLG9CQUE0QjtRQUp6RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQUE7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO0lBQ2hFLENBQUM7SUFFRyxhQUFhO1FBQ2xCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pDLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUU7Z0JBQzNCLElBQUksU0FBUyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxHQUFHLENBQ1QseURBQXlELEVBQ3pELElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7aUJBQ0g7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVCO2lCQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ25DLElBQUksU0FBUyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxHQUFHLENBQ1QsbURBQW1ELEVBQ25ELElBQUksQ0FBQyxVQUFVLENBQ2hCLENBQUM7aUJBQ0g7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDaEQ7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQy9DLFNBQVMsQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ3pCLElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3hDLElBQUksU0FBUyxFQUFFO29CQUNiLE9BQU8sQ0FBQyxHQUFHLENBQ1QsMENBQTBDLEVBQzFDLFlBQVksQ0FDYixDQUFDO2lCQUNIO2dCQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQzthQUN6QjtpQkFBTSxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFO2dCQUNoRCxJQUFJLFNBQVMsRUFBRTtvQkFDYixPQUFPLENBQUMsR0FBRyxDQUNULG1EQUFtRCxFQUNuRCxJQUFJLENBQUMsVUFBVSxDQUNoQixDQUFDO2lCQUNIO2dCQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDN0M7aUJBQU07Z0JBQ0wsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztnQkFDL0IsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLFNBQVMsRUFBRTtvQkFDYixPQUFPLENBQUMsR0FBRyxDQUNULHNEQUFzRCxFQUN0RCxTQUFTLENBQ1YsQ0FBQztpQkFDSDtnQkFDRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDakM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVBLElBQUksUUFBUTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxPQUFPLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDeEI7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNiLENBQUM7SUFFTyxVQUFVLENBQUMsR0FBVyxFQUFFLFNBQWlCO1FBQy9DLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3RFLENBQUM7SUFDTyxVQUFVLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDekIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUM7SUFDbEUsQ0FBQztJQUVNLGNBQWMsQ0FBQyxVQUFzQjtRQUMxQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3ZFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGVBQWUsQ0FBQyxFQUFFO2dCQUM3RCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN4RTtTQUNGO2FBQU0sSUFDTCxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FDeEIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQ2hELEdBQUcsQ0FBQyxDQUFDLEVBQ047WUFDQSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDbkQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzthQUNqRTtTQUNGO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBa0M7UUFDakUsSUFBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUM7WUFDbEIsT0FBTztTQUNSO1FBRUQsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixxREFBcUQ7WUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUNoRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFDdkIsZ0JBQWdCLENBQUMsVUFBVSxDQUM1QixDQUFDLENBQUM7WUFDSCxJQUFJLFFBQVEsRUFBRTtnQkFDWixnQkFBZ0IsQ0FBQyx5QkFBeUIsR0FBRyxRQUFRLENBQUM7YUFDdkQ7aUJBQU07Z0JBQ0wsZ0JBQWdCLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDO2FBQ3pEO1lBQ0QsSUFBSTtTQUNMO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztJQUMzQyxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FDeEIsV0FBbUIsRUFDbkIsS0FBNkI7UUFFN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDekQ7UUFDRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFL0UsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLG1CQUFtQixFQUFFLENBQUM7U0FDckU7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QiwwREFBMEQ7WUFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQ2xELElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUNqQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixHQUFHLFFBQVEsQ0FBQzthQUM1RDtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLEdBQUcsVUFBVSxDQUFDO2FBQzlEO1lBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzRCxJQUFJO1NBQ0w7UUFFRCxNQUFNLHlCQUF5QixHQUFHLElBQUksQ0FBQyxnQkFBZ0I7YUFDcEQseUJBQXlCLENBQUM7UUFFN0IsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDOUQsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLENBQUM7UUFFckMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN2QyxJQUFJLElBQUksQ0FBQztZQUNULElBQUksT0FBTyxDQUFDO1lBQ1osT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDOUIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDakMsd0JBQXdCO2dCQUN4QixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztvQkFDNUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN6QiwyQkFBMkI7b0JBQzNCLDJCQUEyQjtvQkFDM0IsMkJBQTJCO29CQUMzQixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzt3QkFDN0MsT0FBTyxDQUNMLENBQUMsQ0FBQyxXQUFXLEtBQUssV0FBVzs0QkFDN0IsQ0FBQyxDQUFDLFFBQVEsS0FBSyxRQUFROzRCQUN2QixDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU07NEJBQ25CLENBQUMsQ0FBQyx5QkFBeUIsS0FBSyx5QkFBeUIsQ0FDMUQsQ0FBQztvQkFDSixDQUFDLENBQUMsQ0FBQztvQkFDSDs7Ozs7Ozs7c0JBUUU7b0JBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFFdEQsSUFBSSxVQUFVLEVBQUU7d0JBQ2QsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFOzRCQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDeEIsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO29DQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDO2lDQUNiOzZCQUNGO2lDQUFNO2dDQUNMLElBQUksR0FBRyxLQUFLLENBQUM7NkJBQ2Q7eUJBQ0Y7NkJBQU0sSUFDTCxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDOzRCQUM5QyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDOzRCQUM5QyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDOzRCQUM5QyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDOzRCQUM5QyxDQUFDLEtBQUssS0FBSyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDOzRCQUM1QyxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDOzRCQUNoRCxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQzlDOzRCQUNBLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0NBQ2pDLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtvQ0FDbEIsSUFBSSxHQUFHLElBQUksQ0FBQztpQ0FDYjs2QkFDRjtpQ0FBTTtnQ0FDTCxJQUFJLE9BQU8sS0FBSyxLQUFLLEVBQUU7b0NBQ3JCLE9BQU8sR0FBRyxJQUFJLENBQUM7aUNBQ2hCOzZCQUNGO3lCQUNGOzZCQUFNOzRCQUNMLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0NBQ2pDLElBQUksR0FBRyxLQUFLLENBQUM7NkJBQ2Q7aUNBQU07Z0NBQ0wsT0FBTyxHQUFHLEtBQUssQ0FBQzs2QkFDakI7eUJBQ0Y7cUJBQ0Y7eUJBQU07d0JBQ0wsSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFOzRCQUNwQixJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0NBQ2xCLElBQUksR0FBRyxJQUFJLENBQUM7NkJBQ2I7eUJBQ0Y7NkJBQU0sSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTs0QkFDeEMsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO2dDQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDOzZCQUNiO3lCQUNGOzZCQUFNLElBQUksT0FBTyxLQUFLLEtBQUssRUFBRTs0QkFDNUIsT0FBTyxHQUFHLElBQUksQ0FBQzt5QkFDaEI7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2xDLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtnQkFDakIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUMvQjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLGVBQWUsQ0FBQyxtQkFBNkM7UUFDbEUsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUNqRCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztZQUMzRSxTQUFTLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxJQUFJLENBQUM7U0FDcEQ7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDM0IsTUFBTSxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTTtZQUN2QyxDQUFDLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRTtZQUMxQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ1QsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUMsVUFBVSxDQUFDO1FBQ2xELE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO2FBQ3JELHlCQUF5QjtZQUMxQixDQUFDLENBQUMsS0FBSztZQUNQLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUM7UUFFcEQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hDLE9BQU8sQ0FDQSxDQUFDLENBQUMsV0FBVyxLQUFLLG1CQUFtQixDQUFDLFdBQVc7bUJBQ2pELENBQUMsQ0FBQyxRQUFRLEtBQUssUUFBUTttQkFDdkIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQzttQkFDaEMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLEtBQUssS0FBSztvQkFDM0MsQ0FBQyxDQUFDLHlCQUF5QixLQUFLLHlCQUF5QixDQUFDLENBQzNELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO2dCQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRTtvQkFDeEIsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7cUJBQU07b0JBQ0wsT0FBTyxJQUFJLENBQUM7aUJBQ2I7YUFDRjtpQkFBTSxJQUNMLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELENBQUMsVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2pELENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUM7Z0JBQ3JELENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFDbkQ7Z0JBQ0EsT0FBTyxLQUFLLENBQUM7YUFDZDtpQkFBTTtnQkFDTCxPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7YUFBTTtZQUNMLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtnQkFDekIsT0FBTyxLQUFLLENBQUM7YUFDZDtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU0scUJBQXFCLENBQzFCLFVBQXNCLEVBQ3RCLE9BQWUsRUFDZixXQUFXLEdBQUcsSUFBSTtRQUVsQiwyREFBMkQ7UUFDM0QsaUJBQWlCO1FBQ2pCLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FDakMsVUFBVSxDQUFDLFdBQVcsRUFDdEIsT0FBTyxFQUNQLFdBQVcsQ0FDWixDQUFDO0lBQ0osQ0FBQztJQUVELDREQUE0RDtJQUM1RCxxQ0FBcUM7SUFDckMsbUdBQW1HO0lBQ25HLE1BQU07SUFDTixrQkFBa0I7SUFDbEIsSUFBSTtJQUVHLGFBQWEsQ0FBQyxLQUFhO1FBQ2hDLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdCLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDaEQ7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyx1QkFBdUIsQ0FDN0IsV0FBeUIsRUFDekIsT0FBZSxFQUNmLFdBQW1CO1FBRW5CLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLElBQUksV0FBVyxFQUFFO2dCQUNmLE9BQU8sQ0FDTCxXQUFXLENBQUMsU0FBUyxDQUNuQixDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLElBQUksQ0FBQyxDQUFDLFdBQVcsS0FBSyxXQUFXLENBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQ1AsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUNsRTtTQUNGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYyxDQUFDLE1BQU07UUFDM0IsUUFBUSxNQUFNLEVBQUU7WUFDZCxLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssUUFBUSxDQUFDO1lBQ2QsS0FBSyxRQUFRLENBQUM7WUFDZCxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssUUFBUTtnQkFDWCxPQUFPLElBQUksQ0FBQztZQUNkO2dCQUNFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFVO1FBQzdCLFFBQVEsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNuQixLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxNQUFNO2dCQUNULE9BQU8sSUFBSSxDQUFDO1lBQ2Q7Z0JBQ0UsT0FBTyxLQUFLLENBQUM7U0FDaEI7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsT0FBZ0I7UUFDekMsd0JBQXdCO1FBQ3hCLFFBQVEsT0FBTyxDQUFDLFFBQVEsRUFBRTtZQUN4QixLQUFLLEdBQUc7Z0JBQ04sT0FBTyxDQUFDLFlBQVksQ0FDbEIsT0FBTyxFQUNQLDJDQUEyQyxDQUM1QyxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUN2QyxNQUFNO1lBQ1I7Z0JBQ0UsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQzdDLE1BQU07U0FDVDtJQUNILENBQUM7SUFFTyxlQUFlLENBQUMsT0FBZ0I7UUFDdEMsNENBQTRDO1FBQzVDLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVPLFFBQVEsQ0FBQyxRQUFnQjtRQUMvQixNQUFNLFdBQVcsR0FBRztZQUNsQixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3JCLGNBQWMsRUFBRSxrQkFBa0I7Z0JBQ2xDLFNBQVMsRUFBRSxNQUFNO2FBQ3BCLENBQUM7U0FDSCxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQUc7O3VEQUUrQixRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Y0FvQ2pELENBQUM7UUFFWCxPQUFPLElBQUksQ0FBQyxJQUFJO2FBQ2IsSUFBSSxDQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxXQUFXLENBQUM7YUFDeEUsSUFBSSxDQUNILElBQUksQ0FBQyxDQUFDLENBQUMsRUFDUCxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNiLElBQUksU0FBUyxFQUFFO2dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0NBQWdDLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDdkQ7WUFDRCxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztnQkFDdkIsT0FBTyxJQUFJLENBQUM7YUFDYjtpQkFBTTtnQkFDTCxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEIseUNBQXlDO2FBQzFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDOUIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUM7SUFFTyx3QkFBd0IsQ0FDOUIsT0FBZSxFQUNmLFVBQWtCO1FBRWxCLE1BQU0sV0FBVyxHQUFHOztxRUFFNkMsT0FBTyxpQkFBaUIsVUFBVTs7Ozs7Y0FLekYsQ0FBQztRQUVYLE9BQU8sSUFBSSxDQUFDLElBQUk7YUFDYixJQUFJLENBQU0sSUFBSSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDO2FBQzNELElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDYixJQUFJLFNBQVMsRUFBRTtnQkFDYixPQUFPLENBQUMsR0FBRyxDQUNULGdEQUFnRCxFQUNoRCxNQUFNLENBQ1AsQ0FBQzthQUNIO1lBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0QsT0FBTyxJQUFJLENBQUMseUJBQXlCLENBQUM7YUFDdkM7aUJBQU07Z0JBQ0wsT0FBTyxJQUFJLENBQUM7Z0JBQ1oseUNBQXlDO2FBQzFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsVUFBVSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDOUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ04sQ0FBQztJQUVPLGtCQUFrQixDQUN4QixXQUFtQixFQUNuQixRQUFnQjtRQUVoQixNQUFNLFdBQVcsR0FBRzs7cUVBRTZDLFdBQVcsZUFBZSxRQUFROzs7O1lBSTNGLENBQUM7UUFFVCxPQUFPLElBQUksQ0FBQyxJQUFJO2FBQ2IsSUFBSSxDQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsQ0FBQzthQUMzRCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUNQLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2IsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FDVCxpREFBaUQsRUFDakQsTUFBTSxDQUNQLENBQUM7YUFDSDtZQUNELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO2dCQUN4RCxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLE9BQU8sS0FBSyxDQUFDO2dCQUNiLHlDQUF5QzthQUMxQztRQUNILENBQUMsQ0FBQyxFQUNGLFVBQVUsQ0FBQyxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQzlCLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDTixDQUFDOzttSkExaUJVLGdCQUFnQixpR0FRakIsc0JBQXNCLGFBQ3RCLG1CQUFtQjt1SkFUbEIsZ0JBQWdCLGNBRmYsTUFBTTsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFTSSxNQUFNOzJCQUFDLHNCQUFzQjs7MEJBQzdCLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEhlYWRlcnMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mLCBmcm9tLCB0aHJvd0Vycm9yLCBsYXN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCwgc3dpdGNoTWFwLCB0YWtlLCBjYXRjaEVycm9yfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IE1zYWxTZXJ2aWNlIH0gZnJvbSAnQGF6dXJlL21zYWwtYW5ndWxhcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuaW1wb3J0IHtcclxuICBMb2dpblN0YWZmLFxyXG4gIFNlbGVjdGVkT2ZmZW5kZXIsXHJcbiAgU01BUlRfREFUQV9TRVJWSUNFX1VSTCxcclxuICBTTUFSVF9ET01BSU5fRk9STUFULFxyXG4gIFJvbGUsXHJcbiAgUGVybWlzc2lvbixcclxufSBmcm9tICcuLi9zbWFydC1zdG9yYWdlL3NtYXJ0LXN0b3JhZ2UtbW9kZWwnO1xyXG5pbXBvcnQgeyBYZG1TZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS94ZG0uc2VydmljZSc7XHJcbmltcG9ydCB7IFNtYXJ0QWNjZXNzQ29udHJvbENvbmZpZyB9IGZyb20gJy4vc21hcnQtYWNjZXNzLWNvbnRyb2wtY29uZmlnJztcclxuaW1wb3J0IHsgbnVsbFNhZmVJc0VxdWl2YWxlbnQgfSBmcm9tICdAYW5ndWxhci9jb21waWxlci9zcmMvb3V0cHV0L291dHB1dF9hc3QnO1xyXG4vLyBpbXBvcnQgeyBzdHJpbmdpZnkgfSBmcm9tICdxdWVyeXN0cmluZyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRBdXRoU2VydmljZSB7XHJcbiAgbG9naW5TdGFmZjogTG9naW5TdGFmZjtcclxuICBzZWxlY3RlZE9mZmVuZGVyOiBTZWxlY3RlZE9mZmVuZGVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgYXV0aG5TZXJ2aWNlOiBNc2FsU2VydmljZSxcclxuICAgIHByaXZhdGUgeGRtU2VydmljZTogWGRtU2VydmljZSxcclxuICAgIEBJbmplY3QoU01BUlRfREFUQV9TRVJWSUNFX1VSTCkgcHJpdmF0ZSBzbWFydERhdGFTZXJ2aWNlVXJsLFxyXG4gICAgQEluamVjdChTTUFSVF9ET01BSU5fRk9STUFUKSBwcml2YXRlIHNtYXJ0RG9tYWluRm9ybWF0VXJsOiBzdHJpbmcsXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgZ2V0TG9naW5TdGFmZigpOiBPYnNlcnZhYmxlPExvZ2luU3RhZmY+IHtcclxuICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgY29uc29sZS5sb2coJ1NtYXJ0QXV0aFNlcnZpY2UgLSBnZXRMb2dpblN0YWZmKCknKTtcclxuICAgIH1cclxuICAgIGlmICghaXNEZXZNb2RlICYmIHRoaXMubG9naW5TdGFmZikge1xyXG4gICAgICBpZiAodGhpcy5sb2dpblN0YWZmLnN0YWZmSWQpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IGludGVybmFsIGluc3RhbmNlIGluIHNlcnZpY2UnLFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2YodGhpcy5sb2dpblN0YWZmKTtcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luU3RhZmYudXNlck5hbWUpIHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZih0aGlzLmxvZ2luU3RhZmYudXNlck5hbWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZnJvbSh0aGlzLnhkbVNlcnZpY2UuZ2V0TG9naW5TdGFmZigpKS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHN0b3JlZFJlc3VsdCkgPT4ge1xyXG4gICAgICAgIGlmIChzdG9yZWRSZXN1bHQgJiYgc3RvcmVkUmVzdWx0LnN0YWZmSWQpIHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IGZyb20gc2Vzc2lvbi4nLFxyXG4gICAgICAgICAgICAgIHN0b3JlZFJlc3VsdCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubG9naW5TdGFmZiA9IHN0b3JlZFJlc3VsdDtcclxuICAgICAgICAgIHJldHVybiBvZihzdG9yZWRSZXN1bHQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC51c2VyTmFtZSkge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZ2V0TG9naW5TdGFmZigpOiBnZXQgdXNpbmcgcHJlc2V0IHVzZXIgbmFtZScsXHJcbiAgICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYoc3RvcmVkUmVzdWx0LnVzZXJOYW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgdXNlck5hbWUgPSB0aGlzLnVzZXJOYW1lO1xyXG4gICAgICAgICAgY29uc3Qgc3RhZmZOYW1lID0gdXNlck5hbWUuc3Vic3RyaW5nKDAsIHVzZXJOYW1lLmluZGV4T2YoJ0AnKSk7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBsb2dpbkxvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIGxvZ2luIHN0YWZmIG5hbWUgJyxcclxuICAgICAgICAgICAgICBzdGFmZk5hbWUsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRTdGFmZihzdGFmZk5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgIGdldCB1c2VyTmFtZSgpIDogc3RyaW5nIHtcclxuICAgIGlmICh0aGlzLmF1dGhuU2VydmljZS5pbnN0YW5jZS5nZXRBbGxBY2NvdW50cygpLmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgYWNjb3VudCA9IHRoaXMuYXV0aG5TZXJ2aWNlLmluc3RhbmNlLmdldEFsbEFjY291bnRzKClbMF07XHJcbiAgICAgIHJldHVybiBhY2NvdW50LnVzZXJuYW1lO1xyXG4gICAgIH1cclxuICAgICBcclxuICAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFRlYW1VcmwoYXBwOiBzdHJpbmcsIGFmdGVySGFzaDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgKyBhZnRlckhhc2g7XHJcbiAgfVxyXG4gIHByaXZhdGUgaXNTYW1lSG9zdCh1cmwsIGFwcCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc21hcnREb21haW5Gb3JtYXRVcmwucmVwbGFjZSgnJHtBUFB9JywgYXBwKSA9PT0gdXJsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZGlyZWN0VG9UZWFtKGxvZ2luU3RhZmY6IExvZ2luU3RhZmYpIHtcclxuICAgIGlmIChsb2dpblN0YWZmLnJvbGVzLmZpbmRJbmRleCgocm9sZSkgPT4gcm9sZS5yb2xlSWQgPT09ICdFVVVTUEMnKSA+IC0xKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdpbnZlc3RpZ2F0aW9uJykpIHtcclxuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHRoaXMuZ2V0VGVhbVVybCgnaW52ZXN0aWdhdGlvbicsICcvYXNzaWdubWVudCcpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICBsb2dpblN0YWZmLnJvbGVzLmZpbmRJbmRleChcclxuICAgICAgICAocm9sZSkgPT4gcm9sZS5yb2xlSWQuc3Vic3RyaW5nKDAsIDMpID09PSAnUlNDJyxcclxuICAgICAgKSA+IC0xXHJcbiAgICApIHtcclxuICAgICAgaWYgKCF0aGlzLmlzU2FtZUhvc3Qod2luZG93LmxvY2F0aW9uLm9yaWdpbiwgJ3JzYycpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldFRlYW1VcmwoJ3JzYycsICcvb2ZmZW5kZXItbGlzdCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0U2VsZWN0ZWRPZmZlbmRlcihzZWxlY3RlZE9mZmVuZGVyOiBTZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICBpZighdGhpcy5sb2dpblN0YWZmKXtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBpZiAoc2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgICAvLyBpZiAoIXNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCkge1xyXG4gICAgICBjb25zdCByZWxhdGlvbiA9IGF3YWl0IGxhc3RWYWx1ZUZyb20odGhpcy5nZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oXHJcbiAgICAgICAgdGhpcy5sb2dpblN0YWZmLnN0YWZmSWQsXHJcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5vZmZlbmRlcklkLFxyXG4gICAgICApKTtcclxuICAgICAgaWYgKHJlbGF0aW9uKSB7XHJcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gcmVsYXRpb247XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gJ05PQVNTSUdOJztcclxuICAgICAgfVxyXG4gICAgICAvLyB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnhkbVNlcnZpY2Uuc2V0U2VsZWN0ZWRPZmZlbmRlcihzZWxlY3RlZE9mZmVuZGVyKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IHNlbGVjdGVkT2ZmZW5kZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nb3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy54ZG1TZXJ2aWNlLmNsZWFyQWxsKCk7XHJcbiAgICB0aGlzLmF1dGhuU2VydmljZS5sb2dvdXQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRQZXJtaXNzaW9uKFxyXG4gICAgYXBwTW9kdWxlSWQ6IHN0cmluZyxcclxuICAgIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxyXG4gICkge1xyXG4gICAgaWYgKCF0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgdGhpcy5sb2dpblN0YWZmID0gYXdhaXQgdGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gdGhpcy5sb2dpblN0YWZmLnBlcm1pc3Npb25zO1xyXG4gICAgY29uc3QgcmVzb3VyY2UgPSAocm91dGUudXJsICYmIHJvdXRlLnVybC5sZW5ndGggPiAwKSA/IHJvdXRlLnVybFswXSEucGF0aCA6ICcnO1xyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IGF3YWl0IHRoaXMueGRtU2VydmljZS5nZXRTZWxlY3RlZE9mZmVuZGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgICAvLyBpZiAoIXRoaXMuc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkKSB7XHJcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gYXdhaXQgdGhpcy5nZXRTdGFmZk9mZmVuZGVyUmVsYXRpb24oXHJcbiAgICAgICAgdGhpcy5sb2dpblN0YWZmLnN0YWZmSWQsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLm9mZmVuZGVySWQsXHJcbiAgICAgICkudG9Qcm9taXNlKCk7XHJcbiAgICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gcmVsYXRpb247XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSAnTk9BU1NJR04nO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMueGRtU2VydmljZS5zZXRTZWxlY3RlZE9mZmVuZGVyKHRoaXMuc2VsZWN0ZWRPZmZlbmRlcik7XHJcbiAgICAgIC8vIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gdGhpcy5zZWxlY3RlZE9mZmVuZGVyXHJcbiAgICAgIC5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkO1xyXG5cclxuICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW2NsYXNzXj1cInNhYy1cIl0nKTtcclxuICAgIGNvbnN0IHBhdHRlcm4gPSAvXnNhYy0oXFxTKyktKFxcUyspJC9pO1xyXG5cclxuICAgIEFycmF5LmZyb20oZWxlbWVudHMpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgbGV0IGhpZGU7XHJcbiAgICAgIGxldCBkaXNhYmxlO1xyXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGMubWF0Y2gocGF0dGVybik7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0cyk7XHJcbiAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5sZW5ndGggPiAyKSB7XHJcbiAgICAgICAgICBjb25zdCByb2xlSWQgPSByZXN1bHRzWzFdID8gcmVzdWx0c1sxXS50b1VwcGVyQ2FzZSgpIDogbnVsbDtcclxuICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gcmVzdWx0c1syXTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMF0pO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0c1sxXSk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzWzJdKTtcclxuICAgICAgICAgIGNvbnN0IHBlcm1pc3Npb24gPSBwZXJtaXNzaW9ucy5maW5kKGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgcC5hcHBNb2R1bGVJZCA9PT0gYXBwTW9kdWxlSWQgJiZcclxuICAgICAgICAgICAgICBwLnJlc291cmNlID09PSByZXNvdXJjZSAmJlxyXG4gICAgICAgICAgICAgIHAucm9sZUlkID09PSByb2xlSWQgJiZcclxuICAgICAgICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgLypcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgcmVzb3VyY2U6ICcsIHJlc291cmNlKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgYXBwTW9kdWxlSWQ6ICcsIGFwcE1vZHVsZUlkKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgcm9sZUlkOiAnLCByb2xlSWQpO1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBzZXRQZXJtaXNzaW9uKCkgYXNzaWdubWVudCByZWxhdGlvbjogJyxcclxuICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCxcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAqL1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIE1hdGNoZWQgcGVybWlzc2lvbjogJywgcGVybWlzc2lvbik7XHJcblxyXG4gICAgICAgICAgaWYgKHBlcm1pc3Npb24pIHtcclxuICAgICAgICAgICAgaWYgKHJpZ2h0ID09PSAncmVhZCcpIHtcclxuICAgICAgICAgICAgICBpZiAoIXBlcm1pc3Npb24ucmVhZEZsYWcpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdjcmVhdGUnICYmICFwZXJtaXNzaW9uLmNyZWF0ZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAndXBkYXRlJyAmJiAhcGVybWlzc2lvbi51cGRhdGVGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdhc3NpZ24nICYmICFwZXJtaXNzaW9uLmFzc2lnbkZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnY2xvc2UnICYmICFwZXJtaXNzaW9uLmNsb3NlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdyZW9wZW4nICYmICFwZXJtaXNzaW9uLnJlb3BlbkZsYWcpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmlnaHQgPT09ICdyZWFkJykge1xyXG4gICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdCVVRUT04nKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGhpZGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzYWJsZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICBkaXNhYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdoaWRlOiAnLCBoaWRlKTtcclxuICAgICAgY29uc29sZS5sb2coJ2Rpc2FibGU6ICcsIGRpc2FibGUpO1xyXG4gICAgICBpZiAoaGlkZSA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuaGlkZUh0bWxFbGVtZW50KGVsZW1lbnQpO1xyXG4gICAgICB9IGVsc2UgaWYgKGRpc2FibGUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmRpc2FibGVIdG1sRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2hlY2tQZXJtaXNzaW9uKGFjY2Vzc0NvbnRyb2xDb25maWc6IFNtYXJ0QWNjZXNzQ29udHJvbENvbmZpZykge1xyXG4gICAgY29uc3Qgc2VsRGF0YSA9IGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUuZGF0YTtcclxuICAgIHRoaXMubG9naW5TdGFmZiA9IHNlbERhdGEubG9naW5TdGFmZjtcclxuICAgIHRoaXMuc2VsZWN0ZWRPZmZlbmRlciA9IHNlbERhdGEuc2VsZWN0ZWRPZmZlbmRlcjtcclxuICAgIGxldCByb3V0ZVBhdGggPSAnJztcclxuICAgIGlmKGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsICYmIGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsLmxlbmd0aCA+IDApe1xyXG4gICAgICByb3V0ZVBhdGggPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLnVybFswXSEucGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcclxuICAgIGNvbnN0IHJlc291cmNlID0gcm91dGVQYXRoO1xyXG4gICAgY29uc3Qgcm9sZUlkID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb2xlSWRcclxuICAgICAgPyBhY2Nlc3NDb250cm9sQ29uZmlnLnJvbGVJZC50b1VwcGVyQ2FzZSgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IGFjY2Vzc1R5cGUgPSBhY2Nlc3NDb250cm9sQ29uZmlnLmFjY2Vzc1R5cGU7XHJcbiAgICBjb25zdCBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gIXRoaXMuc2VsZWN0ZWRPZmZlbmRlclxyXG4gICAgICAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICA/ICdOL0EnXHJcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoKHApID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgIHAuYXBwTW9kdWxlSWQgPT09IGFjY2Vzc0NvbnRyb2xDb25maWcuYXBwTW9kdWxlSWRcclxuICAgICAgICAgICYmIHAucmVzb3VyY2UgPT09IHJlc291cmNlXHJcbiAgICAgICAgICAmJiAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKVxyXG4gICAgICAgICAgJiYgKHAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9PT0gJ04vQScgfHxcclxuICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuQXBwRmVhdHVyZUFjdGl2YXRlKFxyXG4gICAgbG9naW5TdGFmZjogTG9naW5TdGFmZixcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkID0gbnVsbCxcclxuICApIHtcclxuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XHJcbiAgICAvLyAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXHJcbiAgICAgIGxvZ2luU3RhZmYucGVybWlzc2lvbnMsXHJcbiAgICAgIGZlYXR1cmUsXHJcbiAgICAgIGFwcE1vZHVsZUlkLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBpc0F1dGhFbmFibGUocm9sZXM6IFJvbGVbXSwgYXBwTW9kdWxlSWQ6IHN0cmluZykge1xyXG4gIC8vICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBoYXNJbnRha2VSb2xlKHJvbGVzOiBSb2xlW10pIHtcclxuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiByb2xlcy5maW5kSW5kZXgodGhpcy5pc0ludGFrZVJvbGUpID4gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSxcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcclxuICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSkgPiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNFeHRlcm5hbFJvbGUocm9sZUlkKSB7XHJcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xyXG4gICAgICBjYXNlICdFVURUTCc6XHJcbiAgICAgIGNhc2UgJ0VVRFVTTSc6XHJcbiAgICAgIGNhc2UgJ0VVSkRHJzpcclxuICAgICAgY2FzZSAnRVVNUEQnOlxyXG4gICAgICBjYXNlICdFVVNPVFYnOlxyXG4gICAgICBjYXNlICdFVVVTQTInOlxyXG4gICAgICBjYXNlICdFVVVTQU8nOlxyXG4gICAgICBjYXNlICdFVVVTUEMnOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcclxuICAgIHN3aXRjaCAocm9sZS5yb2xlSWQpIHtcclxuICAgICAgY2FzZSAnT1BBJzpcclxuICAgICAgY2FzZSAnT1BTJzpcclxuICAgICAgY2FzZSAnU09QUyc6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XHJcbiAgICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lO2N1cnNvcjogbm90LWFsbG93ZWQ7JyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZih1c2VyTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBjb25zdCBodHRwT3B0aW9ucyA9IHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgICAnTm8tQXV0aCc6ICdUcnVlJyxcclxuICAgICAgfSksXHJcbiAgICB9O1xyXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaW5kdlN0YWZmcyhpbnB1dDoge3doZXJlOiB7dXNlck5hbWU6IFwiJHt1c2VyTmFtZX1cIiwgYWN0aXZlRmxhZzogdHJ1ZX19KSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlXHJcbiAgICAgICAgICAgICAgICBkYXRhIHtcclxuICAgICAgICAgICAgICAgICAgc3RhZmZJZFxyXG4gICAgICAgICAgICAgICAgICB1c2VyTmFtZVxyXG4gICAgICAgICAgICAgICAgICBsYXN0TmFtZVxyXG4gICAgICAgICAgICAgICAgICBmaXJzdE5hbWVcclxuICAgICAgICAgICAgICAgICAgcGhvbmVcclxuICAgICAgICAgICAgICAgICAgZW1haWxcclxuICAgICAgICAgICAgICAgICAgcm9sZXMge1xyXG4gICAgICAgICAgICAgICAgICAgIHJvbGVJZFxyXG4gICAgICAgICAgICAgICAgICAgIHJvbGVcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgICAgICAgICAgICAgICAgcm9sZUlkXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwTW9kdWxlSWRcclxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVxyXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWRcclxuICAgICAgICAgICAgICAgICAgICByZWFkRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZsYWdcclxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlRmxhZ1xyXG4gICAgICAgICAgICAgICAgICAgIGFzc2lnbkZsYWdcclxuICAgICAgICAgICAgICAgICAgICByZW9wZW5GbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VGbGFnXHJcbiAgICAgICAgICAgICAgICAgICAgZXhwdW5nZUZsYWdcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBvcHRpb25zIHtcclxuICAgICAgICAgICAgICAgICAgICBvZmZlbmRlckxpc3RPcHRpb25JZFxyXG4gICAgICAgICAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlQXBpRmllbGROYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRGbGFnXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1gO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8YW55Pih0aGlzLnNtYXJ0RGF0YVNlcnZpY2VVcmwsIHsgcXVlcnk6IHF1ZXJ5U3RyaW5nIH0sIGh0dHBPcHRpb25zKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlKDEpLFxyXG4gICAgICAgIG1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBnZXRTdGFmZigpIGZyb20gc2VydmljZSAnLCByZXN1bHQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZzLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LmRhdGEuZmluZHZTdGFmZnMuZGF0YVswXTtcclxuICAgICAgICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldExvZ2luU3RhZmYoZGF0YSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZiA9IGRhdGE7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKFxyXG4gICAgc3RhZmZJZDogbnVtYmVyLFxyXG4gICAgb2ZmZW5kZXJJZDogbnVtYmVyLFxyXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IGBcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucyhpbnB1dDoge3doZXJlOiB7c3RhZmZJZDogJHtzdGFmZklkfSwgb2ZmZW5kZXJJZDogJHtvZmZlbmRlcklkfX19KSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhIHtcclxuICAgICAgICAgICAgICAgICAgYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZ2V0U3RhZmZPZmZlbmRlclJlbGF0aW9uKCkgZnJvbSBzZXJ2aWNlICcsXHJcbiAgICAgICAgICAgICAgcmVzdWx0LFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucy5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhLmZpbmR2U3RhZmZPZmZlbmRlclJlbGF0aW9ucy5kYXRhWzBdO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0aHJvd0Vycm9yKCdObyBhY2Nlc3MgcmlnaHQuJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJvbGVQZXJtaXNzaW9ucyhcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgICByZXNvdXJjZTogc3RyaW5nLFxyXG4gICk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXHJcbiAgICAgICAgICAgcXVlcnkgZmluZHZSb2xlUGVybWlzc2lvblBpdm90c3tcclxuICAgICAgICAgICAgZmluZHZSb2xlUGVybWlzc2lvblBpdm90cyhpbnB1dDoge3doZXJlOiB7YXBwTW9kdWxlSWQ6ICR7YXBwTW9kdWxlSWR9LCByZXNvdXJjZTogJHtyZXNvdXJjZX19fSl7XHJcbiAgICAgICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cFxyXG4gICAgICAucG9zdDxhbnk+KHRoaXMuc21hcnREYXRhU2VydmljZVVybCwgeyBxdWVyeTogcXVlcnlTdHJpbmcgfSlcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZSgxKSxcclxuICAgICAgICBtYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgZmluZHZSb2xlUGVybWlzc2lvblBpdm90cygpIGZyb20gc2VydmljZSAnLFxyXG4gICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5maW5kdlJvbGVQZXJtaXNzaW9uUGl2b3RzLnRvdGFsQ291bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciAnICsgZXJyb3IpO1xyXG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyb3IpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
503
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY3NtYXJ0L25nYy1zbWFydC1jb3JlL3NyYy9saWIvc21hcnQtYXV0aC9zbWFydC1hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDL0QsT0FBTyxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR2xELE9BQU8sRUFHTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEdBR3BCLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7OztBQUcxRCwyQ0FBMkM7QUFLM0MsTUFBTSxPQUFPLGdCQUFnQjtJQUkzQixZQUNVLElBQWdCLEVBQ2hCLFlBQXlCLEVBQ3pCLFVBQXNCLEVBQ1UsbUJBQW1CLEVBQ3RCLG9CQUE0QjtRQUp6RCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQ2hCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDVSx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQUE7UUFDdEIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFRO0lBQ2hFLENBQUM7SUFFRyxhQUFhO1FBQ2xCLElBQUksU0FBUyxFQUFFO1lBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FB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IEluamVjdCwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgZnJvbSwgdGhyb3dFcnJvciwgbGFzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBtYXAsIHN3aXRjaE1hcCwgdGFrZSwgY2F0Y2hFcnJvcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBNc2FsU2VydmljZSB9IGZyb20gJ0BhenVyZS9tc2FsLWFuZ3VsYXInO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90IH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7XHJcbiAgTG9naW5TdGFmZixcclxuICBTZWxlY3RlZE9mZmVuZGVyLFxyXG4gIFNNQVJUX0RBVEFfU0VSVklDRV9VUkwsXHJcbiAgU01BUlRfRE9NQUlOX0ZPUk1BVCxcclxuICBSb2xlLFxyXG4gIFBlcm1pc3Npb24sXHJcbn0gZnJvbSAnLi4vc21hcnQtc3RvcmFnZS9zbWFydC1zdG9yYWdlLW1vZGVsJztcclxuaW1wb3J0IHsgWGRtU2VydmljZSB9IGZyb20gJy4uL3NtYXJ0LXN0b3JhZ2UveGRtLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTbWFydEFjY2Vzc0NvbnRyb2xDb25maWcgfSBmcm9tICcuL3NtYXJ0LWFjY2Vzcy1jb250cm9sLWNvbmZpZyc7XHJcbmltcG9ydCB7IG51bGxTYWZlSXNFcXVpdmFsZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXIvc3JjL291dHB1dC9vdXRwdXRfYXN0JztcclxuLy8gaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSAncXVlcnlzdHJpbmcnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNtYXJ0QXV0aFNlcnZpY2Uge1xyXG4gIGxvZ2luU3RhZmY6IExvZ2luU3RhZmY7XHJcbiAgc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXHJcbiAgICBwcml2YXRlIGF1dGhuU2VydmljZTogTXNhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHhkbVNlcnZpY2U6IFhkbVNlcnZpY2UsXHJcbiAgICBASW5qZWN0KFNNQVJUX0RBVEFfU0VSVklDRV9VUkwpIHByaXZhdGUgc21hcnREYXRhU2VydmljZVVybCxcclxuICAgIEBJbmplY3QoU01BUlRfRE9NQUlOX0ZPUk1BVCkgcHJpdmF0ZSBzbWFydERvbWFpbkZvcm1hdFVybDogc3RyaW5nLFxyXG4gICkge31cclxuXHJcbiAgcHVibGljIGdldExvZ2luU3RhZmYoKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdTbWFydEF1dGhTZXJ2aWNlIC0gZ2V0TG9naW5TdGFmZigpJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoIWlzRGV2TW9kZSAmJiB0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgaWYgKHRoaXMubG9naW5TdGFmZi5zdGFmZklkKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBpbnRlcm5hbCBpbnN0YW5jZSBpbiBzZXJ2aWNlJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMubG9naW5TdGFmZik7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCB1c2luZyBwcmVzZXQgdXNlciBuYW1lJyxcclxuICAgICAgICAgICAgdGhpcy5sb2dpblN0YWZmLFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYodGhpcy5sb2dpblN0YWZmLnVzZXJOYW1lKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZyb20odGhpcy54ZG1TZXJ2aWNlLmdldExvZ2luU3RhZmYoKSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChzdG9yZWRSZXN1bHQpID0+IHtcclxuICAgICAgICBpZiAoc3RvcmVkUmVzdWx0ICYmIHN0b3JlZFJlc3VsdC5zdGFmZklkKSB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAgICcjIyMjIyBnZXRMb2dpblN0YWZmKCk6IGdldCBmcm9tIHNlc3Npb24uJyxcclxuICAgICAgICAgICAgICBzdG9yZWRSZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBzdG9yZWRSZXN1bHQ7XHJcbiAgICAgICAgICByZXR1cm4gb2Yoc3RvcmVkUmVzdWx0KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHN0b3JlZFJlc3VsdCAmJiBzdG9yZWRSZXN1bHQudXNlck5hbWUpIHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldExvZ2luU3RhZmYoKTogZ2V0IHVzaW5nIHByZXNldCB1c2VyIG5hbWUnLFxyXG4gICAgICAgICAgICAgIHRoaXMubG9naW5TdGFmZixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0YWZmKHN0b3JlZFJlc3VsdC51c2VyTmFtZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJOYW1lID0gdGhpcy51c2VyTmFtZTtcclxuICAgICAgICAgIGNvbnN0IHN0YWZmTmFtZSA9IHVzZXJOYW1lLnN1YnN0cmluZygwLCB1c2VyTmFtZS5pbmRleE9mKCdAJykpO1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICAgICAgICAnIyMjIyMgbG9naW5Mb2dpblN0YWZmKCk6IGdldCB1c2luZyBsb2dpbiBzdGFmZiBuYW1lICcsXHJcbiAgICAgICAgICAgICAgc3RhZmZOYW1lLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U3RhZmYoc3RhZmZOYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCB1c2VyTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuYXV0aG5TZXJ2aWNlLmluc3RhbmNlLmdldEFsbEFjY291bnRzKCkubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBhY2NvdW50ID0gdGhpcy5hdXRoblNlcnZpY2UuaW5zdGFuY2UuZ2V0QWxsQWNjb3VudHMoKVswXTtcclxuICAgICAgcmV0dXJuIGFjY291bnQudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUZWFtVXJsKGFwcDogc3RyaW5nLCBhZnRlckhhc2g6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zbWFydERvbWFpbkZvcm1hdFVybC5yZXBsYWNlKCcke0FQUH0nLCBhcHApICsgYWZ0ZXJIYXNoO1xyXG4gIH1cclxuICBwcml2YXRlIGlzU2FtZUhvc3QodXJsLCBhcHApIHtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0RG9tYWluRm9ybWF0VXJsLnJlcGxhY2UoJyR7QVBQfScsIGFwcCkgPT09IHVybDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWRpcmVjdFRvVGVhbShsb2dpblN0YWZmOiBMb2dpblN0YWZmKSB7XHJcbiAgICBpZiAobG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoKHJvbGUpID0+IHJvbGUucm9sZUlkID09PSAnRVVVU1BDJykgPiAtMSkge1xyXG4gICAgICBpZiAoIXRoaXMuaXNTYW1lSG9zdCh3aW5kb3cubG9jYXRpb24ub3JpZ2luLCAnaW52ZXN0aWdhdGlvbicpKSB7XHJcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmdldFRlYW1VcmwoJ2ludmVzdGlnYXRpb24nLCAnL2Fzc2lnbm1lbnQnKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChcclxuICAgICAgbG9naW5TdGFmZi5yb2xlcy5maW5kSW5kZXgoXHJcbiAgICAgICAgKHJvbGUpID0+IHJvbGUucm9sZUlkLnN1YnN0cmluZygwLCAzKSA9PT0gJ1JTQycsXHJcbiAgICAgICkgPiAtMVxyXG4gICAgKSB7XHJcbiAgICAgIGlmICghdGhpcy5pc1NhbWVIb3N0KHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4sICdyc2MnKSkge1xyXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5nZXRUZWFtVXJsKCdyc2MnLCAnL29mZmVuZGVyLWxpc3QnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcjogU2VsZWN0ZWRPZmZlbmRlcikge1xyXG4gICAgaWYgKCF0aGlzLmxvZ2luU3RhZmYpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICAgIC8vIGlmICghc2VsZWN0ZWRPZmZlbmRlci5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkKSB7XHJcbiAgICAgIGNvbnN0IHJlbGF0aW9uID0gYXdhaXQgbGFzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICAgIHRoaXMubG9naW5TdGFmZi5zdGFmZklkLFxyXG4gICAgICAgICAgc2VsZWN0ZWRPZmZlbmRlci5vZmZlbmRlcklkLFxyXG4gICAgICAgICksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZWxhdGlvbikge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9IHJlbGF0aW9uO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG4gICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIoc2VsZWN0ZWRPZmZlbmRlcik7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBzZWxlY3RlZE9mZmVuZGVyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ291dCgpOiB2b2lkIHtcclxuICAgIHRoaXMueGRtU2VydmljZS5jbGVhckFsbCgpO1xyXG4gICAgdGhpcy5hdXRoblNlcnZpY2UubG9nb3V0KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0UGVybWlzc2lvbihcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgICByb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcclxuICApIHtcclxuICAgIGlmICghdGhpcy5sb2dpblN0YWZmKSB7XHJcbiAgICAgIHRoaXMubG9naW5TdGFmZiA9IGF3YWl0IHRoaXMueGRtU2VydmljZS5nZXRMb2dpblN0YWZmKCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcclxuICAgIGNvbnN0IHJlc291cmNlID1cclxuICAgICAgcm91dGUudXJsICYmIHJvdXRlLnVybC5sZW5ndGggPiAwID8gcm91dGUudXJsWzBdIS5wYXRoIDogJyc7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkT2ZmZW5kZXIpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyID0gYXdhaXQgdGhpcy54ZG1TZXJ2aWNlLmdldFNlbGVjdGVkT2ZmZW5kZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9mZmVuZGVyKSB7XHJcbiAgICAgIC8vIGlmICghdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpIHtcclxuICAgICAgY29uc3QgcmVsYXRpb24gPSBhd2FpdCB0aGlzLmdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgICAgICB0aGlzLmxvZ2luU3RhZmYuc3RhZmZJZCxcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIub2ZmZW5kZXJJZCxcclxuICAgICAgKS50b1Byb21pc2UoKTtcclxuICAgICAgaWYgKHJlbGF0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPSByZWxhdGlvbjtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZCA9ICdOT0FTU0lHTic7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy54ZG1TZXJ2aWNlLnNldFNlbGVjdGVkT2ZmZW5kZXIodGhpcy5zZWxlY3RlZE9mZmVuZGVyKTtcclxuICAgICAgLy8gfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPVxyXG4gICAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZDtcclxuXHJcbiAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tjbGFzc149XCJzYWMtXCJdJyk7XHJcbiAgICBjb25zdCBwYXR0ZXJuID0gL15zYWMtKFxcUyspLShcXFMrKSQvaTtcclxuXHJcbiAgICBBcnJheS5mcm9tKGVsZW1lbnRzKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGxldCBoaWRlO1xyXG4gICAgICBsZXQgZGlzYWJsZTtcclxuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuZm9yRWFjaCgoYykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBjLm1hdGNoKHBhdHRlcm4pO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHMpO1xyXG4gICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMikge1xyXG4gICAgICAgICAgY29uc3Qgcm9sZUlkID0gcmVzdWx0c1sxXSA/IHJlc3VsdHNbMV0udG9VcHBlckNhc2UoKSA6IG51bGw7XHJcbiAgICAgICAgICBjb25zdCByaWdodCA9IHJlc3VsdHNbMl07XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHRzWzBdKTtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdHNbMV0pO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0c1syXSk7XHJcbiAgICAgICAgICBjb25zdCBwZXJtaXNzaW9uID0gcGVybWlzc2lvbnMuZmluZChmdW5jdGlvbiAocCkge1xyXG4gICAgICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAgIHAuYXBwTW9kdWxlSWQgPT09IGFwcE1vZHVsZUlkICYmXHJcbiAgICAgICAgICAgICAgcC5yZXNvdXJjZSA9PT0gcmVzb3VyY2UgJiZcclxuICAgICAgICAgICAgICBwLnJvbGVJZCA9PT0gcm9sZUlkICYmXHJcbiAgICAgICAgICAgICAgcC5hc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID09PSBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8qXHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgc2V0UGVybWlzc2lvbigpIHJlc291cmNlOiAnLCByZXNvdXJjZSk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgc2V0UGVybWlzc2lvbigpIGFwcE1vZHVsZUlkOiAnLCBhcHBNb2R1bGVJZCk7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnIyMjIyMgc2V0UGVybWlzc2lvbigpIHJvbGVJZDogJywgcm9sZUlkKTtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgICAgICAnIyMjIyMgc2V0UGVybWlzc2lvbigpIGFzc2lnbm1lbnQgcmVsYXRpb246ICcsXHJcbiAgICAgICAgICAgIGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQsXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgKi9cclxuICAgICAgICAgIGNvbnNvbGUubG9nKCcjIyMjIyBNYXRjaGVkIHBlcm1pc3Npb246ICcsIHBlcm1pc3Npb24pO1xyXG5cclxuICAgICAgICAgIGlmIChwZXJtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGlmIChyaWdodCA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGhpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnY3JlYXRlJyAmJiAhcGVybWlzc2lvbi5jcmVhdGVGbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAgICAgICAocmlnaHQgPT09ICdkZWxldGUnICYmICFwZXJtaXNzaW9uLmRlbGV0ZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnYXNzaWduJyAmJiAhcGVybWlzc2lvbi5hc3NpZ25GbGFnKSB8fFxyXG4gICAgICAgICAgICAgIChyaWdodCA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAnZXhwdW5nZScgJiYgIXBlcm1pc3Npb24uZXhwdW5nZUZsYWcpIHx8XHJcbiAgICAgICAgICAgICAgKHJpZ2h0ID09PSAncmVvcGVuJyAmJiAhcGVybWlzc2lvbi5yZW9wZW5GbGFnKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuICAgICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgICBoaWRlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpc2FibGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0JVVFRPTicpIHtcclxuICAgICAgICAgICAgICAgIGhpZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJpZ2h0ID09PSAncmVhZCcpIHtcclxuICAgICAgICAgICAgICBpZiAoaGlkZSAhPT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgICAgIGhpZGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykge1xyXG4gICAgICAgICAgICAgIGlmIChoaWRlICE9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAgICAgaGlkZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRpc2FibGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgICAgZGlzYWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBjb25zb2xlLmxvZygnaGlkZTogJywgaGlkZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdkaXNhYmxlOiAnLCBkaXNhYmxlKTtcclxuICAgICAgaWYgKGhpZGUgPT09IHRydWUpIHtcclxuICAgICAgICB0aGlzLmhpZGVIdG1sRWxlbWVudChlbGVtZW50KTtcclxuICAgICAgfSBlbHNlIGlmIChkaXNhYmxlID09PSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrUGVybWlzc2lvbihhY2Nlc3NDb250cm9sQ29uZmlnOiBTbWFydEFjY2Vzc0NvbnRyb2xDb25maWcpIHtcclxuICAgIGNvbnN0IHNlbERhdGEgPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLmRhdGE7XHJcbiAgICB0aGlzLmxvZ2luU3RhZmYgPSBzZWxEYXRhLmxvZ2luU3RhZmY7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2ZmZW5kZXIgPSBzZWxEYXRhLnNlbGVjdGVkT2ZmZW5kZXI7XHJcbiAgICBsZXQgcm91dGVQYXRoID0gJyc7XHJcbiAgICBpZiAoXHJcbiAgICAgIGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsICYmXHJcbiAgICAgIGFjY2Vzc0NvbnRyb2xDb25maWcucm91dGUudXJsLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICByb3V0ZVBhdGggPSBhY2Nlc3NDb250cm9sQ29uZmlnLnJvdXRlLnVybFswXSEucGF0aDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwZXJtaXNzaW9ucyA9IHRoaXMubG9naW5TdGFmZi5wZXJtaXNzaW9ucztcclxuICAgIGNvbnN0IHJlc291cmNlID0gcm91dGVQYXRoO1xyXG4gICAgY29uc3Qgcm9sZUlkID0gYWNjZXNzQ29udHJvbENvbmZpZy5yb2xlSWRcclxuICAgICAgPyBhY2Nlc3NDb250cm9sQ29uZmlnLnJvbGVJZC50b1VwcGVyQ2FzZSgpXHJcbiAgICAgIDogbnVsbDtcclxuICAgIGNvbnN0IGFjY2Vzc1R5cGUgPSBhY2Nlc3NDb250cm9sQ29uZmlnLmFjY2Vzc1R5cGU7XHJcbiAgICBjb25zdCBhc3NpZ25tZW50U3RhZmZSZWxhdGlvbklkID0gIXRoaXMuc2VsZWN0ZWRPZmZlbmRlclxyXG4gICAgICAuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZFxyXG4gICAgICA/ICdOL0EnXHJcbiAgICAgIDogdGhpcy5zZWxlY3RlZE9mZmVuZGVyLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQ7XHJcblxyXG4gICAgY29uc3QgcGVybWlzc2lvbiA9IHBlcm1pc3Npb25zLmZpbmQoKHApID0+IHtcclxuICAgICAgcmV0dXJuIChcclxuICAgICAgICBwLmFwcE1vZHVsZUlkID09PSBhY2Nlc3NDb250cm9sQ29uZmlnLmFwcE1vZHVsZUlkICYmXHJcbiAgICAgICAgcC5yZXNvdXJjZSA9PT0gcmVzb3VyY2UgJiZcclxuICAgICAgICAoIXJvbGVJZCB8fCBwLnJvbGVJZCA9PT0gcm9sZUlkKSAmJlxyXG4gICAgICAgIChwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09ICdOL0EnIHx8XHJcbiAgICAgICAgICBwLmFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQgPT09IGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWQpXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAocGVybWlzc2lvbikge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgaWYgKCFwZXJtaXNzaW9uLnJlYWRGbGFnKSB7XHJcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2NyZWF0ZScgJiYgIXBlcm1pc3Npb24uY3JlYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3VwZGF0ZScgJiYgIXBlcm1pc3Npb24udXBkYXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2RlbGV0ZScgJiYgIXBlcm1pc3Npb24uZGVsZXRlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Fzc2lnbicgJiYgIXBlcm1pc3Npb24uYXNzaWduRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ2Nsb3NlJyAmJiAhcGVybWlzc2lvbi5jbG9zZUZsYWcpIHx8XHJcbiAgICAgICAgKGFjY2Vzc1R5cGUgPT09ICdleHB1bmdlJyAmJiAhcGVybWlzc2lvbi5leHB1bmdlRmxhZykgfHxcclxuICAgICAgICAoYWNjZXNzVHlwZSA9PT0gJ3Jlb3BlbicgJiYgIXBlcm1pc3Npb24ucmVvcGVuRmxhZylcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoYWNjZXNzVHlwZSA9PT0gJ3JlYWQnKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuQXBwRmVhdHVyZUFjdGl2YXRlKFxyXG4gICAgbG9naW5TdGFmZjogTG9naW5TdGFmZixcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkID0gbnVsbCxcclxuICApIHtcclxuICAgIC8vIGlmICghdGhpcy5pc0F1dGhFbmFibGUobG9naW5TdGFmZi5yb2xlcywgYXBwTW9kdWxlSWQpKSB7XHJcbiAgICAvLyAgIHJldHVybiB0cnVlO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaGFzQXBwRmVhdHVyZVBlcm1pc3Npb24oXHJcbiAgICAgIGxvZ2luU3RhZmYucGVybWlzc2lvbnMsXHJcbiAgICAgIGZlYXR1cmUsXHJcbiAgICAgIGFwcE1vZHVsZUlkLFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIHB1YmxpYyBpc0F1dGhFbmFibGUocm9sZXM6IFJvbGVbXSwgYXBwTW9kdWxlSWQ6IHN0cmluZykge1xyXG4gIC8vICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcclxuICAvLyAgICAgcmV0dXJuIHJvbGVzLm1hcChyID0+IHIucm9sZUlkKS5maW5kSW5kZXgodGhpcy5pc0V4dGVybmFsUm9sZSkgPiAtMSB8fCBhcHBNb2R1bGVJZCA9PT0gJ1JSJztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBmYWxzZTtcclxuICAvLyB9XHJcblxyXG4gIHB1YmxpYyBoYXNJbnRha2VSb2xlKHJvbGVzOiBSb2xlW10pIHtcclxuICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiByb2xlcy5maW5kSW5kZXgodGhpcy5pc0ludGFrZVJvbGUpID4gLTE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc0FwcEZlYXR1cmVQZXJtaXNzaW9uKFxyXG4gICAgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25bXSxcclxuICAgIGZlYXR1cmU6IHN0cmluZyxcclxuICAgIGFwcE1vZHVsZUlkOiBzdHJpbmcsXHJcbiAgKSB7XHJcbiAgICBpZiAocGVybWlzc2lvbnMgJiYgcGVybWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBpZiAoYXBwTW9kdWxlSWQpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgcGVybWlzc2lvbnMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSAmJiBwLmFwcE1vZHVsZUlkID09PSBhcHBNb2R1bGVJZCxcclxuICAgICAgICAgICkgPiAtMVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHBlcm1pc3Npb25zLmZpbmRJbmRleCgocCkgPT4gcC5yZXNvdXJjZSA9PT0gZmVhdHVyZSkgPiAtMTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNFeHRlcm5hbFJvbGUocm9sZUlkKSB7XHJcbiAgICBzd2l0Y2ggKHJvbGVJZCkge1xyXG4gICAgICBjYXNlICdFVURUTCc6XHJcbiAgICAgIGNhc2UgJ0VVRFVTTSc6XHJcbiAgICAgIGNhc2UgJ0VVSkRHJzpcclxuICAgICAgY2FzZSAnRVVNUEQnOlxyXG4gICAgICBjYXNlICdFVVNPVFYnOlxyXG4gICAgICBjYXNlICdFVVVTQTInOlxyXG4gICAgICBjYXNlICdFVVVTQU8nOlxyXG4gICAgICBjYXNlICdFVVVTUEMnOlxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNJbnRha2VSb2xlKHJvbGU6IFJvbGUpIHtcclxuICAgIHN3aXRjaCAocm9sZS5yb2xlSWQpIHtcclxuICAgICAgY2FzZSAnT1BBJzpcclxuICAgICAgY2FzZSAnT1BTJzpcclxuICAgICAgY2FzZSAnU09QUyc6XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkaXNhYmxlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coZWxlbWVudCk7XHJcbiAgICBzd2l0Y2ggKGVsZW1lbnQubm9kZU5hbWUpIHtcclxuICAgICAgY2FzZSAnQSc6XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXHJcbiAgICAgICAgICAnc3R5bGUnLFxyXG4gICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lO2N1cnNvcjogbm90LWFsbG93ZWQ7JyxcclxuICAgICAgICApO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlSHRtbEVsZW1lbnQoZWxlbWVudDogRWxlbWVudCk6IHZvaWQge1xyXG4gICAgLy8gZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcclxuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRTdGFmZih1c2VyTmFtZTogc3RyaW5nKTogT2JzZXJ2YWJsZTxMb2dpblN0YWZmPiB7XHJcbiAgICByZXR1cm4gdGhpcy5xdWVyeTxhbnk+KHtcclxuICAgICAgcXVlcnk6IHRoaXMuZmluZFN0YWZmUXVlcnksXHJcbiAgICAgIHZhcmlhYmxlczoge1xyXG4gICAgICAgIHdoZXJlOiB7XHJcbiAgICAgICAgICB1c2VyTmFtZTogdXNlck5hbWUsXHJcbiAgICAgICAgICBhY3RpdmVGbGFnOiB0cnVlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJyMjIyMjIGdldFN0YWZmKCkgZnJvbSBzZXJ2aWNlICcsIHJlc3VsdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzdWx0LmZpbmR2U3RhZmZzLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LmZpbmR2U3RhZmZzLmRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMueGRtU2VydmljZS5zZXRMb2dpblN0YWZmKGRhdGEpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2luU3RhZmYgPSBkYXRhO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yICcgKyBlcnJvcik7XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHF1ZXJ5PFQ+KG9wdGlvbnM6IHtcclxuICAgIHF1ZXJ5OiBzdHJpbmc7XHJcbiAgICB2YXJpYWJsZXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xyXG4gIH0pOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8eyBkYXRhOiBUIH0+KFxyXG4gICAgICAgIHRoaXMuc21hcnREYXRhU2VydmljZVVybCxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBxdWVyeTogb3B0aW9ucy5xdWVyeSxcclxuICAgICAgICAgIHZhcmlhYmxlczogb3B0aW9ucy52YXJpYWJsZXMsXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgICAgICAnTm8tQXV0aCc6ICdUcnVlJyxcclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgfVxyXG4gICAgICApXHJcbiAgICAgIC5waXBlKG1hcCgoZCkgPT4gZC5kYXRhKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBmaW5kU3RhZmZRdWVyeSgpe1xyXG4gICAgcmV0dXJuIGBcclxuICAgICBxdWVyeSBmaW5kdlN0YWZmcygkaW5wdXQ6IHZTdGFmZk11bHRpSW5wdXQpIHtcclxuICAgICAgICBmaW5kdlN0YWZmcyhpbnB1dDogJGlucHV0KSB7XHJcbiAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgICBtZXNzYWdlXHJcbiAgICAgICAgICBkYXRhIHtcclxuICAgICAgICAgICAgc3RhZmZJZFxyXG4gICAgICAgICAgICB1c2VyTmFtZVxyXG4gICAgICAgICAgICBsYXN0TmFtZVxyXG4gICAgICAgICAgICBmaXJzdE5hbWVcclxuICAgICAgICAgICAgcGhvbmVcclxuICAgICAgICAgICAgZW1haWxcclxuICAgICAgICAgICAgcm9sZXMge1xyXG4gICAgICAgICAgICAgIHJvbGVJZFxyXG4gICAgICAgICAgICAgIHJvbGVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwZXJtaXNzaW9ucyB7XHJcbiAgICAgICAgICAgICAgcm9sZUlkXHJcbiAgICAgICAgICAgICAgYXBwTW9kdWxlSWRcclxuICAgICAgICAgICAgICByZXNvdXJjZVxyXG4gICAgICAgICAgICAgIGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWRcclxuICAgICAgICAgICAgICByZWFkRmxhZ1xyXG4gICAgICAgICAgICAgIGNyZWF0ZUZsYWdcclxuICAgICAgICAgICAgICB1cGRhdGVGbGFnXHJcbiAgICAgICAgICAgICAgZGVsZXRlRmxhZ1xyXG4gICAgICAgICAgICAgIGFzc2lnbkZsYWdcclxuICAgICAgICAgICAgICByZW9wZW5GbGFnXHJcbiAgICAgICAgICAgICAgY2xvc2VGbGFnXHJcbiAgICAgICAgICAgICAgZXhwdW5nZUZsYWdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcHRpb25zIHtcclxuICAgICAgICAgICAgICBvZmZlbmRlckxpc3RPcHRpb25JZFxyXG4gICAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgICAgICBzZXJ2aWNlQXBpRmllbGROYW1lXHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRGbGFnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbihcclxuICAgIHN0YWZmSWQ6IG51bWJlcixcclxuICAgIG9mZmVuZGVySWQ6IG51bWJlcixcclxuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgcXVlcnlTdHJpbmcgPSBgXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBmaW5kdlN0YWZmT2ZmZW5kZXJSZWxhdGlvbnMoaW5wdXQ6IHt3aGVyZToge3N0YWZmSWQ6ICR7c3RhZmZJZH0sIG9mZmVuZGVySWQ6ICR7b2ZmZW5kZXJJZH19fSkge1xyXG4gICAgICAgICAgICAgICAgZGF0YSB7XHJcbiAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnRTdGFmZlJlbGF0aW9uSWRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1gO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8YW55Pih0aGlzLnNtYXJ0RGF0YVNlcnZpY2VVcmwsIHsgcXVlcnk6IHF1ZXJ5U3RyaW5nIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGdldFN0YWZmT2ZmZW5kZXJSZWxhdGlvbigpIGZyb20gc2VydmljZSAnLFxyXG4gICAgICAgICAgICAgIHJlc3VsdCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChyZXN1bHQuZGF0YS5maW5kdlN0YWZmT2ZmZW5kZXJSZWxhdGlvbnMuZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXN1bHQuZGF0YS5maW5kdlN0YWZmT2ZmZW5kZXJSZWxhdGlvbnMuZGF0YVswXTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEuYXNzaWdubWVudFN0YWZmUmVsYXRpb25JZDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdGhyb3dFcnJvcignTm8gYWNjZXNzIHJpZ2h0LicpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSb2xlUGVybWlzc2lvbnMoXHJcbiAgICBhcHBNb2R1bGVJZDogc3RyaW5nLFxyXG4gICAgcmVzb3VyY2U6IHN0cmluZyxcclxuICApOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gYFxyXG4gICAgICAgICAgIHF1ZXJ5IGZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHN7XHJcbiAgICAgICAgICAgIGZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMoaW5wdXQ6IHt3aGVyZToge2FwcE1vZHVsZUlkOiAke2FwcE1vZHVsZUlkfSwgcmVzb3VyY2U6ICR7cmVzb3VyY2V9fX0pe1xyXG4gICAgICAgICAgICAgIHRvdGFsQ291bnRcclxuICAgICAgICAgICAgICBtZXNzYWdlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1gO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHBcclxuICAgICAgLnBvc3Q8YW55Pih0aGlzLnNtYXJ0RGF0YVNlcnZpY2VVcmwsIHsgcXVlcnk6IHF1ZXJ5U3RyaW5nIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgbWFwKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgICAgICAgJyMjIyMjIGZpbmR2Um9sZVBlcm1pc3Npb25QaXZvdHMoKSBmcm9tIHNlcnZpY2UgJyxcclxuICAgICAgICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocmVzdWx0LmRhdGEuZmluZHZSb2xlUGVybWlzc2lvblBpdm90cy50b3RhbENvdW50ID4gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgLy8gcmV0dXJuIHRocm93RXJyb3IoJ05vIGFjY2VzcyByaWdodC4nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgJyArIGVycm9yKTtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -917,7 +917,7 @@ class SmartAuthService {
|
|
|
917
917
|
this.loginStaff = yield this.xdmService.getLoginStaff();
|
|
918
918
|
}
|
|
919
919
|
const permissions = this.loginStaff.permissions;
|
|
920
|
-
const resource =
|
|
920
|
+
const resource = route.url && route.url.length > 0 ? route.url[0].path : '';
|
|
921
921
|
if (!this.selectedOffender) {
|
|
922
922
|
this.selectedOffender = yield this.xdmService.getSelectedOffender();
|
|
923
923
|
}
|
|
@@ -933,8 +933,7 @@ class SmartAuthService {
|
|
|
933
933
|
this.xdmService.setSelectedOffender(this.selectedOffender);
|
|
934
934
|
// }
|
|
935
935
|
}
|
|
936
|
-
const assignmentStaffRelationId = this.selectedOffender
|
|
937
|
-
.assignmentStaffRelationId;
|
|
936
|
+
const assignmentStaffRelationId = this.selectedOffender.assignmentStaffRelationId;
|
|
938
937
|
const elements = document.querySelectorAll('[class^="sac-"]');
|
|
939
938
|
const pattern = /^sac-(\S+)-(\S+)$/i;
|
|
940
939
|
Array.from(elements).forEach((element) => {
|
|
@@ -1036,7 +1035,8 @@ class SmartAuthService {
|
|
|
1036
1035
|
this.loginStaff = selData.loginStaff;
|
|
1037
1036
|
this.selectedOffender = selData.selectedOffender;
|
|
1038
1037
|
let routePath = '';
|
|
1039
|
-
if (accessControlConfig.route.url &&
|
|
1038
|
+
if (accessControlConfig.route.url &&
|
|
1039
|
+
accessControlConfig.route.url.length > 0) {
|
|
1040
1040
|
routePath = accessControlConfig.route.url[0].path;
|
|
1041
1041
|
}
|
|
1042
1042
|
const permissions = this.loginStaff.permissions;
|
|
@@ -1050,10 +1050,10 @@ class SmartAuthService {
|
|
|
1050
1050
|
? 'N/A'
|
|
1051
1051
|
: this.selectedOffender.assignmentStaffRelationId;
|
|
1052
1052
|
const permission = permissions.find((p) => {
|
|
1053
|
-
return (p.appModuleId === accessControlConfig.appModuleId
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1053
|
+
return (p.appModuleId === accessControlConfig.appModuleId &&
|
|
1054
|
+
p.resource === resource &&
|
|
1055
|
+
(!roleId || p.roleId === roleId) &&
|
|
1056
|
+
(p.assignmentStaffRelationId === 'N/A' ||
|
|
1057
1057
|
p.assignmentStaffRelationId === assignmentStaffRelationId));
|
|
1058
1058
|
});
|
|
1059
1059
|
if (permission) {
|
|
@@ -1156,72 +1156,87 @@ class SmartAuthService {
|
|
|
1156
1156
|
element.setAttribute('style', 'display: none;');
|
|
1157
1157
|
}
|
|
1158
1158
|
getStaff(userName) {
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
totalCount
|
|
1169
|
-
message
|
|
1170
|
-
data {
|
|
1171
|
-
staffId
|
|
1172
|
-
userName
|
|
1173
|
-
lastName
|
|
1174
|
-
firstName
|
|
1175
|
-
phone
|
|
1176
|
-
email
|
|
1177
|
-
roles {
|
|
1178
|
-
roleId
|
|
1179
|
-
role
|
|
1180
|
-
}
|
|
1181
|
-
permissions {
|
|
1182
|
-
roleId
|
|
1183
|
-
appModuleId
|
|
1184
|
-
resource
|
|
1185
|
-
assignmentStaffRelationId
|
|
1186
|
-
readFlag
|
|
1187
|
-
createFlag
|
|
1188
|
-
updateFlag
|
|
1189
|
-
deleteFlag
|
|
1190
|
-
assignFlag
|
|
1191
|
-
reopenFlag
|
|
1192
|
-
closeFlag
|
|
1193
|
-
expungeFlag
|
|
1194
|
-
}
|
|
1195
|
-
options {
|
|
1196
|
-
offenderListOptionId
|
|
1197
|
-
name
|
|
1198
|
-
serviceApiFieldName
|
|
1199
|
-
selectedFlag
|
|
1200
|
-
}
|
|
1201
|
-
}
|
|
1202
|
-
}
|
|
1203
|
-
}`;
|
|
1204
|
-
return this.http
|
|
1205
|
-
.post(this.smartDataServiceUrl, { query: queryString }, httpOptions)
|
|
1206
|
-
.pipe(take(1), map((result) => {
|
|
1159
|
+
return this.query({
|
|
1160
|
+
query: this.findStaffQuery,
|
|
1161
|
+
variables: {
|
|
1162
|
+
where: {
|
|
1163
|
+
userName: userName,
|
|
1164
|
+
activeFlag: true,
|
|
1165
|
+
},
|
|
1166
|
+
},
|
|
1167
|
+
}).pipe(take(1), map((result) => {
|
|
1207
1168
|
if (isDevMode) {
|
|
1208
1169
|
console.log('##### getStaff() from service ', result);
|
|
1209
1170
|
}
|
|
1210
|
-
if (result.
|
|
1211
|
-
const data = result.
|
|
1171
|
+
if (result.findvStaffs.data.length > 0) {
|
|
1172
|
+
const data = result.findvStaffs.data[0];
|
|
1212
1173
|
this.xdmService.setLoginStaff(data);
|
|
1213
1174
|
this.loginStaff = data;
|
|
1214
1175
|
return data;
|
|
1215
1176
|
}
|
|
1216
1177
|
else {
|
|
1217
1178
|
return of(null);
|
|
1218
|
-
// return throwError('No access right.');
|
|
1219
1179
|
}
|
|
1220
1180
|
}), catchError((error) => {
|
|
1221
1181
|
console.log('error ' + error);
|
|
1222
1182
|
return of(null);
|
|
1223
1183
|
}));
|
|
1224
1184
|
}
|
|
1185
|
+
query(options) {
|
|
1186
|
+
return this.http
|
|
1187
|
+
.post(this.smartDataServiceUrl, {
|
|
1188
|
+
query: options.query,
|
|
1189
|
+
variables: options.variables,
|
|
1190
|
+
}, {
|
|
1191
|
+
headers: new HttpHeaders({
|
|
1192
|
+
'Content-Type': 'application/json',
|
|
1193
|
+
'No-Auth': 'True',
|
|
1194
|
+
}),
|
|
1195
|
+
})
|
|
1196
|
+
.pipe(map((d) => d.data));
|
|
1197
|
+
}
|
|
1198
|
+
get findStaffQuery() {
|
|
1199
|
+
return `
|
|
1200
|
+
query findvStaffs($input: vStaffMultiInput) {
|
|
1201
|
+
findvStaffs(input: $input) {
|
|
1202
|
+
totalCount
|
|
1203
|
+
message
|
|
1204
|
+
data {
|
|
1205
|
+
staffId
|
|
1206
|
+
userName
|
|
1207
|
+
lastName
|
|
1208
|
+
firstName
|
|
1209
|
+
phone
|
|
1210
|
+
email
|
|
1211
|
+
roles {
|
|
1212
|
+
roleId
|
|
1213
|
+
role
|
|
1214
|
+
}
|
|
1215
|
+
permissions {
|
|
1216
|
+
roleId
|
|
1217
|
+
appModuleId
|
|
1218
|
+
resource
|
|
1219
|
+
assignmentStaffRelationId
|
|
1220
|
+
readFlag
|
|
1221
|
+
createFlag
|
|
1222
|
+
updateFlag
|
|
1223
|
+
deleteFlag
|
|
1224
|
+
assignFlag
|
|
1225
|
+
reopenFlag
|
|
1226
|
+
closeFlag
|
|
1227
|
+
expungeFlag
|
|
1228
|
+
}
|
|
1229
|
+
options {
|
|
1230
|
+
offenderListOptionId
|
|
1231
|
+
name
|
|
1232
|
+
serviceApiFieldName
|
|
1233
|
+
selectedFlag
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1238
|
+
`;
|
|
1239
|
+
}
|
|
1225
1240
|
getStaffOffenderRelation(staffId, offenderId) {
|
|
1226
1241
|
const queryString = `
|
|
1227
1242
|
{
|