dts-backoffice-util 16.1.0 → 17.0.0
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/README.md +1 -0
- package/esm2022/dts-backoffice-util.mjs +4 -4
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.mjs +305 -305
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.mjs +6 -6
- package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.mjs +208 -208
- package/esm2022/lib/dts-backoffice-util.module.mjs +54 -54
- package/esm2022/lib/interfaces/filter-range.interface.mjs +1 -1
- package/esm2022/lib/interfaces/totvs-response.interface.mjs +1 -1
- package/esm2022/lib/model/session-info.model.mjs +67 -67
- package/esm2022/lib/pipes/dts-date-format.pipe.mjs +20 -20
- package/esm2022/lib/services/breadcrumb-control.service.mjs +99 -99
- package/esm2022/lib/services/cache-params.service.mjs +25 -25
- package/esm2022/lib/services/menu-datasul.service.mjs +118 -118
- package/esm2022/lib/services/profile.service.mjs +55 -55
- package/esm2022/lib/services/report.service.mjs +57 -57
- package/esm2022/lib/services/session-info.service.mjs +36 -36
- package/esm2022/lib/services/translate.service.mjs +23 -23
- package/esm2022/lib/utils/date.util.mjs +56 -56
- package/esm2022/lib/utils/disclaimer.util.mjs +490 -490
- package/esm2022/lib/utils/field-validation.util.mjs +179 -179
- package/esm2022/lib/utils/file.util.mjs +151 -151
- package/esm2022/lib/utils/filter-range.util.mjs +32 -32
- package/esm2022/lib/utils/generic-functions.utils.mjs +170 -170
- package/esm2022/public-api.mjs +33 -33
- package/fesm2022/dts-backoffice-util.mjs +2013 -2013
- package/fesm2022/dts-backoffice-util.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/components/totvs-schedule-execution/totvs-schedule-execution.component.d.ts +53 -53
- package/lib/components/totvs-schedule-execution/totvs-schedule-execution.model.d.ts +68 -68
- package/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.d.ts +30 -30
- package/lib/dts-backoffice-util.module.d.ts +14 -14
- package/lib/interfaces/filter-range.interface.d.ts +18 -18
- package/lib/interfaces/totvs-response.interface.d.ts +4 -4
- package/lib/model/session-info.model.d.ts +40 -40
- package/lib/pipes/dts-date-format.pipe.d.ts +7 -7
- package/lib/services/breadcrumb-control.service.d.ts +18 -18
- package/lib/services/cache-params.service.d.ts +10 -10
- package/lib/services/menu-datasul.service.d.ts +27 -27
- package/lib/services/profile.service.d.ts +25 -25
- package/lib/services/report.service.d.ts +31 -31
- package/lib/services/session-info.service.d.ts +12 -12
- package/lib/services/translate.service.d.ts +8 -8
- package/lib/utils/date.util.d.ts +9 -9
- package/lib/utils/disclaimer.util.d.ts +40 -40
- package/lib/utils/field-validation.util.d.ts +21 -21
- package/lib/utils/file.util.d.ts +23 -23
- package/lib/utils/filter-range.util.d.ts +7 -7
- package/lib/utils/generic-functions.utils.d.ts +24 -24
- package/package.json +5 -5
- package/public-api.d.ts +20 -20
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export class ScheduleParameters {
|
|
2
|
-
}
|
|
3
|
-
export class ExecutionStatus {
|
|
4
|
-
}
|
|
5
|
-
export class ExecutionParameters {
|
|
6
|
-
}
|
|
1
|
+
export class ScheduleParameters {
|
|
2
|
+
}
|
|
3
|
+
export class ExecutionStatus {
|
|
4
|
+
}
|
|
5
|
+
export class ExecutionParameters {
|
|
6
|
+
}
|
|
7
7
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZHRzLWJhY2tvZmZpY2UtdXRpbC9zcmMvbGliL2NvbXBvbmVudHMvdG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uL3RvdHZzLXNjaGVkdWxlLWV4ZWN1dGlvbi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFnQkEsTUFBTSxPQUFPLGtCQUFrQjtDQWM5QjtBQVVELE1BQU0sT0FBTyxlQUFlO0NBTTNCO0FBZUQsTUFBTSxPQUFPLG1CQUFtQjtDQVcvQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSVNjaGVkdWxlUGFyYW1ldGVycyB7XHJcbiAgICBleGVjdXRpb25UeXBlOiBudW1iZXI7XHJcbiAgICBleGVjQXBwb2ludERhdGU6IERhdGU7XHJcbiAgICBleGVjQXBwb2ludEhvdXI6IHN0cmluZztcclxuICAgIGV4ZWN1dGlvblNlcnZlcjogc3RyaW5nO1xyXG4gICAgcmVwZWF0RXhlY3V0aW9uOiBib29sZWFuO1xyXG4gICAgcmVwZWF0VHlwZTogbnVtYmVyO1xyXG4gICAgZnJlcXVlbmN5OiBzdHJpbmc7XHJcbiAgICBmcmVxdWVuY3lWYWx1ZTogbnVtYmVyO1xyXG4gICAgZnJlcXVlbmN5VHlwZTogc3RyaW5nO1xyXG4gICAgZXhlY0FwcG9pbnRIb3VySW5pdDogc3RyaW5nO1xyXG4gICAgZXhlY0FwcG9pbnRIb3VyRmluYWw6IHN0cmluZztcclxuICAgIHNlbGVjdFdlZWtseXM6IFtdO1xyXG4gICAgZGF5T2ZNb250aDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgU2NoZWR1bGVQYXJhbWV0ZXJzIGltcGxlbWVudHMgSVNjaGVkdWxlUGFyYW1ldGVycyB7XHJcbiAgICBleGVjdXRpb25UeXBlOiBudW1iZXI7XHJcbiAgICBleGVjQXBwb2ludERhdGU6IERhdGU7XHJcbiAgICBleGVjQXBwb2ludEhvdXI6IHN0cmluZztcclxuICAgIGV4ZWN1dGlvblNlcnZlcjogc3RyaW5nO1xyXG4gICAgcmVwZWF0RXhlY3V0aW9uOiBib29sZWFuO1xyXG4gICAgcmVwZWF0VHlwZTogbnVtYmVyO1xyXG4gICAgZnJlcXVlbmN5OiBzdHJpbmc7XHJcbiAgICBmcmVxdWVuY3lWYWx1ZTogbnVtYmVyO1xyXG4gICAgZnJlcXVlbmN5VHlwZTogc3RyaW5nO1xyXG4gICAgZXhlY0FwcG9pbnRIb3VySW5pdDogc3RyaW5nO1xyXG4gICAgZXhlY0FwcG9pbnRIb3VyRmluYWw6IHN0cmluZztcclxuICAgIHNlbGVjdFdlZWtseXM6IFtdO1xyXG4gICAgZGF5T2ZNb250aDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElFeGVjdXRpb25TdGF0dXMge1xyXG4gICAgam9iU2NoZWR1bGVJRDogc3RyaW5nO1xyXG4gICAgZXhlY3V0aW9uSUQ6IHN0cmluZztcclxuICAgIHN0YXJ0ZWREYXRlOiBEYXRlO1xyXG4gICAgZXJyb3I6IHN0cmluZztcclxuICAgIHN0YXR1czogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uU3RhdHVzIGltcGxlbWVudHMgSUV4ZWN1dGlvblN0YXR1cyB7XHJcbiAgICBqb2JTY2hlZHVsZUlEOiBzdHJpbmc7XHJcbiAgICBleGVjdXRpb25JRDogc3RyaW5nO1xyXG4gICAgc3RhcnRlZERhdGU6IERhdGU7XHJcbiAgICBlcnJvcjogc3RyaW5nO1xyXG4gICAgc3RhdHVzOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUV4ZWN1dGlvblBhcmFtZXRlcnMge1xyXG4gICAgZXhlY3V0aW9uU2VydmVyOiBzdHJpbmc7XHJcbiAgICBwcm9ncmFtTmFtZTogc3RyaW5nO1xyXG4gICAgZXh0ZXJuYWxOYW1lOiBzdHJpbmc7XHJcbiAgICBwcm9ncmFtRU1TNT86IGJvb2xlYW47XHJcbiAgICBwcm9ncmFtU3R5bGU/OiBudW1iZXI7XHJcbiAgICBwcm9ncmFtVmVyc2lvbj86IHN0cmluZztcclxuICAgIGJ1c2luZXNzUGFyYW1zOiBBcnJheTxhbnk+O1xyXG4gICAgcGFyYW1EaWdpdERlZj86IEFycmF5PGFueT47XHJcbiAgICBwYXJhbURpZ2l0RGF0YT86IEFycmF5PGFueT47XHJcbiAgICBwYXJhbVNlbGVjdGlvbnM/OiBBcnJheTxhbnk+O1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXhlY3V0aW9uUGFyYW1ldGVycyBpbXBsZW1lbnRzIElFeGVjdXRpb25QYXJhbWV0ZXJzIHtcclxuICAgIGV4ZWN1dGlvblNlcnZlcjogc3RyaW5nO1xyXG4gICAgcHJvZ3JhbU5hbWU6IHN0cmluZztcclxuICAgIGV4dGVybmFsTmFtZTogc3RyaW5nO1xyXG4gICAgcHJvZ3JhbUVNUzU/OiBib29sZWFuO1xyXG4gICAgcHJvZ3JhbVN0eWxlPzogbnVtYmVyO1xyXG4gICAgcHJvZ3JhbVZlcnNpb24/OiBzdHJpbmc7XHJcbiAgICBidXNpbmVzc1BhcmFtczogQXJyYXk8YW55PjtcclxuICAgIHBhcmFtRGlnaXREZWY/OiBBcnJheTxhbnk+O1xyXG4gICAgcGFyYW1EaWdpdERhdGE/OiBBcnJheTxhbnk+O1xyXG4gICAgcGFyYW1TZWxlY3Rpb25zPzogQXJyYXk8YW55PjtcclxufVxyXG4iXX0=
|
package/esm2022/lib/components/totvs-schedule-execution/totvs-schedule-execution.service.mjs
CHANGED
|
@@ -1,208 +1,208 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
3
|
-
import { map } from 'rxjs/operators';
|
|
4
|
-
import { ExecutionStatus } from './totvs-schedule-execution.model';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
export class TotvsScheduleExecutionService {
|
|
8
|
-
constructor(http) {
|
|
9
|
-
this.http = http;
|
|
10
|
-
this.headers = { headers: { 'X-PO-Screen-Lock': 'true' } };
|
|
11
|
-
this.urlCadServidor = '/dts/datasul-rest/resources/prg/btb/v1/servidoresExecucao';
|
|
12
|
-
this.urlJobScheduler = '/dts/datasul-rest/resources/prg/framework/v1/jobScheduler';
|
|
13
|
-
this.urlJobExecution = '/dts/datasul-rest/resources/prg/framework/v1/jobExecution';
|
|
14
|
-
}
|
|
15
|
-
getFilteredItems(params) {
|
|
16
|
-
const urlParams = new Array();
|
|
17
|
-
urlParams.push(`pageSize=${params.pageSize.toString()}`);
|
|
18
|
-
urlParams.push(`page=${params.page.toString()}`);
|
|
19
|
-
if (params.filter && params.filter.length > 0) {
|
|
20
|
-
urlParams.push(`quickSearch=${params.filter}`);
|
|
21
|
-
}
|
|
22
|
-
return this.http.get(`${this.urlCadServidor}?${urlParams.join('&')}`);
|
|
23
|
-
}
|
|
24
|
-
getObjectByValue(id) {
|
|
25
|
-
return this.http.get(`${this.urlCadServidor}/${id}`, this.headers);
|
|
26
|
-
}
|
|
27
|
-
createExecution(parameters, loading) {
|
|
28
|
-
const params = JSON.parse(JSON.stringify(parameters).replace(/\\\\/g, '*|'));
|
|
29
|
-
if (loading) {
|
|
30
|
-
return this.http.post(`${this.urlJobScheduler}`, params, this.headers);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
return this.http.post(`${this.urlJobScheduler}`, params);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
createExecutionForNow(executionParams, loading) {
|
|
37
|
-
let jobScheduleParams;
|
|
38
|
-
const date = new Date();
|
|
39
|
-
const params = JSON.parse(JSON.stringify(executionParams).replace(/\\\\/g, '*|'));
|
|
40
|
-
if (!params.programEMS5) {
|
|
41
|
-
params.programEMS5 = false;
|
|
42
|
-
}
|
|
43
|
-
if (!params.programStyle) {
|
|
44
|
-
params.programStyle = 0;
|
|
45
|
-
}
|
|
46
|
-
if (!params.programVersion) {
|
|
47
|
-
params.programVersion = '';
|
|
48
|
-
}
|
|
49
|
-
if (!params.businessParams || params.businessParams.length === 0) {
|
|
50
|
-
params.businessParams = [{ chave: '', valor: '' }];
|
|
51
|
-
}
|
|
52
|
-
jobScheduleParams = {};
|
|
53
|
-
jobScheduleParams.status = 'active';
|
|
54
|
-
jobScheduleParams.processID = params.programName;
|
|
55
|
-
jobScheduleParams.firstExecution = `${date.getFullYear()}-${(date.getMonth() + 1)}-${date.getDate()}T${this.addZero(date.getHours())}:${this.addZero(date.getMinutes())}:00.000Z`;
|
|
56
|
-
jobScheduleParams.recurrent = false;
|
|
57
|
-
jobScheduleParams.executionParameter = {
|
|
58
|
-
parametros: [
|
|
59
|
-
{ chave: 'rpwServer', valor: params.executionServer },
|
|
60
|
-
{ chave: 'RPW_PROGRAM', valor: params.externalName },
|
|
61
|
-
{ chave: 'RPW_PRG_EMS5', valor: params.programEMS5 ? 'yes' : 'no' },
|
|
62
|
-
{ chave: 'RPW_PRG_ESTILO', valor: params.programStyle },
|
|
63
|
-
{ chave: 'RPW_PRG_VERS', valor: params.programVersion },
|
|
64
|
-
{ parametros_negocio: params.businessParams }
|
|
65
|
-
]
|
|
66
|
-
};
|
|
67
|
-
if (params.paramDigitDef && params.paramDigitDef.length > 0) {
|
|
68
|
-
jobScheduleParams.executionParameter.parametros.push({
|
|
69
|
-
param_digita_def: params.paramDigitDef
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
if (params.paramDigitData && params.paramDigitData.length > 0) {
|
|
73
|
-
jobScheduleParams.executionParameter.parametros.push({
|
|
74
|
-
param_digita_dados: params.paramDigitData
|
|
75
|
-
});
|
|
76
|
-
}
|
|
77
|
-
if (params.paramSelections && params.paramSelections.length > 0) {
|
|
78
|
-
jobScheduleParams.executionParameter.parametros.push({
|
|
79
|
-
selecoes: params.paramSelections
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
if (loading) {
|
|
83
|
-
return this.http.post(`${this.urlJobScheduler}`, jobScheduleParams, this.headers);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
return this.http.post(`${this.urlJobScheduler}`, jobScheduleParams);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
getExecutionByJobScheduleID(jobScheduleID, loading = false) {
|
|
90
|
-
const url = `${this.urlJobExecution}?jobScheduleID=${jobScheduleID}`;
|
|
91
|
-
return this.getExecution(url, loading).pipe(map((response) => this.transformExecution('jobScheduleID', response)));
|
|
92
|
-
}
|
|
93
|
-
getExecutionByExecutionID(executionID, loading = false) {
|
|
94
|
-
const url = `${this.urlJobExecution}/${executionID}`;
|
|
95
|
-
return this.getExecution(url, loading).pipe(map((response) => this.transformExecution('executionID', response)));
|
|
96
|
-
}
|
|
97
|
-
getExecution(url, loading) {
|
|
98
|
-
if (loading) {
|
|
99
|
-
return this.http.get(url, this.headers);
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
return this.http.get(url);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
transformExecution(type, response) {
|
|
106
|
-
if (!response || !response.items || response.items.length === 0) {
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
response = response.items[0];
|
|
110
|
-
const execStatus = new ExecutionStatus();
|
|
111
|
-
execStatus.jobScheduleID = response.jobScheduleID;
|
|
112
|
-
execStatus.executionID = response.executionID;
|
|
113
|
-
execStatus.startedDate = response.startedDate;
|
|
114
|
-
execStatus.error = response.error;
|
|
115
|
-
execStatus.status = response.status;
|
|
116
|
-
return execStatus;
|
|
117
|
-
}
|
|
118
|
-
followUpExcByJobScheduleID(jobScheduleID, intervalNum, fncCallBack, loading = false) {
|
|
119
|
-
this.followUpExecution('jobScheduleID', jobScheduleID, intervalNum, fncCallBack, loading);
|
|
120
|
-
}
|
|
121
|
-
followUpExcByExecutionID(executionID, intervalNum, fncCallBack, loading = false) {
|
|
122
|
-
this.followUpExecution('executionID', executionID, intervalNum, fncCallBack, loading);
|
|
123
|
-
}
|
|
124
|
-
followUpExecution(type, execID, intervalNum, fncCallBack, loading) {
|
|
125
|
-
this.jobExecutionSubscription$ = null;
|
|
126
|
-
const intervalID = setInterval(() => {
|
|
127
|
-
const execStatus = new ExecutionStatus();
|
|
128
|
-
execStatus.jobScheduleID = (type === 'jobScheduleID') ? execID : '';
|
|
129
|
-
execStatus.executionID = (type === 'executionID') ? execID : '';
|
|
130
|
-
execStatus.startedDate = null;
|
|
131
|
-
execStatus.error = '';
|
|
132
|
-
execStatus.status = 'PENDING'; // PENDING, RUNNING, SUCCESS, FAILURE
|
|
133
|
-
if (this.jobExecutionSubscription$) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
if (type === 'jobScheduleID') {
|
|
137
|
-
this.jobExecutionSubscription$ = this.getExecutionByJobScheduleID(execID, loading)
|
|
138
|
-
.subscribe((response) => {
|
|
139
|
-
this.followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack);
|
|
140
|
-
}, (error) => {
|
|
141
|
-
this.followUpExecReturnError(error, execStatus, intervalID, fncCallBack);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
if (type === 'executionID') {
|
|
145
|
-
this.jobExecutionSubscription$ = this.getExecutionByExecutionID(execID, loading)
|
|
146
|
-
.subscribe((response) => {
|
|
147
|
-
this.followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack);
|
|
148
|
-
}, (error) => {
|
|
149
|
-
this.followUpExecReturnError(error, execStatus, intervalID, fncCallBack);
|
|
150
|
-
});
|
|
151
|
-
}
|
|
152
|
-
}, intervalNum);
|
|
153
|
-
}
|
|
154
|
-
followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack) {
|
|
155
|
-
if (response) {
|
|
156
|
-
execStatus = response;
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
execStatus.error = `Agendamento não encontrado com ID: ${execID}`;
|
|
160
|
-
execStatus.status = 'FAILURE';
|
|
161
|
-
}
|
|
162
|
-
if (!fncCallBack(execStatus) ||
|
|
163
|
-
execStatus.status === 'SUCCESS' ||
|
|
164
|
-
execStatus.status === 'FAILURE') {
|
|
165
|
-
clearInterval(intervalID);
|
|
166
|
-
}
|
|
167
|
-
this.jobExecutionSubscription$ = null;
|
|
168
|
-
}
|
|
169
|
-
followUpExecReturnError(error, execStatus, intervalID, fncCallBack) {
|
|
170
|
-
let erroDesc = '';
|
|
171
|
-
if (error instanceof HttpErrorResponse) {
|
|
172
|
-
erroDesc = error.message;
|
|
173
|
-
if (error.error) {
|
|
174
|
-
erroDesc = '';
|
|
175
|
-
if (error.error.code) {
|
|
176
|
-
erroDesc = error.error.code;
|
|
177
|
-
}
|
|
178
|
-
if (error.error.message) {
|
|
179
|
-
erroDesc = `${erroDesc} - ${error.error.message}`;
|
|
180
|
-
}
|
|
181
|
-
if (error.error.detailedMessage) {
|
|
182
|
-
erroDesc = `${erroDesc} - ${error.error.detailedMessage}`;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
else {
|
|
187
|
-
erroDesc = error;
|
|
188
|
-
}
|
|
189
|
-
execStatus.error = erroDesc;
|
|
190
|
-
execStatus.status = 'FAILURE';
|
|
191
|
-
fncCallBack(execStatus);
|
|
192
|
-
clearInterval(intervalID);
|
|
193
|
-
this.jobExecutionSubscription$ = null;
|
|
194
|
-
}
|
|
195
|
-
addZero(num) {
|
|
196
|
-
let str = `${num}`;
|
|
197
|
-
if (num < 10) {
|
|
198
|
-
str = `0${num}`;
|
|
199
|
-
}
|
|
200
|
-
return str;
|
|
201
|
-
}
|
|
202
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
203
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
204
|
-
}
|
|
205
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
206
|
-
type: Injectable
|
|
207
|
-
}], ctorParameters:
|
|
208
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvY29tcG9uZW50cy90b3R2cy1zY2hlZHVsZS1leGVjdXRpb24vdG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBMEMsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBRzNHLE1BQU0sT0FBTyw2QkFBNkI7SUFhdEMsWUFBbUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVgzQixZQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBRXRELG1CQUFjLEdBQUcsMkRBQTJELENBQUM7UUFDN0Usb0JBQWUsR0FBRywyREFBMkQsQ0FBQztRQUM5RSxvQkFBZSxHQUFHLDJEQUEyRCxDQUFDO0lBTy9DLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsTUFBbUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUV0QyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENB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QkFBNkI7a0JBRHpDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBQb0xvb2t1cEZpbHRlcmVkSXRlbXNQYXJhbXMgfSBmcm9tICdAcG8tdWkvbmctY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IEV4ZWN1dGlvblN0YXR1cywgSUV4ZWN1dGlvblBhcmFtZXRlcnMsIElFeGVjdXRpb25TdGF0dXMgfSBmcm9tICcuL3RvdHZzLXNjaGVkdWxlLWV4ZWN1dGlvbi5tb2RlbCc7XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBUb3R2c1NjaGVkdWxlRXhlY3V0aW9uU2VydmljZSB7XHJcblxyXG4gICAgcHJpdmF0ZSBoZWFkZXJzID0geyBoZWFkZXJzOiB7ICdYLVBPLVNjcmVlbi1Mb2NrJzogJ3RydWUnIH0gfTtcclxuXHJcbiAgICBwcml2YXRlIHVybENhZFNlcnZpZG9yID0gJy9kdHMvZGF0YXN1bC1yZXN0L3Jlc291cmNlcy9wcmcvYnRiL3YxL3NlcnZpZG9yZXNFeGVjdWNhbyc7XHJcbiAgICBwcml2YXRlIHVybEpvYlNjaGVkdWxlciA9ICcvZHRzL2RhdGFzdWwtcmVzdC9yZXNvdXJjZXMvcHJnL2ZyYW1ld29yay92MS9qb2JTY2hlZHVsZXInO1xyXG4gICAgcHJpdmF0ZSB1cmxKb2JFeGVjdXRpb24gPSAnL2R0cy9kYXRhc3VsLXJlc3QvcmVzb3VyY2VzL3ByZy9mcmFtZXdvcmsvdjEvam9iRXhlY3V0aW9uJztcclxuXHJcbiAgICAvLyBwcml2YXRlIHVybENhZFNlcnZpZG9yID0gJy9nZW5lcmljc1pvb20nO1xyXG4gICAgLy8gcHJpdmF0ZSB1cmxKb2JTY2hlZHVsZXIgPSAnL2pvYlNjaGVkdWxlcic7XHJcblxyXG4gICAgcHJpdmF0ZSBqb2JFeGVjdXRpb25TdWJzY3JpcHRpb24kOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IocHVibGljIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxyXG5cclxuICAgIGdldEZpbHRlcmVkSXRlbXMocGFyYW1zOiBQb0xvb2t1cEZpbHRlcmVkSXRlbXNQYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG4gICAgICAgIHVybFBhcmFtcy5wdXNoKGBwYWdlU2l6ZT0ke3BhcmFtcy5wYWdlU2l6ZS50b1N0cmluZygpfWApO1xyXG4gICAgICAgIHVybFBhcmFtcy5wdXNoKGBwYWdlPSR7cGFyYW1zLnBhZ2UudG9TdHJpbmcoKX1gKTtcclxuXHJcbiAgICAgICAgaWYgKHBhcmFtcy5maWx0ZXIgJiYgcGFyYW1zLmZpbHRlci5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHVybFBhcmFtcy5wdXNoKGBxdWlja1NlYXJjaD0ke3BhcmFtcy5maWx0ZXJ9YCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHt0aGlzLnVybENhZFNlcnZpZG9yfT8ke3VybFBhcmFtcy5qb2luKCcmJyl9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0T2JqZWN0QnlWYWx1ZShpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke3RoaXMudXJsQ2FkU2Vydmlkb3J9LyR7aWR9YCwgdGhpcy5oZWFkZXJzKTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVFeGVjdXRpb24ocGFyYW1ldGVyczogT2JqZWN0LCBsb2FkaW5nOiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpLnJlcGxhY2UoL1xcXFxcXFxcL2csICcqfCcpKTtcclxuXHJcbiAgICAgICAgaWYgKGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMudXJsSm9iU2NoZWR1bGVyfWAsIHBhcmFtcywgdGhpcy5oZWFkZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy51cmxKb2JTY2hlZHVsZXJ9YCwgcGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRXhlY3V0aW9uRm9yTm93KGV4ZWN1dGlvblBhcmFtczogSUV4ZWN1dGlvblBhcmFtZXRlcnMsIGxvYWRpbmc6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGxldCBqb2JTY2hlZHVsZVBhcmFtczogYW55O1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGV4ZWN1dGlvblBhcmFtcykucmVwbGFjZSgvXFxcXFxcXFwvZywgJyp8JykpO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmFtcy5wcm9ncmFtRU1TNSkgeyBwYXJhbXMucHJvZ3JhbUVNUzUgPSBmYWxzZTsgfVxyXG4gICAgICAgIGlmICghcGFyYW1zLnByb2dyYW1TdHlsZSkgeyBwYXJhbXMucHJvZ3JhbVN0eWxlID0gMDsgfVxyXG4gICAgICAgIGlmICghcGFyYW1zLnByb2dyYW1WZXJzaW9uKSB7IHBhcmFtcy5wcm9ncmFtVmVyc2lvbiA9ICcnOyB9XHJcbiAgICAgICAgaWYgKCFwYXJhbXMuYnVzaW5lc3NQYXJhbXMgfHwgcGFyYW1zLmJ1c2luZXNzUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwYXJhbXMuYnVzaW5lc3NQYXJhbXMgPSBbeyBjaGF2ZTogJycsIHZhbG9yOiAnJyB9XTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zID0ge307XHJcbiAgICAgICAgam9iU2NoZWR1bGVQYXJhbXMuc3RhdHVzID0gJ2FjdGl2ZSc7XHJcbiAgICAgICAgam9iU2NoZWR1bGVQYXJhbXMucHJvY2Vzc0lEID0gcGFyYW1zLnByb2dyYW1OYW1lO1xyXG4gICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLmZpcnN0RXhlY3V0aW9uID0gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0keyhkYXRlLmdldE1vbnRoKCkgKyAxKX0tJHtkYXRlLmdldERhdGUoKX1UJHt0aGlzLmFkZFplcm8oZGF0ZS5nZXRIb3VycygpKX06JHt0aGlzLmFkZFplcm8oZGF0ZS5nZXRNaW51dGVzKCkpfTowMC4wMDBaYDtcclxuICAgICAgICBqb2JTY2hlZHVsZVBhcmFtcy5yZWN1cnJlbnQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgam9iU2NoZWR1bGVQYXJhbXMuZXhlY3V0aW9uUGFyYW1ldGVyID0ge1xyXG4gICAgICAgICAgICBwYXJhbWV0cm9zOiBbXHJcbiAgICAgICAgICAgICAgICB7IGNoYXZlOiAncnB3U2VydmVyJywgdmFsb3I6IHBhcmFtcy5leGVjdXRpb25TZXJ2ZXIgfSxcclxuICAgICAgICAgICAgICAgIHsgY2hhdmU6ICdSUFdfUFJPR1JBTScsIHZhbG9yOiBwYXJhbXMuZXh0ZXJuYWxOYW1lIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNoYXZlOiAnUlBXX1BSR19FTVM1JywgdmFsb3I6IHBhcmFtcy5wcm9ncmFtRU1TNSA/ICd5ZXMnIDogJ25vJyB9LFxyXG4gICAgICAgICAgICAgICAgeyBjaGF2ZTogJ1JQV19QUkdfRVNUSUxPJywgdmFsb3I6IHBhcmFtcy5wcm9ncmFtU3R5bGUgfSxcclxuICAgICAgICAgICAgICAgIHsgY2hhdmU6ICdSUFdfUFJHX1ZFUlMnLCB2YWxvcjogcGFyYW1zLnByb2dyYW1WZXJzaW9uIH0sXHJcbiAgICAgICAgICAgICAgICB7IHBhcmFtZXRyb3NfbmVnb2NpbzogcGFyYW1zLmJ1c2luZXNzUGFyYW1zIH1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChwYXJhbXMucGFyYW1EaWdpdERlZiAmJiBwYXJhbXMucGFyYW1EaWdpdERlZi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLmV4ZWN1dGlvblBhcmFtZXRlci5wYXJhbWV0cm9zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgcGFyYW1fZGlnaXRhX2RlZjogcGFyYW1zLnBhcmFtRGlnaXREZWZcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyYW1zLnBhcmFtRGlnaXREYXRhICYmIHBhcmFtcy5wYXJhbURpZ2l0RGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLmV4ZWN1dGlvblBhcmFtZXRlci5wYXJhbWV0cm9zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgcGFyYW1fZGlnaXRhX2RhZG9zOiBwYXJhbXMucGFyYW1EaWdpdERhdGFcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocGFyYW1zLnBhcmFtU2VsZWN0aW9ucyAmJiBwYXJhbXMucGFyYW1TZWxlY3Rpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgam9iU2NoZWR1bGVQYXJhbXMuZXhlY3V0aW9uUGFyYW1ldGVyLnBhcmFtZXRyb3MucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY29lczogcGFyYW1zLnBhcmFtU2VsZWN0aW9uc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLnVybEpvYlNjaGVkdWxlcn1gLCBqb2JTY2hlZHVsZVBhcmFtcywgdGhpcy5oZWFkZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy51cmxKb2JTY2hlZHVsZXJ9YCwgam9iU2NoZWR1bGVQYXJhbXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRFeGVjdXRpb25CeUpvYlNjaGVkdWxlSUQoam9iU2NoZWR1bGVJRDogc3RyaW5nLCBsb2FkaW5nID0gZmFsc2UpOiBPYnNlcnZhYmxlPElFeGVjdXRpb25TdGF0dXM+IHtcclxuICAgICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLnVybEpvYkV4ZWN1dGlvbn0/am9iU2NoZWR1bGVJRD0ke2pvYlNjaGVkdWxlSUR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFeGVjdXRpb24odXJsLCBsb2FkaW5nKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB0aGlzLnRyYW5zZm9ybUV4ZWN1dGlvbignam9iU2NoZWR1bGVJRCcsIHJlc3BvbnNlKSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4ZWN1dGlvbkJ5RXhlY3V0aW9uSUQoZXhlY3V0aW9uSUQ6IHN0cmluZywgbG9hZGluZyA9IGZhbHNlKTogT2JzZXJ2YWJsZTxJRXhlY3V0aW9uU3RhdHVzPiB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy51cmxKb2JFeGVjdXRpb259LyR7ZXhlY3V0aW9uSUR9YDtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRFeGVjdXRpb24odXJsLCBsb2FkaW5nKS5waXBlKFxyXG4gICAgICAgICAgICBtYXAoKHJlc3BvbnNlKSA9PiB0aGlzLnRyYW5zZm9ybUV4ZWN1dGlvbignZXhlY3V0aW9uSUQnLCByZXNwb25zZSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEV4ZWN1dGlvbih1cmw6IHN0cmluZywgbG9hZGluZzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgaWYgKGxvYWRpbmcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB0aGlzLmhlYWRlcnMpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtRXhlY3V0aW9uKHR5cGU6IHN0cmluZywgcmVzcG9uc2U6IGFueSk6IElFeGVjdXRpb25TdGF0dXMge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2UgfHwgIXJlc3BvbnNlLml0ZW1zIHx8IHJlc3BvbnNlLml0ZW1zLmxlbmd0aCA9PT0gMCkgeyByZXR1cm47IH1cclxuICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLml0ZW1zWzBdO1xyXG5cclxuICAgICAgICBjb25zdCBleGVjU3RhdHVzID0gbmV3IEV4ZWN1dGlvblN0YXR1cygpO1xyXG4gICAgICAgIGV4ZWNTdGF0dXMuam9iU2NoZWR1bGVJRCA9IHJlc3BvbnNlLmpvYlNjaGVkdWxlSUQ7XHJcbiAgICAgICAgZXhlY1N0YXR1cy5leGVjdXRpb25JRCA9IHJlc3BvbnNlLmV4ZWN1dGlvbklEO1xyXG4gICAgICAgIGV4ZWNTdGF0dXMuc3RhcnRlZERhdGUgPSByZXNwb25zZS5zdGFydGVkRGF0ZTtcclxuICAgICAgICBleGVjU3RhdHVzLmVycm9yID0gcmVzcG9uc2UuZXJyb3I7XHJcbiAgICAgICAgZXhlY1N0YXR1cy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XHJcblxyXG4gICAgICAgIHJldHVybiBleGVjU3RhdHVzO1xyXG4gICAgfVxyXG5cclxuICAgIGZvbGxvd1VwRXhjQnlKb2JTY2hlZHVsZUlEKGpvYlNjaGVkdWxlSUQ6IHN0cmluZywgaW50ZXJ2YWxOdW06IG51bWJlciwgZm5jQ2FsbEJhY2s6IEZ1bmN0aW9uLCBsb2FkaW5nID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvbGxvd1VwRXhlY3V0aW9uKCdqb2JTY2hlZHVsZUlEJywgam9iU2NoZWR1bGVJRCwgaW50ZXJ2YWxOdW0sIGZuY0NhbGxCYWNrLCBsb2FkaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb2xsb3dVcEV4Y0J5RXhlY3V0aW9uSUQoZXhlY3V0aW9uSUQ6IHN0cmluZywgaW50ZXJ2YWxOdW06IG51bWJlciwgZm5jQ2FsbEJhY2s6IEZ1bmN0aW9uLCBsb2FkaW5nID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvbGxvd1VwRXhlY3V0aW9uKCdleGVjdXRpb25JRCcsIGV4ZWN1dGlvbklELCBpbnRlcnZhbE51bSwgZm5jQ2FsbEJhY2ssIGxvYWRpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZm9sbG93VXBFeGVjdXRpb24odHlwZTogc3RyaW5nLCBleGVjSUQ6IHN0cmluZyxcclxuICAgICAgICBpbnRlcnZhbE51bTogbnVtYmVyLCBmbmNDYWxsQmFjazogRnVuY3Rpb24sIGxvYWRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgdGhpcy5qb2JFeGVjdXRpb25TdWJzY3JpcHRpb24kID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxJRCA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXhlY1N0YXR1cyA9IG5ldyBFeGVjdXRpb25TdGF0dXMoKTtcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5qb2JTY2hlZHVsZUlEID0gKHR5cGUgPT09ICdqb2JTY2hlZHVsZUlEJykgPyBleGVjSUQgOiAnJztcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5leGVjdXRpb25JRCA9ICh0eXBlID09PSAnZXhlY3V0aW9uSUQnKSA/IGV4ZWNJRCA6ICcnO1xyXG4gICAgICAgICAgICBleGVjU3RhdHVzLnN0YXJ0ZWREYXRlID0gbnVsbDtcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5lcnJvciA9ICcnO1xyXG4gICAgICAgICAgICBleGVjU3RhdHVzLnN0YXR1cyA9ICdQRU5ESU5HJzsgLy8gUEVORElORywgUlVOTklORywgU1VDQ0VTUywgRkFJTFVSRVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCkgeyByZXR1cm47IH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSAnam9iU2NoZWR1bGVJRCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCA9IHRoaXMuZ2V0RXhlY3V0aW9uQnlKb2JTY2hlZHVsZUlEKGV4ZWNJRCwgbG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogSUV4ZWN1dGlvblN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGxvd1VwRXhlY1JldHVybk9rKGV4ZWNJRCwgZXhlY1N0YXR1cywgcmVzcG9uc2UsIGludGVydmFsSUQsIGZuY0NhbGxCYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWNSZXR1cm5FcnJvcihlcnJvciwgZXhlY1N0YXR1cywgaW50ZXJ2YWxJRCwgZm5jQ2FsbEJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2V4ZWN1dGlvbklEJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5qb2JFeGVjdXRpb25TdWJzY3JpcHRpb24kID0gdGhpcy5nZXRFeGVjdXRpb25CeUV4ZWN1dGlvbklEKGV4ZWNJRCwgbG9hZGluZylcclxuICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwb25zZTogSUV4ZWN1dGlvblN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvbGxvd1VwRXhlY1JldHVybk9rKGV4ZWNJRCwgZXhlY1N0YXR1cywgcmVzcG9uc2UsIGludGVydmFsSUQsIGZuY0NhbGxCYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWNSZXR1cm5FcnJvcihlcnJvciwgZXhlY1N0YXR1cywgaW50ZXJ2YWxJRCwgZm5jQ2FsbEJhY2spO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH0sIGludGVydmFsTnVtKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvbGxvd1VwRXhlY1JldHVybk9rKGV4ZWNJRDogc3RyaW5nLCBleGVjU3RhdHVzOiBJRXhlY3V0aW9uU3RhdHVzLCByZXNwb25zZTogSUV4ZWN1dGlvblN0YXR1cyxcclxuICAgICAgICBpbnRlcnZhbElEOiBhbnksIGZuY0NhbGxCYWNrOiBGdW5jdGlvbik6IHZvaWQge1xyXG5cclxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgZXhlY1N0YXR1cyA9IHJlc3BvbnNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuZXJyb3IgPSBgQWdlbmRhbWVudG8gbsOjbyBlbmNvbnRyYWRvIGNvbSBJRDogJHtleGVjSUR9YDtcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5zdGF0dXMgPSAnRkFJTFVSRSc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWZuY0NhbGxCYWNrKGV4ZWNTdGF0dXMpIHx8XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuc3RhdHVzID09PSAnU1VDQ0VTUycgfHxcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5zdGF0dXMgPT09ICdGQUlMVVJFJykge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5qb2JFeGVjdXRpb25TdWJzY3JpcHRpb24kID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvbGxvd1VwRXhlY1JldHVybkVycm9yKGVycm9yOiBhbnksIGV4ZWNTdGF0dXM6IElFeGVjdXRpb25TdGF0dXMsXHJcbiAgICAgICAgaW50ZXJ2YWxJRDogYW55LCBmbmNDYWxsQmFjazogRnVuY3Rpb24pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgbGV0IGVycm9EZXNjID0gJyc7XHJcblxyXG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGVycm9EZXNjID0gZXJyb3IubWVzc2FnZTtcclxuICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvRGVzYyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yLmNvZGUpIHsgZXJyb0Rlc2MgPSBlcnJvci5lcnJvci5jb2RlOyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IubWVzc2FnZSkgeyBlcnJvRGVzYyA9IGAke2Vycm9EZXNjfSAtICR7ZXJyb3IuZXJyb3IubWVzc2FnZX1gOyB9XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZXJyb3IuZGV0YWlsZWRNZXNzYWdlKSB7IGVycm9EZXNjID0gYCR7ZXJyb0Rlc2N9IC0gJHtlcnJvci5lcnJvci5kZXRhaWxlZE1lc3NhZ2V9YDsgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZXJyb0Rlc2MgPSBlcnJvcjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGV4ZWNTdGF0dXMuZXJyb3IgPSBlcnJvRGVzYztcclxuICAgICAgICBleGVjU3RhdHVzLnN0YXR1cyA9ICdGQUlMVVJFJztcclxuICAgICAgICBmbmNDYWxsQmFjayhleGVjU3RhdHVzKTtcclxuICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSUQpO1xyXG4gICAgICAgIHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRaZXJvKG51bTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICBsZXQgc3RyID0gYCR7bnVtfWA7XHJcbiAgICAgICAgaWYgKG51bSA8IDEwKSB7IHN0ciA9IGAwJHtudW19YDsgfVxyXG4gICAgICAgIHJldHVybiBzdHI7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
3
|
+
import { map } from 'rxjs/operators';
|
|
4
|
+
import { ExecutionStatus } from './totvs-schedule-execution.model';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
export class TotvsScheduleExecutionService {
|
|
8
|
+
constructor(http) {
|
|
9
|
+
this.http = http;
|
|
10
|
+
this.headers = { headers: { 'X-PO-Screen-Lock': 'true' } };
|
|
11
|
+
this.urlCadServidor = '/dts/datasul-rest/resources/prg/btb/v1/servidoresExecucao';
|
|
12
|
+
this.urlJobScheduler = '/dts/datasul-rest/resources/prg/framework/v1/jobScheduler';
|
|
13
|
+
this.urlJobExecution = '/dts/datasul-rest/resources/prg/framework/v1/jobExecution';
|
|
14
|
+
}
|
|
15
|
+
getFilteredItems(params) {
|
|
16
|
+
const urlParams = new Array();
|
|
17
|
+
urlParams.push(`pageSize=${params.pageSize.toString()}`);
|
|
18
|
+
urlParams.push(`page=${params.page.toString()}`);
|
|
19
|
+
if (params.filter && params.filter.length > 0) {
|
|
20
|
+
urlParams.push(`quickSearch=${params.filter}`);
|
|
21
|
+
}
|
|
22
|
+
return this.http.get(`${this.urlCadServidor}?${urlParams.join('&')}`);
|
|
23
|
+
}
|
|
24
|
+
getObjectByValue(id) {
|
|
25
|
+
return this.http.get(`${this.urlCadServidor}/${id}`, this.headers);
|
|
26
|
+
}
|
|
27
|
+
createExecution(parameters, loading) {
|
|
28
|
+
const params = JSON.parse(JSON.stringify(parameters).replace(/\\\\/g, '*|'));
|
|
29
|
+
if (loading) {
|
|
30
|
+
return this.http.post(`${this.urlJobScheduler}`, params, this.headers);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
return this.http.post(`${this.urlJobScheduler}`, params);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
createExecutionForNow(executionParams, loading) {
|
|
37
|
+
let jobScheduleParams;
|
|
38
|
+
const date = new Date();
|
|
39
|
+
const params = JSON.parse(JSON.stringify(executionParams).replace(/\\\\/g, '*|'));
|
|
40
|
+
if (!params.programEMS5) {
|
|
41
|
+
params.programEMS5 = false;
|
|
42
|
+
}
|
|
43
|
+
if (!params.programStyle) {
|
|
44
|
+
params.programStyle = 0;
|
|
45
|
+
}
|
|
46
|
+
if (!params.programVersion) {
|
|
47
|
+
params.programVersion = '';
|
|
48
|
+
}
|
|
49
|
+
if (!params.businessParams || params.businessParams.length === 0) {
|
|
50
|
+
params.businessParams = [{ chave: '', valor: '' }];
|
|
51
|
+
}
|
|
52
|
+
jobScheduleParams = {};
|
|
53
|
+
jobScheduleParams.status = 'active';
|
|
54
|
+
jobScheduleParams.processID = params.programName;
|
|
55
|
+
jobScheduleParams.firstExecution = `${date.getFullYear()}-${(date.getMonth() + 1)}-${date.getDate()}T${this.addZero(date.getHours())}:${this.addZero(date.getMinutes())}:00.000Z`;
|
|
56
|
+
jobScheduleParams.recurrent = false;
|
|
57
|
+
jobScheduleParams.executionParameter = {
|
|
58
|
+
parametros: [
|
|
59
|
+
{ chave: 'rpwServer', valor: params.executionServer },
|
|
60
|
+
{ chave: 'RPW_PROGRAM', valor: params.externalName },
|
|
61
|
+
{ chave: 'RPW_PRG_EMS5', valor: params.programEMS5 ? 'yes' : 'no' },
|
|
62
|
+
{ chave: 'RPW_PRG_ESTILO', valor: params.programStyle },
|
|
63
|
+
{ chave: 'RPW_PRG_VERS', valor: params.programVersion },
|
|
64
|
+
{ parametros_negocio: params.businessParams }
|
|
65
|
+
]
|
|
66
|
+
};
|
|
67
|
+
if (params.paramDigitDef && params.paramDigitDef.length > 0) {
|
|
68
|
+
jobScheduleParams.executionParameter.parametros.push({
|
|
69
|
+
param_digita_def: params.paramDigitDef
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (params.paramDigitData && params.paramDigitData.length > 0) {
|
|
73
|
+
jobScheduleParams.executionParameter.parametros.push({
|
|
74
|
+
param_digita_dados: params.paramDigitData
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (params.paramSelections && params.paramSelections.length > 0) {
|
|
78
|
+
jobScheduleParams.executionParameter.parametros.push({
|
|
79
|
+
selecoes: params.paramSelections
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
if (loading) {
|
|
83
|
+
return this.http.post(`${this.urlJobScheduler}`, jobScheduleParams, this.headers);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
return this.http.post(`${this.urlJobScheduler}`, jobScheduleParams);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getExecutionByJobScheduleID(jobScheduleID, loading = false) {
|
|
90
|
+
const url = `${this.urlJobExecution}?jobScheduleID=${jobScheduleID}`;
|
|
91
|
+
return this.getExecution(url, loading).pipe(map((response) => this.transformExecution('jobScheduleID', response)));
|
|
92
|
+
}
|
|
93
|
+
getExecutionByExecutionID(executionID, loading = false) {
|
|
94
|
+
const url = `${this.urlJobExecution}/${executionID}`;
|
|
95
|
+
return this.getExecution(url, loading).pipe(map((response) => this.transformExecution('executionID', response)));
|
|
96
|
+
}
|
|
97
|
+
getExecution(url, loading) {
|
|
98
|
+
if (loading) {
|
|
99
|
+
return this.http.get(url, this.headers);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return this.http.get(url);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
transformExecution(type, response) {
|
|
106
|
+
if (!response || !response.items || response.items.length === 0) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
response = response.items[0];
|
|
110
|
+
const execStatus = new ExecutionStatus();
|
|
111
|
+
execStatus.jobScheduleID = response.jobScheduleID;
|
|
112
|
+
execStatus.executionID = response.executionID;
|
|
113
|
+
execStatus.startedDate = response.startedDate;
|
|
114
|
+
execStatus.error = response.error;
|
|
115
|
+
execStatus.status = response.status;
|
|
116
|
+
return execStatus;
|
|
117
|
+
}
|
|
118
|
+
followUpExcByJobScheduleID(jobScheduleID, intervalNum, fncCallBack, loading = false) {
|
|
119
|
+
this.followUpExecution('jobScheduleID', jobScheduleID, intervalNum, fncCallBack, loading);
|
|
120
|
+
}
|
|
121
|
+
followUpExcByExecutionID(executionID, intervalNum, fncCallBack, loading = false) {
|
|
122
|
+
this.followUpExecution('executionID', executionID, intervalNum, fncCallBack, loading);
|
|
123
|
+
}
|
|
124
|
+
followUpExecution(type, execID, intervalNum, fncCallBack, loading) {
|
|
125
|
+
this.jobExecutionSubscription$ = null;
|
|
126
|
+
const intervalID = setInterval(() => {
|
|
127
|
+
const execStatus = new ExecutionStatus();
|
|
128
|
+
execStatus.jobScheduleID = (type === 'jobScheduleID') ? execID : '';
|
|
129
|
+
execStatus.executionID = (type === 'executionID') ? execID : '';
|
|
130
|
+
execStatus.startedDate = null;
|
|
131
|
+
execStatus.error = '';
|
|
132
|
+
execStatus.status = 'PENDING'; // PENDING, RUNNING, SUCCESS, FAILURE
|
|
133
|
+
if (this.jobExecutionSubscription$) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (type === 'jobScheduleID') {
|
|
137
|
+
this.jobExecutionSubscription$ = this.getExecutionByJobScheduleID(execID, loading)
|
|
138
|
+
.subscribe((response) => {
|
|
139
|
+
this.followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack);
|
|
140
|
+
}, (error) => {
|
|
141
|
+
this.followUpExecReturnError(error, execStatus, intervalID, fncCallBack);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (type === 'executionID') {
|
|
145
|
+
this.jobExecutionSubscription$ = this.getExecutionByExecutionID(execID, loading)
|
|
146
|
+
.subscribe((response) => {
|
|
147
|
+
this.followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack);
|
|
148
|
+
}, (error) => {
|
|
149
|
+
this.followUpExecReturnError(error, execStatus, intervalID, fncCallBack);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}, intervalNum);
|
|
153
|
+
}
|
|
154
|
+
followUpExecReturnOk(execID, execStatus, response, intervalID, fncCallBack) {
|
|
155
|
+
if (response) {
|
|
156
|
+
execStatus = response;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
execStatus.error = `Agendamento não encontrado com ID: ${execID}`;
|
|
160
|
+
execStatus.status = 'FAILURE';
|
|
161
|
+
}
|
|
162
|
+
if (!fncCallBack(execStatus) ||
|
|
163
|
+
execStatus.status === 'SUCCESS' ||
|
|
164
|
+
execStatus.status === 'FAILURE') {
|
|
165
|
+
clearInterval(intervalID);
|
|
166
|
+
}
|
|
167
|
+
this.jobExecutionSubscription$ = null;
|
|
168
|
+
}
|
|
169
|
+
followUpExecReturnError(error, execStatus, intervalID, fncCallBack) {
|
|
170
|
+
let erroDesc = '';
|
|
171
|
+
if (error instanceof HttpErrorResponse) {
|
|
172
|
+
erroDesc = error.message;
|
|
173
|
+
if (error.error) {
|
|
174
|
+
erroDesc = '';
|
|
175
|
+
if (error.error.code) {
|
|
176
|
+
erroDesc = error.error.code;
|
|
177
|
+
}
|
|
178
|
+
if (error.error.message) {
|
|
179
|
+
erroDesc = `${erroDesc} - ${error.error.message}`;
|
|
180
|
+
}
|
|
181
|
+
if (error.error.detailedMessage) {
|
|
182
|
+
erroDesc = `${erroDesc} - ${error.error.detailedMessage}`;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
erroDesc = error;
|
|
188
|
+
}
|
|
189
|
+
execStatus.error = erroDesc;
|
|
190
|
+
execStatus.status = 'FAILURE';
|
|
191
|
+
fncCallBack(execStatus);
|
|
192
|
+
clearInterval(intervalID);
|
|
193
|
+
this.jobExecutionSubscription$ = null;
|
|
194
|
+
}
|
|
195
|
+
addZero(num) {
|
|
196
|
+
let str = `${num}`;
|
|
197
|
+
if (num < 10) {
|
|
198
|
+
str = `0${num}`;
|
|
199
|
+
}
|
|
200
|
+
return str;
|
|
201
|
+
}
|
|
202
|
+
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TotvsScheduleExecutionService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
203
|
+
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TotvsScheduleExecutionService }); }
|
|
204
|
+
}
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: TotvsScheduleExecutionService, decorators: [{
|
|
206
|
+
type: Injectable
|
|
207
|
+
}], ctorParameters: () => [{ type: i1.HttpClient }] });
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kdHMtYmFja29mZmljZS11dGlsL3NyYy9saWIvY29tcG9uZW50cy90b3R2cy1zY2hlZHVsZS1leGVjdXRpb24vdG90dnMtc2NoZWR1bGUtZXhlY3V0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWMsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckMsT0FBTyxFQUFFLGVBQWUsRUFBMEMsTUFBTSxrQ0FBa0MsQ0FBQzs7O0FBRzNHLE1BQU0sT0FBTyw2QkFBNkI7SUFhdEMsWUFBbUIsSUFBZ0I7UUFBaEIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQVgzQixZQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO1FBRXRELG1CQUFjLEdBQUcsMkRBQTJELENBQUM7UUFDN0Usb0JBQWUsR0FBRywyREFBMkQsQ0FBQztRQUM5RSxvQkFBZSxHQUFHLDJEQUEyRCxDQUFDO0lBTy9DLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsTUFBbUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUV0QyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekQsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpELElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENB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LENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQztJQUMxQyxDQUFDO0lBRU8sT0FBTyxDQUFDLEdBQVc7UUFDdkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQUMsQ0FBQztRQUNsQyxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7aUlBaE9RLDZCQUE2QjtxSUFBN0IsNkJBQTZCOzsyRkFBN0IsNkJBQTZCO2tCQUR6QyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUG9Mb29rdXBGaWx0ZXJlZEl0ZW1zUGFyYW1zIH0gZnJvbSAnQHBvLXVpL25nLWNvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBFeGVjdXRpb25TdGF0dXMsIElFeGVjdXRpb25QYXJhbWV0ZXJzLCBJRXhlY3V0aW9uU3RhdHVzIH0gZnJvbSAnLi90b3R2cy1zY2hlZHVsZS1leGVjdXRpb24ubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgVG90dnNTY2hlZHVsZUV4ZWN1dGlvblNlcnZpY2Uge1xyXG5cclxuICAgIHByaXZhdGUgaGVhZGVycyA9IHsgaGVhZGVyczogeyAnWC1QTy1TY3JlZW4tTG9jayc6ICd0cnVlJyB9IH07XHJcblxyXG4gICAgcHJpdmF0ZSB1cmxDYWRTZXJ2aWRvciA9ICcvZHRzL2RhdGFzdWwtcmVzdC9yZXNvdXJjZXMvcHJnL2J0Yi92MS9zZXJ2aWRvcmVzRXhlY3VjYW8nO1xyXG4gICAgcHJpdmF0ZSB1cmxKb2JTY2hlZHVsZXIgPSAnL2R0cy9kYXRhc3VsLXJlc3QvcmVzb3VyY2VzL3ByZy9mcmFtZXdvcmsvdjEvam9iU2NoZWR1bGVyJztcclxuICAgIHByaXZhdGUgdXJsSm9iRXhlY3V0aW9uID0gJy9kdHMvZGF0YXN1bC1yZXN0L3Jlc291cmNlcy9wcmcvZnJhbWV3b3JrL3YxL2pvYkV4ZWN1dGlvbic7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSB1cmxDYWRTZXJ2aWRvciA9ICcvZ2VuZXJpY3Nab29tJztcclxuICAgIC8vIHByaXZhdGUgdXJsSm9iU2NoZWR1bGVyID0gJy9qb2JTY2hlZHVsZXInO1xyXG5cclxuICAgIHByaXZhdGUgam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJDogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50KSB7IH1cclxuXHJcbiAgICBnZXRGaWx0ZXJlZEl0ZW1zKHBhcmFtczogUG9Mb29rdXBGaWx0ZXJlZEl0ZW1zUGFyYW1zKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBjb25zdCB1cmxQYXJhbXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xyXG5cclxuICAgICAgICB1cmxQYXJhbXMucHVzaChgcGFnZVNpemU9JHtwYXJhbXMucGFnZVNpemUudG9TdHJpbmcoKX1gKTtcclxuICAgICAgICB1cmxQYXJhbXMucHVzaChgcGFnZT0ke3BhcmFtcy5wYWdlLnRvU3RyaW5nKCl9YCk7XHJcblxyXG4gICAgICAgIGlmIChwYXJhbXMuZmlsdGVyICYmIHBhcmFtcy5maWx0ZXIubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB1cmxQYXJhbXMucHVzaChgcXVpY2tTZWFyY2g9JHtwYXJhbXMuZmlsdGVyfWApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy51cmxDYWRTZXJ2aWRvcn0/JHt1cmxQYXJhbXMuam9pbignJicpfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9iamVjdEJ5VmFsdWUoaWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihgJHt0aGlzLnVybENhZFNlcnZpZG9yfS8ke2lkfWAsIHRoaXMuaGVhZGVycyk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlRXhlY3V0aW9uKHBhcmFtZXRlcnM6IE9iamVjdCwgbG9hZGluZzogYm9vbGVhbik6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJhbWV0ZXJzKS5yZXBsYWNlKC9cXFxcXFxcXC9nLCAnKnwnKSk7XHJcblxyXG4gICAgICAgIGlmIChsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChgJHt0aGlzLnVybEpvYlNjaGVkdWxlcn1gLCBwYXJhbXMsIHRoaXMuaGVhZGVycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMudXJsSm9iU2NoZWR1bGVyfWAsIHBhcmFtcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUV4ZWN1dGlvbkZvck5vdyhleGVjdXRpb25QYXJhbXM6IElFeGVjdXRpb25QYXJhbWV0ZXJzLCBsb2FkaW5nOiBib29sZWFuKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgICBsZXQgam9iU2NoZWR1bGVQYXJhbXM6IGFueTtcclxuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShleGVjdXRpb25QYXJhbXMpLnJlcGxhY2UoL1xcXFxcXFxcL2csICcqfCcpKTtcclxuXHJcbiAgICAgICAgaWYgKCFwYXJhbXMucHJvZ3JhbUVNUzUpIHsgcGFyYW1zLnByb2dyYW1FTVM1ID0gZmFsc2U7IH1cclxuICAgICAgICBpZiAoIXBhcmFtcy5wcm9ncmFtU3R5bGUpIHsgcGFyYW1zLnByb2dyYW1TdHlsZSA9IDA7IH1cclxuICAgICAgICBpZiAoIXBhcmFtcy5wcm9ncmFtVmVyc2lvbikgeyBwYXJhbXMucHJvZ3JhbVZlcnNpb24gPSAnJzsgfVxyXG4gICAgICAgIGlmICghcGFyYW1zLmJ1c2luZXNzUGFyYW1zIHx8IHBhcmFtcy5idXNpbmVzc1BhcmFtcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgcGFyYW1zLmJ1c2luZXNzUGFyYW1zID0gW3sgY2hhdmU6ICcnLCB2YWxvcjogJycgfV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBqb2JTY2hlZHVsZVBhcmFtcyA9IHt9O1xyXG4gICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLnN0YXR1cyA9ICdhY3RpdmUnO1xyXG4gICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLnByb2Nlc3NJRCA9IHBhcmFtcy5wcm9ncmFtTmFtZTtcclxuICAgICAgICBqb2JTY2hlZHVsZVBhcmFtcy5maXJzdEV4ZWN1dGlvbiA9IGAke2RhdGUuZ2V0RnVsbFllYXIoKX0tJHsoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7ZGF0ZS5nZXREYXRlKCl9VCR7dGhpcy5hZGRaZXJvKGRhdGUuZ2V0SG91cnMoKSl9OiR7dGhpcy5hZGRaZXJvKGRhdGUuZ2V0TWludXRlcygpKX06MDAuMDAwWmA7XHJcbiAgICAgICAgam9iU2NoZWR1bGVQYXJhbXMucmVjdXJyZW50ID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLmV4ZWN1dGlvblBhcmFtZXRlciA9IHtcclxuICAgICAgICAgICAgcGFyYW1ldHJvczogW1xyXG4gICAgICAgICAgICAgICAgeyBjaGF2ZTogJ3Jwd1NlcnZlcicsIHZhbG9yOiBwYXJhbXMuZXhlY3V0aW9uU2VydmVyIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNoYXZlOiAnUlBXX1BST0dSQU0nLCB2YWxvcjogcGFyYW1zLmV4dGVybmFsTmFtZSB9LFxyXG4gICAgICAgICAgICAgICAgeyBjaGF2ZTogJ1JQV19QUkdfRU1TNScsIHZhbG9yOiBwYXJhbXMucHJvZ3JhbUVNUzUgPyAneWVzJyA6ICdubycgfSxcclxuICAgICAgICAgICAgICAgIHsgY2hhdmU6ICdSUFdfUFJHX0VTVElMTycsIHZhbG9yOiBwYXJhbXMucHJvZ3JhbVN0eWxlIH0sXHJcbiAgICAgICAgICAgICAgICB7IGNoYXZlOiAnUlBXX1BSR19WRVJTJywgdmFsb3I6IHBhcmFtcy5wcm9ncmFtVmVyc2lvbiB9LFxyXG4gICAgICAgICAgICAgICAgeyBwYXJhbWV0cm9zX25lZ29jaW86IHBhcmFtcy5idXNpbmVzc1BhcmFtcyB9XHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAocGFyYW1zLnBhcmFtRGlnaXREZWYgJiYgcGFyYW1zLnBhcmFtRGlnaXREZWYubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBqb2JTY2hlZHVsZVBhcmFtcy5leGVjdXRpb25QYXJhbWV0ZXIucGFyYW1ldHJvcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhcmFtX2RpZ2l0YV9kZWY6IHBhcmFtcy5wYXJhbURpZ2l0RGVmXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmFtcy5wYXJhbURpZ2l0RGF0YSAmJiBwYXJhbXMucGFyYW1EaWdpdERhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBqb2JTY2hlZHVsZVBhcmFtcy5leGVjdXRpb25QYXJhbWV0ZXIucGFyYW1ldHJvcy5wdXNoKHtcclxuICAgICAgICAgICAgICAgIHBhcmFtX2RpZ2l0YV9kYWRvczogcGFyYW1zLnBhcmFtRGlnaXREYXRhXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhcmFtcy5wYXJhbVNlbGVjdGlvbnMgJiYgcGFyYW1zLnBhcmFtU2VsZWN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGpvYlNjaGVkdWxlUGFyYW1zLmV4ZWN1dGlvblBhcmFtZXRlci5wYXJhbWV0cm9zLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgc2VsZWNvZXM6IHBhcmFtcy5wYXJhbVNlbGVjdGlvbnNcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAobG9hZGluZykge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7dGhpcy51cmxKb2JTY2hlZHVsZXJ9YCwgam9iU2NoZWR1bGVQYXJhbXMsIHRoaXMuaGVhZGVycyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGAke3RoaXMudXJsSm9iU2NoZWR1bGVyfWAsIGpvYlNjaGVkdWxlUGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RXhlY3V0aW9uQnlKb2JTY2hlZHVsZUlEKGpvYlNjaGVkdWxlSUQ6IHN0cmluZywgbG9hZGluZyA9IGZhbHNlKTogT2JzZXJ2YWJsZTxJRXhlY3V0aW9uU3RhdHVzPiB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy51cmxKb2JFeGVjdXRpb259P2pvYlNjaGVkdWxlSUQ9JHtqb2JTY2hlZHVsZUlEfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhlY3V0aW9uKHVybCwgbG9hZGluZykucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gdGhpcy50cmFuc2Zvcm1FeGVjdXRpb24oJ2pvYlNjaGVkdWxlSUQnLCByZXNwb25zZSkpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRFeGVjdXRpb25CeUV4ZWN1dGlvbklEKGV4ZWN1dGlvbklEOiBzdHJpbmcsIGxvYWRpbmcgPSBmYWxzZSk6IE9ic2VydmFibGU8SUV4ZWN1dGlvblN0YXR1cz4ge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXJsSm9iRXhlY3V0aW9ufS8ke2V4ZWN1dGlvbklEfWA7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhlY3V0aW9uKHVybCwgbG9hZGluZykucGlwZShcclxuICAgICAgICAgICAgbWFwKChyZXNwb25zZSkgPT4gdGhpcy50cmFuc2Zvcm1FeGVjdXRpb24oJ2V4ZWN1dGlvbklEJywgcmVzcG9uc2UpKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRFeGVjdXRpb24odXJsOiBzdHJpbmcsIGxvYWRpbmc6IGJvb2xlYW4pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIGlmIChsb2FkaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCwgdGhpcy5oZWFkZXJzKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh1cmwpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyYW5zZm9ybUV4ZWN1dGlvbih0eXBlOiBzdHJpbmcsIHJlc3BvbnNlOiBhbnkpOiBJRXhlY3V0aW9uU3RhdHVzIHtcclxuICAgICAgICBpZiAoIXJlc3BvbnNlIHx8ICFyZXNwb25zZS5pdGVtcyB8fCByZXNwb25zZS5pdGVtcy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5pdGVtc1swXTtcclxuXHJcbiAgICAgICAgY29uc3QgZXhlY1N0YXR1cyA9IG5ldyBFeGVjdXRpb25TdGF0dXMoKTtcclxuICAgICAgICBleGVjU3RhdHVzLmpvYlNjaGVkdWxlSUQgPSByZXNwb25zZS5qb2JTY2hlZHVsZUlEO1xyXG4gICAgICAgIGV4ZWNTdGF0dXMuZXhlY3V0aW9uSUQgPSByZXNwb25zZS5leGVjdXRpb25JRDtcclxuICAgICAgICBleGVjU3RhdHVzLnN0YXJ0ZWREYXRlID0gcmVzcG9uc2Uuc3RhcnRlZERhdGU7XHJcbiAgICAgICAgZXhlY1N0YXR1cy5lcnJvciA9IHJlc3BvbnNlLmVycm9yO1xyXG4gICAgICAgIGV4ZWNTdGF0dXMuc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xyXG5cclxuICAgICAgICByZXR1cm4gZXhlY1N0YXR1cztcclxuICAgIH1cclxuXHJcbiAgICBmb2xsb3dVcEV4Y0J5Sm9iU2NoZWR1bGVJRChqb2JTY2hlZHVsZUlEOiBzdHJpbmcsIGludGVydmFsTnVtOiBudW1iZXIsIGZuY0NhbGxCYWNrOiBGdW5jdGlvbiwgbG9hZGluZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWN1dGlvbignam9iU2NoZWR1bGVJRCcsIGpvYlNjaGVkdWxlSUQsIGludGVydmFsTnVtLCBmbmNDYWxsQmFjaywgbG9hZGluZyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9sbG93VXBFeGNCeUV4ZWN1dGlvbklEKGV4ZWN1dGlvbklEOiBzdHJpbmcsIGludGVydmFsTnVtOiBudW1iZXIsIGZuY0NhbGxCYWNrOiBGdW5jdGlvbiwgbG9hZGluZyA9IGZhbHNlKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWN1dGlvbignZXhlY3V0aW9uSUQnLCBleGVjdXRpb25JRCwgaW50ZXJ2YWxOdW0sIGZuY0NhbGxCYWNrLCBsb2FkaW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZvbGxvd1VwRXhlY3V0aW9uKHR5cGU6IHN0cmluZywgZXhlY0lEOiBzdHJpbmcsXHJcbiAgICAgICAgaW50ZXJ2YWxOdW06IG51bWJlciwgZm5jQ2FsbEJhY2s6IEZ1bmN0aW9uLCBsb2FkaW5nOiBib29sZWFuKTogdm9pZCB7XHJcblxyXG4gICAgICAgIHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCA9IG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV4ZWNTdGF0dXMgPSBuZXcgRXhlY3V0aW9uU3RhdHVzKCk7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuam9iU2NoZWR1bGVJRCA9ICh0eXBlID09PSAnam9iU2NoZWR1bGVJRCcpID8gZXhlY0lEIDogJyc7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuZXhlY3V0aW9uSUQgPSAodHlwZSA9PT0gJ2V4ZWN1dGlvbklEJykgPyBleGVjSUQgOiAnJztcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5zdGFydGVkRGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuZXJyb3IgPSAnJztcclxuICAgICAgICAgICAgZXhlY1N0YXR1cy5zdGF0dXMgPSAnUEVORElORyc7IC8vIFBFTkRJTkcsIFJVTk5JTkcsIFNVQ0NFU1MsIEZBSUxVUkVcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmpvYkV4ZWN1dGlvblN1YnNjcmlwdGlvbiQpIHsgcmV0dXJuOyB9XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2pvYlNjaGVkdWxlSUQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmpvYkV4ZWN1dGlvblN1YnNjcmlwdGlvbiQgPSB0aGlzLmdldEV4ZWN1dGlvbkJ5Sm9iU2NoZWR1bGVJRChleGVjSUQsIGxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IElFeGVjdXRpb25TdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWNSZXR1cm5PayhleGVjSUQsIGV4ZWNTdGF0dXMsIHJlc3BvbnNlLCBpbnRlcnZhbElELCBmbmNDYWxsQmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9sbG93VXBFeGVjUmV0dXJuRXJyb3IoZXJyb3IsIGV4ZWNTdGF0dXMsIGludGVydmFsSUQsIGZuY0NhbGxCYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdleGVjdXRpb25JRCcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCA9IHRoaXMuZ2V0RXhlY3V0aW9uQnlFeGVjdXRpb25JRChleGVjSUQsIGxvYWRpbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2U6IElFeGVjdXRpb25TdGF0dXMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2xsb3dVcEV4ZWNSZXR1cm5PayhleGVjSUQsIGV4ZWNTdGF0dXMsIHJlc3BvbnNlLCBpbnRlcnZhbElELCBmbmNDYWxsQmFjayk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9sbG93VXBFeGVjUmV0dXJuRXJyb3IoZXJyb3IsIGV4ZWNTdGF0dXMsIGludGVydmFsSUQsIGZuY0NhbGxCYWNrKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICB9LCBpbnRlcnZhbE51bSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2xsb3dVcEV4ZWNSZXR1cm5PayhleGVjSUQ6IHN0cmluZywgZXhlY1N0YXR1czogSUV4ZWN1dGlvblN0YXR1cywgcmVzcG9uc2U6IElFeGVjdXRpb25TdGF0dXMsXHJcbiAgICAgICAgaW50ZXJ2YWxJRDogYW55LCBmbmNDYWxsQmFjazogRnVuY3Rpb24pOiB2b2lkIHtcclxuXHJcbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMgPSByZXNwb25zZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBleGVjU3RhdHVzLmVycm9yID0gYEFnZW5kYW1lbnRvIG7Do28gZW5jb250cmFkbyBjb20gSUQ6ICR7ZXhlY0lEfWA7XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuc3RhdHVzID0gJ0ZBSUxVUkUnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFmbmNDYWxsQmFjayhleGVjU3RhdHVzKSB8fFxyXG4gICAgICAgICAgICBleGVjU3RhdHVzLnN0YXR1cyA9PT0gJ1NVQ0NFU1MnIHx8XHJcbiAgICAgICAgICAgIGV4ZWNTdGF0dXMuc3RhdHVzID09PSAnRkFJTFVSRScpIHtcclxuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuam9iRXhlY3V0aW9uU3Vic2NyaXB0aW9uJCA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBmb2xsb3dVcEV4ZWNSZXR1cm5FcnJvcihlcnJvcjogYW55LCBleGVjU3RhdHVzOiBJRXhlY3V0aW9uU3RhdHVzLFxyXG4gICAgICAgIGludGVydmFsSUQ6IGFueSwgZm5jQ2FsbEJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XHJcblxyXG4gICAgICAgIGxldCBlcnJvRGVzYyA9ICcnO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgICBlcnJvRGVzYyA9IGVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgZXJyb0Rlc2MgPSAnJztcclxuICAgICAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5jb2RlKSB7IGVycm9EZXNjID0gZXJyb3IuZXJyb3IuY29kZTsgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yLm1lc3NhZ2UpIHsgZXJyb0Rlc2MgPSBgJHtlcnJvRGVzY30gLSAke2Vycm9yLmVycm9yLm1lc3NhZ2V9YDsgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yLmRldGFpbGVkTWVzc2FnZSkgeyBlcnJvRGVzYyA9IGAke2Vycm9EZXNjfSAtICR7ZXJyb3IuZXJyb3IuZGV0YWlsZWRNZXNzYWdlfWA7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGVycm9EZXNjID0gZXJyb3I7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBleGVjU3RhdHVzLmVycm9yID0gZXJyb0Rlc2M7XHJcbiAgICAgICAgZXhlY1N0YXR1cy5zdGF0dXMgPSAnRkFJTFVSRSc7XHJcbiAgICAgICAgZm5jQ2FsbEJhY2soZXhlY1N0YXR1cyk7XHJcbiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElEKTtcclxuICAgICAgICB0aGlzLmpvYkV4ZWN1dGlvblN1YnNjcmlwdGlvbiQgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkWmVybyhudW06IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IHN0ciA9IGAke251bX1gO1xyXG4gICAgICAgIGlmIChudW0gPCAxMCkgeyBzdHIgPSBgMCR7bnVtfWA7IH1cclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|