bpm-core 0.0.25 → 0.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/app/app.component.mjs +12 -13
- package/esm2022/lib/components/app-component-sections/activities/activities.component.mjs +20 -34
- package/esm2022/lib/components/app-component-sections/approvals/approvals.component.mjs +26 -0
- package/esm2022/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.mjs +98 -0
- package/esm2022/lib/components/app-component-sections/form-section/form-section.component.mjs +4 -40
- package/esm2022/lib/components/app-component-sections/service-header/service-header.component.mjs +15 -13
- package/esm2022/lib/components/shared-components/action-buttons/action-buttons.component.mjs +95 -11
- package/esm2022/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.mjs +12 -17
- package/esm2022/lib/components/shared-components/form-field/control-value-accessor.directive.mjs +9 -11
- package/esm2022/lib/components/shared-components/form-field/date-picker/date-picker.component.mjs +3 -5
- package/esm2022/lib/components/shared-components/form-field/input/input.component.mjs +9 -42
- package/esm2022/lib/components/shared-components/form-field/validation-errors/validation-errors.component.mjs +42 -0
- package/esm2022/lib/constants/constants.mjs +3 -1
- package/esm2022/lib/services/core.service.ts.mjs +309 -301
- package/esm2022/lib/testComponent/general-approver-section/general-approver-section.component.mjs +72 -27
- package/esm2022/lib/testComponent/request-details-section/request-details-section.component.mjs +33 -11
- package/fesm2022/bpm-core.mjs +789 -719
- package/fesm2022/bpm-core.mjs.map +1 -1
- package/lib/app/app.component.d.ts +1 -2
- package/lib/components/app-component-sections/activities/activities.component.d.ts +5 -14
- package/lib/components/app-component-sections/approvals/approvals.component.d.ts +11 -0
- package/lib/components/app-component-sections/approvals-workflow/approvals-workflow.component.d.ts +20 -0
- package/lib/components/app-component-sections/form-section/form-section.component.d.ts +3 -4
- package/lib/components/app-component-sections/service-header/service-header.component.d.ts +4 -3
- package/lib/components/shared-components/action-buttons/action-buttons.component.d.ts +29 -6
- package/lib/components/shared-components/dialogs/submit-dialog/submit-dialog.component.d.ts +4 -4
- package/lib/components/shared-components/form-field/control-value-accessor.directive.d.ts +3 -2
- package/lib/components/shared-components/form-field/input/input.component.d.ts +1 -4
- package/lib/components/shared-components/form-field/validation-errors/validation-errors.component.d.ts +16 -0
- package/lib/constants/constants.d.ts +2 -0
- package/lib/services/core.service.ts.d.ts +35 -2
- package/lib/testComponent/general-approver-section/general-approver-section.component.d.ts +21 -13
- package/lib/testComponent/request-details-section/request-details-section.component.d.ts +14 -6
- package/package.json +1 -1
- package/src/lib/assets/scss/_upgrade.scss +3 -3
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { HttpHeaders } from "@angular/common/http";
|
|
2
2
|
import { Inject, Injectable } from "@angular/core";
|
|
3
|
-
import { Form, Header, Messages, MY_LIB_CONFIG_TOKEN, ProfileInfoDrop, Section, SectionHeader } from "../../public-api";
|
|
3
|
+
import { CommentsDrop, Form, Header, InboxItem, Messages, MY_LIB_CONFIG_TOKEN, ProfileInfoDrop, Section, SectionHeader } from "../../public-api";
|
|
4
4
|
import * as constants from '../constants';
|
|
5
|
-
import { catchError, throwError } from "rxjs";
|
|
5
|
+
import { catchError, from, throwError, switchMap } from "rxjs";
|
|
6
6
|
import { map } from "rxjs/operators";
|
|
7
|
+
import saveFormHooks from '../hooks/save-form';
|
|
8
|
+
import { of } from 'rxjs';
|
|
7
9
|
import * as i0 from "@angular/core";
|
|
8
10
|
import * as i1 from "@angular/common/http";
|
|
9
11
|
export class CoreService {
|
|
@@ -17,12 +19,18 @@ export class CoreService {
|
|
|
17
19
|
localUser;
|
|
18
20
|
loggedInUserData;
|
|
19
21
|
currentActor;
|
|
22
|
+
authorizedEmail;
|
|
23
|
+
requesterEmail;
|
|
24
|
+
currentSubmitter;
|
|
25
|
+
language;
|
|
26
|
+
activities = [];
|
|
27
|
+
approvals;
|
|
20
28
|
constructor(http, config) {
|
|
21
29
|
this.http = http;
|
|
22
30
|
this.config = config;
|
|
23
31
|
const language = window?.wmConfig?.language ? window.wmConfig.language : 'en';
|
|
24
32
|
this.apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
|
|
25
|
-
console.log('Config: ', this.config);
|
|
33
|
+
console.log('Config: ', this.config);
|
|
26
34
|
this.localUser = {
|
|
27
35
|
"formPrefix": "CEP",
|
|
28
36
|
"formId": "CEP5595432",
|
|
@@ -36,6 +44,7 @@ export class CoreService {
|
|
|
36
44
|
};
|
|
37
45
|
this.projectConfig = (this.config.production) ? window['wmConfig'] : btoa(JSON.stringify(this.localUser));
|
|
38
46
|
this.userData = JSON.parse(atob(this.projectConfig));
|
|
47
|
+
this.language = window?.wmConfig?.language ? window.wmConfig.language : "en";
|
|
39
48
|
}
|
|
40
49
|
getLoggedInUserData() {
|
|
41
50
|
let loggedInEmail = this.loggedInUserId();
|
|
@@ -46,8 +55,7 @@ export class CoreService {
|
|
|
46
55
|
}
|
|
47
56
|
loadForm() {
|
|
48
57
|
const authUrl = this.buildAuthUrl();
|
|
49
|
-
return this.http.get(authUrl, { observe: 'response' }).
|
|
50
|
-
.then((res) => {
|
|
58
|
+
return this.http.get(authUrl, { observe: 'response' }).pipe(map((res) => {
|
|
51
59
|
const tokenInformation = res.body;
|
|
52
60
|
this.authToken = tokenInformation.token;
|
|
53
61
|
this.getLoggedInUserData();
|
|
@@ -55,10 +63,9 @@ export class CoreService {
|
|
|
55
63
|
const body = this.buildBody();
|
|
56
64
|
const options = this.getRequestOptions();
|
|
57
65
|
return this.callPost(body, options);
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
});
|
|
66
|
+
}), switchMap(postObservable => postObservable), catchError((httpError) => {
|
|
67
|
+
return of(throwError(httpError));
|
|
68
|
+
}));
|
|
62
69
|
}
|
|
63
70
|
buildAuthUrl() {
|
|
64
71
|
const baseUrl = this.config.proxyServiceBaseUrl;
|
|
@@ -86,10 +93,10 @@ export class CoreService {
|
|
|
86
93
|
}
|
|
87
94
|
employeeProfile(employeeEmail) {
|
|
88
95
|
let body = {
|
|
89
|
-
method:
|
|
90
|
-
formName:
|
|
91
|
-
destination:
|
|
92
|
-
serviceName:
|
|
96
|
+
method: constants.HTTP_METHOD_GET,
|
|
97
|
+
formName: this.config.formName,
|
|
98
|
+
destination: constants.TARGET_SERVER_DP,
|
|
99
|
+
serviceName: constants.SERVICE_NAME_DP_SEARCH_EMPLOYEE,
|
|
93
100
|
parameters: {
|
|
94
101
|
q: employeeEmail
|
|
95
102
|
}
|
|
@@ -115,333 +122,244 @@ export class CoreService {
|
|
|
115
122
|
observe: 'body'
|
|
116
123
|
};
|
|
117
124
|
}
|
|
125
|
+
getDraftId(val) {
|
|
126
|
+
return val.toUpperCase().startsWith('DRAFT');
|
|
127
|
+
}
|
|
128
|
+
submitForm(...args) {
|
|
129
|
+
const [section, action] = args;
|
|
130
|
+
const method = this.getHttpMethod();
|
|
131
|
+
let sectionId = this.beforeTranspileSectionWrapper(section).id;
|
|
132
|
+
let serviceName = this.getServiceName(action);
|
|
133
|
+
let formName = this.getFormName(action);
|
|
134
|
+
let body = this.getBodyObject(method, serviceName, action, formName, this.populatedPayload(sectionId, section), this.config.formId);
|
|
135
|
+
const options = this.getRequestOptions();
|
|
136
|
+
return this.submit(body, options);
|
|
137
|
+
}
|
|
138
|
+
getHttpMethod() {
|
|
139
|
+
return (this.config.formId && !this.getDraftId(this.config.formId)) ? constants.HTTP_METHOD_PUT : constants.HTTP_METHOD_POST;
|
|
140
|
+
}
|
|
141
|
+
beforeTranspileSectionWrapper(section) {
|
|
142
|
+
return saveFormHooks.beforeTranspileSection ? saveFormHooks.beforeTranspileSection(section) : section;
|
|
143
|
+
}
|
|
144
|
+
getServiceName(action) {
|
|
145
|
+
if (action === constants.WM_ACTION_SAVE_CHANGES) {
|
|
146
|
+
return constants.SERVICE_NAME_WM_DRAFT_FORM;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
return constants.SERVICE_NAME_WM_FORM;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
getFormName(action) {
|
|
153
|
+
if (action === constants.WM_ACTION_SAVE_CHANGES) {
|
|
154
|
+
return 'common';
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
return this.config.formName;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
populatedPayload(sectionId, section) {
|
|
161
|
+
let payload;
|
|
162
|
+
if (sectionId === constants.SECTION_ID_REQUEST_DETAILS) {
|
|
163
|
+
payload = { request: { details: section.body.details } };
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
payload = { workflowSteps: {} };
|
|
167
|
+
payload.workflowSteps.details = section.body.details;
|
|
168
|
+
payload.workflowSteps.actor = this.currentSubmitter.actor;
|
|
169
|
+
payload.workflowSteps.actor.email = this.currentActor;
|
|
170
|
+
payload.workflowSteps.status = constants.SECTION_STATUS_PENDING;
|
|
171
|
+
}
|
|
172
|
+
return payload;
|
|
173
|
+
}
|
|
174
|
+
getBodyObject(method, serviceName, action, formName, payload, formId) {
|
|
175
|
+
let body = {
|
|
176
|
+
method: method,
|
|
177
|
+
destination: constants.TARGET_SERVER_WM,
|
|
178
|
+
serviceName: serviceName,
|
|
179
|
+
parameters: {
|
|
180
|
+
action: action
|
|
181
|
+
},
|
|
182
|
+
formName: formName,
|
|
183
|
+
body: payload,
|
|
184
|
+
formId: formId,
|
|
185
|
+
queryParameters: {},
|
|
186
|
+
payload
|
|
187
|
+
};
|
|
188
|
+
if (this.config.formId) {
|
|
189
|
+
body.formId = this.config.formId;
|
|
190
|
+
}
|
|
191
|
+
if (!this.authorizedEmail || !this.authorizedEmail.length || this.authorizedEmail === this.requesterEmail) {
|
|
192
|
+
delete body.queryParameters;
|
|
193
|
+
}
|
|
194
|
+
if (saveFormHooks.beforeSendPayload) {
|
|
195
|
+
body.payload = saveFormHooks.beforeSendPayload(body.payload);
|
|
196
|
+
}
|
|
197
|
+
return body;
|
|
198
|
+
}
|
|
118
199
|
callPost(body, options) {
|
|
119
200
|
const language = window?.wmConfig?.language ? window.wmConfig.language : "en";
|
|
120
201
|
let apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
|
|
121
202
|
return this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).toPromise()
|
|
122
203
|
.then((responseObject) => {
|
|
123
|
-
// let payload = responseObject.body;
|
|
124
204
|
return this.successWm(responseObject);
|
|
125
205
|
}).catch((httpError) => {
|
|
126
206
|
return throwError(httpError);
|
|
127
207
|
});
|
|
128
208
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
constants.NO_VALUE,
|
|
138
|
-
constants.NO_VALUE,
|
|
139
|
-
constants.NO_VALUE,
|
|
140
|
-
constants.NO_VALUE
|
|
141
|
-
);
|
|
142
|
-
// keep emails on-track
|
|
143
|
-
let payloadFormDetails = payload.data.form;
|
|
144
|
-
let isReadOnly = (payloadFormDetails.readOnly.toUpperCase() === constants.TRUE_STRING ? constants.TRUE_BOOL : (payloadFormDetails.readOnly.toUpperCase() === constants.FALSE_STRING ? constants.FALSE_BOOL : constants.NO_VALUE))
|
|
145
|
-
result.header = new Header(
|
|
146
|
-
payload.data?.['requester'].fullName,
|
|
147
|
-
constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + payload.data.requester.employeeEmail,
|
|
148
|
-
(payloadFormDetails.formId ? payloadFormDetails.formId : constants.DONT_SHOW),
|
|
149
|
-
(payloadFormDetails.creationDate ? payloadFormDetails.creationDate : constants.DONT_SHOW),
|
|
150
|
-
payloadFormDetails.formStatus,
|
|
151
|
-
payloadFormDetails.details
|
|
152
|
-
);
|
|
153
|
-
// this.isReadOnly = payloadFormDetails.readOnly
|
|
154
|
-
/!* Generate Profile Information Object *!/
|
|
155
|
-
let payloadProfileInfo = payload.data?.['requester'];
|
|
156
|
-
result.profileInfoDrop = new ProfileInfoDrop(
|
|
157
|
-
(payloadProfileInfo.onBehalfAuthorized ? JSON.parse(payloadProfileInfo.onBehalfAuthorized) : null),
|
|
158
|
-
payloadProfileInfo?.['employeeId'],
|
|
159
|
-
payloadProfileInfo.employeeEmail,
|
|
160
|
-
payloadProfileInfo.fullName,
|
|
161
|
-
payloadProfileInfo.generalDepartmentName,
|
|
162
|
-
payloadProfileInfo.jobPosition,
|
|
163
|
-
payloadProfileInfo?.['sectorName'],
|
|
164
|
-
payloadProfileInfo.departmentName,
|
|
165
|
-
payloadProfileInfo.generalDepartmentCode,
|
|
166
|
-
payloadProfileInfo?.['humanResourceLocation'],
|
|
167
|
-
payloadProfileInfo.nationality,
|
|
168
|
-
payloadProfileInfo.businessPhone,
|
|
169
|
-
payloadProfileInfo?.['directManagerName']
|
|
170
|
-
);
|
|
171
|
-
/!* Generate Sections Object *!/
|
|
172
|
-
result.sections = [];
|
|
173
|
-
/!* Push as first object the section for the request details *!/
|
|
174
|
-
let requestDetailsHasComment = false;
|
|
175
|
-
if (payload.data.request.details.comment) {
|
|
176
|
-
requestDetailsHasComment = true;
|
|
177
|
-
}
|
|
178
|
-
result.sections.push(
|
|
179
|
-
new Section(
|
|
180
|
-
constants.SECTION_ID_REQUEST_DETAILS,
|
|
181
|
-
new SectionHeader(
|
|
182
|
-
constants.DONT_SHOW,
|
|
183
|
-
constants.DONT_SHOW,
|
|
184
|
-
constants.DONT_SHOW,
|
|
185
|
-
constants.DONT_SHOW,
|
|
186
|
-
constants.DONT_SHOW,
|
|
187
|
-
constants.DONT_SHOW,
|
|
188
|
-
constants.DONT_SHOW,
|
|
189
|
-
requestDetailsHasComment,
|
|
190
|
-
(payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
|
|
191
|
-
),
|
|
192
|
-
payload.data.request
|
|
193
|
-
)
|
|
194
|
-
);
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
let payloadWorkflowSteps = payload.data.workflowSteps;
|
|
198
|
-
if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
|
|
199
|
-
payloadWorkflowSteps.forEach((step, index) => {
|
|
200
|
-
let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
|
|
201
|
-
let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
|
|
202
|
-
this.currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null))
|
|
203
|
-
if (hasComments) {
|
|
204
|
-
result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
|
|
208
|
-
console.log("wasSendBack && REQUESTER")
|
|
209
|
-
result.sections = [new Section(
|
|
210
|
-
constants.SECTION_ID_REQUEST_DETAILS,
|
|
211
|
-
new SectionHeader(
|
|
212
|
-
constants.DONT_SHOW,
|
|
213
|
-
constants.DONT_SHOW,
|
|
214
|
-
constants.DONT_SHOW,
|
|
215
|
-
constants.DONT_SHOW,
|
|
216
|
-
constants.DONT_SHOW,
|
|
217
|
-
constants.DONT_SHOW,
|
|
218
|
-
constants.DONT_SHOW,
|
|
219
|
-
requestDetailsHasComment,
|
|
220
|
-
(payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
|
|
221
|
-
),
|
|
222
|
-
payload.data.request
|
|
223
|
-
)]
|
|
224
|
-
} else if (wasSendBack) {
|
|
225
|
-
console.log("Pop")
|
|
226
|
-
if (result.sections.length > 1) {
|
|
227
|
-
result.sections.pop();
|
|
209
|
+
submit(body, options) {
|
|
210
|
+
const language = window?.wmConfig?.language ? window.wmConfig.language : "en";
|
|
211
|
+
const apiUrl = this.config.proxyServiceBaseUrl + language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
|
|
212
|
+
// Convert the promise to an observable
|
|
213
|
+
return from(this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).toPromise().then((responseObject) => {
|
|
214
|
+
let formResponse = responseObject.data.form;
|
|
215
|
+
if (saveFormHooks.afterSendPayload) {
|
|
216
|
+
formResponse = saveFormHooks.afterSendPayload(formResponse);
|
|
228
217
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
/!* Create Lov Sections *!/
|
|
259
|
-
result.lovs = (payload.meta && payload.meta.lovs ? payload.meta.lovs : null);
|
|
260
|
-
|
|
261
|
-
if (payload.meta && payload.meta.messages) {
|
|
262
|
-
result.messages = new Messages(
|
|
263
|
-
{},
|
|
264
|
-
[],
|
|
265
|
-
[],
|
|
266
|
-
[]
|
|
267
|
-
);
|
|
268
|
-
payload.meta.messages.forEach((message: any) => {
|
|
269
|
-
result.messages[message.type].push(message.message);
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
// result.messages = (payload.meta && payload.meta.messages ? payload.meta.messages : null);
|
|
273
|
-
/!* Fix last section to be the RO/WM from the variable *!/
|
|
274
|
-
result.sections[result.sections.length - 1].header.readOnly = isReadOnly;
|
|
275
|
-
return result;
|
|
276
|
-
}*/
|
|
218
|
+
let result = {
|
|
219
|
+
id: null,
|
|
220
|
+
status: null,
|
|
221
|
+
nextApprover: {
|
|
222
|
+
name: null,
|
|
223
|
+
email: null,
|
|
224
|
+
role: null
|
|
225
|
+
},
|
|
226
|
+
creationDate: null
|
|
227
|
+
};
|
|
228
|
+
result.id = formResponse.formId;
|
|
229
|
+
result.status = formResponse['formStatus'];
|
|
230
|
+
if (formResponse.currentActor) {
|
|
231
|
+
result.nextApprover = {
|
|
232
|
+
name: formResponse.currentActor.name,
|
|
233
|
+
email: formResponse.currentActor.email,
|
|
234
|
+
role: formResponse['formStep']
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
result.creationDate = formResponse.creationDate;
|
|
238
|
+
return result;
|
|
239
|
+
}, (httpError) => {
|
|
240
|
+
throw httpError;
|
|
241
|
+
}));
|
|
242
|
+
}
|
|
277
243
|
successWm(...args) {
|
|
278
244
|
let [payload] = args;
|
|
279
|
-
|
|
245
|
+
let wasSendBack = false;
|
|
280
246
|
/* Convert into Form Object */
|
|
281
247
|
let result = new Form(constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE, constants.NO_VALUE);
|
|
248
|
+
this.requesterEmail = payload.data['requester'].employeeEmail;
|
|
249
|
+
this.authorizedEmail = payload.data['requester'].authorizedEmail;
|
|
282
250
|
/* Generate Header Object */
|
|
283
251
|
let payloadFormDetails = payload.data.form;
|
|
284
252
|
let isReadOnly = (payloadFormDetails.readOnly.toUpperCase() === constants.TRUE_STRING ? constants.TRUE_BOOL : (payloadFormDetails.readOnly.toUpperCase() === constants.FALSE_STRING ? constants.FALSE_BOOL : constants.NO_VALUE));
|
|
285
253
|
result.header = new Header(payload.data['requester'].fullName, constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + payload.data['requester'].employeeEmail, (payloadFormDetails.formId ? payloadFormDetails.formId : constants.DONT_SHOW), (payloadFormDetails.creationDate ? payloadFormDetails.creationDate : constants.DONT_SHOW), payloadFormDetails['formStatus'], payloadFormDetails.details);
|
|
286
254
|
/* Generate Profile Information Object */
|
|
287
255
|
let payloadProfileInfo = payload.data['requester'];
|
|
288
|
-
result.profileInfoDrop = new ProfileInfoDrop((payloadProfileInfo
|
|
289
|
-
/* Generate Sections Object */
|
|
256
|
+
result.profileInfoDrop = new ProfileInfoDrop((payloadProfileInfo['onBehalfAuthorized'] ? JSON.parse(payloadProfileInfo['onBehalfAuthorized']) : null), payloadProfileInfo['employeeId'], payloadProfileInfo.employeeEmail, payloadProfileInfo.fullName, payloadProfileInfo.generalDepartmentName, payloadProfileInfo.jobPosition, payloadProfileInfo['sectorName'], payloadProfileInfo.departmentName, payloadProfileInfo.generalDepartmentCode, payloadProfileInfo['humanResourceLocation'], payloadProfileInfo.nationality, payloadProfileInfo.businessPhone, payloadProfileInfo['directManagerName'], payloadProfileInfo.seniorSectorName);
|
|
290
257
|
result.sections = [];
|
|
291
|
-
/* Push as first object the section for the request details */
|
|
292
258
|
let requestDetailsHasComment = false;
|
|
293
259
|
if (payload.data.request.details.comment) {
|
|
294
260
|
requestDetailsHasComment = true;
|
|
295
261
|
}
|
|
296
262
|
result.sections.push(new Section(constants.SECTION_ID_REQUEST_DETAILS, new SectionHeader(constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, requestDetailsHasComment, (payload.data['workflowSteps'] ? constants.READ_ONLY : isReadOnly)), payload.data.request));
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
item.comments,
|
|
308
|
-
item.modifiedDate,
|
|
309
|
-
item.attachments,
|
|
310
|
-
item.processedBy.job
|
|
311
|
-
));
|
|
263
|
+
if (result.header.formId) {
|
|
264
|
+
result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
|
|
265
|
+
this.loadHistory(result.header.formId).subscribe((response) => {
|
|
266
|
+
if (response) {
|
|
267
|
+
response.items.forEach((item) => {
|
|
268
|
+
if (item.sequenceNumber !== '0' && item.processedBy) {
|
|
269
|
+
const name = item.processedBy['firstName'] + ' ' + item.processedBy['secondMiddleName'] + ' ' + item.processedBy['familyName'];
|
|
270
|
+
result.commentsDrop.push(new CommentsDrop(constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.processedBy.email, name, item.comments, item['modifiedDate'], item.attachments, item.processedBy.job));
|
|
271
|
+
}
|
|
272
|
+
});
|
|
312
273
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}*/
|
|
317
|
-
/*if (result.header.formId && /^DYL/.test(result.header.formId)) {
|
|
318
|
-
this.state = constants.STATE_MACHINE_STATUS_IDLE;
|
|
319
|
-
result.confidentialComments = [];
|
|
320
|
-
this.dispatch('loadConfidentialComments', result.header.formId).then((responseObject: any) => {
|
|
321
|
-
if (responseObject && responseObject.items && responseObject.items.length > 0) {
|
|
322
|
-
responseObject.items.forEach((item: any) => {
|
|
323
|
-
result.confidentialComments.push(new CommentsDrop(
|
|
324
|
-
constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + item.email,
|
|
325
|
-
item.name,
|
|
326
|
-
item.comment,
|
|
327
|
-
item.modifiedDate,
|
|
328
|
-
item.attachment,
|
|
329
|
-
item.position
|
|
330
|
-
));
|
|
331
|
-
})
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
}*/
|
|
335
|
-
/*const inboxType = this.getInboxType(result);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
const inboxType = this.getInboxType(result);
|
|
336
277
|
if (result.header.formId && (!this.isOpenOnInbox())) {
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
item.feedback.canRequestFeedback,
|
|
345
|
-
item.feedback.hasFeedback,
|
|
346
|
-
item.feedback.isPending,
|
|
347
|
-
item.feedback.isRequested,
|
|
348
|
-
item.feedback.isResponded
|
|
349
|
-
);
|
|
350
|
-
}
|
|
351
|
-
});
|
|
352
|
-
}*/
|
|
278
|
+
this.getInboxItem(result.header.formId, inboxType).subscribe((response) => {
|
|
279
|
+
if (response) {
|
|
280
|
+
const item = response.item;
|
|
281
|
+
result.inboxItem = new InboxItem(item['flagging'].flagPriority, item['flagging']['isFlagged'], item.feedback['canRequestFeedback'], item.feedback['hasFeedback'], item.feedback['isPending'], item.feedback['isRequested'], item.feedback['isResponded']);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
353
285
|
let payloadWorkflowSteps = payload.data.workflowSteps;
|
|
354
286
|
if (payloadWorkflowSteps && payloadWorkflowSteps.constructor === Array && payloadWorkflowSteps.length > 0) {
|
|
355
287
|
payloadWorkflowSteps.forEach((step, index) => {
|
|
356
288
|
let currentIsRequesterSendBack = JSON.stringify(step.details) === JSON.stringify({});
|
|
357
289
|
let hasComments = (!currentIsRequesterSendBack && (step.details.comment || step.comment) ? constants.HAS_COMMENTS : constants.NO_COMMENTS);
|
|
358
290
|
let currentActor = (step.actor.email === step.actor.recipient.email ? step.actor.recipient : (step.actor.delegate ? step.actor.delegate : null));
|
|
359
|
-
/*if (hasComments) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
}
|
|
413
|
-
}*/
|
|
414
|
-
/* if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
|
|
415
|
-
console.log("wasSendBack && REQUESTER")
|
|
416
|
-
result.sections = [new Section(
|
|
417
|
-
constants.SECTION_ID_REQUEST_DETAILS,
|
|
418
|
-
new SectionHeader(
|
|
419
|
-
constants.DONT_SHOW,
|
|
420
|
-
constants.DONT_SHOW,
|
|
421
|
-
constants.DONT_SHOW,
|
|
422
|
-
constants.DONT_SHOW,
|
|
423
|
-
constants.DONT_SHOW,
|
|
424
|
-
constants.DONT_SHOW,
|
|
425
|
-
constants.DONT_SHOW,
|
|
426
|
-
requestDetailsHasComment,
|
|
427
|
-
(payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)
|
|
428
|
-
),
|
|
429
|
-
payload.data.request
|
|
430
|
-
)]
|
|
431
|
-
} else if (wasSendBack) {
|
|
432
|
-
console.log("Pop")
|
|
433
|
-
if (result.sections.length > 1) {
|
|
434
|
-
result.sections.pop();
|
|
291
|
+
/* if (hasComments) {
|
|
292
|
+
result.commentsDrop = (!result.commentsDrop ? [] : result.commentsDrop);
|
|
293
|
+
if (step.details.attachment && step.details.attachment.attachmentId && this.config.production) {
|
|
294
|
+
// this.state = constants.STATE_MACHINE_STATUS_IDLE;
|
|
295
|
+
/!* this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attachment.attachmentId).then((responseObject) => {
|
|
296
|
+
let fileInformation = responseObject.body;
|
|
297
|
+
if (currentActor) {
|
|
298
|
+
/!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
|
|
299
|
+
result.commentsDrop.push(new CommentsDrop(
|
|
300
|
+
constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
|
|
301
|
+
currentActor.name,
|
|
302
|
+
(step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
|
|
303
|
+
step.date,
|
|
304
|
+
fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
|
|
305
|
+
profile.job.name
|
|
306
|
+
))
|
|
307
|
+
})*!/
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
this.state = constants.STATE_MACHINE_STATUS_FETCHING;*!/
|
|
311
|
+
} else if (step.details.attachmentId) {
|
|
312
|
+
/!* this.state = constants.STATE_MACHINE_STATUS_IDLE;
|
|
313
|
+
this.dispatch(constants.STATE_MACHINE_ACTION_LOAD_FILE, step.details.attchmentId).then((responseObject) => {
|
|
314
|
+
let fileInformation = responseObject.body;
|
|
315
|
+
if (currentActor) {
|
|
316
|
+
/!*this.dispatch(constants.STATE_MACHINE_ACTION_EMPLOYEE_PROFILE, currentActor.email).then((profile) => {
|
|
317
|
+
result.commentsDrop.push(new CommentsDrop(
|
|
318
|
+
constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
|
|
319
|
+
currentActor.name,
|
|
320
|
+
(step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
|
|
321
|
+
step.date,
|
|
322
|
+
fileInformation.fileName + "|data:" + fileInformation.mimeType + ";base64," + fileInformation.fileContents,
|
|
323
|
+
profile.job.name
|
|
324
|
+
))
|
|
325
|
+
})*!/
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
this.state = constants.STATE_MACHINE_STATUS_FETCHING;*!/
|
|
329
|
+
} else {
|
|
330
|
+
if (currentActor) {
|
|
331
|
+
this.employeeProfile(currentActor.email).subscribe((profile: any) => {
|
|
332
|
+
if (profile) {
|
|
333
|
+
result.commentsDrop.push(new CommentsDrop(
|
|
334
|
+
constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + currentActor.email,
|
|
335
|
+
currentActor.name,
|
|
336
|
+
(step.details.comment ? step.details.comment : (step.comment ? step.comment : null)),
|
|
337
|
+
step.date,
|
|
338
|
+
null,
|
|
339
|
+
profile.job.name
|
|
340
|
+
))
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
}
|
|
435
344
|
}
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
345
|
+
}*/
|
|
346
|
+
if (wasSendBack && step.actor.recipient.role === 'REQUESTER') {
|
|
347
|
+
console.log("wasSendBack && REQUESTER");
|
|
348
|
+
result.sections = [new Section(constants.SECTION_ID_REQUEST_DETAILS, new SectionHeader(constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, constants.DONT_SHOW, requestDetailsHasComment, (payload.data.workflowSteps ? constants.READ_ONLY : isReadOnly)), payload.data.request)];
|
|
349
|
+
}
|
|
350
|
+
else if (wasSendBack) {
|
|
351
|
+
console.log("Pop");
|
|
352
|
+
if (result.sections.length > 1) {
|
|
353
|
+
result.sections.pop();
|
|
354
|
+
}
|
|
355
|
+
wasSendBack = false;
|
|
356
|
+
}
|
|
439
357
|
if (step.details.decision && step.details.decision.key === constants.FORM_STATUS_SEND_BACK) {
|
|
440
|
-
|
|
358
|
+
wasSendBack = true;
|
|
441
359
|
}
|
|
442
360
|
else if (JSON.stringify(step.details) !== JSON.stringify({})) {
|
|
443
361
|
result.sections.push(new Section(step.actor.recipient.role.toLowerCase() + constants.SECTION_ID_APPROVAL_PARTIAL_NAME, new SectionHeader((currentActor ? this.getShortName(currentActor.name) : "").toString(), step.date, this.getShortName(step.actor.recipient.name).toString(), constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.recipient.email, (step.actor.delegate?.name ? this.getShortName(step.actor.delegate.name) : "").toString(), (step.actor.delegate?.email ? constants.IGATE_STATIC_ASSET_PROFILE_PHOTO_URL + step.actor.delegate.email : ""), step.actor.status, hasComments, (index < payloadWorkflowSteps.length - 1 ? constants.READ_ONLY : isReadOnly)), { details: step.details, processingDate: step.date }));
|
|
444
|
-
|
|
362
|
+
this.currentSubmitter = { actor: step.actor, recipient: step.recipient, delegate: step.actor.delegate };
|
|
445
363
|
}
|
|
446
364
|
});
|
|
447
365
|
}
|
|
@@ -459,6 +377,80 @@ export class CoreService {
|
|
|
459
377
|
result.sections[result.sections.length - 1].header.readOnly = isReadOnly;
|
|
460
378
|
return result;
|
|
461
379
|
}
|
|
380
|
+
loadFile(...args) {
|
|
381
|
+
const [id] = args;
|
|
382
|
+
return this.http.get(this.config.proxyFullAddress + this.config.proxyServiceForms + this.config.formId + this.config.proxyServiceAttachment + id, { observe: 'response' }).toPromise();
|
|
383
|
+
}
|
|
384
|
+
dataURItoBlob(dataURI) {
|
|
385
|
+
const byteString = atob(dataURI);
|
|
386
|
+
const arrayBuffer = new ArrayBuffer(byteString.length);
|
|
387
|
+
const int8Array = new Uint8Array(arrayBuffer);
|
|
388
|
+
for (let i = 0; i < byteString.length; i++) {
|
|
389
|
+
int8Array[i] = byteString.charCodeAt(i);
|
|
390
|
+
}
|
|
391
|
+
return new Blob([arrayBuffer], { type: 'image/jpeg' });
|
|
392
|
+
}
|
|
393
|
+
loadHistory(...args) {
|
|
394
|
+
const [id] = args;
|
|
395
|
+
const body = {
|
|
396
|
+
method: constants.HTTP_METHOD_GET,
|
|
397
|
+
destination: constants.TARGET_SERVER_WM,
|
|
398
|
+
serviceName: constants.WORKFLOW_ITEMS,
|
|
399
|
+
formId: id ? id : this.config.formId,
|
|
400
|
+
formName: "bpm",
|
|
401
|
+
};
|
|
402
|
+
let options = this.getRequestOptions();
|
|
403
|
+
return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_LOAD_HISTORY, options);
|
|
404
|
+
}
|
|
405
|
+
getInboxItem(...args) {
|
|
406
|
+
const [id, inboxType] = args;
|
|
407
|
+
const body = {
|
|
408
|
+
formName: this.config.formName,
|
|
409
|
+
method: constants.HTTP_METHOD_GET,
|
|
410
|
+
destination: constants.TARGET_SERVER_DP,
|
|
411
|
+
serviceName: constants.SERVICE_NAME_DP_INBOX_ITEM,
|
|
412
|
+
urlParameters: {
|
|
413
|
+
inboxid: id,
|
|
414
|
+
inboxtype: inboxType
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
let options = this.getRequestOptions();
|
|
418
|
+
return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_GET_INBOX_ITEM, options);
|
|
419
|
+
}
|
|
420
|
+
prespectiveApprovers(details) {
|
|
421
|
+
if (!this.config.production) {
|
|
422
|
+
details = {};
|
|
423
|
+
}
|
|
424
|
+
let serviceName = "form/" + this.config.formName;
|
|
425
|
+
if (this.config.formId) {
|
|
426
|
+
serviceName = "form/" + this.config.formId;
|
|
427
|
+
}
|
|
428
|
+
let body = {
|
|
429
|
+
method: constants.HTTP_METHOD_POST,
|
|
430
|
+
destination: constants.TARGET_SERVER_WM,
|
|
431
|
+
serviceName: serviceName,
|
|
432
|
+
formName: constants.APPROVERS,
|
|
433
|
+
body: {
|
|
434
|
+
"request": {
|
|
435
|
+
"details": details
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
let options = this.getRequestOptions();
|
|
440
|
+
return this.generalCallApi(body, constants.STATE_MACHINE_ACTION_SUCCESS_RESPONSE, options);
|
|
441
|
+
}
|
|
442
|
+
generalCallApi(body, type, options) {
|
|
443
|
+
let apiUrl = this.config.proxyServiceBaseUrl + this.language + this.config.proxyFullAddress + this.config.proxyServiceExecute;
|
|
444
|
+
return this.http.post(apiUrl, encodeURIComponent(JSON.stringify(body)), options).pipe(map((responseObject) => {
|
|
445
|
+
return responseObject;
|
|
446
|
+
/*switch (type) {
|
|
447
|
+
case constants.STATE_MACHINE_ACTION_LOAD_HISTORY:
|
|
448
|
+
return responseObject
|
|
449
|
+
}*/
|
|
450
|
+
}), catchError((httpError) => {
|
|
451
|
+
return throwError(httpError);
|
|
452
|
+
}));
|
|
453
|
+
}
|
|
462
454
|
loggedInUserId() {
|
|
463
455
|
return this.userData['loggedInUserEmail'];
|
|
464
456
|
}
|
|
@@ -481,6 +473,22 @@ export class CoreService {
|
|
|
481
473
|
return null;
|
|
482
474
|
}
|
|
483
475
|
}
|
|
476
|
+
isMobileApp() {
|
|
477
|
+
return window.wmConfig.isMobile;
|
|
478
|
+
}
|
|
479
|
+
getInboxType(result) {
|
|
480
|
+
let rtn = null;
|
|
481
|
+
if (this.loggedInUserId() === result.profileInfoDrop.employeeEmail) {
|
|
482
|
+
rtn = constants.INBOX_STATUS_SENT;
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
rtn = constants.INBOX_STATUS_PENDING;
|
|
486
|
+
}
|
|
487
|
+
return rtn;
|
|
488
|
+
}
|
|
489
|
+
isOpenOnInbox() {
|
|
490
|
+
return window.wmConfig.outlook;
|
|
491
|
+
}
|
|
484
492
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CoreService, deps: [{ token: i1.HttpClient }, { token: MY_LIB_CONFIG_TOKEN }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
485
493
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: CoreService, providedIn: "any" });
|
|
486
494
|
}
|
|
@@ -493,4 +501,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
|
|
|
493
501
|
type: Inject,
|
|
494
502
|
args: [MY_LIB_CONFIG_TOKEN]
|
|
495
503
|
}] }] });
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5zZXJ2aWNlLnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb3JlLnNlcnZpY2UudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3RILE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFBO0FBQ3pDLE9BQU8sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBS25DLE1BQU0sT0FBTyxXQUFXO0lBVUY7SUFDNkI7SUFWakQsTUFBTSxHQUFXLEVBQUUsQ0FBQTtJQUNYLFNBQVMsQ0FBUztJQUNsQixZQUFZLENBQVM7SUFDWixhQUFhLENBQVM7SUFDaEMsUUFBUSxDQUFTO0lBQ1AsU0FBUyxDQUFLO0lBQ3hCLGdCQUFnQixDQUFLO0lBQzVCLFlBQVksQ0FBUTtJQUVwQixZQUFvQixJQUFnQixFQUNhLE1BQW1CO1FBRGhELFNBQUksR0FBSixJQUFJLENBQVk7UUFDYSxXQUFNLEdBQU4sTUFBTSxDQUFhO1FBQ2xFLE1BQU0sUUFBUSxHQUFJLE1BQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQzFILE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDRCQUE0QjtRQUNsRSxJQUFJLENBQUMsU0FBUyxHQUFHO1lBQ2YsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLFlBQVk7WUFDdEIsVUFBVSxFQUFFLHFCQUFxQjtZQUNqQyxTQUFTLEVBQUUsMENBQTBDO1lBQ3JELFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLG1CQUFtQixFQUFFLHlCQUF5QjtTQUMvQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFFLE1BQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDbkgsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtRQUN6QyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQzlELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTthQUM3RCxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNqQixNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7WUFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLENBQUMsU0FBYyxFQUFFLEVBQUU7WUFDeEIsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sWUFBWTtRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ2hELE1BQU0sUUFBUSxHQUFJLE1BQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBRSxNQUFjLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2hHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDakQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQztRQUN2RCxPQUFPLEdBQUcsT0FBTyxHQUFHLFFBQVEsR0FBRyxXQUFXLEdBQUcsUUFBUSxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDdkYsQ0FBQztJQUVPLFNBQVM7UUFDZixNQUFNLFFBQVEsR0FBRztZQUNmLE1BQU0sRUFBRSxTQUFTLENBQUMsZUFBZTtZQUNqQyxXQUFXLEVBQUUsU0FBUyxDQUFDLGdCQUFnQjtZQUN2QyxXQUFXLEVBQUUsU0FBUyxDQUFDLG9CQUFvQjtZQUMzQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQzlCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUN6QixDQUFDO2FBQU0sQ0FBQztZQUNOLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxlQUFlLENBQUMsYUFBa0I7UUFDaEMsSUFBSSxJQUFJLEdBQUc7WUFDVCxNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxLQUFLO1lBQ2YsV0FBVyxFQUFFLElBQUk7WUFDakIsV0FBVyxFQUFFLHVCQUF1QjtZQUNwQyxVQUFVLEVBQUU7Z0JBQ1YsQ0FBQyxFQUFFLGFBQWE7YUFDakI7U0FDRixDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRTtZQUN2QyxPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUM7Z0JBQ3ZCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsY0FBYyxFQUFFLG1DQUFtQzthQUNwRCxDQUFDO1lBQ0YsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FBQyxDQUFDLElBQUksQ0FDTCxHQUFHLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUNwQixPQUFPLFFBQVEsQ0FBQTtRQUNqQixDQUFDLENBQUMsRUFDQSxVQUFVLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUN4QixPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUN4QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLGNBQWMsRUFBRSxTQUFTLENBQUMsd0JBQXdCO2FBQ25ELENBQUM7WUFDRixPQUFPLEVBQUUsTUFBTTtTQUNoQixDQUFBO0lBQ0gsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTztRQUM1QixNQUFNLFFBQVEsR0FBSSxNQUFjLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUUsTUFBYyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7UUFDekgsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRTthQUN6RixJQUFJLENBQ0gsQ0FBQyxjQUFtQixFQUFFLEVBQUU7WUFDdEIscUNBQXFDO1lBQ3JDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUN2QyxDQUFDLENBQ0YsQ0FBQyxLQUFLLENBQ0wsQ0FBQyxTQUFjLEVBQUUsRUFBRTtZQUNqQixPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUM5QixDQUFDLENBQ0YsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUpHO0lBRUgsU0FBUyxDQUFDLEdBQUcsSUFBSTtRQUNmLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckIsMkJBQTJCO1FBQzNCLDhCQUE4QjtRQUM5QixJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FDbkIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsRUFDbEIsU0FBUyxDQUFDLFFBQVEsQ0FDbkIsQ0FBQztRQUNGLDRCQUE0QjtRQUM1QixJQUFJLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzNDLElBQUksVUFBVSxHQUFHLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ2pPLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUNsQyxTQUFTLENBQUMsb0NBQW9DLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxhQUFhLEVBQ3hGLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFDN0UsQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUN6RixrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFDaEMsa0JBQWtCLENBQUMsT0FBTyxDQUMzQixDQUFDO1FBQ0YseUNBQXlDO1FBQ3pDLElBQUksa0JBQWtCLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRCxNQUFNLENBQUMsZUFBZSxHQUFHLElBQUksZUFBZSxDQUMxQyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUNsRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsRUFDaEMsa0JBQWtCLENBQUMsYUFBYSxFQUNoQyxrQkFBa0IsQ0FBQyxRQUFRLEVBQzNCLGtCQUFrQixDQUFDLHFCQUFxQixFQUN4QyxrQkFBa0IsQ0FBQyxXQUFXLEVBQzlCLGtCQUFrQixDQUFDLFVBQVUsRUFDN0Isa0JBQWtCLENBQUMsY0FBYyxFQUNqQyxrQkFBa0IsQ0FBQyxxQkFBcUIsRUFDeEMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsRUFDM0Msa0JBQWtCLENBQUMsV0FBVyxFQUM5QixrQkFBa0IsQ0FBQyxhQUFhLEVBQ2hDLGtCQUFrQixDQUFDLGlCQUFpQixFQUNwQyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDcEMsQ0FBQztRQUNGLDhCQUE4QjtRQUM5QixNQUFNLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNyQiw4REFBOEQ7UUFDOUQsSUFBSSx3QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDckMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FDbEIsSUFBSSxPQUFPLENBQ1QsU0FBUyxDQUFDLDBCQUEwQixFQUNwQyxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLHdCQUF3QixFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsRUFDbFEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQ3JCLENBQ0YsQ0FBQztRQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBbUJHO1FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBaUJHO1FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O1dBaUJHO1FBRUgsSUFBSSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0RCxJQUFJLG9CQUFvQixJQUFJLG9CQUFvQixDQUFDLFdBQVcsS0FBSyxLQUFLLElBQUksb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFHLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUMsMEJBQTBCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0ksSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtnQkFDaEo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQkFzREc7Z0JBRUo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzttQkF3Qkc7Z0JBR0YsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzNGLHNCQUFzQjtnQkFDeEIsQ0FBQztxQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDL0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2xCLElBQUksT0FBTyxDQUNULElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxTQUFTLENBQUMsZ0NBQWdDLEVBQ3BGLElBQUksYUFBYSxDQUNmLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQ3JFLElBQUksQ0FBQyxJQUFJLEVBQ1QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFDdkQsU0FBUyxDQUFDLG9DQUFvQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssRUFDM0UsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUN6RixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLG9DQUFvQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQzlHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqQixXQUFXLEVBQ1gsQ0FBQyxLQUFLLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQzdFLEVBQ0QsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBQyxDQUNuRCxDQUNGLENBQUM7b0JBQ0YseUdBQXlHO2dCQUMzRyxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QseUJBQXlCO1FBQ3pCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFN0UsSUFBSSxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FDNUIsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxDQUNILENBQUM7WUFDRixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELDRGQUE0RjtRQUM1Rix3REFBd0Q7UUFDeEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztRQUN6RSxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVk7UUFDOUIsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakMsSUFBSSxVQUFVLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQzVELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3pHLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQzt1R0FyaUJVLFdBQVcsNENBV0YsbUJBQW1COzJHQVg1QixXQUFXLGNBRlYsS0FBSzs7MkZBRU4sV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsS0FBSztpQkFDbEI7OzBCQVljLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgdHlwZSB7TXlMaWJDb25maWd9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3NoYXJlZC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtGb3JtLCBIZWFkZXIsIE1lc3NhZ2VzLCBNWV9MSUJfQ09ORklHX1RPS0VOLCBQcm9maWxlSW5mb0Ryb3AsIFNlY3Rpb24sIFNlY3Rpb25IZWFkZXJ9IGZyb20gXCIuLi8uLi9wdWJsaWMtYXBpXCI7XHJcbmltcG9ydCAqIGFzIGNvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXHJcbmltcG9ydCB7Y2F0Y2hFcnJvciwgdGhyb3dFcnJvcn0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHttYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46IFwiYW55XCJcclxufSlcclxuZXhwb3J0IGNsYXNzIENvcmVTZXJ2aWNlIHtcclxuICBhcGlVcmw6IHN0cmluZyA9ICcnXHJcbiAgcHJpdmF0ZSBhdXRoVG9rZW46IHN0cmluZztcclxuICBwcml2YXRlIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdENvbmZpZzogc3RyaW5nO1xyXG4gIHB1YmxpYyB1c2VyRGF0YTogc3RyaW5nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxVc2VyOiB7fTtcclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VyRGF0YToge307XHJcbiAgY3VycmVudEFjdG9yOiBzdHJpbmdcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTVlfTElCX0NPTkZJR19UT0tFTikgcHJpdmF0ZSBjb25maWc6IE15TGliQ29uZmlnKSB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogJ2VuJztcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQmFzZVVybCArIGxhbmd1YWdlICsgdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUV4ZWN1dGU7XHJcbiAgICBjb25zb2xlLmxvZygnQ29uZmlnOiAnLCB0aGlzLmNvbmZpZyk7IC8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHlcclxuICAgIHRoaXMubG9jYWxVc2VyID0ge1xyXG4gICAgICBcImZvcm1QcmVmaXhcIjogXCJDRVBcIixcclxuICAgICAgXCJmb3JtSWRcIjogXCJDRVA1NTk1NDMyXCIsXHJcbiAgICAgIFwiaW5ib3hVcmlcIjogXCJcXC9ncm91cFxcL2h1YlxcL2luYm94XCIsXHJcbiAgICAgIFwiYmFzZVVybFwiOiBcIlxcL2dyb3VwXFwvaS1nYXRlXFwvd20tYnBtXFwvZm9ybXNcXC8tXFwvcHJveHlcIixcclxuICAgICAgXCJzaG93UHJpbnRcIjogdHJ1ZSxcclxuICAgICAgXCJsYW5ndWFnZVwiOiBcImVuXCIsXHJcbiAgICAgIFwiaXNNb2JpbGVcIjogdHJ1ZSxcclxuICAgICAgXCJvdXRsb29rXCI6IGZhbHNlLFxyXG4gICAgICBcImxvZ2dlZEluVXNlckVtYWlsXCI6IFwiaWJyYWhpbW1hYS5jQHN0Yy5jb20uc2FcIlxyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9qZWN0Q29uZmlnID0gKHRoaXMuY29uZmlnLnByb2R1Y3Rpb24pID8gKHdpbmRvdyBhcyBhbnkpWyd3bUNvbmZpZyddIDogYnRvYShKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsVXNlcikpO1xyXG4gICAgdGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoYXRvYih0aGlzLnByb2plY3RDb25maWcpKTtcclxuICB9XHJcblxyXG4gIGdldExvZ2dlZEluVXNlckRhdGEoKSB7XHJcbiAgICBsZXQgbG9nZ2VkSW5FbWFpbCA9IHRoaXMubG9nZ2VkSW5Vc2VySWQoKVxyXG4gICAgdGhpcy5lbXBsb3llZVByb2ZpbGUobG9nZ2VkSW5FbWFpbCkuc3Vic2NyaWJlKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubG9nZ2VkSW5Vc2VyRGF0YSA9IHJlc3BvbnNlPy5bXCJVc2Vyc1wiXT8uWzBdXHJcbiAgICAgIGNvbnNvbGUubG9nKCdnZXRMb2dnZWRJblVzZXJEYXRhJywgcmVzcG9uc2UpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbG9hZEZvcm0oKSB7XHJcbiAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5idWlsZEF1dGhVcmwoKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGF1dGhVcmwsIHtvYnNlcnZlOiAncmVzcG9uc2UnfSkudG9Qcm9taXNlKClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdG9rZW5JbmZvcm1hdGlvbiA9IHJlcy5ib2R5O1xyXG4gICAgICAgIHRoaXMuYXV0aFRva2VuID0gdG9rZW5JbmZvcm1hdGlvbi50b2tlbjtcclxuICAgICAgICB0aGlzLmdldExvZ2dlZEluVXNlckRhdGEoKVxyXG4gICAgICAgIHRoaXMucmVmcmVzaFRva2VuID0gdG9rZW5JbmZvcm1hdGlvbi5yZWZyZXNoVG9rZW47XHJcbiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVpbGRCb2R5KCk7XHJcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5jYWxsUG9zdChib2R5LCBvcHRpb25zKTtcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGh0dHBFcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEF1dGhVcmwoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsO1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6ICdlbic7XHJcbiAgICBjb25zdCBmdWxsQWRkcmVzcyA9IHRoaXMuY29uZmlnLnByb3h5RnVsbEFkZHJlc3M7XHJcbiAgICBjb25zdCBhdXRoUGFydCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUF1dGhvcml6YXRpb247XHJcbiAgICByZXR1cm4gYCR7YmFzZVVybH0ke2xhbmd1YWdlfSR7ZnVsbEFkZHJlc3N9JHthdXRoUGFydH0/dHM9JHsobmV3IERhdGUoKSkudmFsdWVPZigpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQm9keSgpOiBvYmplY3Qge1xyXG4gICAgY29uc3QgYmFzZUJvZHkgPSB7XHJcbiAgICAgIG1ldGhvZDogY29uc3RhbnRzLkhUVFBfTUVUSE9EX0dFVCxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX1dNLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogY29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9XTV9GT1JNLFxyXG4gICAgICBmb3JtTmFtZTogdGhpcy5jb25maWcuZm9ybU5hbWUsXHJcbiAgICAgIGZvcm1JZDogXCJcIixcclxuICAgICAgcXVlcnlQYXJhbWV0ZXJzOiBudWxsXHJcbiAgICB9O1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgZGVsZXRlIGJhc2VCb2R5LmZvcm1JZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGJhc2VCb2R5LmZvcm1JZCA9IHRoaXMuY29uZmlnLmZvcm1JZDtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNlQm9keTtcclxuICB9XHJcblxyXG4gIGVtcGxveWVlUHJvZmlsZShlbXBsb3llZUVtYWlsOiBhbnkpIHtcclxuICAgIGxldCBib2R5ID0ge1xyXG4gICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgIGZvcm1OYW1lOiBcIkFBSVwiLFxyXG4gICAgICBkZXN0aW5hdGlvbjogXCJEUFwiLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogXCJpZ2F0ZS51c2Vycy5zZWFyY2gudjNcIixcclxuICAgICAgcGFyYW1ldGVyczoge1xyXG4gICAgICAgIHE6IGVtcGxveWVlRW1haWxcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdCh0aGlzLmFwaVVybCwgYm9keSwge1xyXG4gICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAgIGF1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4sXHJcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIlxyXG4gICAgICB9KSxcclxuICAgICAgb2JzZXJ2ZTogXCJib2R5XCJcclxuICAgIH0pLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZVxyXG4gICAgICB9KVxyXG4gICAgICAsIGNhdGNoRXJyb3IoKGVycjogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKVxyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFJlcXVlc3RPcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICBhdXRoVG9rZW46IHRoaXMuYXV0aFRva2VuLFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiBjb25zdGFudHMuSEVBREVSX0NPTlRFTlRfVFlQRV9GT1JNXHJcbiAgICAgIH0pLFxyXG4gICAgICBvYnNlcnZlOiAnYm9keSdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2FsbFBvc3QoYm9keSwgb3B0aW9ucykge1xyXG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAod2luZG93IGFzIGFueSk/LndtQ29uZmlnPy5sYW5ndWFnZSA/ICh3aW5kb3cgYXMgYW55KS53bUNvbmZpZy5sYW5ndWFnZSA6IFwiZW5cIjtcclxuICAgIGxldCBhcGlVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsICsgbGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnRvUHJvbWlzZSgpXHJcbiAgICAgIC50aGVuKFxyXG4gICAgICAgIChyZXNwb25zZU9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgICAvLyBsZXQgcGF5bG9hZCA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzV20ocmVzcG9uc2VPYmplY3QpXHJcbiAgICAgICAgfSxcclxuICAgICAgKS5jYXRjaChcclxuICAgICAgICAoaHR0cEVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGh0dHBFcnJvcilcclxuICAgICAgICB9XHJcbiAgICAgICk7XHJcbiAgfVxyXG5cclxuICAvKnN1Y2Nlc3NXbSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IFtwYXlsb2FkXSA9IGFyZ3M7XHJcbiAgICBsZXQgd2FzU2VuZEJhY2sgPSBmYWxzZTtcclxuICAgIC8hKiBDb252ZXJ0IGludG8gRm9ybSBPYmplY3QgKiEvXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIC8vIGtlZXAgZW1haWxzIG9uLXRyYWNrXHJcbiAgICBsZXQgcGF5bG9hZEZvcm1EZXRhaWxzID0gcGF5bG9hZC5kYXRhLmZvcm07XHJcbiAgICBsZXQgaXNSZWFkT25seSA9IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLlRSVUVfU1RSSU5HID8gY29uc3RhbnRzLlRSVUVfQk9PTCA6IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLkZBTFNFX1NUUklORyA/IGNvbnN0YW50cy5GQUxTRV9CT09MIDogY29uc3RhbnRzLk5PX1ZBTFVFKSlcclxuICAgIHJlc3VsdC5oZWFkZXIgPSBuZXcgSGVhZGVyKFxyXG4gICAgICBwYXlsb2FkLmRhdGE/LlsncmVxdWVzdGVyJ10uZnVsbE5hbWUsXHJcbiAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBwYXlsb2FkLmRhdGEucmVxdWVzdGVyLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkID8gcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA/IHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1TdGF0dXMsXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlscy5kZXRhaWxzXHJcbiAgICApO1xyXG4gICAgLy8gdGhpcy5pc1JlYWRPbmx5ID0gcGF5bG9hZEZvcm1EZXRhaWxzLnJlYWRPbmx5XHJcbiAgICAvISogR2VuZXJhdGUgUHJvZmlsZSBJbmZvcm1hdGlvbiBPYmplY3QgKiEvXHJcbiAgICBsZXQgcGF5bG9hZFByb2ZpbGVJbmZvID0gcGF5bG9hZC5kYXRhPy5bJ3JlcXVlc3RlciddO1xyXG4gICAgcmVzdWx0LnByb2ZpbGVJbmZvRHJvcCA9IG5ldyBQcm9maWxlSW5mb0Ryb3AoXHJcbiAgICAgIChwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkID8gSlNPTi5wYXJzZShwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkKSA6IG51bGwpLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8/LlsnZW1wbG95ZWVJZCddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZW1wbG95ZWVFbWFpbCxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmZ1bGxOYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uam9iUG9zaXRpb24sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mbz8uWydzZWN0b3JOYW1lJ10sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5kZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50Q29kZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvPy5bJ2h1bWFuUmVzb3VyY2VMb2NhdGlvbiddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8ubmF0aW9uYWxpdHksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5idXNpbmVzc1Bob25lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8/LlsnZGlyZWN0TWFuYWdlck5hbWUnXVxyXG4gICAgKTtcclxuICAgIC8hKiBHZW5lcmF0ZSBTZWN0aW9ucyBPYmplY3QgKiEvXHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIC8hKiBQdXNoIGFzIGZpcnN0IG9iamVjdCB0aGUgc2VjdGlvbiBmb3IgdGhlIHJlcXVlc3QgZGV0YWlscyAqIS9cclxuICAgIGxldCByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQgPSBmYWxzZTtcclxuICAgIGlmIChwYXlsb2FkLmRhdGEucmVxdWVzdC5kZXRhaWxzLmNvbW1lbnQpIHtcclxuICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKFxyXG4gICAgICBuZXcgU2VjdGlvbihcclxuICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LFxyXG4gICAgICAgICAgKHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgKSxcclxuICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuXHJcbiAgICBsZXQgcGF5bG9hZFdvcmtmbG93U3RlcHMgPSBwYXlsb2FkLmRhdGEud29ya2Zsb3dTdGVwcztcclxuICAgIGlmIChwYXlsb2FkV29ya2Zsb3dTdGVwcyAmJiBwYXlsb2FkV29ya2Zsb3dTdGVwcy5jb25zdHJ1Y3RvciA9PT0gQXJyYXkgJiYgcGF5bG9hZFdvcmtmbG93U3RlcHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBwYXlsb2FkV29ya2Zsb3dTdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGxldCBjdXJyZW50SXNSZXF1ZXN0ZXJTZW5kQmFjayA9IEpTT04uc3RyaW5naWZ5KHN0ZXAuZGV0YWlscykgPT09IEpTT04uc3RyaW5naWZ5KHt9KTtcclxuICAgICAgICBsZXQgaGFzQ29tbWVudHMgPSAoIWN1cnJlbnRJc1JlcXVlc3RlclNlbmRCYWNrICYmIChzdGVwLmRldGFpbHMuY29tbWVudCB8fCBzdGVwLmNvbW1lbnQpID8gY29uc3RhbnRzLkhBU19DT01NRU5UUyA6IGNvbnN0YW50cy5OT19DT01NRU5UUyk7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QWN0b3IgPSAoc3RlcC5hY3Rvci5lbWFpbCA9PT0gc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwgPyBzdGVwLmFjdG9yLnJlY2lwaWVudCA6IChzdGVwLmFjdG9yLmRlbGVnYXRlID8gc3RlcC5hY3Rvci5kZWxlZ2F0ZSA6IG51bGwpKVxyXG4gICAgICAgIGlmIChoYXNDb21tZW50cykge1xyXG4gICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcCA9ICghcmVzdWx0LmNvbW1lbnRzRHJvcCA/IFtdIDogcmVzdWx0LmNvbW1lbnRzRHJvcCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAod2FzU2VuZEJhY2sgJiYgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZSA9PT0gJ1JFUVVFU1RFUicpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwid2FzU2VuZEJhY2sgJiYgUkVRVUVTVEVSXCIpXHJcbiAgICAgICAgICByZXN1bHQuc2VjdGlvbnMgPSBbbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgIGNvbnN0YW50cy5TRUNUSU9OX0lEX1JFUVVFU1RfREVUQUlMUyxcclxuICAgICAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQsXHJcbiAgICAgICAgICAgICAgKHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHBheWxvYWQuZGF0YS5yZXF1ZXN0XHJcbiAgICAgICAgICApXVxyXG4gICAgICAgIH0gZWxzZSBpZiAod2FzU2VuZEJhY2spIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiUG9wXCIpXHJcbiAgICAgICAgICBpZiAocmVzdWx0LnNlY3Rpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgcmVzdWx0LnNlY3Rpb25zLnBvcCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgd2FzU2VuZEJhY2sgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0ZXAuZGV0YWlscy5kZWNpc2lvbiAmJiBzdGVwLmRldGFpbHMuZGVjaXNpb24ua2V5ID09PSBjb25zdGFudHMuRk9STV9TVEFUVVNfU0VORF9CQUNLKSB7XHJcbiAgICAgICAgICB3YXNTZW5kQmFjayA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChKU09OLnN0cmluZ2lmeShzdGVwLmRldGFpbHMpICE9PSBKU09OLnN0cmluZ2lmeSh7fSkpIHtcclxuICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wdXNoKFxyXG4gICAgICAgICAgICBuZXcgU2VjdGlvbihcclxuICAgICAgICAgICAgICBzdGVwLmFjdG9yLnJlY2lwaWVudC5yb2xlLnRvTG93ZXJDYXNlKCkgKyBjb25zdGFudHMuU0VDVElPTl9JRF9BUFBST1ZBTF9QQVJUSUFMX05BTUUsXHJcbiAgICAgICAgICAgICAgbmV3IFNlY3Rpb25IZWFkZXIoXHJcbiAgICAgICAgICAgICAgICAodGhpcy5nZXRTaG9ydE5hbWUodGhpcy5jdXJyZW50QWN0b3I/Lm5hbWUpKSxcclxuICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0U2hvcnROYW1lKHN0ZXAuYWN0b3IucmVjaXBpZW50Lm5hbWUpLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIHN0ZXAuYWN0b3IucmVjaXBpZW50LmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgKHN0ZXAuYWN0b3IuZGVsZWdhdGUgJiYgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lKSA6IG51bGwpLFxyXG4gICAgICAgICAgICAgICAgKHN0ZXAuYWN0b3IuZGVsZWdhdGUgJiYgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5lbWFpbCA/IGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLmRlbGVnYXRlLmVtYWlsIDogbnVsbCksXHJcbiAgICAgICAgICAgICAgICBzdGVwLmFjdG9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgIGhhc0NvbW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgKGluZGV4IDwgcGF5bG9hZFdvcmtmbG93U3RlcHMubGVuZ3RoIC0gMSA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAge2RldGFpbHM6IHN0ZXAuZGV0YWlscywgcHJvY2Vzc2luZ0RhdGU6IHN0ZXAuZGF0ZX1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIC8vIHRoaXMuZ2VuZXJhbFNlcnZpY2UuY3VycmVudFN1Ym1pdHRlciA9IHthY3Rvcjogc3RlcC5hY3RvciwgcmVjaXBpZW50OiBzdGVwLnJlY2lwaWVudCwgZGVsZWdhdGU6IHN0ZXAuYWN0b3IuZGVsZWdhdGV9O1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvISogQ3JlYXRlIExvdiBTZWN0aW9ucyAqIS9cclxuICAgIHJlc3VsdC5sb3ZzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubG92cyA/IHBheWxvYWQubWV0YS5sb3ZzIDogbnVsbCk7XHJcblxyXG4gICAgaWYgKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMpIHtcclxuICAgICAgcmVzdWx0Lm1lc3NhZ2VzID0gbmV3IE1lc3NhZ2VzKFxyXG4gICAgICAgIHt9LFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdLFxyXG4gICAgICAgIFtdXHJcbiAgICAgICk7XHJcbiAgICAgIHBheWxvYWQubWV0YS5tZXNzYWdlcy5mb3JFYWNoKChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXNbbWVzc2FnZS50eXBlXS5wdXNoKG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gcmVzdWx0Lm1lc3NhZ2VzID0gKHBheWxvYWQubWV0YSAmJiBwYXlsb2FkLm1ldGEubWVzc2FnZXMgPyBwYXlsb2FkLm1ldGEubWVzc2FnZXMgOiBudWxsKTtcclxuICAgIC8hKiBGaXggbGFzdCBzZWN0aW9uIHRvIGJlIHRoZSBSTy9XTSBmcm9tIHRoZSB2YXJpYWJsZSAqIS9cclxuICAgIHJlc3VsdC5zZWN0aW9uc1tyZXN1bHQuc2VjdGlvbnMubGVuZ3RoIC0gMV0uaGVhZGVyLnJlYWRPbmx5ID0gaXNSZWFkT25seTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfSovXHJcblxyXG4gIHN1Y2Nlc3NXbSguLi5hcmdzKSB7XHJcbiAgICBsZXQgW3BheWxvYWRdID0gYXJncztcclxuICAgIC8vIGxldCB3YXNTZW5kQmFjayA9IGZhbHNlO1xyXG4gICAgLyogQ29udmVydCBpbnRvIEZvcm0gT2JqZWN0ICovXHJcbiAgICBsZXQgcmVzdWx0ID0gbmV3IEZvcm0oXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRVxyXG4gICAgKTtcclxuICAgIC8qIEdlbmVyYXRlIEhlYWRlciBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkRm9ybURldGFpbHMgPSBwYXlsb2FkLmRhdGEuZm9ybTtcclxuICAgIGxldCBpc1JlYWRPbmx5ID0gKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuVFJVRV9TVFJJTkcgPyBjb25zdGFudHMuVFJVRV9CT09MIDogKHBheWxvYWRGb3JtRGV0YWlscy5yZWFkT25seS50b1VwcGVyQ2FzZSgpID09PSBjb25zdGFudHMuRkFMU0VfU1RSSU5HID8gY29uc3RhbnRzLkZBTFNFX0JPT0wgOiBjb25zdGFudHMuTk9fVkFMVUUpKVxyXG4gICAgcmVzdWx0LmhlYWRlciA9IG5ldyBIZWFkZXIoXHJcbiAgICAgIHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uZnVsbE5hbWUsXHJcbiAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIChwYXlsb2FkRm9ybURldGFpbHMuZm9ybUlkID8gcGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA6IGNvbnN0YW50cy5ET05UX1NIT1cpLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmNyZWF0aW9uRGF0ZSA/IHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgcGF5bG9hZEZvcm1EZXRhaWxzWydmb3JtU3RhdHVzJ10sXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlscy5kZXRhaWxzXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgUHJvZmlsZSBJbmZvcm1hdGlvbiBPYmplY3QgKi9cclxuICAgIGxldCBwYXlsb2FkUHJvZmlsZUluZm8gPSBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddO1xyXG4gICAgcmVzdWx0LnByb2ZpbGVJbmZvRHJvcCA9IG5ldyBQcm9maWxlSW5mb0Ryb3AoXHJcbiAgICAgIChwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkID8gSlNPTi5wYXJzZShwYXlsb2FkUHJvZmlsZUluZm8ub25CZWhhbGZBdXRob3JpemVkKSA6IG51bGwpLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2VtcGxveWVlSWQnXSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmVtcGxveWVlRW1haWwsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5mdWxsTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmpvYlBvc2l0aW9uLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uc2VjdG9yTmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmRlcGFydG1lbnROYW1lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZ2VuZXJhbERlcGFydG1lbnRDb2RlLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm9bJ2h1bWFuUmVzb3VyY2VMb2NhdGlvbiddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8ubmF0aW9uYWxpdHksXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5idXNpbmVzc1Bob25lLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZGlyZWN0TWFuYWdlck5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5zZW5pb3JTZWN0b3JOYW1lXHJcbiAgICApO1xyXG4gICAgLyogR2VuZXJhdGUgU2VjdGlvbnMgT2JqZWN0ICovXHJcbiAgICByZXN1bHQuc2VjdGlvbnMgPSBbXTtcclxuICAgIC8qIFB1c2ggYXMgZmlyc3Qgb2JqZWN0IHRoZSBzZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBkZXRhaWxzICovXHJcbiAgICBsZXQgcmVxdWVzdERldGFpbHNIYXNDb21tZW50ID0gZmFsc2U7XHJcbiAgICBpZiAocGF5bG9hZC5kYXRhLnJlcXVlc3QuZGV0YWlscy5jb21tZW50KSB7XHJcbiAgICAgIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTLFxyXG4gICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIGNvbnN0YW50cy5ET05UX1NIT1csIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCwgKHBheWxvYWQuZGF0YVsnd29ya2Zsb3dTdGVwcyddID8gY29uc3RhbnRzLlJFQURfT05MWSA6IGlzUmVhZE9ubHkpKSxcclxuICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICApXHJcbiAgICApO1xyXG5cclxuICAgIC8qaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkKSB7XHJcbiAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AgPSAoIXJlc3VsdC5jb21tZW50c0Ryb3AgPyBbXSA6IHJlc3VsdC5jb21tZW50c0Ryb3ApO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoKGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9MT0FEX0hJU1RPUlksIHJlc3VsdC5oZWFkZXIuZm9ybUlkKS50aGVuKChyZXNwb25zZU9iamVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlT2JqZWN0KSB7XHJcbiAgICAgICAgICByZXNwb25zZU9iamVjdC5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0uc2VxdWVuY2VOdW1iZXIgIT09ICcwJyAmJiBpdGVtLnByb2Nlc3NlZEJ5KSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGl0ZW0ucHJvY2Vzc2VkQnkuZmlyc3ROYW1lICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeS5zZWNvbmRNaWRkbGVOYW1lICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeS5mYW1pbHlOYW1lO1xyXG4gICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIGl0ZW0ucHJvY2Vzc2VkQnkuZW1haWwsXHJcbiAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlbS5jb21tZW50cyxcclxuICAgICAgICAgICAgICAgIGl0ZW0ubW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyxcclxuICAgICAgICAgICAgICAgIGl0ZW0ucHJvY2Vzc2VkQnkuam9iXHJcbiAgICAgICAgICAgICAgKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9Ki9cclxuICAgIC8qaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmIC9eRFlMLy50ZXN0KHJlc3VsdC5oZWFkZXIuZm9ybUlkKSkge1xyXG4gICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgIHJlc3VsdC5jb25maWRlbnRpYWxDb21tZW50cyA9IFtdO1xyXG4gICAgICB0aGlzLmRpc3BhdGNoKCdsb2FkQ29uZmlkZW50aWFsQ29tbWVudHMnLCByZXN1bHQuaGVhZGVyLmZvcm1JZCkudGhlbigocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZU9iamVjdCAmJiByZXNwb25zZU9iamVjdC5pdGVtcyAmJiByZXNwb25zZU9iamVjdC5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXNwb25zZU9iamVjdC5pdGVtcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmVzdWx0LmNvbmZpZGVudGlhbENvbW1lbnRzLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgaXRlbS5lbWFpbCxcclxuICAgICAgICAgICAgICBpdGVtLm5hbWUsXHJcbiAgICAgICAgICAgICAgaXRlbS5jb21tZW50LFxyXG4gICAgICAgICAgICAgIGl0ZW0ubW9kaWZpZWREYXRlLFxyXG4gICAgICAgICAgICAgIGl0ZW0uYXR0YWNobWVudCxcclxuICAgICAgICAgICAgICBpdGVtLnBvc2l0aW9uXHJcbiAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgLypjb25zdCBpbmJveFR5cGUgPSB0aGlzLmdldEluYm94VHlwZShyZXN1bHQpO1xyXG4gICAgaWYgKHJlc3VsdC5oZWFkZXIuZm9ybUlkICYmICghdGhpcy5pc09wZW5PbkluYm94KCkpKSB7XHJcbiAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fR0VUX0lOQk9YX0lURU0sIHJlc3VsdC5oZWFkZXIuZm9ybUlkLCBpbmJveFR5cGUpLnRoZW4oKHJlc3BvbnNlT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlT2JqZWN0KSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0gcmVzcG9uc2VPYmplY3QuaXRlbTtcclxuICAgICAgICAgIHJlc3VsdC5pbmJveEl0ZW0gPSBuZXcgSW5ib3hJdGVtKFxyXG4gICAgICAgICAgICBpdGVtLmZsYWdnaW5nLmZsYWdQcmlvcml0eSxcclxuICAgICAgICAgICAgaXRlbS5mbGFnZ2luZy5pc0ZsYWdnZWQsXHJcbiAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2suY2FuUmVxdWVzdEZlZWRiYWNrLFxyXG4gICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmhhc0ZlZWRiYWNrLFxyXG4gICAgICAgICAgICBpdGVtLmZlZWRiYWNrLmlzUGVuZGluZyxcclxuICAgICAgICAgICAgaXRlbS5mZWVkYmFjay5pc1JlcXVlc3RlZCxcclxuICAgICAgICAgICAgaXRlbS5mZWVkYmFjay5pc1Jlc3BvbmRlZFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgbGV0IHBheWxvYWRXb3JrZmxvd1N0ZXBzID0gcGF5bG9hZC5kYXRhLndvcmtmbG93U3RlcHM7XHJcbiAgICBpZiAocGF5bG9hZFdvcmtmbG93U3RlcHMgJiYgcGF5bG9hZFdvcmtmbG93U3RlcHMuY29uc3RydWN0b3IgPT09IEFycmF5ICYmIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgcGF5bG9hZFdvcmtmbG93U3RlcHMuZm9yRWFjaCgoc3RlcCwgaW5kZXgpID0+IHtcclxuICAgICAgICBsZXQgY3VycmVudElzUmVxdWVzdGVyU2VuZEJhY2sgPSBKU09OLnN0cmluZ2lmeShzdGVwLmRldGFpbHMpID09PSBKU09OLnN0cmluZ2lmeSh7fSk7XHJcbiAgICAgICAgbGV0IGhhc0NvbW1lbnRzID0gKCFjdXJyZW50SXNSZXF1ZXN0ZXJTZW5kQmFjayAmJiAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgfHwgc3RlcC5jb21tZW50KSA/IGNvbnN0YW50cy5IQVNfQ09NTUVOVFMgOiBjb25zdGFudHMuTk9fQ09NTUVOVFMpO1xyXG4gICAgICAgIGxldCBjdXJyZW50QWN0b3IgPSAoc3RlcC5hY3Rvci5lbWFpbCA9PT0gc3RlcC5hY3Rvci5yZWNpcGllbnQuZW1haWwgPyBzdGVwLmFjdG9yLnJlY2lwaWVudCA6IChzdGVwLmFjdG9yLmRlbGVnYXRlID8gc3RlcC5hY3Rvci5kZWxlZ2F0ZSA6IG51bGwpKVxyXG4gICAgICAgIC8qaWYgKGhhc0NvbW1lbnRzKSB7XHJcbiAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wID0gKCFyZXN1bHQuY29tbWVudHNEcm9wID8gW10gOiByZXN1bHQuY29tbWVudHNEcm9wKTtcclxuICAgICAgICAgIGlmIChzdGVwLmRldGFpbHMuYXR0YWNobWVudCAmJiBzdGVwLmRldGFpbHMuYXR0YWNobWVudC5hdHRhY2htZW50SWQgJiYgdGhpcy5jb25maWcucHJvZHVjdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0lETEU7XHJcbiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0xPQURfRklMRSwgc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQuYXR0YWNobWVudElkKS50aGVuKChyZXNwb25zZU9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgIGxldCBmaWxlSW5mb3JtYXRpb24gPSByZXNwb25zZU9iamVjdC5ib2R5O1xyXG4gICAgICAgICAgICAgIGlmIChjdXJyZW50QWN0b3IpIHtcclxuICAgICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wLnB1c2gobmV3IENvbW1lbnRzRHJvcChcclxuICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgY3VycmVudEFjdG9yLmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgIChzdGVwLmRldGFpbHMuY29tbWVudCA/IHN0ZXAuZGV0YWlscy5jb21tZW50IDogKHN0ZXAuY29tbWVudCA/IHN0ZXAuY29tbWVudCA6IG51bGwpKSxcclxuICAgICAgICAgICAgICAgICAgICBzdGVwLmRhdGUsXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lICsgXCJ8ZGF0YTpcIiArIGZpbGVJbmZvcm1hdGlvbi5taW1lVHlwZSArIFwiO2Jhc2U2NCxcIiArIGZpbGVJbmZvcm1hdGlvbi5maWxlQ29udGVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgICApKVxyXG4gICAgICAgICAgICAgICAgfSkqIS9cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0ZFVENISU5HO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGVwLmRldGFpbHMuYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fTE9BRF9GSUxFLCBzdGVwLmRldGFpbHMuYXR0Y2htZW50SWQpLnRoZW4oKHJlc3BvbnNlT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvcm1hdGlvbiA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgLyEqdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fRU1QTE9ZRUVfUFJPRklMRSwgY3VycmVudEFjdG9yLmVtYWlsKS50aGVuKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEFjdG9yLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgKHN0ZXAuZGV0YWlscy5jb21tZW50ID8gc3RlcC5kZXRhaWxzLmNvbW1lbnQgOiAoc3RlcC5jb21tZW50ID8gc3RlcC5jb21tZW50IDogbnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICBmaWxlSW5mb3JtYXRpb24uZmlsZU5hbWUgKyBcInxkYXRhOlwiICsgZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlICsgXCI7YmFzZTY0LFwiICsgZmlsZUluZm9ybWF0aW9uLmZpbGVDb250ZW50cyxcclxuICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmpvYi5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICB9KSohL1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfRkVUQ0hJTkc7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudEFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19JRExFO1xyXG4gICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcC5wdXNoKG5ldyBDb21tZW50c0Ryb3AoXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgPyBzdGVwLmRldGFpbHMuY29tbWVudCA6IChzdGVwLmNvbW1lbnQgPyBzdGVwLmNvbW1lbnQgOiBudWxsKSksXHJcbiAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICB9KSohL1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfRkVUQ0hJTkc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSovXHJcblxyXG4gICAgICAgLyogaWYgKHdhc1NlbmRCYWNrICYmIHN0ZXAuYWN0b3IucmVjaXBpZW50LnJvbGUgPT09ICdSRVFVRVNURVInKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndhc1NlbmRCYWNrICYmIFJFUVVFU1RFUlwiKVxyXG4gICAgICAgICAgcmVzdWx0LnNlY3Rpb25zID0gW25ldyBTZWN0aW9uKFxyXG4gICAgICAgICAgICBjb25zdGFudHMuU0VDVElPTl9JRF9SRVFVRVNUX0RFVEFJTFMsXHJcbiAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgcmVxdWVzdERldGFpbHNIYXNDb21tZW50LFxyXG4gICAgICAgICAgICAgIChwYXlsb2FkLmRhdGEud29ya2Zsb3dTdGVwcyA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBwYXlsb2FkLmRhdGEucmVxdWVzdFxyXG4gICAgICAgICAgKV1cclxuICAgICAgICB9IGVsc2UgaWYgKHdhc1NlbmRCYWNrKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlBvcFwiKVxyXG4gICAgICAgICAgaWYgKHJlc3VsdC5zZWN0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucy5wb3AoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHdhc1NlbmRCYWNrID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgICovXHJcblxyXG5cclxuICAgICAgICBpZiAoc3RlcC5kZXRhaWxzLmRlY2lzaW9uICYmIHN0ZXAuZGV0YWlscy5kZWNpc2lvbi5rZXkgPT09IGNvbnN0YW50cy5GT1JNX1NUQVRVU19TRU5EX0JBQ0spIHtcclxuICAgICAgICAgIC8vIHdhc1NlbmRCYWNrID0gdHJ1ZTtcclxuICAgICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KHN0ZXAuZGV0YWlscykgIT09IEpTT04uc3RyaW5naWZ5KHt9KSkge1xyXG4gICAgICAgICAgcmVzdWx0LnNlY3Rpb25zLnB1c2goXHJcbiAgICAgICAgICAgIG5ldyBTZWN0aW9uKFxyXG4gICAgICAgICAgICAgIHN0ZXAuYWN0b3IucmVjaXBpZW50LnJvbGUudG9Mb3dlckNhc2UoKSArIGNvbnN0YW50cy5TRUNUSU9OX0lEX0FQUFJPVkFMX1BBUlRJQUxfTkFNRSxcclxuICAgICAgICAgICAgICBuZXcgU2VjdGlvbkhlYWRlcihcclxuICAgICAgICAgICAgICAgIChjdXJyZW50QWN0b3IgPyB0aGlzLmdldFNob3J0TmFtZShjdXJyZW50QWN0b3IubmFtZSkgOiBcIlwiKS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgc3RlcC5kYXRlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5yZWNpcGllbnQubmFtZSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLnJlY2lwaWVudC5lbWFpbCxcclxuICAgICAgICAgICAgICAgIChzdGVwLmFjdG9yLmRlbGVnYXRlPy5uYW1lID8gdGhpcy5nZXRTaG9ydE5hbWUoc3RlcC5hY3Rvci5kZWxlZ2F0ZS5uYW1lKSA6IFwiXCIpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICAoc3RlcC5hY3Rvci5kZWxlZ2F0ZT8uZW1haWwgPyBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgc3RlcC5hY3Rvci5kZWxlZ2F0ZS5lbWFpbCA6IFwiXCIpLFxyXG4gICAgICAgICAgICAgICAgc3RlcC5hY3Rvci5zdGF0dXMsXHJcbiAgICAgICAgICAgICAgICBoYXNDb21tZW50cyxcclxuICAgICAgICAgICAgICAgIChpbmRleCA8IHBheWxvYWRXb3JrZmxvd1N0ZXBzLmxlbmd0aCAtIDEgPyBjb25zdGFudHMuUkVBRF9PTkxZIDogaXNSZWFkT25seSlcclxuICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIHtkZXRhaWxzOiBzdGVwLmRldGFpbHMsIHByb2Nlc3NpbmdEYXRlOiBzdGVwLmRhdGV9XHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgICAvLyB0aGlzLmN1cnJlbnRTdWJtaXR0ZXIgPSB7YWN0b3I6IHN0ZXAuYWN0b3IsIHJlY2lwaWVudDogc3RlcC5yZWNpcGllbnQsIGRlbGVnYXRlOiBzdGVwLmFjdG9yLmRlbGVnYXRlfTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLyogQ3JlYXRlIExvdiBTZWN0aW9ucyAqL1xyXG4gICAgcmVzdWx0LmxvdnMgPSAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5sb3ZzID8gcGF5bG9hZC5tZXRhLmxvdnMgOiBudWxsKTtcclxuXHJcbiAgICBpZiAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5tZXNzYWdlcykge1xyXG4gICAgICByZXN1bHQubWVzc2FnZXMgPSBuZXcgTWVzc2FnZXMoXHJcbiAgICAgICAge30sXHJcbiAgICAgICAgW10sXHJcbiAgICAgICAgW10sXHJcbiAgICAgICAgW11cclxuICAgICAgKTtcclxuICAgICAgcGF5bG9hZC5tZXRhLm1lc3NhZ2VzLmZvckVhY2goKG1lc3NhZ2UpID0+IHtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXMub3JpZ2luYWxNc2dzLnB1c2gobWVzc2FnZSk7XHJcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2VzW21lc3NhZ2UudHlwZV0ucHVzaChtZXNzYWdlLm1lc3NhZ2UpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZXN1bHQubWVzc2FnZXMgPSAocGF5bG9hZC5tZXRhICYmIHBheWxvYWQubWV0YS5tZXNzYWdlcyA/IHBheWxvYWQubWV0YS5tZXNzYWdlcyA6IG51bGwpO1xyXG4gICAgLyogRml4IGxhc3Qgc2VjdGlvbiB0byBiZSB0aGUgUk8vV00gZnJvbSB0aGUgdmFyaWFibGUgKi9cclxuICAgIHJlc3VsdC5zZWN0aW9uc1tyZXN1bHQuc2VjdGlvbnMubGVuZ3RoIC0gMV0uaGVhZGVyLnJlYWRPbmx5ID0gaXNSZWFkT25seTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9nZ2VkSW5Vc2VySWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy51c2VyRGF0YVsnbG9nZ2VkSW5Vc2VyRW1haWwnXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTaG9ydE5hbWUobmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAobmFtZSkge1xyXG4gICAgICBsZXQgbmFtZVRva2VucyA9IG5hbWUuc3BsaXQoJyAnKTtcclxuICAgICAgaWYgKG5hbWVUb2tlbnMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF1dXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAyXS50b0xvd2VyQ2FzZSgpID09ICdhbCcpIHtcclxuICAgICAgICAgIHJldHVybiBbbmFtZVRva2Vuc1swXSwgbmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDJdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMV1dLmpvaW4oJyAnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIFtuYW1lVG9rZW5zWzBdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMV1dLmpvaW4oJyAnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|
|
504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5zZXJ2aWNlLnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYnBtLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9jb3JlLnNlcnZpY2UudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFhLFdBQVcsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0ksT0FBTyxLQUFLLFNBQVMsTUFBTSxjQUFjLENBQUE7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxhQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQzs7O0FBS3hCLE1BQU0sT0FBTyxXQUFXO0lBZ0JGO0lBQzZCO0lBaEJqRCxNQUFNLEdBQVcsRUFBRSxDQUFBO0lBQ1gsU0FBUyxDQUFTO0lBQ2xCLFlBQVksQ0FBUztJQUNaLGFBQWEsQ0FBUztJQUNoQyxRQUFRLENBQVM7SUFDUCxTQUFTLENBQUs7SUFDeEIsZ0JBQWdCLENBQUs7SUFDNUIsWUFBWSxDQUFRO0lBQ1osZUFBZSxDQUFVO0lBQ3pCLGNBQWMsQ0FBVTtJQUN4QixnQkFBZ0IsQ0FBTTtJQUM5QixRQUFRLENBQVE7SUFDaEIsVUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUNmLFNBQVMsQ0FBSztJQUVkLFlBQW9CLElBQWdC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QUFPLElBQUksQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFRLE1BQWMsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBQzNDLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBTTtRQUN4QixJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsS0FBSyxNQUFNLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25FLEdBQUcsR0FBRyxTQUFTLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixHQUFHLEdBQUcsU0FBUyxDQUFDLG9CQUFvQixDQUFDO1FBQ3ZDLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFTSxhQUFhO1FBQ2xCLE9BQVEsTUFBYyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDMUMsQ0FBQzt1R0EzbUJVLFdBQVcsNENBaUJGLG1CQUFtQjsyR0FqQjVCLFdBQVcsY0FGVixLQUFLOzsyRkFFTixXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxLQUFLO2lCQUNsQjs7MEJBa0JjLE1BQU07MkJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVyc30gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgdHlwZSB7TXlMaWJDb25maWd9IGZyb20gXCIuLi9pbnRlcmZhY2VzL3NoYXJlZC5pbnRlcmZhY2VcIjtcclxuaW1wb3J0IHtDb21tZW50c0Ryb3AsIEZvcm0sIEhlYWRlciwgSW5ib3hJdGVtLCBNZXNzYWdlcywgTVlfTElCX0NPTkZJR19UT0tFTiwgUHJvZmlsZUluZm9Ecm9wLCBTZWN0aW9uLCBTZWN0aW9uSGVhZGVyfSBmcm9tIFwiLi4vLi4vcHVibGljLWFwaVwiO1xyXG5pbXBvcnQgKiBhcyBjb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzJ1xyXG5pbXBvcnQge2NhdGNoRXJyb3IsIGZyb20sIHRocm93RXJyb3IsIHN3aXRjaE1hcH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHttYXB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgc2F2ZUZvcm1Ib29rcyBmcm9tICcuLi9ob29rcy9zYXZlLWZvcm0nO1xyXG5pbXBvcnQge29mfSBmcm9tICdyeGpzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiBcImFueVwiXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb3JlU2VydmljZSB7XHJcbiAgYXBpVXJsOiBzdHJpbmcgPSAnJ1xyXG4gIHByaXZhdGUgYXV0aFRva2VuOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWZyZXNoVG9rZW46IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IHByb2plY3RDb25maWc6IHN0cmluZztcclxuICBwdWJsaWMgdXNlckRhdGE6IHN0cmluZztcclxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2FsVXNlcjoge307XHJcbiAgcHVibGljIGxvZ2dlZEluVXNlckRhdGE6IHt9O1xyXG4gIGN1cnJlbnRBY3Rvcjogc3RyaW5nXHJcbiAgcHJpdmF0ZSBhdXRob3JpemVkRW1haWwhOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZXF1ZXN0ZXJFbWFpbCE6IHN0cmluZztcclxuICBwcml2YXRlIGN1cnJlbnRTdWJtaXR0ZXI6IGFueTtcclxuICBsYW5ndWFnZTogc3RyaW5nXHJcbiAgYWN0aXZpdGllcyA9IFtdXHJcbiAgYXBwcm92YWxzOiBhbnlcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoTVlfTElCX0NPTkZJR19UT0tFTikgcHJpdmF0ZSBjb25maWc6IE15TGliQ29uZmlnKSB7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogJ2VuJztcclxuICAgIHRoaXMuYXBpVXJsID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQmFzZVVybCArIGxhbmd1YWdlICsgdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUV4ZWN1dGU7XHJcbiAgICBjb25zb2xlLmxvZygnQ29uZmlnOiAnLCB0aGlzLmNvbmZpZyk7XHJcbiAgICB0aGlzLmxvY2FsVXNlciA9IHtcclxuICAgICAgXCJmb3JtUHJlZml4XCI6IFwiQ0VQXCIsXHJcbiAgICAgIFwiZm9ybUlkXCI6IFwiQ0VQNTU5NTQzMlwiLFxyXG4gICAgICBcImluYm94VXJpXCI6IFwiXFwvZ3JvdXBcXC9odWJcXC9pbmJveFwiLFxyXG4gICAgICBcImJhc2VVcmxcIjogXCJcXC9ncm91cFxcL2ktZ2F0ZVxcL3dtLWJwbVxcL2Zvcm1zXFwvLVxcL3Byb3h5XCIsXHJcbiAgICAgIFwic2hvd1ByaW50XCI6IHRydWUsXHJcbiAgICAgIFwibGFuZ3VhZ2VcIjogXCJlblwiLFxyXG4gICAgICBcImlzTW9iaWxlXCI6IHRydWUsXHJcbiAgICAgIFwib3V0bG9va1wiOiBmYWxzZSxcclxuICAgICAgXCJsb2dnZWRJblVzZXJFbWFpbFwiOiBcImlicmFoaW1tYWEuY0BzdGMuY29tLnNhXCJcclxuICAgIH1cclxuICAgIHRoaXMucHJvamVjdENvbmZpZyA9ICh0aGlzLmNvbmZpZy5wcm9kdWN0aW9uKSA/ICh3aW5kb3cgYXMgYW55KVsnd21Db25maWcnXSA6IGJ0b2EoSlNPTi5zdHJpbmdpZnkodGhpcy5sb2NhbFVzZXIpKTtcclxuICAgIHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKGF0b2IodGhpcy5wcm9qZWN0Q29uZmlnKSk7XHJcbiAgICB0aGlzLmxhbmd1YWdlID0gKHdpbmRvdyBhcyBhbnkpPy53bUNvbmZpZz8ubGFuZ3VhZ2UgPyAod2luZG93IGFzIGFueSkud21Db25maWcubGFuZ3VhZ2UgOiBcImVuXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0TG9nZ2VkSW5Vc2VyRGF0YSgpIHtcclxuICAgIGxldCBsb2dnZWRJbkVtYWlsID0gdGhpcy5sb2dnZWRJblVzZXJJZCgpXHJcbiAgICB0aGlzLmVtcGxveWVlUHJvZmlsZShsb2dnZWRJbkVtYWlsKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5sb2dnZWRJblVzZXJEYXRhID0gcmVzcG9uc2U/LltcIlVzZXJzXCJdPy5bMF1cclxuICAgICAgY29uc29sZS5sb2coJ2dldExvZ2dlZEluVXNlckRhdGEnLCByZXNwb25zZSlcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZEZvcm0oKSB7XHJcbiAgICBjb25zdCBhdXRoVXJsID0gdGhpcy5idWlsZEF1dGhVcmwoKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGF1dGhVcmwsIHtvYnNlcnZlOiAncmVzcG9uc2UnfSkucGlwZShcclxuICAgICAgbWFwKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRva2VuSW5mb3JtYXRpb24gPSByZXMuYm9keTtcclxuICAgICAgICB0aGlzLmF1dGhUb2tlbiA9IHRva2VuSW5mb3JtYXRpb24udG9rZW47XHJcbiAgICAgICAgdGhpcy5nZXRMb2dnZWRJblVzZXJEYXRhKCk7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSB0b2tlbkluZm9ybWF0aW9uLnJlZnJlc2hUb2tlbjtcclxuICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5idWlsZEJvZHkoKTtcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucygpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhbGxQb3N0KGJvZHksIG9wdGlvbnMpO1xyXG4gICAgICB9KSxcclxuICAgICAgc3dpdGNoTWFwKHBvc3RPYnNlcnZhYmxlID0+IHBvc3RPYnNlcnZhYmxlKSxcclxuICAgICAgY2F0Y2hFcnJvcigoaHR0cEVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gb2YodGhyb3dFcnJvcihodHRwRXJyb3IpKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQXV0aFVybCgpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuY29uZmlnLnByb3h5U2VydmljZUJhc2VVcmw7XHJcbiAgICBjb25zdCBsYW5ndWFnZSA9ICh3aW5kb3cgYXMgYW55KT8ud21Db25maWc/Lmxhbmd1YWdlID8gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmxhbmd1YWdlIDogJ2VuJztcclxuICAgIGNvbnN0IGZ1bGxBZGRyZXNzID0gdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcztcclxuICAgIGNvbnN0IGF1dGhQYXJ0ID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQXV0aG9yaXphdGlvbjtcclxuICAgIHJldHVybiBgJHtiYXNlVXJsfSR7bGFuZ3VhZ2V9JHtmdWxsQWRkcmVzc30ke2F1dGhQYXJ0fT90cz0keyhuZXcgRGF0ZSgpKS52YWx1ZU9mKCl9YDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRCb2R5KCk6IG9iamVjdCB7XHJcbiAgICBjb25zdCBiYXNlQm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuU0VSVklDRV9OQU1FX1dNX0ZPUk0sXHJcbiAgICAgIGZvcm1OYW1lOiB0aGlzLmNvbmZpZy5mb3JtTmFtZSxcclxuICAgICAgZm9ybUlkOiBcIlwiLFxyXG4gICAgICBxdWVyeVBhcmFtZXRlcnM6IG51bGxcclxuICAgIH07XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmZvcm1JZCkge1xyXG4gICAgICBkZWxldGUgYmFzZUJvZHkuZm9ybUlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYmFzZUJvZHkuZm9ybUlkID0gdGhpcy5jb25maWcuZm9ybUlkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGJhc2VCb2R5O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVtcGxveWVlUHJvZmlsZShlbXBsb3llZUVtYWlsOiBhbnkpIHtcclxuICAgIGxldCBib2R5ID0ge1xyXG4gICAgICBtZXRob2Q6IGNvbnN0YW50cy5IVFRQX01FVEhPRF9HRVQsXHJcbiAgICAgIGZvcm1OYW1lOiB0aGlzLmNvbmZpZy5mb3JtTmFtZSxcclxuICAgICAgZGVzdGluYXRpb246IGNvbnN0YW50cy5UQVJHRVRfU0VSVkVSX0RQLFxyXG4gICAgICBzZXJ2aWNlTmFtZTogY29uc3RhbnRzLlNFUlZJQ0VfTkFNRV9EUF9TRUFSQ0hfRU1QTE9ZRUUsXHJcbiAgICAgIHBhcmFtZXRlcnM6IHtcclxuICAgICAgICBxOiBlbXBsb3llZUVtYWlsXHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodGhpcy5hcGlVcmwsIGJvZHksIHtcclxuICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcclxuICAgICAgICBhdXRoVG9rZW46IHRoaXMuYXV0aFRva2VuLFxyXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcclxuICAgICAgfSksXHJcbiAgICAgIG9ic2VydmU6IFwiYm9keVwiXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBtYXAoKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcclxuICAgICAgfSlcclxuICAgICAgLCBjYXRjaEVycm9yKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycilcclxuICAgICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRSZXF1ZXN0T3B0aW9ucygpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICAgYXV0aFRva2VuOiB0aGlzLmF1dGhUb2tlbixcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogY29uc3RhbnRzLkhFQURFUl9DT05URU5UX1RZUEVfRk9STVxyXG4gICAgICB9KSxcclxuICAgICAgb2JzZXJ2ZTogJ2JvZHknXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldERyYWZ0SWQodmFsKSB7XHJcbiAgICByZXR1cm4gdmFsLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgnRFJBRlQnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdWJtaXRGb3JtKC4uLmFyZ3MpIHtcclxuICAgIGNvbnN0IFtzZWN0aW9uLCBhY3Rpb25dID0gYXJncztcclxuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMuZ2V0SHR0cE1ldGhvZCgpO1xyXG4gICAgbGV0IHNlY3Rpb25JZCA9IHRoaXMuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbldyYXBwZXIoc2VjdGlvbikuaWQ7XHJcbiAgICBsZXQgc2VydmljZU5hbWUgPSB0aGlzLmdldFNlcnZpY2VOYW1lKGFjdGlvbik7XHJcbiAgICBsZXQgZm9ybU5hbWUgPSB0aGlzLmdldEZvcm1OYW1lKGFjdGlvbik7XHJcbiAgICBsZXQgYm9keSA9IHRoaXMuZ2V0Qm9keU9iamVjdChtZXRob2QsIHNlcnZpY2VOYW1lLCBhY3Rpb24sIGZvcm1OYW1lLCB0aGlzLnBvcHVsYXRlZFBheWxvYWQoc2VjdGlvbklkLCBzZWN0aW9uKSwgdGhpcy5jb25maWcuZm9ybUlkKTtcclxuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc3VibWl0KGJvZHksIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRIdHRwTWV0aG9kKCkge1xyXG4gICAgcmV0dXJuICh0aGlzLmNvbmZpZy5mb3JtSWQgJiYgIXRoaXMuZ2V0RHJhZnRJZCh0aGlzLmNvbmZpZy5mb3JtSWQpKSA/IGNvbnN0YW50cy5IVFRQX01FVEhPRF9QVVQgOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfUE9TVDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYmVmb3JlVHJhbnNwaWxlU2VjdGlvbldyYXBwZXIoc2VjdGlvbikge1xyXG4gICAgcmV0dXJuIHNhdmVGb3JtSG9va3MuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbiA/IHNhdmVGb3JtSG9va3MuYmVmb3JlVHJhbnNwaWxlU2VjdGlvbihzZWN0aW9uKSA6IHNlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFNlcnZpY2VOYW1lKGFjdGlvbikge1xyXG4gICAgaWYgKGFjdGlvbiA9PT0gY29uc3RhbnRzLldNX0FDVElPTl9TQVZFX0NIQU5HRVMpIHtcclxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5TRVJWSUNFX05BTUVfV01fRFJBRlRfRk9STVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGNvbnN0YW50cy5TRVJWSUNFX05BTUVfV01fRk9STVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtTmFtZShhY3Rpb24pIHtcclxuICAgIGlmIChhY3Rpb24gPT09IGNvbnN0YW50cy5XTV9BQ1RJT05fU0FWRV9DSEFOR0VTKSB7XHJcbiAgICAgIHJldHVybiAnY29tbW9uJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZy5mb3JtTmFtZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG9wdWxhdGVkUGF5bG9hZChzZWN0aW9uSWQsIHNlY3Rpb24pIHtcclxuICAgIGxldCBwYXlsb2FkO1xyXG4gICAgaWYgKHNlY3Rpb25JZCA9PT0gY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTKSB7XHJcbiAgICAgIHBheWxvYWQgPSB7cmVxdWVzdDoge2RldGFpbHM6IHNlY3Rpb24uYm9keS5kZXRhaWxzfX07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYXlsb2FkID0ge3dvcmtmbG93U3RlcHM6IHt9fTtcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLmRldGFpbHMgPSBzZWN0aW9uLmJvZHkuZGV0YWlscztcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLmFjdG9yID0gdGhpcy5jdXJyZW50U3VibWl0dGVyLmFjdG9yO1xyXG4gICAgICBwYXlsb2FkLndvcmtmbG93U3RlcHMuYWN0b3IuZW1haWwgPSB0aGlzLmN1cnJlbnRBY3RvcjtcclxuICAgICAgcGF5bG9hZC53b3JrZmxvd1N0ZXBzLnN0YXR1cyA9IGNvbnN0YW50cy5TRUNUSU9OX1NUQVRVU19QRU5ESU5HO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBheWxvYWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEJvZHlPYmplY3QobWV0aG9kLCBzZXJ2aWNlTmFtZSwgYWN0aW9uLCBmb3JtTmFtZSwgcGF5bG9hZCwgZm9ybUlkKSB7XHJcbiAgICBsZXQgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBtZXRob2QsXHJcbiAgICAgIGRlc3RpbmF0aW9uOiBjb25zdGFudHMuVEFSR0VUX1NFUlZFUl9XTSxcclxuICAgICAgc2VydmljZU5hbWU6IHNlcnZpY2VOYW1lLFxyXG4gICAgICBwYXJhbWV0ZXJzOiB7XHJcbiAgICAgICAgYWN0aW9uOiBhY3Rpb25cclxuICAgICAgfSxcclxuICAgICAgZm9ybU5hbWU6IGZvcm1OYW1lLFxyXG4gICAgICBib2R5OiBwYXlsb2FkLFxyXG4gICAgICBmb3JtSWQ6IGZvcm1JZCxcclxuICAgICAgcXVlcnlQYXJhbWV0ZXJzOiB7fSxcclxuICAgICAgcGF5bG9hZFxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgYm9keS5mb3JtSWQgPSB0aGlzLmNvbmZpZy5mb3JtSWQ7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLmF1dGhvcml6ZWRFbWFpbCB8fCAhdGhpcy5hdXRob3JpemVkRW1haWwubGVuZ3RoIHx8IHRoaXMuYXV0aG9yaXplZEVtYWlsID09PSB0aGlzLnJlcXVlc3RlckVtYWlsKSB7XHJcbiAgICAgIGRlbGV0ZSBib2R5LnF1ZXJ5UGFyYW1ldGVycztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2F2ZUZvcm1Ib29rcy5iZWZvcmVTZW5kUGF5bG9hZCkge1xyXG4gICAgICBib2R5LnBheWxvYWQgPSBzYXZlRm9ybUhvb2tzLmJlZm9yZVNlbmRQYXlsb2FkKGJvZHkucGF5bG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJvZHk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhbGxQb3N0KGJvZHksIG9wdGlvbnMpIHtcclxuICAgIGNvbnN0IGxhbmd1YWdlID0gKHdpbmRvdyBhcyBhbnkpPy53bUNvbmZpZz8ubGFuZ3VhZ2UgPyAod2luZG93IGFzIGFueSkud21Db25maWcubGFuZ3VhZ2UgOiBcImVuXCI7XHJcbiAgICBsZXQgYXBpVXJsID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQmFzZVVybCArIGxhbmd1YWdlICsgdGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUV4ZWN1dGU7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYXBpVXJsLCBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoYm9keSkpLCBvcHRpb25zKS50b1Byb21pc2UoKVxyXG4gICAgICAudGhlbihcclxuICAgICAgICAocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzc1dtKHJlc3BvbnNlT2JqZWN0KVxyXG4gICAgICAgIH0sXHJcbiAgICAgICkuY2F0Y2goXHJcbiAgICAgICAgKGh0dHBFcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihodHRwRXJyb3IpXHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdWJtaXQoYm9keTogYW55LCBvcHRpb25zOiBhbnkpIHtcclxuICAgIGNvbnN0IGxhbmd1YWdlID0gKHdpbmRvdyBhcyBhbnkpPy53bUNvbmZpZz8ubGFuZ3VhZ2UgPyAod2luZG93IGFzIGFueSkud21Db25maWcubGFuZ3VhZ2UgOiBcImVuXCI7XHJcbiAgICBjb25zdCBhcGlVcmwgPSB0aGlzLmNvbmZpZy5wcm94eVNlcnZpY2VCYXNlVXJsICsgbGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuXHJcbiAgICAvLyBDb252ZXJ0IHRoZSBwcm9taXNlIHRvIGFuIG9ic2VydmFibGVcclxuICAgIHJldHVybiBmcm9tKFxyXG4gICAgICB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnRvUHJvbWlzZSgpLnRoZW4oXHJcbiAgICAgICAgKHJlc3BvbnNlT2JqZWN0OiBhbnkpID0+IHtcclxuICAgICAgICAgIGxldCBmb3JtUmVzcG9uc2UgPSByZXNwb25zZU9iamVjdC5kYXRhLmZvcm07XHJcbiAgICAgICAgICBpZiAoc2F2ZUZvcm1Ib29rcy5hZnRlclNlbmRQYXlsb2FkKSB7XHJcbiAgICAgICAgICAgIGZvcm1SZXNwb25zZSA9IHNhdmVGb3JtSG9va3MuYWZ0ZXJTZW5kUGF5bG9hZChmb3JtUmVzcG9uc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgaWQ6IG51bGwsXHJcbiAgICAgICAgICAgIHN0YXR1czogbnVsbCxcclxuICAgICAgICAgICAgbmV4dEFwcHJvdmVyOiB7XHJcbiAgICAgICAgICAgICAgbmFtZTogbnVsbCxcclxuICAgICAgICAgICAgICBlbWFpbDogbnVsbCxcclxuICAgICAgICAgICAgICByb2xlOiBudWxsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNyZWF0aW9uRGF0ZTogbnVsbFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHJlc3VsdC5pZCA9IGZvcm1SZXNwb25zZS5mb3JtSWQ7XHJcbiAgICAgICAgICByZXN1bHQuc3RhdHVzID0gZm9ybVJlc3BvbnNlWydmb3JtU3RhdHVzJ107XHJcbiAgICAgICAgICBpZiAoZm9ybVJlc3BvbnNlLmN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICByZXN1bHQubmV4dEFwcHJvdmVyID0ge1xyXG4gICAgICAgICAgICAgIG5hbWU6IGZvcm1SZXNwb25zZS5jdXJyZW50QWN0b3IubmFtZSxcclxuICAgICAgICAgICAgICBlbWFpbDogZm9ybVJlc3BvbnNlLmN1cnJlbnRBY3Rvci5lbWFpbCxcclxuICAgICAgICAgICAgICByb2xlOiBmb3JtUmVzcG9uc2VbJ2Zvcm1TdGVwJ11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVzdWx0LmNyZWF0aW9uRGF0ZSA9IGZvcm1SZXNwb25zZS5jcmVhdGlvbkRhdGU7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0sIChodHRwRXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhyb3cgaHR0cEVycm9yO1xyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VjY2Vzc1dtKC4uLmFyZ3MpIHtcclxuICAgIGxldCBbcGF5bG9hZF0gPSBhcmdzO1xyXG4gICAgbGV0IHdhc1NlbmRCYWNrID0gZmFsc2U7XHJcbiAgICAvKiBDb252ZXJ0IGludG8gRm9ybSBPYmplY3QgKi9cclxuICAgIGxldCByZXN1bHQgPSBuZXcgRm9ybShcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFLFxyXG4gICAgICBjb25zdGFudHMuTk9fVkFMVUUsXHJcbiAgICAgIGNvbnN0YW50cy5OT19WQUxVRSxcclxuICAgICAgY29uc3RhbnRzLk5PX1ZBTFVFXHJcbiAgICApO1xyXG4gICAgdGhpcy5yZXF1ZXN0ZXJFbWFpbCA9IHBheWxvYWQuZGF0YVsncmVxdWVzdGVyJ10uZW1wbG95ZWVFbWFpbDtcclxuICAgIHRoaXMuYXV0aG9yaXplZEVtYWlsID0gcGF5bG9hZC5kYXRhWydyZXF1ZXN0ZXInXS5hdXRob3JpemVkRW1haWw7XHJcbiAgICAvKiBHZW5lcmF0ZSBIZWFkZXIgT2JqZWN0ICovXHJcbiAgICBsZXQgcGF5bG9hZEZvcm1EZXRhaWxzID0gcGF5bG9hZC5kYXRhLmZvcm07XHJcbiAgICBsZXQgaXNSZWFkT25seSA9IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLlRSVUVfU1RSSU5HID8gY29uc3RhbnRzLlRSVUVfQk9PTCA6IChwYXlsb2FkRm9ybURldGFpbHMucmVhZE9ubHkudG9VcHBlckNhc2UoKSA9PT0gY29uc3RhbnRzLkZBTFNFX1NUUklORyA/IGNvbnN0YW50cy5GQUxTRV9CT09MIDogY29uc3RhbnRzLk5PX1ZBTFVFKSlcclxuICAgIHJlc3VsdC5oZWFkZXIgPSBuZXcgSGVhZGVyKFxyXG4gICAgICBwYXlsb2FkLmRhdGFbJ3JlcXVlc3RlciddLmZ1bGxOYW1lLFxyXG4gICAgICBjb25zdGFudHMuSUdBVEVfU1RBVElDX0FTU0VUX1BST0ZJTEVfUEhPVE9fVVJMICsgcGF5bG9hZC5kYXRhWydyZXF1ZXN0ZXInXS5lbXBsb3llZUVtYWlsLFxyXG4gICAgICAocGF5bG9hZEZvcm1EZXRhaWxzLmZvcm1JZCA/IHBheWxvYWRGb3JtRGV0YWlscy5mb3JtSWQgOiBjb25zdGFudHMuRE9OVF9TSE9XKSxcclxuICAgICAgKHBheWxvYWRGb3JtRGV0YWlscy5jcmVhdGlvbkRhdGUgPyBwYXlsb2FkRm9ybURldGFpbHMuY3JlYXRpb25EYXRlIDogY29uc3RhbnRzLkRPTlRfU0hPVyksXHJcbiAgICAgIHBheWxvYWRGb3JtRGV0YWlsc1snZm9ybVN0YXR1cyddLFxyXG4gICAgICBwYXlsb2FkRm9ybURldGFpbHMuZGV0YWlsc1xyXG4gICAgKTtcclxuICAgIC8qIEdlbmVyYXRlIFByb2ZpbGUgSW5mb3JtYXRpb24gT2JqZWN0ICovXHJcbiAgICBsZXQgcGF5bG9hZFByb2ZpbGVJbmZvID0gcGF5bG9hZC5kYXRhWydyZXF1ZXN0ZXInXTtcclxuICAgIHJlc3VsdC5wcm9maWxlSW5mb0Ryb3AgPSBuZXcgUHJvZmlsZUluZm9Ecm9wKFxyXG4gICAgICAocGF5bG9hZFByb2ZpbGVJbmZvWydvbkJlaGFsZkF1dGhvcml6ZWQnXSA/IEpTT04ucGFyc2UocGF5bG9hZFByb2ZpbGVJbmZvWydvbkJlaGFsZkF1dGhvcml6ZWQnXSkgOiBudWxsKSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvWydlbXBsb3llZUlkJ10sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5lbXBsb3llZUVtYWlsLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uZnVsbE5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5nZW5lcmFsRGVwYXJ0bWVudE5hbWUsXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5qb2JQb3NpdGlvbixcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvWydzZWN0b3JOYW1lJ10sXHJcbiAgICAgIHBheWxvYWRQcm9maWxlSW5mby5kZXBhcnRtZW50TmFtZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLmdlbmVyYWxEZXBhcnRtZW50Q29kZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvWydodW1hblJlc291cmNlTG9jYXRpb24nXSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvLm5hdGlvbmFsaXR5LFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uYnVzaW5lc3NQaG9uZSxcclxuICAgICAgcGF5bG9hZFByb2ZpbGVJbmZvWydkaXJlY3RNYW5hZ2VyTmFtZSddLFxyXG4gICAgICBwYXlsb2FkUHJvZmlsZUluZm8uc2VuaW9yU2VjdG9yTmFtZVxyXG4gICAgKTtcclxuICAgIHJlc3VsdC5zZWN0aW9ucyA9IFtdO1xyXG4gICAgbGV0IHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCA9IGZhbHNlO1xyXG4gICAgaWYgKHBheWxvYWQuZGF0YS5yZXF1ZXN0LmRldGFpbHMuY29tbWVudCkge1xyXG4gICAgICByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmVzdWx0LnNlY3Rpb25zLnB1c2goXHJcbiAgICAgIG5ldyBTZWN0aW9uKFxyXG4gICAgICAgIGNvbnN0YW50cy5TRUNUSU9OX0lEX1JFUVVFU1RfREVUQUlMUyxcclxuICAgICAgICBuZXcgU2VjdGlvbkhlYWRlcihjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCBjb25zdGFudHMuRE9OVF9TSE9XLCByZXF1ZXN0RGV0YWlsc0hhc0NvbW1lbnQsIChwYXlsb2FkLmRhdGFbJ3dvcmtmbG93U3RlcHMnXSA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KSksXHJcbiAgICAgICAgcGF5bG9hZC5kYXRhLnJlcXVlc3RcclxuICAgICAgKVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAocmVzdWx0LmhlYWRlci5mb3JtSWQpIHtcclxuICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcCA9ICghcmVzdWx0LmNvbW1lbnRzRHJvcCA/IFtdIDogcmVzdWx0LmNvbW1lbnRzRHJvcCk7XHJcbiAgICAgIHRoaXMubG9hZEhpc3RvcnkocmVzdWx0LmhlYWRlci5mb3JtSWQpLnN1YnNjcmliZShcclxuICAgICAgICAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGlmIChpdGVtLnNlcXVlbmNlTnVtYmVyICE9PSAnMCcgJiYgaXRlbS5wcm9jZXNzZWRCeSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGl0ZW0ucHJvY2Vzc2VkQnlbJ2ZpcnN0TmFtZSddICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeVsnc2Vjb25kTWlkZGxlTmFtZSddICsgJyAnICsgaXRlbS5wcm9jZXNzZWRCeVsnZmFtaWx5TmFtZSddO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcC5wdXNoKG5ldyBDb21tZW50c0Ryb3AoXHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBpdGVtLnByb2Nlc3NlZEJ5LmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICBuYW1lLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtLmNvbW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgICBpdGVtWydtb2RpZmllZERhdGUnXSxcclxuICAgICAgICAgICAgICAgICAgaXRlbS5hdHRhY2htZW50cyxcclxuICAgICAgICAgICAgICAgICAgaXRlbS5wcm9jZXNzZWRCeS5qb2JcclxuICAgICAgICAgICAgICAgICkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgY29uc3QgaW5ib3hUeXBlID0gdGhpcy5nZXRJbmJveFR5cGUocmVzdWx0KTtcclxuICAgIGlmIChyZXN1bHQuaGVhZGVyLmZvcm1JZCAmJiAoIXRoaXMuaXNPcGVuT25JbmJveCgpKSkge1xyXG4gICAgICB0aGlzLmdldEluYm94SXRlbShyZXN1bHQuaGVhZGVyLmZvcm1JZCwgaW5ib3hUeXBlKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtID0gcmVzcG9uc2UuaXRlbTtcclxuICAgICAgICAgICAgcmVzdWx0LmluYm94SXRlbSA9IG5ldyBJbmJveEl0ZW0oXHJcbiAgICAgICAgICAgICAgaXRlbVsnZmxhZ2dpbmcnXS5mbGFnUHJpb3JpdHksXHJcbiAgICAgICAgICAgICAgaXRlbVsnZmxhZ2dpbmcnXVsnaXNGbGFnZ2VkJ10sXHJcbiAgICAgICAgICAgICAgaXRlbS5mZWVkYmFja1snY2FuUmVxdWVzdEZlZWRiYWNrJ10sXHJcbiAgICAgICAgICAgICAgaXRlbS5mZWVkYmFja1snaGFzRmVlZGJhY2snXSxcclxuICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrWydpc1BlbmRpbmcnXSxcclxuICAgICAgICAgICAgICBpdGVtLmZlZWRiYWNrWydpc1JlcXVlc3RlZCddLFxyXG4gICAgICAgICAgICAgIGl0ZW0uZmVlZGJhY2tbJ2lzUmVzcG9uZGVkJ11cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXlsb2FkV29ya2Zsb3dTdGVwcyA9IHBheWxvYWQuZGF0YS53b3JrZmxvd1N0ZXBzO1xyXG4gICAgaWYgKHBheWxvYWRXb3JrZmxvd1N0ZXBzICYmIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmNvbnN0cnVjdG9yID09PSBBcnJheSAmJiBwYXlsb2FkV29ya2Zsb3dTdGVwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHBheWxvYWRXb3JrZmxvd1N0ZXBzLmZvckVhY2goKHN0ZXAsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRJc1JlcXVlc3RlclNlbmRCYWNrID0gSlNPTi5zdHJpbmdpZnkoc3RlcC5kZXRhaWxzKSA9PT0gSlNPTi5zdHJpbmdpZnkoe30pO1xyXG4gICAgICAgIGxldCBoYXNDb21tZW50cyA9ICghY3VycmVudElzUmVxdWVzdGVyU2VuZEJhY2sgJiYgKHN0ZXAuZGV0YWlscy5jb21tZW50IHx8IHN0ZXAuY29tbWVudCkgPyBjb25zdGFudHMuSEFTX0NPTU1FTlRTIDogY29uc3RhbnRzLk5PX0NPTU1FTlRTKTtcclxuICAgICAgICBsZXQgY3VycmVudEFjdG9yID0gKHN0ZXAuYWN0b3IuZW1haWwgPT09IHN0ZXAuYWN0b3IucmVjaXBpZW50LmVtYWlsID8gc3RlcC5hY3Rvci5yZWNpcGllbnQgOiAoc3RlcC5hY3Rvci5kZWxlZ2F0ZSA/IHN0ZXAuYWN0b3IuZGVsZWdhdGUgOiBudWxsKSlcclxuICAgICAgICAvKiBpZiAoaGFzQ29tbWVudHMpIHtcclxuICAgICAgICAgICByZXN1bHQuY29tbWVudHNEcm9wID0gKCFyZXN1bHQuY29tbWVudHNEcm9wID8gW10gOiByZXN1bHQuY29tbWVudHNEcm9wKTtcclxuICAgICAgICAgICBpZiAoc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQgJiYgc3RlcC5kZXRhaWxzLmF0dGFjaG1lbnQuYXR0YWNobWVudElkICYmIHRoaXMuY29uZmlnLnByb2R1Y3Rpb24pIHtcclxuICAgICAgICAgICAgIC8vIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfSURMRTtcclxuICAgICAgICAgICAgIC8hKiAgICAgICAgICAgdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fTE9BRF9GSUxFLCBzdGVwLmRldGFpbHMuYXR0YWNobWVudC5hdHRhY2htZW50SWQpLnRoZW4oKHJlc3BvbnNlT2JqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvcm1hdGlvbiA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBY3Rvcikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyEqdGhpcy5kaXNwYXRjaChjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fRU1QTE9ZRUVfUFJPRklMRSwgY3VycmVudEFjdG9yLmVtYWlsKS50aGVuKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEFjdG9yLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ZXAuZGV0YWlscy5jb21tZW50ID8gc3RlcC5kZXRhaWxzLmNvbW1lbnQgOiAoc3RlcC5jb21tZW50ID8gc3RlcC5jb21tZW50IDogbnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSW5mb3JtYXRpb24uZmlsZU5hbWUgKyBcInxkYXRhOlwiICsgZmlsZUluZm9ybWF0aW9uLm1pbWVUeXBlICsgXCI7YmFzZTY0LFwiICsgZmlsZUluZm9ybWF0aW9uLmZpbGVDb250ZW50cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmpvYi5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSohL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBjb25zdGFudHMuU1RBVEVfTUFDSElORV9TVEFUVVNfRkVUQ0hJTkc7KiEvXHJcbiAgICAgICAgICAgfSBlbHNlIGlmIChzdGVwLmRldGFpbHMuYXR0YWNobWVudElkKSB7XHJcbiAgICAgICAgICAgICAvISogdGhpcy5zdGF0ZSA9IGNvbnN0YW50cy5TVEFURV9NQUNISU5FX1NUQVRVU19JRExFO1xyXG4gICAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0xPQURfRklMRSwgc3RlcC5kZXRhaWxzLmF0dGNobWVudElkKS50aGVuKChyZXNwb25zZU9iamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGVJbmZvcm1hdGlvbiA9IHJlc3BvbnNlT2JqZWN0LmJvZHk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgICAgIC8hKnRoaXMuZGlzcGF0Y2goY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX0VNUExPWUVFX1BST0ZJTEUsIGN1cnJlbnRBY3Rvci5lbWFpbCkudGhlbigocHJvZmlsZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5jb21tZW50c0Ryb3AucHVzaChuZXcgQ29tbWVudHNEcm9wKFxyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIGN1cnJlbnRBY3Rvci5lbWFpbCxcclxuICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgKHN0ZXAuZGV0YWlscy5jb21tZW50ID8gc3RlcC5kZXRhaWxzLmNvbW1lbnQgOiAoc3RlcC5jb21tZW50ID8gc3RlcC5jb21tZW50IDogbnVsbCkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcC5kYXRlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgZmlsZUluZm9ybWF0aW9uLmZpbGVOYW1lICsgXCJ8ZGF0YTpcIiArIGZpbGVJbmZvcm1hdGlvbi5taW1lVHlwZSArIFwiO2Jhc2U2NCxcIiArIGZpbGVJbmZvcm1hdGlvbi5maWxlQ29udGVudHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLmpvYi5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICAgICAgfSkqIS9cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfU1RBVFVTX0ZFVENISU5HOyohL1xyXG4gICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICBpZiAoY3VycmVudEFjdG9yKSB7XHJcbiAgICAgICAgICAgICAgIHRoaXMuZW1wbG95ZWVQcm9maWxlKGN1cnJlbnRBY3Rvci5lbWFpbCkuc3Vic2NyaWJlKChwcm9maWxlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgcmVzdWx0LmNvbW1lbnRzRHJvcC5wdXNoKG5ldyBDb21tZW50c0Ryb3AoXHJcbiAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBjdXJyZW50QWN0b3IuZW1haWwsXHJcbiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRBY3Rvci5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAoc3RlcC5kZXRhaWxzLmNvbW1lbnQgPyBzdGVwLmRldGFpbHMuY29tbWVudCA6IChzdGVwLmNvbW1lbnQgPyBzdGVwLmNvbW1lbnQgOiBudWxsKSksXHJcbiAgICAgICAgICAgICAgICAgICAgIHN0ZXAuZGF0ZSxcclxuICAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS5qb2IubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgKSlcclxuICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgfVxyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgfSovXHJcblxyXG4gICAgICAgIGlmICh3YXNTZW5kQmFjayAmJiBzdGVwLmFjdG9yLnJlY2lwaWVudC5yb2xlID09PSAnUkVRVUVTVEVSJykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJ3YXNTZW5kQmFjayAmJiBSRVFVRVNURVJcIilcclxuICAgICAgICAgIHJlc3VsdC5zZWN0aW9ucyA9IFtuZXcgU2VjdGlvbihcclxuICAgICAgICAgICAgY29uc3RhbnRzLlNFQ1RJT05fSURfUkVRVUVTVF9ERVRBSUxTLFxyXG4gICAgICAgICAgICBuZXcgU2VjdGlvbkhlYWRlcihcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIGNvbnN0YW50cy5ET05UX1NIT1csXHJcbiAgICAgICAgICAgICAgY29uc3RhbnRzLkRPTlRfU0hPVyxcclxuICAgICAgICAgICAgICBjb25zdGFudHMuRE9OVF9TSE9XLFxyXG4gICAgICAgICAgICAgIHJlcXVlc3REZXRhaWxzSGFzQ29tbWVudCxcclxuICAgICAgICAgICAgICAocGF5bG9hZC5kYXRhLndvcmtmbG93U3RlcHMgPyBjb25zdGFudHMuUkVBRF9PTkxZIDogaXNSZWFkT25seSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgcGF5bG9hZC5kYXRhLnJlcXVlc3RcclxuICAgICAgICAgICldXHJcbiAgICAgICAgfSBlbHNlIGlmICh3YXNTZW5kQmFjaykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJQb3BcIilcclxuICAgICAgICAgIGlmIChyZXN1bHQuc2VjdGlvbnMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICByZXN1bHQuc2VjdGlvbnMucG9wKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB3YXNTZW5kQmFjayA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChzdGVwLmRldGFpbHMuZGVjaXNpb24gJiYgc3RlcC5kZXRhaWxzLmRlY2lzaW9uLmtleSA9PT0gY29uc3RhbnRzLkZPUk1fU1RBVFVTX1NFTkRfQkFDSykge1xyXG4gICAgICAgICAgd2FzU2VuZEJhY2sgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkoc3RlcC5kZXRhaWxzKSAhPT0gSlNPTi5zdHJpbmdpZnkoe30pKSB7XHJcbiAgICAgICAgICByZXN1bHQuc2VjdGlvbnMucHVzaChcclxuICAgICAgICAgICAgbmV3IFNlY3Rpb24oXHJcbiAgICAgICAgICAgICAgc3RlcC5hY3Rvci5yZWNpcGllbnQucm9sZS50b0xvd2VyQ2FzZSgpICsgY29uc3RhbnRzLlNFQ1RJT05fSURfQVBQUk9WQUxfUEFSVElBTF9OQU1FLFxyXG4gICAgICAgICAgICAgIG5ldyBTZWN0aW9uSGVhZGVyKFxyXG4gICAgICAgICAgICAgICAgKGN1cnJlbnRBY3RvciA/IHRoaXMuZ2V0U2hvcnROYW1lKGN1cnJlbnRBY3Rvci5uYW1lKSA6IFwiXCIpLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICAgICAgICBzdGVwLmRhdGUsXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldFNob3J0TmFtZShzdGVwLmFjdG9yLnJlY2lwaWVudC5uYW1lKS50b1N0cmluZygpLFxyXG4gICAgICAgICAgICAgICAgY29uc3RhbnRzLklHQVRFX1NUQVRJQ19BU1NFVF9QUk9GSUxFX1BIT1RPX1VSTCArIHN0ZXAuYWN0b3IucmVjaXBpZW50LmVtYWlsLFxyXG4gICAgICAgICAgICAgICAgKHN0ZXAuYWN0b3IuZGVsZWdhdGU/Lm5hbWUgPyB0aGlzLmdldFNob3J0TmFtZShzdGVwLmFjdG9yLmRlbGVnYXRlLm5hbWUpIDogXCJcIikudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgIChzdGVwLmFjdG9yLmRlbGVnYXRlPy5lbWFpbCA/IGNvbnN0YW50cy5JR0FURV9TVEFUSUNfQVNTRVRfUFJPRklMRV9QSE9UT19VUkwgKyBzdGVwLmFjdG9yLmRlbGVnYXRlLmVtYWlsIDogXCJcIiksXHJcbiAgICAgICAgICAgICAgICBzdGVwLmFjdG9yLnN0YXR1cyxcclxuICAgICAgICAgICAgICAgIGhhc0NvbW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgKGluZGV4IDwgcGF5bG9hZFdvcmtmbG93U3RlcHMubGVuZ3RoIC0gMSA/IGNvbnN0YW50cy5SRUFEX09OTFkgOiBpc1JlYWRPbmx5KVxyXG4gICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAge2RldGFpbHM6IHN0ZXAuZGV0YWlscywgcHJvY2Vzc2luZ0RhdGU6IHN0ZXAuZGF0ZX1cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFN1Ym1pdHRlciA9IHthY3Rvcjogc3RlcC5hY3RvciwgcmVjaXBpZW50OiBzdGVwLnJlY2lwaWVudCwgZGVsZWdhdGU6IHN0ZXAuYWN0b3IuZGVsZWdhdGV9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICAvKiBDcmVhdGUgTG92IFNlY3Rpb25zICovXHJcbiAgICByZXN1bHQubG92cyA9IChwYXlsb2FkLm1ldGEgJiYgcGF5bG9hZC5tZXRhLmxvdnMgPyBwYXlsb2FkLm1ldGEubG92cyA6IG51bGwpO1xyXG5cclxuICAgIGlmIChwYXlsb2FkLm1ldGEgJiYgcGF5bG9hZC5tZXRhLm1lc3NhZ2VzKSB7XHJcbiAgICAgIHJlc3VsdC5tZXNzYWdlcyA9IG5ldyBNZXNzYWdlcyhcclxuICAgICAgICB7fSxcclxuICAgICAgICBbXSxcclxuICAgICAgICBbXSxcclxuICAgICAgICBbXVxyXG4gICAgICApO1xyXG4gICAgICBwYXlsb2FkLm1ldGEubWVzc2FnZXMuZm9yRWFjaCgobWVzc2FnZSkgPT4ge1xyXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlcy5vcmlnaW5hbE1zZ3MucHVzaChtZXNzYWdlKTtcclxuICAgICAgICByZXN1bHQubWVzc2FnZXNbbWVzc2FnZS50eXBlXS5wdXNoKG1lc3NhZ2UubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlc3VsdC5tZXNzYWdlcyA9IChwYXlsb2FkLm1ldGEgJiYgcGF5bG9hZC5tZXRhLm1lc3NhZ2VzID8gcGF5bG9hZC5tZXRhLm1lc3NhZ2VzIDogbnVsbCk7XHJcbiAgICAvKiBGaXggbGFzdCBzZWN0aW9uIHRvIGJlIHRoZSBSTy9XTSBmcm9tIHRoZSB2YXJpYWJsZSAqL1xyXG4gICAgcmVzdWx0LnNlY3Rpb25zW3Jlc3VsdC5zZWN0aW9ucy5sZW5ndGggLSAxXS5oZWFkZXIucmVhZE9ubHkgPSBpc1JlYWRPbmx5O1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkRmlsZSguLi5hcmdzOiBhbnkpIHtcclxuICAgIGNvbnN0IFtpZF0gPSBhcmdzO1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5jb25maWcucHJveHlGdWxsQWRkcmVzcyArIHRoaXMuY29uZmlnLnByb3h5U2VydmljZUZvcm1zICsgdGhpcy5jb25maWcuZm9ybUlkICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQXR0YWNobWVudCArIGlkLCB7b2JzZXJ2ZTogJ3Jlc3BvbnNlJ30pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRhdGFVUkl0b0Jsb2IoZGF0YVVSSTogYW55KSB7XHJcbiAgICBjb25zdCBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJJKTtcclxuICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGJ5dGVTdHJpbmcubGVuZ3RoKTtcclxuICAgIGNvbnN0IGludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnl0ZVN0cmluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpbnQ4QXJyYXlbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IEJsb2IoW2FycmF5QnVmZmVyXSwge3R5cGU6ICdpbWFnZS9qcGVnJ30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvYWRIaXN0b3J5KC4uLmFyZ3MpIHtcclxuICAgIGNvbnN0IFtpZF0gPSBhcmdzO1xyXG4gICAgY29uc3QgYm9keSA9IHtcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuV09SS0ZMT1dfSVRFTVMsXHJcbiAgICAgIGZvcm1JZDogaWQgPyBpZCA6IHRoaXMuY29uZmlnLmZvcm1JZCxcclxuICAgICAgZm9ybU5hbWU6IFwiYnBtXCIsXHJcbiAgICB9O1xyXG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLmdldFJlcXVlc3RPcHRpb25zKCk7XHJcbiAgICByZXR1cm4gdGhpcy5nZW5lcmFsQ2FsbEFwaShib2R5LCBjb25zdGFudHMuU1RBVEVfTUFDSElORV9BQ1RJT05fTE9BRF9ISVNUT1JZLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRJbmJveEl0ZW0oLi4uYXJncykge1xyXG4gICAgY29uc3QgW2lkLCBpbmJveFR5cGVdID0gYXJncztcclxuICAgIGNvbnN0IGJvZHkgPSB7XHJcbiAgICAgIGZvcm1OYW1lOiB0aGlzLmNvbmZpZy5mb3JtTmFtZSxcclxuICAgICAgbWV0aG9kOiBjb25zdGFudHMuSFRUUF9NRVRIT0RfR0VULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfRFAsXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBjb25zdGFudHMuU0VSVklDRV9OQU1FX0RQX0lOQk9YX0lURU0sXHJcbiAgICAgIHVybFBhcmFtZXRlcnM6IHtcclxuICAgICAgICBpbmJveGlkOiBpZCxcclxuICAgICAgICBpbmJveHR5cGU6IGluYm94VHlwZVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBsZXQgb3B0aW9ucyA9IHRoaXMuZ2V0UmVxdWVzdE9wdGlvbnMoKTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYWxDYWxsQXBpKGJvZHksIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9HRVRfSU5CT1hfSVRFTSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcHJlc3BlY3RpdmVBcHByb3ZlcnMoZGV0YWlscykge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5wcm9kdWN0aW9uKSB7XHJcbiAgICAgIGRldGFpbHMgPSB7fVxyXG4gICAgfVxyXG4gICAgbGV0IHNlcnZpY2VOYW1lID0gXCJmb3JtL1wiICsgdGhpcy5jb25maWcuZm9ybU5hbWVcclxuICAgIGlmICh0aGlzLmNvbmZpZy5mb3JtSWQpIHtcclxuICAgICAgc2VydmljZU5hbWUgPSBcImZvcm0vXCIgKyB0aGlzLmNvbmZpZy5mb3JtSWRcclxuICAgIH1cclxuICAgIGxldCBib2R5ID0ge1xyXG4gICAgICBtZXRob2Q6IGNvbnN0YW50cy5IVFRQX01FVEhPRF9QT1NULFxyXG4gICAgICBkZXN0aW5hdGlvbjogY29uc3RhbnRzLlRBUkdFVF9TRVJWRVJfV00sXHJcbiAgICAgIHNlcnZpY2VOYW1lOiBzZXJ2aWNlTmFtZVxyXG4gICAgICAsIGZvcm1OYW1lOiBjb25zdGFudHMuQVBQUk9WRVJTXHJcbiAgICAgICwgYm9keToge1xyXG4gICAgICAgIFwicmVxdWVzdFwiOiB7XHJcbiAgICAgICAgICBcImRldGFpbHNcIjpcclxuICAgICAgICAgIGRldGFpbHNcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBvcHRpb25zID0gdGhpcy5nZXRSZXF1ZXN0T3B0aW9ucygpO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhbENhbGxBcGkoYm9keSwgY29uc3RhbnRzLlNUQVRFX01BQ0hJTkVfQUNUSU9OX1NVQ0NFU1NfUkVTUE9OU0UsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhbENhbGxBcGkoYm9keSwgdHlwZTogc3RyaW5nLCBvcHRpb25zKSB7XHJcbiAgICBsZXQgYXBpVXJsID0gdGhpcy5jb25maWcucHJveHlTZXJ2aWNlQmFzZVVybCArIHRoaXMubGFuZ3VhZ2UgKyB0aGlzLmNvbmZpZy5wcm94eUZ1bGxBZGRyZXNzICsgdGhpcy5jb25maWcucHJveHlTZXJ2aWNlRXhlY3V0ZTtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdChhcGlVcmwsIGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShib2R5KSksIG9wdGlvbnMpLnBpcGUoXHJcbiAgICAgIG1hcCgocmVzcG9uc2VPYmplY3Q6IGFueSkgPT4ge1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdFxyXG4gICAgICAgIC8qc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgICAgICBjYXNlIGNvbnN0YW50cy5TVEFURV9NQUNISU5FX0FDVElPTl9MT0FEX0hJU1RPUlk6XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZU9iamVjdFxyXG4gICAgICAgIH0qL1xyXG4gICAgICB9KSxcclxuICAgICAgY2F0Y2hFcnJvcigoaHR0cEVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihodHRwRXJyb3IpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2dnZWRJblVzZXJJZCgpIHtcclxuICAgIHJldHVybiB0aGlzLnVzZXJEYXRhWydsb2dnZWRJblVzZXJFbWFpbCddO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNob3J0TmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmIChuYW1lKSB7XHJcbiAgICAgIGxldCBuYW1lVG9rZW5zID0gbmFtZS5zcGxpdCgnICcpO1xyXG4gICAgICBpZiAobmFtZVRva2Vucy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgIHJldHVybiBbbmFtZVRva2Vuc1swXV1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAobmFtZVRva2Vuc1tuYW1lVG9rZW5zLmxlbmd0aCAtIDJdLnRvTG93ZXJDYXNlKCkgPT0gJ2FsJykge1xyXG4gICAgICAgICAgcmV0dXJuIFtuYW1lVG9rZW5zWzBdLCBuYW1lVG9rZW5zW25hbWVUb2tlbnMubGVuZ3RoIC0gMl0sIG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAxXV0uam9pbignICcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gW25hbWVUb2tlbnNbMF0sIG5hbWVUb2tlbnNbbmFtZVRva2Vucy5sZW5ndGggLSAxXV0uam9pbignICcpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNNb2JpbGVBcHAoKSB7XHJcbiAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpLndtQ29uZmlnLmlzTW9iaWxlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEluYm94VHlwZShyZXN1bHQpIHtcclxuICAgIGxldCBydG4gPSBudWxsO1xyXG4gICAgaWYgKHRoaXMubG9nZ2VkSW5Vc2VySWQoKSA9PT0gcmVzdWx0LnByb2ZpbGVJbmZvRHJvcC5lbXBsb3llZUVtYWlsKSB7XHJcbiAgICAgIHJ0biA9IGNvbnN0YW50cy5JTkJPWF9TVEFUVVNfU0VOVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJ0biA9IGNvbnN0YW50cy5JTkJPWF9TVEFUVVNfUEVORElORztcclxuICAgIH1cclxuICAgIHJldHVybiBydG47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNPcGVuT25JbmJveCgpIHtcclxuICAgIHJldHVybiAod2luZG93IGFzIGFueSkud21Db25maWcub3V0bG9vaztcclxuICB9XHJcbn1cclxuIl19
|