@tiba-spark/client-shared-lib 10.3.0-667 → 10.3.0-680
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/libraries/service-proxy/edge-service-proxies.mjs +4 -2
- package/esm2022/libraries/service-proxy/identity-service-proxies.mjs +3028 -0
- package/esm2022/libraries/service-proxy/index.mjs +2 -1
- package/fesm2022/tiba-spark-client-shared-lib.mjs +5157 -2068
- package/fesm2022/tiba-spark-client-shared-lib.mjs.map +1 -1
- package/libraries/service-proxy/edge-service-proxies.d.ts +1 -1
- package/libraries/service-proxy/edge-service-proxies.d.ts.map +1 -1
- package/libraries/service-proxy/identity-service-proxies.d.ts +1198 -0
- package/libraries/service-proxy/identity-service-proxies.d.ts.map +1 -0
- package/libraries/service-proxy/index.d.ts +1 -0
- package/libraries/service-proxy/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,3028 @@
|
|
|
1
|
+
//----------------------
|
|
2
|
+
// <auto-generated>
|
|
3
|
+
// Generated using the NSwag toolchain v14.0.7.0 (NJsonSchema v11.0.0.0 (Newtonsoft.Json v13.0.0.0)) (http://NSwag.org)
|
|
4
|
+
// </auto-generated>
|
|
5
|
+
//----------------------
|
|
6
|
+
/* tslint:disable */
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
// ReSharper disable InconsistentNaming
|
|
9
|
+
import { mergeMap as _observableMergeMap, catchError as _observableCatch } from 'rxjs/operators';
|
|
10
|
+
import { Observable, throwError as _observableThrow, of as _observableOf } from 'rxjs';
|
|
11
|
+
import { Injectable, Inject, Optional, InjectionToken } from '@angular/core';
|
|
12
|
+
import { HttpClient, HttpHeaders, HttpResponse, HttpResponseBase } from '@angular/common/http';
|
|
13
|
+
import moment from 'moment';
|
|
14
|
+
import * as i0 from "@angular/core";
|
|
15
|
+
import * as i1 from "@angular/common/http";
|
|
16
|
+
export const API_BASE_URL = new InjectionToken('API_BASE_URL');
|
|
17
|
+
export class ConfigurationServiceProxyIdentity {
|
|
18
|
+
constructor(http, baseUrl) {
|
|
19
|
+
this.jsonParseReviver = undefined;
|
|
20
|
+
this.http = http;
|
|
21
|
+
this.baseUrl = baseUrl ?? "";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @return Success
|
|
25
|
+
*/
|
|
26
|
+
getHealth() {
|
|
27
|
+
let url_ = this.baseUrl + "/api/services/configuration/health";
|
|
28
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
29
|
+
let options_ = {
|
|
30
|
+
observe: "response",
|
|
31
|
+
responseType: "blob",
|
|
32
|
+
headers: new HttpHeaders({
|
|
33
|
+
"Accept": "text/plain"
|
|
34
|
+
})
|
|
35
|
+
};
|
|
36
|
+
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
37
|
+
return this.processGetHealth(response_);
|
|
38
|
+
})).pipe(_observableCatch((response_) => {
|
|
39
|
+
if (response_ instanceof HttpResponseBase) {
|
|
40
|
+
try {
|
|
41
|
+
return this.processGetHealth(response_);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return _observableThrow(e);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else
|
|
48
|
+
return _observableThrow(response_);
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
processGetHealth(response) {
|
|
52
|
+
const status = response.status;
|
|
53
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
54
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
55
|
+
let _headers = {};
|
|
56
|
+
if (response.headers) {
|
|
57
|
+
for (let key of response.headers.keys()) {
|
|
58
|
+
_headers[key] = response.headers.get(key);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (status === 200) {
|
|
62
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
63
|
+
let result200 = null;
|
|
64
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
65
|
+
result200 = HealthDtoHttpResponseData.fromJS(resultData200);
|
|
66
|
+
return _observableOf(result200);
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
else if (status !== 200 && status !== 204) {
|
|
70
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
71
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
return _observableOf(null);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @return Success
|
|
78
|
+
*/
|
|
79
|
+
getOnlineValidatorVersion() {
|
|
80
|
+
let url_ = this.baseUrl + "/api/services/configuration/online-validator-version";
|
|
81
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
82
|
+
let options_ = {
|
|
83
|
+
observe: "response",
|
|
84
|
+
responseType: "blob",
|
|
85
|
+
headers: new HttpHeaders({
|
|
86
|
+
"Accept": "text/plain"
|
|
87
|
+
})
|
|
88
|
+
};
|
|
89
|
+
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
90
|
+
return this.processGetOnlineValidatorVersion(response_);
|
|
91
|
+
})).pipe(_observableCatch((response_) => {
|
|
92
|
+
if (response_ instanceof HttpResponseBase) {
|
|
93
|
+
try {
|
|
94
|
+
return this.processGetOnlineValidatorVersion(response_);
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
return _observableThrow(e);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else
|
|
101
|
+
return _observableThrow(response_);
|
|
102
|
+
}));
|
|
103
|
+
}
|
|
104
|
+
processGetOnlineValidatorVersion(response) {
|
|
105
|
+
const status = response.status;
|
|
106
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
107
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
108
|
+
let _headers = {};
|
|
109
|
+
if (response.headers) {
|
|
110
|
+
for (let key of response.headers.keys()) {
|
|
111
|
+
_headers[key] = response.headers.get(key);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (status === 200) {
|
|
115
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
116
|
+
let result200 = null;
|
|
117
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
118
|
+
result200 = ObjectHttpResponseData.fromJS(resultData200);
|
|
119
|
+
return _observableOf(result200);
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
else if (status !== 200 && status !== 204) {
|
|
123
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
124
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
return _observableOf(null);
|
|
128
|
+
}
|
|
129
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationServiceProxyIdentity, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
130
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationServiceProxyIdentity }); }
|
|
131
|
+
}
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ConfigurationServiceProxyIdentity, decorators: [{
|
|
133
|
+
type: Injectable
|
|
134
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
|
|
135
|
+
type: Inject,
|
|
136
|
+
args: [HttpClient]
|
|
137
|
+
}] }, { type: undefined, decorators: [{
|
|
138
|
+
type: Optional
|
|
139
|
+
}, {
|
|
140
|
+
type: Inject,
|
|
141
|
+
args: [API_BASE_URL]
|
|
142
|
+
}] }]; } });
|
|
143
|
+
export class ThirdPartyServiceProxyIdentity {
|
|
144
|
+
constructor(http, baseUrl) {
|
|
145
|
+
this.jsonParseReviver = undefined;
|
|
146
|
+
this.http = http;
|
|
147
|
+
this.baseUrl = baseUrl ?? "";
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @return Success
|
|
151
|
+
*/
|
|
152
|
+
me() {
|
|
153
|
+
let url_ = this.baseUrl + "/api/services/thirdparty/me";
|
|
154
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
155
|
+
let options_ = {
|
|
156
|
+
observe: "response",
|
|
157
|
+
responseType: "blob",
|
|
158
|
+
headers: new HttpHeaders({
|
|
159
|
+
"Accept": "text/plain"
|
|
160
|
+
})
|
|
161
|
+
};
|
|
162
|
+
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
163
|
+
return this.processMe(response_);
|
|
164
|
+
})).pipe(_observableCatch((response_) => {
|
|
165
|
+
if (response_ instanceof HttpResponseBase) {
|
|
166
|
+
try {
|
|
167
|
+
return this.processMe(response_);
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
return _observableThrow(e);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else
|
|
174
|
+
return _observableThrow(response_);
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
processMe(response) {
|
|
178
|
+
const status = response.status;
|
|
179
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
180
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
181
|
+
let _headers = {};
|
|
182
|
+
if (response.headers) {
|
|
183
|
+
for (let key of response.headers.keys()) {
|
|
184
|
+
_headers[key] = response.headers.get(key);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
if (status === 200) {
|
|
188
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
189
|
+
let result200 = null;
|
|
190
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
191
|
+
result200 = ThirdPartyVendorDtoHttpResponseData.fromJS(resultData200);
|
|
192
|
+
return _observableOf(result200);
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
else if (status !== 200 && status !== 204) {
|
|
196
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
197
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
198
|
+
}));
|
|
199
|
+
}
|
|
200
|
+
return _observableOf(null);
|
|
201
|
+
}
|
|
202
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThirdPartyServiceProxyIdentity, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
203
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThirdPartyServiceProxyIdentity }); }
|
|
204
|
+
}
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ThirdPartyServiceProxyIdentity, decorators: [{
|
|
206
|
+
type: Injectable
|
|
207
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
|
|
208
|
+
type: Inject,
|
|
209
|
+
args: [HttpClient]
|
|
210
|
+
}] }, { type: undefined, decorators: [{
|
|
211
|
+
type: Optional
|
|
212
|
+
}, {
|
|
213
|
+
type: Inject,
|
|
214
|
+
args: [API_BASE_URL]
|
|
215
|
+
}] }]; } });
|
|
216
|
+
export class UsersServiceProxyIdentity {
|
|
217
|
+
constructor(http, baseUrl) {
|
|
218
|
+
this.jsonParseReviver = undefined;
|
|
219
|
+
this.http = http;
|
|
220
|
+
this.baseUrl = baseUrl ?? "";
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* @param body (optional)
|
|
224
|
+
* @return Success
|
|
225
|
+
*/
|
|
226
|
+
authenticate(body) {
|
|
227
|
+
let url_ = this.baseUrl + "/api/services/users/authenticate";
|
|
228
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
229
|
+
const content_ = JSON.stringify(body);
|
|
230
|
+
let options_ = {
|
|
231
|
+
body: content_,
|
|
232
|
+
observe: "response",
|
|
233
|
+
responseType: "blob",
|
|
234
|
+
headers: new HttpHeaders({
|
|
235
|
+
"Content-Type": "application/json-patch+json",
|
|
236
|
+
"Accept": "text/plain"
|
|
237
|
+
})
|
|
238
|
+
};
|
|
239
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
240
|
+
return this.processAuthenticate(response_);
|
|
241
|
+
})).pipe(_observableCatch((response_) => {
|
|
242
|
+
if (response_ instanceof HttpResponseBase) {
|
|
243
|
+
try {
|
|
244
|
+
return this.processAuthenticate(response_);
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
return _observableThrow(e);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
else
|
|
251
|
+
return _observableThrow(response_);
|
|
252
|
+
}));
|
|
253
|
+
}
|
|
254
|
+
processAuthenticate(response) {
|
|
255
|
+
const status = response.status;
|
|
256
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
257
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
258
|
+
let _headers = {};
|
|
259
|
+
if (response.headers) {
|
|
260
|
+
for (let key of response.headers.keys()) {
|
|
261
|
+
_headers[key] = response.headers.get(key);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (status === 200) {
|
|
265
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
266
|
+
let result200 = null;
|
|
267
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
268
|
+
result200 = AuthenticateRequestDtoHttpResponseData.fromJS(resultData200);
|
|
269
|
+
return _observableOf(result200);
|
|
270
|
+
}));
|
|
271
|
+
}
|
|
272
|
+
else if (status === 401) {
|
|
273
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
274
|
+
let result401 = null;
|
|
275
|
+
let resultData401 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
276
|
+
result401 = AuthenticateErrorResponseDtoHttpResponseData.fromJS(resultData401);
|
|
277
|
+
return throwException("Unauthorized", status, _responseText, _headers, result401);
|
|
278
|
+
}));
|
|
279
|
+
}
|
|
280
|
+
else if (status !== 200 && status !== 204) {
|
|
281
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
282
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
283
|
+
}));
|
|
284
|
+
}
|
|
285
|
+
return _observableOf(null);
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* @param refreshToken (optional)
|
|
289
|
+
* @return Success
|
|
290
|
+
*/
|
|
291
|
+
refreshToken(refreshToken) {
|
|
292
|
+
let url_ = this.baseUrl + "/api/services/users/refreshtoken";
|
|
293
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
294
|
+
let options_ = {
|
|
295
|
+
observe: "response",
|
|
296
|
+
responseType: "blob",
|
|
297
|
+
headers: new HttpHeaders({
|
|
298
|
+
"RefreshToken": refreshToken !== undefined && refreshToken !== null ? "" + refreshToken : "",
|
|
299
|
+
"Accept": "text/plain"
|
|
300
|
+
})
|
|
301
|
+
};
|
|
302
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
303
|
+
return this.processRefreshToken(response_);
|
|
304
|
+
})).pipe(_observableCatch((response_) => {
|
|
305
|
+
if (response_ instanceof HttpResponseBase) {
|
|
306
|
+
try {
|
|
307
|
+
return this.processRefreshToken(response_);
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
return _observableThrow(e);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else
|
|
314
|
+
return _observableThrow(response_);
|
|
315
|
+
}));
|
|
316
|
+
}
|
|
317
|
+
processRefreshToken(response) {
|
|
318
|
+
const status = response.status;
|
|
319
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
320
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
321
|
+
let _headers = {};
|
|
322
|
+
if (response.headers) {
|
|
323
|
+
for (let key of response.headers.keys()) {
|
|
324
|
+
_headers[key] = response.headers.get(key);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
if (status === 200) {
|
|
328
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
329
|
+
let result200 = null;
|
|
330
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
331
|
+
result200 = RefreshTokenDtoHttpResponseData.fromJS(resultData200);
|
|
332
|
+
return _observableOf(result200);
|
|
333
|
+
}));
|
|
334
|
+
}
|
|
335
|
+
else if (status !== 200 && status !== 204) {
|
|
336
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
337
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
return _observableOf(null);
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* @param activationToken (optional)
|
|
344
|
+
* @param passwordChangeType (optional)
|
|
345
|
+
* @return Success
|
|
346
|
+
*/
|
|
347
|
+
validateActivation(activationToken, passwordChangeType) {
|
|
348
|
+
let url_ = this.baseUrl + "/api/services/users/validate-activation?";
|
|
349
|
+
if (passwordChangeType === null)
|
|
350
|
+
throw new Error("The parameter 'passwordChangeType' cannot be null.");
|
|
351
|
+
else if (passwordChangeType !== undefined)
|
|
352
|
+
url_ += "passwordChangeType=" + encodeURIComponent("" + passwordChangeType) + "&";
|
|
353
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
354
|
+
let options_ = {
|
|
355
|
+
observe: "response",
|
|
356
|
+
responseType: "blob",
|
|
357
|
+
headers: new HttpHeaders({
|
|
358
|
+
"ActivationToken": activationToken !== undefined && activationToken !== null ? "" + activationToken : "",
|
|
359
|
+
"Accept": "text/plain"
|
|
360
|
+
})
|
|
361
|
+
};
|
|
362
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
363
|
+
return this.processValidateActivation(response_);
|
|
364
|
+
})).pipe(_observableCatch((response_) => {
|
|
365
|
+
if (response_ instanceof HttpResponseBase) {
|
|
366
|
+
try {
|
|
367
|
+
return this.processValidateActivation(response_);
|
|
368
|
+
}
|
|
369
|
+
catch (e) {
|
|
370
|
+
return _observableThrow(e);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else
|
|
374
|
+
return _observableThrow(response_);
|
|
375
|
+
}));
|
|
376
|
+
}
|
|
377
|
+
processValidateActivation(response) {
|
|
378
|
+
const status = response.status;
|
|
379
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
380
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
381
|
+
let _headers = {};
|
|
382
|
+
if (response.headers) {
|
|
383
|
+
for (let key of response.headers.keys()) {
|
|
384
|
+
_headers[key] = response.headers.get(key);
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (status === 200) {
|
|
388
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
389
|
+
let result200 = null;
|
|
390
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
391
|
+
result200 = ValidateActivationUserDtoHttpResponseData.fromJS(resultData200);
|
|
392
|
+
return _observableOf(result200);
|
|
393
|
+
}));
|
|
394
|
+
}
|
|
395
|
+
else if (status !== 200 && status !== 204) {
|
|
396
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
397
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
398
|
+
}));
|
|
399
|
+
}
|
|
400
|
+
return _observableOf(null);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* @param body (optional)
|
|
404
|
+
* @return Success
|
|
405
|
+
*/
|
|
406
|
+
mobileAuthenticate(body) {
|
|
407
|
+
let url_ = this.baseUrl + "/api/services/users/authenticate-mobile";
|
|
408
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
409
|
+
const content_ = JSON.stringify(body);
|
|
410
|
+
let options_ = {
|
|
411
|
+
body: content_,
|
|
412
|
+
observe: "response",
|
|
413
|
+
responseType: "blob",
|
|
414
|
+
headers: new HttpHeaders({
|
|
415
|
+
"Content-Type": "application/json-patch+json",
|
|
416
|
+
"Accept": "text/plain"
|
|
417
|
+
})
|
|
418
|
+
};
|
|
419
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
420
|
+
return this.processMobileAuthenticate(response_);
|
|
421
|
+
})).pipe(_observableCatch((response_) => {
|
|
422
|
+
if (response_ instanceof HttpResponseBase) {
|
|
423
|
+
try {
|
|
424
|
+
return this.processMobileAuthenticate(response_);
|
|
425
|
+
}
|
|
426
|
+
catch (e) {
|
|
427
|
+
return _observableThrow(e);
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
else
|
|
431
|
+
return _observableThrow(response_);
|
|
432
|
+
}));
|
|
433
|
+
}
|
|
434
|
+
processMobileAuthenticate(response) {
|
|
435
|
+
const status = response.status;
|
|
436
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
437
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
438
|
+
let _headers = {};
|
|
439
|
+
if (response.headers) {
|
|
440
|
+
for (let key of response.headers.keys()) {
|
|
441
|
+
_headers[key] = response.headers.get(key);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (status === 200) {
|
|
445
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
446
|
+
let result200 = null;
|
|
447
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
448
|
+
result200 = Int32AuthenticateResponseDtoIDictionaryHttpResponseData.fromJS(resultData200);
|
|
449
|
+
return _observableOf(result200);
|
|
450
|
+
}));
|
|
451
|
+
}
|
|
452
|
+
else if (status === 401) {
|
|
453
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
454
|
+
let result401 = null;
|
|
455
|
+
let resultData401 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
456
|
+
result401 = AuthenticateErrorResponseDtoHttpResponseData.fromJS(resultData401);
|
|
457
|
+
return throwException("Unauthorized", status, _responseText, _headers, result401);
|
|
458
|
+
}));
|
|
459
|
+
}
|
|
460
|
+
else if (status !== 200 && status !== 204) {
|
|
461
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
462
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
463
|
+
}));
|
|
464
|
+
}
|
|
465
|
+
return _observableOf(null);
|
|
466
|
+
}
|
|
467
|
+
/**
|
|
468
|
+
* @param body (optional)
|
|
469
|
+
* @return Success
|
|
470
|
+
*/
|
|
471
|
+
multiTenantsAuthenticate(body) {
|
|
472
|
+
let url_ = this.baseUrl + "/api/services/users/multi-tenants-authenticate";
|
|
473
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
474
|
+
const content_ = JSON.stringify(body);
|
|
475
|
+
let options_ = {
|
|
476
|
+
body: content_,
|
|
477
|
+
observe: "response",
|
|
478
|
+
responseType: "blob",
|
|
479
|
+
headers: new HttpHeaders({
|
|
480
|
+
"Content-Type": "application/json-patch+json",
|
|
481
|
+
"Accept": "text/plain"
|
|
482
|
+
})
|
|
483
|
+
};
|
|
484
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
485
|
+
return this.processMultiTenantsAuthenticate(response_);
|
|
486
|
+
})).pipe(_observableCatch((response_) => {
|
|
487
|
+
if (response_ instanceof HttpResponseBase) {
|
|
488
|
+
try {
|
|
489
|
+
return this.processMultiTenantsAuthenticate(response_);
|
|
490
|
+
}
|
|
491
|
+
catch (e) {
|
|
492
|
+
return _observableThrow(e);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
else
|
|
496
|
+
return _observableThrow(response_);
|
|
497
|
+
}));
|
|
498
|
+
}
|
|
499
|
+
processMultiTenantsAuthenticate(response) {
|
|
500
|
+
const status = response.status;
|
|
501
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
502
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
503
|
+
let _headers = {};
|
|
504
|
+
if (response.headers) {
|
|
505
|
+
for (let key of response.headers.keys()) {
|
|
506
|
+
_headers[key] = response.headers.get(key);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
if (status === 200) {
|
|
510
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
511
|
+
let result200 = null;
|
|
512
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
513
|
+
result200 = AuthenticateResponseDtoListHttpResponseData.fromJS(resultData200);
|
|
514
|
+
return _observableOf(result200);
|
|
515
|
+
}));
|
|
516
|
+
}
|
|
517
|
+
else if (status === 401) {
|
|
518
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
519
|
+
let result401 = null;
|
|
520
|
+
let resultData401 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
521
|
+
result401 = AuthenticateErrorResponseDtoHttpResponseData.fromJS(resultData401);
|
|
522
|
+
return throwException("Unauthorized", status, _responseText, _headers, result401);
|
|
523
|
+
}));
|
|
524
|
+
}
|
|
525
|
+
else if (status !== 200 && status !== 204) {
|
|
526
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
527
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
528
|
+
}));
|
|
529
|
+
}
|
|
530
|
+
return _observableOf(null);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* @param body (optional)
|
|
534
|
+
* @return Success
|
|
535
|
+
*/
|
|
536
|
+
verify2FactorAuthentication(body) {
|
|
537
|
+
let url_ = this.baseUrl + "/api/services/users/verify-2fa-auth";
|
|
538
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
539
|
+
const content_ = JSON.stringify(body);
|
|
540
|
+
let options_ = {
|
|
541
|
+
body: content_,
|
|
542
|
+
observe: "response",
|
|
543
|
+
responseType: "blob",
|
|
544
|
+
headers: new HttpHeaders({
|
|
545
|
+
"Content-Type": "application/json-patch+json",
|
|
546
|
+
"Accept": "text/plain"
|
|
547
|
+
})
|
|
548
|
+
};
|
|
549
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
550
|
+
return this.processVerify2FactorAuthentication(response_);
|
|
551
|
+
})).pipe(_observableCatch((response_) => {
|
|
552
|
+
if (response_ instanceof HttpResponseBase) {
|
|
553
|
+
try {
|
|
554
|
+
return this.processVerify2FactorAuthentication(response_);
|
|
555
|
+
}
|
|
556
|
+
catch (e) {
|
|
557
|
+
return _observableThrow(e);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
else
|
|
561
|
+
return _observableThrow(response_);
|
|
562
|
+
}));
|
|
563
|
+
}
|
|
564
|
+
processVerify2FactorAuthentication(response) {
|
|
565
|
+
const status = response.status;
|
|
566
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
567
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
568
|
+
let _headers = {};
|
|
569
|
+
if (response.headers) {
|
|
570
|
+
for (let key of response.headers.keys()) {
|
|
571
|
+
_headers[key] = response.headers.get(key);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
if (status === 200) {
|
|
575
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
576
|
+
let result200 = null;
|
|
577
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
578
|
+
result200 = Verify2FactorAuthResponsetDtoHttpResponseData.fromJS(resultData200);
|
|
579
|
+
return _observableOf(result200);
|
|
580
|
+
}));
|
|
581
|
+
}
|
|
582
|
+
else if (status === 401) {
|
|
583
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
584
|
+
let result401 = null;
|
|
585
|
+
let resultData401 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
586
|
+
result401 = Verify2FactorAuthResponsetDtoHttpResponseData.fromJS(resultData401);
|
|
587
|
+
return throwException("Unauthorized", status, _responseText, _headers, result401);
|
|
588
|
+
}));
|
|
589
|
+
}
|
|
590
|
+
else if (status !== 200 && status !== 204) {
|
|
591
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
592
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
593
|
+
}));
|
|
594
|
+
}
|
|
595
|
+
return _observableOf(null);
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* @return Success
|
|
599
|
+
*/
|
|
600
|
+
enable2FactorAuthForUser(userId) {
|
|
601
|
+
let url_ = this.baseUrl + "/api/services/users/{userId}/enable-2fa";
|
|
602
|
+
if (userId === undefined || userId === null)
|
|
603
|
+
throw new Error("The parameter 'userId' must be defined.");
|
|
604
|
+
url_ = url_.replace("{userId}", encodeURIComponent("" + userId));
|
|
605
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
606
|
+
let options_ = {
|
|
607
|
+
observe: "response",
|
|
608
|
+
responseType: "blob",
|
|
609
|
+
headers: new HttpHeaders({
|
|
610
|
+
"Accept": "text/plain"
|
|
611
|
+
})
|
|
612
|
+
};
|
|
613
|
+
return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
614
|
+
return this.processEnable2FactorAuthForUser(response_);
|
|
615
|
+
})).pipe(_observableCatch((response_) => {
|
|
616
|
+
if (response_ instanceof HttpResponseBase) {
|
|
617
|
+
try {
|
|
618
|
+
return this.processEnable2FactorAuthForUser(response_);
|
|
619
|
+
}
|
|
620
|
+
catch (e) {
|
|
621
|
+
return _observableThrow(e);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
else
|
|
625
|
+
return _observableThrow(response_);
|
|
626
|
+
}));
|
|
627
|
+
}
|
|
628
|
+
processEnable2FactorAuthForUser(response) {
|
|
629
|
+
const status = response.status;
|
|
630
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
631
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
632
|
+
let _headers = {};
|
|
633
|
+
if (response.headers) {
|
|
634
|
+
for (let key of response.headers.keys()) {
|
|
635
|
+
_headers[key] = response.headers.get(key);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
if (status === 200) {
|
|
639
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
640
|
+
let result200 = null;
|
|
641
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
642
|
+
result200 = Toggle2FactorAuthForUserResponseDtoHttpResponseData.fromJS(resultData200);
|
|
643
|
+
return _observableOf(result200);
|
|
644
|
+
}));
|
|
645
|
+
}
|
|
646
|
+
else if (status !== 200 && status !== 204) {
|
|
647
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
648
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
649
|
+
}));
|
|
650
|
+
}
|
|
651
|
+
return _observableOf(null);
|
|
652
|
+
}
|
|
653
|
+
/**
|
|
654
|
+
* @return Success
|
|
655
|
+
*/
|
|
656
|
+
disable2FactorAuthForUser(userId) {
|
|
657
|
+
let url_ = this.baseUrl + "/api/services/users/{userId}/disable-2fa";
|
|
658
|
+
if (userId === undefined || userId === null)
|
|
659
|
+
throw new Error("The parameter 'userId' must be defined.");
|
|
660
|
+
url_ = url_.replace("{userId}", encodeURIComponent("" + userId));
|
|
661
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
662
|
+
let options_ = {
|
|
663
|
+
observe: "response",
|
|
664
|
+
responseType: "blob",
|
|
665
|
+
headers: new HttpHeaders({
|
|
666
|
+
"Accept": "text/plain"
|
|
667
|
+
})
|
|
668
|
+
};
|
|
669
|
+
return this.http.request("put", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
670
|
+
return this.processDisable2FactorAuthForUser(response_);
|
|
671
|
+
})).pipe(_observableCatch((response_) => {
|
|
672
|
+
if (response_ instanceof HttpResponseBase) {
|
|
673
|
+
try {
|
|
674
|
+
return this.processDisable2FactorAuthForUser(response_);
|
|
675
|
+
}
|
|
676
|
+
catch (e) {
|
|
677
|
+
return _observableThrow(e);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
else
|
|
681
|
+
return _observableThrow(response_);
|
|
682
|
+
}));
|
|
683
|
+
}
|
|
684
|
+
processDisable2FactorAuthForUser(response) {
|
|
685
|
+
const status = response.status;
|
|
686
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
687
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
688
|
+
let _headers = {};
|
|
689
|
+
if (response.headers) {
|
|
690
|
+
for (let key of response.headers.keys()) {
|
|
691
|
+
_headers[key] = response.headers.get(key);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
if (status === 200) {
|
|
695
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
696
|
+
let result200 = null;
|
|
697
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
698
|
+
result200 = Toggle2FactorAuthForUserResponseDtoHttpResponseData.fromJS(resultData200);
|
|
699
|
+
return _observableOf(result200);
|
|
700
|
+
}));
|
|
701
|
+
}
|
|
702
|
+
else if (status !== 200 && status !== 204) {
|
|
703
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
704
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
705
|
+
}));
|
|
706
|
+
}
|
|
707
|
+
return _observableOf(null);
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* @param body (optional)
|
|
711
|
+
* @return Success
|
|
712
|
+
*/
|
|
713
|
+
smsAuth(body) {
|
|
714
|
+
let url_ = this.baseUrl + "/api/v1.0/users/sms-auth";
|
|
715
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
716
|
+
const content_ = JSON.stringify(body);
|
|
717
|
+
let options_ = {
|
|
718
|
+
body: content_,
|
|
719
|
+
observe: "response",
|
|
720
|
+
responseType: "blob",
|
|
721
|
+
headers: new HttpHeaders({
|
|
722
|
+
"Content-Type": "application/json-patch+json",
|
|
723
|
+
})
|
|
724
|
+
};
|
|
725
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
726
|
+
return this.processSmsAuth(response_);
|
|
727
|
+
})).pipe(_observableCatch((response_) => {
|
|
728
|
+
if (response_ instanceof HttpResponseBase) {
|
|
729
|
+
try {
|
|
730
|
+
return this.processSmsAuth(response_);
|
|
731
|
+
}
|
|
732
|
+
catch (e) {
|
|
733
|
+
return _observableThrow(e);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
else
|
|
737
|
+
return _observableThrow(response_);
|
|
738
|
+
}));
|
|
739
|
+
}
|
|
740
|
+
processSmsAuth(response) {
|
|
741
|
+
const status = response.status;
|
|
742
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
743
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
744
|
+
let _headers = {};
|
|
745
|
+
if (response.headers) {
|
|
746
|
+
for (let key of response.headers.keys()) {
|
|
747
|
+
_headers[key] = response.headers.get(key);
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
if (status === 200) {
|
|
751
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
752
|
+
return _observableOf(null);
|
|
753
|
+
}));
|
|
754
|
+
}
|
|
755
|
+
else if (status !== 200 && status !== 204) {
|
|
756
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
757
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
758
|
+
}));
|
|
759
|
+
}
|
|
760
|
+
return _observableOf(null);
|
|
761
|
+
}
|
|
762
|
+
/**
|
|
763
|
+
* @param body (optional)
|
|
764
|
+
* @return Success
|
|
765
|
+
*/
|
|
766
|
+
mobileLogin(body) {
|
|
767
|
+
let url_ = this.baseUrl + "/api/v1.0/users/mobile-login";
|
|
768
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
769
|
+
const content_ = JSON.stringify(body);
|
|
770
|
+
let options_ = {
|
|
771
|
+
body: content_,
|
|
772
|
+
observe: "response",
|
|
773
|
+
responseType: "blob",
|
|
774
|
+
headers: new HttpHeaders({
|
|
775
|
+
"Content-Type": "application/json-patch+json",
|
|
776
|
+
})
|
|
777
|
+
};
|
|
778
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
779
|
+
return this.processMobileLogin(response_);
|
|
780
|
+
})).pipe(_observableCatch((response_) => {
|
|
781
|
+
if (response_ instanceof HttpResponseBase) {
|
|
782
|
+
try {
|
|
783
|
+
return this.processMobileLogin(response_);
|
|
784
|
+
}
|
|
785
|
+
catch (e) {
|
|
786
|
+
return _observableThrow(e);
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
else
|
|
790
|
+
return _observableThrow(response_);
|
|
791
|
+
}));
|
|
792
|
+
}
|
|
793
|
+
processMobileLogin(response) {
|
|
794
|
+
const status = response.status;
|
|
795
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
796
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
797
|
+
let _headers = {};
|
|
798
|
+
if (response.headers) {
|
|
799
|
+
for (let key of response.headers.keys()) {
|
|
800
|
+
_headers[key] = response.headers.get(key);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
if (status === 200) {
|
|
804
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
805
|
+
return _observableOf(null);
|
|
806
|
+
}));
|
|
807
|
+
}
|
|
808
|
+
else if (status !== 200 && status !== 204) {
|
|
809
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
810
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
811
|
+
}));
|
|
812
|
+
}
|
|
813
|
+
return _observableOf(null);
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* @param code (optional)
|
|
817
|
+
* @param tenantName (optional)
|
|
818
|
+
* @return Success
|
|
819
|
+
*/
|
|
820
|
+
openIdAuthenticate(code, tenantName) {
|
|
821
|
+
let url_ = this.baseUrl + "/api/services/users/oidc-auth?";
|
|
822
|
+
if (code === null)
|
|
823
|
+
throw new Error("The parameter 'code' cannot be null.");
|
|
824
|
+
else if (code !== undefined)
|
|
825
|
+
url_ += "code=" + encodeURIComponent("" + code) + "&";
|
|
826
|
+
if (tenantName === null)
|
|
827
|
+
throw new Error("The parameter 'tenantName' cannot be null.");
|
|
828
|
+
else if (tenantName !== undefined)
|
|
829
|
+
url_ += "tenantName=" + encodeURIComponent("" + tenantName) + "&";
|
|
830
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
831
|
+
let options_ = {
|
|
832
|
+
observe: "response",
|
|
833
|
+
responseType: "blob",
|
|
834
|
+
headers: new HttpHeaders({
|
|
835
|
+
"Accept": "text/plain"
|
|
836
|
+
})
|
|
837
|
+
};
|
|
838
|
+
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
839
|
+
return this.processOpenIdAuthenticate(response_);
|
|
840
|
+
})).pipe(_observableCatch((response_) => {
|
|
841
|
+
if (response_ instanceof HttpResponseBase) {
|
|
842
|
+
try {
|
|
843
|
+
return this.processOpenIdAuthenticate(response_);
|
|
844
|
+
}
|
|
845
|
+
catch (e) {
|
|
846
|
+
return _observableThrow(e);
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
else
|
|
850
|
+
return _observableThrow(response_);
|
|
851
|
+
}));
|
|
852
|
+
}
|
|
853
|
+
processOpenIdAuthenticate(response) {
|
|
854
|
+
const status = response.status;
|
|
855
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
856
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
857
|
+
let _headers = {};
|
|
858
|
+
if (response.headers) {
|
|
859
|
+
for (let key of response.headers.keys()) {
|
|
860
|
+
_headers[key] = response.headers.get(key);
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
if (status === 200) {
|
|
864
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
865
|
+
let result200 = null;
|
|
866
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
867
|
+
result200 = AuthenticateResponseDtoHttpResponseData.fromJS(resultData200);
|
|
868
|
+
return _observableOf(result200);
|
|
869
|
+
}));
|
|
870
|
+
}
|
|
871
|
+
else if (status === 202) {
|
|
872
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
873
|
+
let result202 = null;
|
|
874
|
+
let resultData202 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
875
|
+
result202 = AuthenticateResponseDtoHttpResponseData.fromJS(resultData202);
|
|
876
|
+
return _observableOf(result202);
|
|
877
|
+
}));
|
|
878
|
+
}
|
|
879
|
+
else if (status === 401) {
|
|
880
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
881
|
+
let result401 = null;
|
|
882
|
+
let resultData401 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
883
|
+
result401 = AuthenticateErrorResponseDtoHttpResponseData.fromJS(resultData401);
|
|
884
|
+
return throwException("Unauthorized", status, _responseText, _headers, result401);
|
|
885
|
+
}));
|
|
886
|
+
}
|
|
887
|
+
else if (status !== 200 && status !== 204) {
|
|
888
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
889
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
890
|
+
}));
|
|
891
|
+
}
|
|
892
|
+
return _observableOf(null);
|
|
893
|
+
}
|
|
894
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UsersServiceProxyIdentity, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
895
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UsersServiceProxyIdentity }); }
|
|
896
|
+
}
|
|
897
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UsersServiceProxyIdentity, decorators: [{
|
|
898
|
+
type: Injectable
|
|
899
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
|
|
900
|
+
type: Inject,
|
|
901
|
+
args: [HttpClient]
|
|
902
|
+
}] }, { type: undefined, decorators: [{
|
|
903
|
+
type: Optional
|
|
904
|
+
}, {
|
|
905
|
+
type: Inject,
|
|
906
|
+
args: [API_BASE_URL]
|
|
907
|
+
}] }]; } });
|
|
908
|
+
export class ValidationServiceProxyIdentity {
|
|
909
|
+
constructor(http, baseUrl) {
|
|
910
|
+
this.jsonParseReviver = undefined;
|
|
911
|
+
this.http = http;
|
|
912
|
+
this.baseUrl = baseUrl ?? "";
|
|
913
|
+
}
|
|
914
|
+
/**
|
|
915
|
+
* @return Success
|
|
916
|
+
*/
|
|
917
|
+
getOnlineValidatorContext() {
|
|
918
|
+
let url_ = this.baseUrl + "/api/services/validation/online-validator-context";
|
|
919
|
+
url_ = url_.replace(/[?&]$/, "");
|
|
920
|
+
let options_ = {
|
|
921
|
+
observe: "response",
|
|
922
|
+
responseType: "blob",
|
|
923
|
+
headers: new HttpHeaders({
|
|
924
|
+
"Accept": "text/plain"
|
|
925
|
+
})
|
|
926
|
+
};
|
|
927
|
+
return this.http.request("get", url_, options_).pipe(_observableMergeMap((response_) => {
|
|
928
|
+
return this.processGetOnlineValidatorContext(response_);
|
|
929
|
+
})).pipe(_observableCatch((response_) => {
|
|
930
|
+
if (response_ instanceof HttpResponseBase) {
|
|
931
|
+
try {
|
|
932
|
+
return this.processGetOnlineValidatorContext(response_);
|
|
933
|
+
}
|
|
934
|
+
catch (e) {
|
|
935
|
+
return _observableThrow(e);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
else
|
|
939
|
+
return _observableThrow(response_);
|
|
940
|
+
}));
|
|
941
|
+
}
|
|
942
|
+
processGetOnlineValidatorContext(response) {
|
|
943
|
+
const status = response.status;
|
|
944
|
+
const responseBlob = response instanceof HttpResponse ? response.body :
|
|
945
|
+
response.error instanceof Blob ? response.error : undefined;
|
|
946
|
+
let _headers = {};
|
|
947
|
+
if (response.headers) {
|
|
948
|
+
for (let key of response.headers.keys()) {
|
|
949
|
+
_headers[key] = response.headers.get(key);
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
if (status === 200) {
|
|
953
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
954
|
+
let result200 = null;
|
|
955
|
+
let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver);
|
|
956
|
+
result200 = OnlineValidatorContextDtoHttpResponseData.fromJS(resultData200);
|
|
957
|
+
return _observableOf(result200);
|
|
958
|
+
}));
|
|
959
|
+
}
|
|
960
|
+
else if (status !== 200 && status !== 204) {
|
|
961
|
+
return blobToText(responseBlob).pipe(_observableMergeMap(_responseText => {
|
|
962
|
+
return throwException("An unexpected server error occurred.", status, _responseText, _headers);
|
|
963
|
+
}));
|
|
964
|
+
}
|
|
965
|
+
return _observableOf(null);
|
|
966
|
+
}
|
|
967
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ValidationServiceProxyIdentity, deps: [{ token: HttpClient }, { token: API_BASE_URL, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
968
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ValidationServiceProxyIdentity }); }
|
|
969
|
+
}
|
|
970
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ValidationServiceProxyIdentity, decorators: [{
|
|
971
|
+
type: Injectable
|
|
972
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient, decorators: [{
|
|
973
|
+
type: Inject,
|
|
974
|
+
args: [HttpClient]
|
|
975
|
+
}] }, { type: undefined, decorators: [{
|
|
976
|
+
type: Optional
|
|
977
|
+
}, {
|
|
978
|
+
type: Inject,
|
|
979
|
+
args: [API_BASE_URL]
|
|
980
|
+
}] }]; } });
|
|
981
|
+
export var ActionType;
|
|
982
|
+
(function (ActionType) {
|
|
983
|
+
ActionType[ActionType["None"] = 0] = "None";
|
|
984
|
+
ActionType[ActionType["Create"] = 1] = "Create";
|
|
985
|
+
ActionType[ActionType["Update"] = 2] = "Update";
|
|
986
|
+
ActionType[ActionType["Delete"] = 3] = "Delete";
|
|
987
|
+
ActionType[ActionType["RemoteCommand"] = 4] = "RemoteCommand";
|
|
988
|
+
ActionType[ActionType["AuditLogIn"] = 5] = "AuditLogIn";
|
|
989
|
+
ActionType[ActionType["UserMailInvitation"] = 6] = "UserMailInvitation";
|
|
990
|
+
ActionType[ActionType["Send"] = 7] = "Send";
|
|
991
|
+
ActionType[ActionType["Print"] = 8] = "Print";
|
|
992
|
+
ActionType[ActionType["FacilityRemoteCommand"] = 9] = "FacilityRemoteCommand";
|
|
993
|
+
ActionType[ActionType["SetAsIO"] = 10] = "SetAsIO";
|
|
994
|
+
ActionType[ActionType["AuditLogOut"] = 11] = "AuditLogOut";
|
|
995
|
+
})(ActionType || (ActionType = {}));
|
|
996
|
+
export class ActivateResponseDto {
|
|
997
|
+
constructor(data) {
|
|
998
|
+
if (data) {
|
|
999
|
+
for (var property in data) {
|
|
1000
|
+
if (data.hasOwnProperty(property))
|
|
1001
|
+
this[property] = data[property];
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
}
|
|
1005
|
+
init(_data) {
|
|
1006
|
+
if (_data) {
|
|
1007
|
+
this.tfaSetup = _data["tfaSetup"] ? TfaSetupDto.fromJS(_data["tfaSetup"]) : undefined;
|
|
1008
|
+
this.isSuccess = _data["isSuccess"];
|
|
1009
|
+
}
|
|
1010
|
+
}
|
|
1011
|
+
static fromJS(data) {
|
|
1012
|
+
data = typeof data === 'object' ? data : {};
|
|
1013
|
+
let result = new ActivateResponseDto();
|
|
1014
|
+
result.init(data);
|
|
1015
|
+
return result;
|
|
1016
|
+
}
|
|
1017
|
+
toJSON(data) {
|
|
1018
|
+
data = typeof data === 'object' ? data : {};
|
|
1019
|
+
data["tfaSetup"] = this.tfaSetup ? this.tfaSetup.toJSON() : undefined;
|
|
1020
|
+
data["isSuccess"] = this.isSuccess;
|
|
1021
|
+
return data;
|
|
1022
|
+
}
|
|
1023
|
+
clone() {
|
|
1024
|
+
const json = this.toJSON();
|
|
1025
|
+
let result = new ActivateResponseDto();
|
|
1026
|
+
result.init(json);
|
|
1027
|
+
return result;
|
|
1028
|
+
}
|
|
1029
|
+
}
|
|
1030
|
+
export class AlertPreferencesSettingsDto {
|
|
1031
|
+
constructor(data) {
|
|
1032
|
+
if (data) {
|
|
1033
|
+
for (var property in data) {
|
|
1034
|
+
if (data.hasOwnProperty(property))
|
|
1035
|
+
this[property] = data[property];
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
init(_data) {
|
|
1040
|
+
if (_data) {
|
|
1041
|
+
this.isEnabled = _data["isEnabled"];
|
|
1042
|
+
if (_data["preferences"]) {
|
|
1043
|
+
this.preferences = {};
|
|
1044
|
+
for (let key in _data["preferences"]) {
|
|
1045
|
+
if (_data["preferences"].hasOwnProperty(key))
|
|
1046
|
+
this.preferences[key] = _data["preferences"][key];
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
static fromJS(data) {
|
|
1052
|
+
data = typeof data === 'object' ? data : {};
|
|
1053
|
+
let result = new AlertPreferencesSettingsDto();
|
|
1054
|
+
result.init(data);
|
|
1055
|
+
return result;
|
|
1056
|
+
}
|
|
1057
|
+
toJSON(data) {
|
|
1058
|
+
data = typeof data === 'object' ? data : {};
|
|
1059
|
+
data["isEnabled"] = this.isEnabled;
|
|
1060
|
+
if (this.preferences) {
|
|
1061
|
+
data["preferences"] = {};
|
|
1062
|
+
for (let key in this.preferences) {
|
|
1063
|
+
if (this.preferences.hasOwnProperty(key))
|
|
1064
|
+
data["preferences"][key] = this.preferences[key];
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
1067
|
+
return data;
|
|
1068
|
+
}
|
|
1069
|
+
clone() {
|
|
1070
|
+
const json = this.toJSON();
|
|
1071
|
+
let result = new AlertPreferencesSettingsDto();
|
|
1072
|
+
result.init(json);
|
|
1073
|
+
return result;
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
export var AlertsDeviceType;
|
|
1077
|
+
(function (AlertsDeviceType) {
|
|
1078
|
+
AlertsDeviceType[AlertsDeviceType["Master"] = 1] = "Master";
|
|
1079
|
+
AlertsDeviceType[AlertsDeviceType["CashRegister"] = 2] = "CashRegister";
|
|
1080
|
+
AlertsDeviceType[AlertsDeviceType["Dispenser"] = 3] = "Dispenser";
|
|
1081
|
+
AlertsDeviceType[AlertsDeviceType["Verifier"] = 4] = "Verifier";
|
|
1082
|
+
AlertsDeviceType[AlertsDeviceType["LobbyStation"] = 5] = "LobbyStation";
|
|
1083
|
+
AlertsDeviceType[AlertsDeviceType["EntryPil"] = 6] = "EntryPil";
|
|
1084
|
+
AlertsDeviceType[AlertsDeviceType["ExitPil"] = 7] = "ExitPil";
|
|
1085
|
+
AlertsDeviceType[AlertsDeviceType["MonthlyValidator"] = 8] = "MonthlyValidator";
|
|
1086
|
+
AlertsDeviceType[AlertsDeviceType["Validator"] = 9] = "Validator";
|
|
1087
|
+
})(AlertsDeviceType || (AlertsDeviceType = {}));
|
|
1088
|
+
export var AppModule;
|
|
1089
|
+
(function (AppModule) {
|
|
1090
|
+
AppModule[AppModule["Cc"] = 0] = "Cc";
|
|
1091
|
+
AppModule[AppModule["Management"] = 1] = "Management";
|
|
1092
|
+
AppModule[AppModule["Settings"] = 2] = "Settings";
|
|
1093
|
+
AppModule[AppModule["Validation"] = 3] = "Validation";
|
|
1094
|
+
AppModule[AppModule["Guests"] = 4] = "Guests";
|
|
1095
|
+
AppModule[AppModule["Reports"] = 5] = "Reports";
|
|
1096
|
+
AppModule[AppModule["Monthlies"] = 6] = "Monthlies";
|
|
1097
|
+
AppModule[AppModule["Backoffice"] = 7] = "Backoffice";
|
|
1098
|
+
AppModule[AppModule["Pi"] = 8] = "Pi";
|
|
1099
|
+
AppModule[AppModule["Accounts"] = 9] = "Accounts";
|
|
1100
|
+
AppModule[AppModule["LotConfiguration"] = 10] = "LotConfiguration";
|
|
1101
|
+
AppModule[AppModule["ECommerceBackoffice"] = 11] = "ECommerceBackoffice";
|
|
1102
|
+
})(AppModule || (AppModule = {}));
|
|
1103
|
+
export class AuditFilter {
|
|
1104
|
+
constructor(data) {
|
|
1105
|
+
if (data) {
|
|
1106
|
+
for (var property in data) {
|
|
1107
|
+
if (data.hasOwnProperty(property))
|
|
1108
|
+
this[property] = data[property];
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
}
|
|
1112
|
+
init(_data) {
|
|
1113
|
+
if (_data) {
|
|
1114
|
+
this.startDate = _data["startDate"] ? moment(_data["startDate"].toString()) : undefined;
|
|
1115
|
+
this.endDate = _data["endDate"] ? moment(_data["endDate"].toString()) : undefined;
|
|
1116
|
+
this.take = _data["take"];
|
|
1117
|
+
this.skip = _data["skip"];
|
|
1118
|
+
this.searchValue = _data["searchValue"];
|
|
1119
|
+
if (Array.isArray(_data["entityNameList"])) {
|
|
1120
|
+
this.entityNameList = [];
|
|
1121
|
+
for (let item of _data["entityNameList"])
|
|
1122
|
+
this.entityNameList.push(item);
|
|
1123
|
+
}
|
|
1124
|
+
if (Array.isArray(_data["actionType"])) {
|
|
1125
|
+
this.actionType = [];
|
|
1126
|
+
for (let item of _data["actionType"])
|
|
1127
|
+
this.actionType.push(item);
|
|
1128
|
+
}
|
|
1129
|
+
if (_data["guidWithFacilities"]) {
|
|
1130
|
+
this.guidWithFacilities = {};
|
|
1131
|
+
for (let key in _data["guidWithFacilities"]) {
|
|
1132
|
+
if (_data["guidWithFacilities"].hasOwnProperty(key))
|
|
1133
|
+
this.guidWithFacilities[key] = _data["guidWithFacilities"][key];
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
this.searchByUserId = _data["searchByUserId"];
|
|
1137
|
+
if (Array.isArray(_data["tenantIds"])) {
|
|
1138
|
+
this.tenantIds = [];
|
|
1139
|
+
for (let item of _data["tenantIds"])
|
|
1140
|
+
this.tenantIds.push(item);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
static fromJS(data) {
|
|
1145
|
+
data = typeof data === 'object' ? data : {};
|
|
1146
|
+
let result = new AuditFilter();
|
|
1147
|
+
result.init(data);
|
|
1148
|
+
return result;
|
|
1149
|
+
}
|
|
1150
|
+
toJSON(data) {
|
|
1151
|
+
data = typeof data === 'object' ? data : {};
|
|
1152
|
+
data["startDate"] = this.startDate ? this.startDate.toISOString() : undefined;
|
|
1153
|
+
data["endDate"] = this.endDate ? this.endDate.toISOString() : undefined;
|
|
1154
|
+
data["take"] = this.take;
|
|
1155
|
+
data["skip"] = this.skip;
|
|
1156
|
+
data["searchValue"] = this.searchValue;
|
|
1157
|
+
if (Array.isArray(this.entityNameList)) {
|
|
1158
|
+
data["entityNameList"] = [];
|
|
1159
|
+
for (let item of this.entityNameList)
|
|
1160
|
+
data["entityNameList"].push(item);
|
|
1161
|
+
}
|
|
1162
|
+
if (Array.isArray(this.actionType)) {
|
|
1163
|
+
data["actionType"] = [];
|
|
1164
|
+
for (let item of this.actionType)
|
|
1165
|
+
data["actionType"].push(item);
|
|
1166
|
+
}
|
|
1167
|
+
if (this.guidWithFacilities) {
|
|
1168
|
+
data["guidWithFacilities"] = {};
|
|
1169
|
+
for (let key in this.guidWithFacilities) {
|
|
1170
|
+
if (this.guidWithFacilities.hasOwnProperty(key))
|
|
1171
|
+
data["guidWithFacilities"][key] = this.guidWithFacilities[key];
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
data["searchByUserId"] = this.searchByUserId;
|
|
1175
|
+
if (Array.isArray(this.tenantIds)) {
|
|
1176
|
+
data["tenantIds"] = [];
|
|
1177
|
+
for (let item of this.tenantIds)
|
|
1178
|
+
data["tenantIds"].push(item);
|
|
1179
|
+
}
|
|
1180
|
+
return data;
|
|
1181
|
+
}
|
|
1182
|
+
clone() {
|
|
1183
|
+
const json = this.toJSON();
|
|
1184
|
+
let result = new AuditFilter();
|
|
1185
|
+
result.init(json);
|
|
1186
|
+
return result;
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
export class AuthenticateErrorResponseDto {
|
|
1190
|
+
constructor(data) {
|
|
1191
|
+
if (data) {
|
|
1192
|
+
for (var property in data) {
|
|
1193
|
+
if (data.hasOwnProperty(property))
|
|
1194
|
+
this[property] = data[property];
|
|
1195
|
+
}
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
init(_data) {
|
|
1199
|
+
if (_data) {
|
|
1200
|
+
this.accessToken = _data["accessToken"];
|
|
1201
|
+
this.temporaryBlockedTime = _data["temporaryBlockedTime"];
|
|
1202
|
+
this.tenant = _data["tenant"] ? TenantDto.fromJS(_data["tenant"]) : undefined;
|
|
1203
|
+
}
|
|
1204
|
+
}
|
|
1205
|
+
static fromJS(data) {
|
|
1206
|
+
data = typeof data === 'object' ? data : {};
|
|
1207
|
+
let result = new AuthenticateErrorResponseDto();
|
|
1208
|
+
result.init(data);
|
|
1209
|
+
return result;
|
|
1210
|
+
}
|
|
1211
|
+
toJSON(data) {
|
|
1212
|
+
data = typeof data === 'object' ? data : {};
|
|
1213
|
+
data["accessToken"] = this.accessToken;
|
|
1214
|
+
data["temporaryBlockedTime"] = this.temporaryBlockedTime;
|
|
1215
|
+
data["tenant"] = this.tenant ? this.tenant.toJSON() : undefined;
|
|
1216
|
+
return data;
|
|
1217
|
+
}
|
|
1218
|
+
clone() {
|
|
1219
|
+
const json = this.toJSON();
|
|
1220
|
+
let result = new AuthenticateErrorResponseDto();
|
|
1221
|
+
result.init(json);
|
|
1222
|
+
return result;
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
export class AuthenticateErrorResponseDtoHttpResponseData {
|
|
1226
|
+
constructor(data) {
|
|
1227
|
+
if (data) {
|
|
1228
|
+
for (var property in data) {
|
|
1229
|
+
if (data.hasOwnProperty(property))
|
|
1230
|
+
this[property] = data[property];
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
}
|
|
1234
|
+
init(_data) {
|
|
1235
|
+
if (_data) {
|
|
1236
|
+
this.errorMessage = _data["errorMessage"];
|
|
1237
|
+
this.isSuccess = _data["isSuccess"];
|
|
1238
|
+
this.statusCode = _data["statusCode"];
|
|
1239
|
+
this.data = _data["data"] ? AuthenticateErrorResponseDto.fromJS(_data["data"]) : undefined;
|
|
1240
|
+
this.successMessage = _data["successMessage"];
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
static fromJS(data) {
|
|
1244
|
+
data = typeof data === 'object' ? data : {};
|
|
1245
|
+
let result = new AuthenticateErrorResponseDtoHttpResponseData();
|
|
1246
|
+
result.init(data);
|
|
1247
|
+
return result;
|
|
1248
|
+
}
|
|
1249
|
+
toJSON(data) {
|
|
1250
|
+
data = typeof data === 'object' ? data : {};
|
|
1251
|
+
data["errorMessage"] = this.errorMessage;
|
|
1252
|
+
data["isSuccess"] = this.isSuccess;
|
|
1253
|
+
data["statusCode"] = this.statusCode;
|
|
1254
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
1255
|
+
data["successMessage"] = this.successMessage;
|
|
1256
|
+
return data;
|
|
1257
|
+
}
|
|
1258
|
+
clone() {
|
|
1259
|
+
const json = this.toJSON();
|
|
1260
|
+
let result = new AuthenticateErrorResponseDtoHttpResponseData();
|
|
1261
|
+
result.init(json);
|
|
1262
|
+
return result;
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
export class AuthenticateRequestDto {
|
|
1266
|
+
constructor(data) {
|
|
1267
|
+
if (data) {
|
|
1268
|
+
for (var property in data) {
|
|
1269
|
+
if (data.hasOwnProperty(property))
|
|
1270
|
+
this[property] = data[property];
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
init(_data) {
|
|
1275
|
+
if (_data) {
|
|
1276
|
+
this.username = _data["username"];
|
|
1277
|
+
this.password = _data["password"];
|
|
1278
|
+
this.tenantName = _data["tenantName"];
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
static fromJS(data) {
|
|
1282
|
+
data = typeof data === 'object' ? data : {};
|
|
1283
|
+
let result = new AuthenticateRequestDto();
|
|
1284
|
+
result.init(data);
|
|
1285
|
+
return result;
|
|
1286
|
+
}
|
|
1287
|
+
toJSON(data) {
|
|
1288
|
+
data = typeof data === 'object' ? data : {};
|
|
1289
|
+
data["username"] = this.username;
|
|
1290
|
+
data["password"] = this.password;
|
|
1291
|
+
data["tenantName"] = this.tenantName;
|
|
1292
|
+
return data;
|
|
1293
|
+
}
|
|
1294
|
+
clone() {
|
|
1295
|
+
const json = this.toJSON();
|
|
1296
|
+
let result = new AuthenticateRequestDto();
|
|
1297
|
+
result.init(json);
|
|
1298
|
+
return result;
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
export class AuthenticateRequestDtoHttpResponseData {
|
|
1302
|
+
constructor(data) {
|
|
1303
|
+
if (data) {
|
|
1304
|
+
for (var property in data) {
|
|
1305
|
+
if (data.hasOwnProperty(property))
|
|
1306
|
+
this[property] = data[property];
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
init(_data) {
|
|
1311
|
+
if (_data) {
|
|
1312
|
+
this.errorMessage = _data["errorMessage"];
|
|
1313
|
+
this.isSuccess = _data["isSuccess"];
|
|
1314
|
+
this.statusCode = _data["statusCode"];
|
|
1315
|
+
this.data = _data["data"] ? AuthenticateRequestDto.fromJS(_data["data"]) : undefined;
|
|
1316
|
+
this.successMessage = _data["successMessage"];
|
|
1317
|
+
}
|
|
1318
|
+
}
|
|
1319
|
+
static fromJS(data) {
|
|
1320
|
+
data = typeof data === 'object' ? data : {};
|
|
1321
|
+
let result = new AuthenticateRequestDtoHttpResponseData();
|
|
1322
|
+
result.init(data);
|
|
1323
|
+
return result;
|
|
1324
|
+
}
|
|
1325
|
+
toJSON(data) {
|
|
1326
|
+
data = typeof data === 'object' ? data : {};
|
|
1327
|
+
data["errorMessage"] = this.errorMessage;
|
|
1328
|
+
data["isSuccess"] = this.isSuccess;
|
|
1329
|
+
data["statusCode"] = this.statusCode;
|
|
1330
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
1331
|
+
data["successMessage"] = this.successMessage;
|
|
1332
|
+
return data;
|
|
1333
|
+
}
|
|
1334
|
+
clone() {
|
|
1335
|
+
const json = this.toJSON();
|
|
1336
|
+
let result = new AuthenticateRequestDtoHttpResponseData();
|
|
1337
|
+
result.init(json);
|
|
1338
|
+
return result;
|
|
1339
|
+
}
|
|
1340
|
+
}
|
|
1341
|
+
export class AuthenticateResponseDto {
|
|
1342
|
+
constructor(data) {
|
|
1343
|
+
if (data) {
|
|
1344
|
+
for (var property in data) {
|
|
1345
|
+
if (data.hasOwnProperty(property))
|
|
1346
|
+
this[property] = data[property];
|
|
1347
|
+
}
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
init(_data) {
|
|
1351
|
+
if (_data) {
|
|
1352
|
+
this.userId = _data["userId"];
|
|
1353
|
+
this.firstName = _data["firstName"];
|
|
1354
|
+
this.lastName = _data["lastName"];
|
|
1355
|
+
this.username = _data["username"];
|
|
1356
|
+
this.userStatus = _data["userStatus"];
|
|
1357
|
+
this.passwordExpiration = _data["passwordExpiration"] ? moment(_data["passwordExpiration"].toString()) : undefined;
|
|
1358
|
+
if (Array.isArray(_data["modules"])) {
|
|
1359
|
+
this.modules = [];
|
|
1360
|
+
for (let item of _data["modules"])
|
|
1361
|
+
this.modules.push(AuthenticateUserModuleDto.fromJS(item));
|
|
1362
|
+
}
|
|
1363
|
+
this.defaultModule = _data["defaultModule"];
|
|
1364
|
+
this.thirdPartyToken = _data["thirdPartyToken"];
|
|
1365
|
+
this.accessToken = _data["accessToken"];
|
|
1366
|
+
this.refreshToken = _data["refreshToken"];
|
|
1367
|
+
this.refreshInterval = _data["refreshInterval"];
|
|
1368
|
+
this.expiration = _data["expiration"] ? moment(_data["expiration"].toString()) : undefined;
|
|
1369
|
+
if (Array.isArray(_data["settings"])) {
|
|
1370
|
+
this.settings = [];
|
|
1371
|
+
for (let item of _data["settings"])
|
|
1372
|
+
this.settings.push(SparkSettingsDto.fromJS(item));
|
|
1373
|
+
}
|
|
1374
|
+
this.tenant = _data["tenant"] ? TenantDto.fromJS(_data["tenant"]) : undefined;
|
|
1375
|
+
this.errorMessage = _data["errorMessage"];
|
|
1376
|
+
this.message = _data["message"];
|
|
1377
|
+
this.userIsTemporaryBlocked = _data["userIsTemporaryBlocked"];
|
|
1378
|
+
this.passwordExpirationState = _data["passwordExpirationState"];
|
|
1379
|
+
this.daysToExpire = _data["daysToExpire"];
|
|
1380
|
+
this.twoFactorAuthentication = _data["twoFactorAuthentication"];
|
|
1381
|
+
this.twoFactorAuthenticationDto = _data["twoFactorAuthenticationDto"] ? TwoFactorAuthenticationDto.fromJS(_data["twoFactorAuthenticationDto"]) : undefined;
|
|
1382
|
+
this.singleSignOnAuthenticationDto = _data["singleSignOnAuthenticationDto"] ? SingleSignOnAuthenticationDto.fromJS(_data["singleSignOnAuthenticationDto"]) : undefined;
|
|
1383
|
+
}
|
|
1384
|
+
}
|
|
1385
|
+
static fromJS(data) {
|
|
1386
|
+
data = typeof data === 'object' ? data : {};
|
|
1387
|
+
let result = new AuthenticateResponseDto();
|
|
1388
|
+
result.init(data);
|
|
1389
|
+
return result;
|
|
1390
|
+
}
|
|
1391
|
+
toJSON(data) {
|
|
1392
|
+
data = typeof data === 'object' ? data : {};
|
|
1393
|
+
data["userId"] = this.userId;
|
|
1394
|
+
data["firstName"] = this.firstName;
|
|
1395
|
+
data["lastName"] = this.lastName;
|
|
1396
|
+
data["username"] = this.username;
|
|
1397
|
+
data["userStatus"] = this.userStatus;
|
|
1398
|
+
data["passwordExpiration"] = this.passwordExpiration ? this.passwordExpiration.toISOString() : undefined;
|
|
1399
|
+
if (Array.isArray(this.modules)) {
|
|
1400
|
+
data["modules"] = [];
|
|
1401
|
+
for (let item of this.modules)
|
|
1402
|
+
data["modules"].push(item.toJSON());
|
|
1403
|
+
}
|
|
1404
|
+
data["defaultModule"] = this.defaultModule;
|
|
1405
|
+
data["thirdPartyToken"] = this.thirdPartyToken;
|
|
1406
|
+
data["accessToken"] = this.accessToken;
|
|
1407
|
+
data["refreshToken"] = this.refreshToken;
|
|
1408
|
+
data["refreshInterval"] = this.refreshInterval;
|
|
1409
|
+
data["expiration"] = this.expiration ? this.expiration.toISOString() : undefined;
|
|
1410
|
+
if (Array.isArray(this.settings)) {
|
|
1411
|
+
data["settings"] = [];
|
|
1412
|
+
for (let item of this.settings)
|
|
1413
|
+
data["settings"].push(item.toJSON());
|
|
1414
|
+
}
|
|
1415
|
+
data["tenant"] = this.tenant ? this.tenant.toJSON() : undefined;
|
|
1416
|
+
data["errorMessage"] = this.errorMessage;
|
|
1417
|
+
data["message"] = this.message;
|
|
1418
|
+
data["userIsTemporaryBlocked"] = this.userIsTemporaryBlocked;
|
|
1419
|
+
data["passwordExpirationState"] = this.passwordExpirationState;
|
|
1420
|
+
data["daysToExpire"] = this.daysToExpire;
|
|
1421
|
+
data["twoFactorAuthentication"] = this.twoFactorAuthentication;
|
|
1422
|
+
data["twoFactorAuthenticationDto"] = this.twoFactorAuthenticationDto ? this.twoFactorAuthenticationDto.toJSON() : undefined;
|
|
1423
|
+
data["singleSignOnAuthenticationDto"] = this.singleSignOnAuthenticationDto ? this.singleSignOnAuthenticationDto.toJSON() : undefined;
|
|
1424
|
+
return data;
|
|
1425
|
+
}
|
|
1426
|
+
clone() {
|
|
1427
|
+
const json = this.toJSON();
|
|
1428
|
+
let result = new AuthenticateResponseDto();
|
|
1429
|
+
result.init(json);
|
|
1430
|
+
return result;
|
|
1431
|
+
}
|
|
1432
|
+
}
|
|
1433
|
+
export class AuthenticateResponseDtoHttpResponseData {
|
|
1434
|
+
constructor(data) {
|
|
1435
|
+
if (data) {
|
|
1436
|
+
for (var property in data) {
|
|
1437
|
+
if (data.hasOwnProperty(property))
|
|
1438
|
+
this[property] = data[property];
|
|
1439
|
+
}
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
init(_data) {
|
|
1443
|
+
if (_data) {
|
|
1444
|
+
this.errorMessage = _data["errorMessage"];
|
|
1445
|
+
this.isSuccess = _data["isSuccess"];
|
|
1446
|
+
this.statusCode = _data["statusCode"];
|
|
1447
|
+
this.data = _data["data"] ? AuthenticateResponseDto.fromJS(_data["data"]) : undefined;
|
|
1448
|
+
this.successMessage = _data["successMessage"];
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
static fromJS(data) {
|
|
1452
|
+
data = typeof data === 'object' ? data : {};
|
|
1453
|
+
let result = new AuthenticateResponseDtoHttpResponseData();
|
|
1454
|
+
result.init(data);
|
|
1455
|
+
return result;
|
|
1456
|
+
}
|
|
1457
|
+
toJSON(data) {
|
|
1458
|
+
data = typeof data === 'object' ? data : {};
|
|
1459
|
+
data["errorMessage"] = this.errorMessage;
|
|
1460
|
+
data["isSuccess"] = this.isSuccess;
|
|
1461
|
+
data["statusCode"] = this.statusCode;
|
|
1462
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
1463
|
+
data["successMessage"] = this.successMessage;
|
|
1464
|
+
return data;
|
|
1465
|
+
}
|
|
1466
|
+
clone() {
|
|
1467
|
+
const json = this.toJSON();
|
|
1468
|
+
let result = new AuthenticateResponseDtoHttpResponseData();
|
|
1469
|
+
result.init(json);
|
|
1470
|
+
return result;
|
|
1471
|
+
}
|
|
1472
|
+
}
|
|
1473
|
+
export class AuthenticateResponseDtoListHttpResponseData {
|
|
1474
|
+
constructor(data) {
|
|
1475
|
+
if (data) {
|
|
1476
|
+
for (var property in data) {
|
|
1477
|
+
if (data.hasOwnProperty(property))
|
|
1478
|
+
this[property] = data[property];
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
}
|
|
1482
|
+
init(_data) {
|
|
1483
|
+
if (_data) {
|
|
1484
|
+
this.errorMessage = _data["errorMessage"];
|
|
1485
|
+
this.isSuccess = _data["isSuccess"];
|
|
1486
|
+
this.statusCode = _data["statusCode"];
|
|
1487
|
+
if (Array.isArray(_data["data"])) {
|
|
1488
|
+
this.data = [];
|
|
1489
|
+
for (let item of _data["data"])
|
|
1490
|
+
this.data.push(AuthenticateResponseDto.fromJS(item));
|
|
1491
|
+
}
|
|
1492
|
+
this.successMessage = _data["successMessage"];
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
static fromJS(data) {
|
|
1496
|
+
data = typeof data === 'object' ? data : {};
|
|
1497
|
+
let result = new AuthenticateResponseDtoListHttpResponseData();
|
|
1498
|
+
result.init(data);
|
|
1499
|
+
return result;
|
|
1500
|
+
}
|
|
1501
|
+
toJSON(data) {
|
|
1502
|
+
data = typeof data === 'object' ? data : {};
|
|
1503
|
+
data["errorMessage"] = this.errorMessage;
|
|
1504
|
+
data["isSuccess"] = this.isSuccess;
|
|
1505
|
+
data["statusCode"] = this.statusCode;
|
|
1506
|
+
if (Array.isArray(this.data)) {
|
|
1507
|
+
data["data"] = [];
|
|
1508
|
+
for (let item of this.data)
|
|
1509
|
+
data["data"].push(item.toJSON());
|
|
1510
|
+
}
|
|
1511
|
+
data["successMessage"] = this.successMessage;
|
|
1512
|
+
return data;
|
|
1513
|
+
}
|
|
1514
|
+
clone() {
|
|
1515
|
+
const json = this.toJSON();
|
|
1516
|
+
let result = new AuthenticateResponseDtoListHttpResponseData();
|
|
1517
|
+
result.init(json);
|
|
1518
|
+
return result;
|
|
1519
|
+
}
|
|
1520
|
+
}
|
|
1521
|
+
export class AuthenticateUserModuleDto {
|
|
1522
|
+
constructor(data) {
|
|
1523
|
+
if (data) {
|
|
1524
|
+
for (var property in data) {
|
|
1525
|
+
if (data.hasOwnProperty(property))
|
|
1526
|
+
this[property] = data[property];
|
|
1527
|
+
}
|
|
1528
|
+
}
|
|
1529
|
+
}
|
|
1530
|
+
init(_data) {
|
|
1531
|
+
if (_data) {
|
|
1532
|
+
this.module = _data["module"];
|
|
1533
|
+
if (Array.isArray(_data["subModule"])) {
|
|
1534
|
+
this.subModule = [];
|
|
1535
|
+
for (let item of _data["subModule"])
|
|
1536
|
+
this.subModule.push(item);
|
|
1537
|
+
}
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
static fromJS(data) {
|
|
1541
|
+
data = typeof data === 'object' ? data : {};
|
|
1542
|
+
let result = new AuthenticateUserModuleDto();
|
|
1543
|
+
result.init(data);
|
|
1544
|
+
return result;
|
|
1545
|
+
}
|
|
1546
|
+
toJSON(data) {
|
|
1547
|
+
data = typeof data === 'object' ? data : {};
|
|
1548
|
+
data["module"] = this.module;
|
|
1549
|
+
if (Array.isArray(this.subModule)) {
|
|
1550
|
+
data["subModule"] = [];
|
|
1551
|
+
for (let item of this.subModule)
|
|
1552
|
+
data["subModule"].push(item);
|
|
1553
|
+
}
|
|
1554
|
+
return data;
|
|
1555
|
+
}
|
|
1556
|
+
clone() {
|
|
1557
|
+
const json = this.toJSON();
|
|
1558
|
+
let result = new AuthenticateUserModuleDto();
|
|
1559
|
+
result.init(json);
|
|
1560
|
+
return result;
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
export class AzureSettings {
|
|
1564
|
+
constructor(data) {
|
|
1565
|
+
if (data) {
|
|
1566
|
+
for (var property in data) {
|
|
1567
|
+
if (data.hasOwnProperty(property))
|
|
1568
|
+
this[property] = data[property];
|
|
1569
|
+
}
|
|
1570
|
+
}
|
|
1571
|
+
}
|
|
1572
|
+
init(_data) {
|
|
1573
|
+
if (_data) {
|
|
1574
|
+
this.clientId = _data["clientId"];
|
|
1575
|
+
this.tenantId = _data["tenantId"];
|
|
1576
|
+
}
|
|
1577
|
+
}
|
|
1578
|
+
static fromJS(data) {
|
|
1579
|
+
data = typeof data === 'object' ? data : {};
|
|
1580
|
+
let result = new AzureSettings();
|
|
1581
|
+
result.init(data);
|
|
1582
|
+
return result;
|
|
1583
|
+
}
|
|
1584
|
+
toJSON(data) {
|
|
1585
|
+
data = typeof data === 'object' ? data : {};
|
|
1586
|
+
data["clientId"] = this.clientId;
|
|
1587
|
+
data["tenantId"] = this.tenantId;
|
|
1588
|
+
return data;
|
|
1589
|
+
}
|
|
1590
|
+
clone() {
|
|
1591
|
+
const json = this.toJSON();
|
|
1592
|
+
let result = new AzureSettings();
|
|
1593
|
+
result.init(json);
|
|
1594
|
+
return result;
|
|
1595
|
+
}
|
|
1596
|
+
}
|
|
1597
|
+
export var DateTimeField;
|
|
1598
|
+
(function (DateTimeField) {
|
|
1599
|
+
DateTimeField[DateTimeField["ValidTo"] = 0] = "ValidTo";
|
|
1600
|
+
DateTimeField[DateTimeField["ValidFrom"] = 1] = "ValidFrom";
|
|
1601
|
+
DateTimeField[DateTimeField["FromDateTime"] = 2] = "FromDateTime";
|
|
1602
|
+
DateTimeField[DateTimeField["ToDateTime"] = 3] = "ToDateTime";
|
|
1603
|
+
DateTimeField[DateTimeField["Creation"] = 4] = "Creation";
|
|
1604
|
+
DateTimeField[DateTimeField["Modified"] = 5] = "Modified";
|
|
1605
|
+
DateTimeField[DateTimeField["ProducedDateTime"] = 6] = "ProducedDateTime";
|
|
1606
|
+
DateTimeField[DateTimeField["PrintedDateTime"] = 7] = "PrintedDateTime";
|
|
1607
|
+
DateTimeField[DateTimeField["LastTransDateTime"] = 8] = "LastTransDateTime";
|
|
1608
|
+
DateTimeField[DateTimeField["LastINDateTime"] = 9] = "LastINDateTime";
|
|
1609
|
+
DateTimeField[DateTimeField["LastActivity"] = 10] = "LastActivity";
|
|
1610
|
+
DateTimeField[DateTimeField["CreatedAt"] = 11] = "CreatedAt";
|
|
1611
|
+
DateTimeField[DateTimeField["PasswordExpiration"] = 12] = "PasswordExpiration";
|
|
1612
|
+
DateTimeField[DateTimeField["TermsApprovalDate"] = 13] = "TermsApprovalDate";
|
|
1613
|
+
DateTimeField[DateTimeField["UpdatedAt"] = 14] = "UpdatedAt";
|
|
1614
|
+
DateTimeField[DateTimeField["LastConnection"] = 15] = "LastConnection";
|
|
1615
|
+
DateTimeField[DateTimeField["DateTime"] = 16] = "DateTime";
|
|
1616
|
+
DateTimeField[DateTimeField["UpdateDate"] = 17] = "UpdateDate";
|
|
1617
|
+
DateTimeField[DateTimeField["ValidTime"] = 18] = "ValidTime";
|
|
1618
|
+
})(DateTimeField || (DateTimeField = {}));
|
|
1619
|
+
export var EnvironmentMode;
|
|
1620
|
+
(function (EnvironmentMode) {
|
|
1621
|
+
EnvironmentMode[EnvironmentMode["Development"] = 1] = "Development";
|
|
1622
|
+
EnvironmentMode[EnvironmentMode["Production"] = 2] = "Production";
|
|
1623
|
+
EnvironmentMode[EnvironmentMode["Staging"] = 3] = "Staging";
|
|
1624
|
+
EnvironmentMode[EnvironmentMode["Sandbox"] = 4] = "Sandbox";
|
|
1625
|
+
EnvironmentMode[EnvironmentMode["Local"] = 5] = "Local";
|
|
1626
|
+
EnvironmentMode[EnvironmentMode["Automation"] = 6] = "Automation";
|
|
1627
|
+
})(EnvironmentMode || (EnvironmentMode = {}));
|
|
1628
|
+
export var FileType;
|
|
1629
|
+
(function (FileType) {
|
|
1630
|
+
FileType[FileType["XLSX"] = 1] = "XLSX";
|
|
1631
|
+
FileType[FileType["CSV"] = 2] = "CSV";
|
|
1632
|
+
FileType[FileType["PDF"] = 3] = "PDF";
|
|
1633
|
+
})(FileType || (FileType = {}));
|
|
1634
|
+
export var GeneralActionType;
|
|
1635
|
+
(function (GeneralActionType) {
|
|
1636
|
+
GeneralActionType[GeneralActionType["DisconnectFromSessions"] = 1] = "DisconnectFromSessions";
|
|
1637
|
+
})(GeneralActionType || (GeneralActionType = {}));
|
|
1638
|
+
export class GetLogoDto {
|
|
1639
|
+
constructor(data) {
|
|
1640
|
+
if (data) {
|
|
1641
|
+
for (var property in data) {
|
|
1642
|
+
if (data.hasOwnProperty(property))
|
|
1643
|
+
this[property] = data[property];
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
}
|
|
1647
|
+
init(_data) {
|
|
1648
|
+
if (_data) {
|
|
1649
|
+
this.identifier = _data["identifier"];
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
static fromJS(data) {
|
|
1653
|
+
data = typeof data === 'object' ? data : {};
|
|
1654
|
+
let result = new GetLogoDto();
|
|
1655
|
+
result.init(data);
|
|
1656
|
+
return result;
|
|
1657
|
+
}
|
|
1658
|
+
toJSON(data) {
|
|
1659
|
+
data = typeof data === 'object' ? data : {};
|
|
1660
|
+
data["identifier"] = this.identifier;
|
|
1661
|
+
return data;
|
|
1662
|
+
}
|
|
1663
|
+
clone() {
|
|
1664
|
+
const json = this.toJSON();
|
|
1665
|
+
let result = new GetLogoDto();
|
|
1666
|
+
result.init(json);
|
|
1667
|
+
return result;
|
|
1668
|
+
}
|
|
1669
|
+
}
|
|
1670
|
+
export class HealthBase {
|
|
1671
|
+
constructor(data) {
|
|
1672
|
+
if (data) {
|
|
1673
|
+
for (var property in data) {
|
|
1674
|
+
if (data.hasOwnProperty(property))
|
|
1675
|
+
this[property] = data[property];
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
init(_data) {
|
|
1680
|
+
if (_data) {
|
|
1681
|
+
this.link = _data["link"];
|
|
1682
|
+
this.status = _data["status"];
|
|
1683
|
+
this.version = _data["version"];
|
|
1684
|
+
}
|
|
1685
|
+
}
|
|
1686
|
+
static fromJS(data) {
|
|
1687
|
+
data = typeof data === 'object' ? data : {};
|
|
1688
|
+
let result = new HealthBase();
|
|
1689
|
+
result.init(data);
|
|
1690
|
+
return result;
|
|
1691
|
+
}
|
|
1692
|
+
toJSON(data) {
|
|
1693
|
+
data = typeof data === 'object' ? data : {};
|
|
1694
|
+
data["link"] = this.link;
|
|
1695
|
+
data["status"] = this.status;
|
|
1696
|
+
data["version"] = this.version;
|
|
1697
|
+
return data;
|
|
1698
|
+
}
|
|
1699
|
+
clone() {
|
|
1700
|
+
const json = this.toJSON();
|
|
1701
|
+
let result = new HealthBase();
|
|
1702
|
+
result.init(json);
|
|
1703
|
+
return result;
|
|
1704
|
+
}
|
|
1705
|
+
}
|
|
1706
|
+
export class HealthDto {
|
|
1707
|
+
constructor(data) {
|
|
1708
|
+
if (data) {
|
|
1709
|
+
for (var property in data) {
|
|
1710
|
+
if (data.hasOwnProperty(property))
|
|
1711
|
+
this[property] = data[property];
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
init(_data) {
|
|
1716
|
+
if (_data) {
|
|
1717
|
+
this.environment = _data["environment"];
|
|
1718
|
+
this.sparkApiServiceVersion = _data["sparkApiServiceVersion"];
|
|
1719
|
+
this.version = _data["version"];
|
|
1720
|
+
if (_data["services"]) {
|
|
1721
|
+
this.services = {};
|
|
1722
|
+
for (let key in _data["services"]) {
|
|
1723
|
+
if (_data["services"].hasOwnProperty(key))
|
|
1724
|
+
this.services[key] = _data["services"][key] ? HealthBase.fromJS(_data["services"][key]) : new HealthBase();
|
|
1725
|
+
}
|
|
1726
|
+
}
|
|
1727
|
+
this.runningStatus = _data["runningStatus"] ? ServicesRunningStatusDto.fromJS(_data["runningStatus"]) : undefined;
|
|
1728
|
+
}
|
|
1729
|
+
}
|
|
1730
|
+
static fromJS(data) {
|
|
1731
|
+
data = typeof data === 'object' ? data : {};
|
|
1732
|
+
let result = new HealthDto();
|
|
1733
|
+
result.init(data);
|
|
1734
|
+
return result;
|
|
1735
|
+
}
|
|
1736
|
+
toJSON(data) {
|
|
1737
|
+
data = typeof data === 'object' ? data : {};
|
|
1738
|
+
data["environment"] = this.environment;
|
|
1739
|
+
data["sparkApiServiceVersion"] = this.sparkApiServiceVersion;
|
|
1740
|
+
data["version"] = this.version;
|
|
1741
|
+
if (this.services) {
|
|
1742
|
+
data["services"] = {};
|
|
1743
|
+
for (let key in this.services) {
|
|
1744
|
+
if (this.services.hasOwnProperty(key))
|
|
1745
|
+
data["services"][key] = this.services[key] ? this.services[key].toJSON() : undefined;
|
|
1746
|
+
}
|
|
1747
|
+
}
|
|
1748
|
+
data["runningStatus"] = this.runningStatus ? this.runningStatus.toJSON() : undefined;
|
|
1749
|
+
return data;
|
|
1750
|
+
}
|
|
1751
|
+
clone() {
|
|
1752
|
+
const json = this.toJSON();
|
|
1753
|
+
let result = new HealthDto();
|
|
1754
|
+
result.init(json);
|
|
1755
|
+
return result;
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
export class HealthDtoHttpResponseData {
|
|
1759
|
+
constructor(data) {
|
|
1760
|
+
if (data) {
|
|
1761
|
+
for (var property in data) {
|
|
1762
|
+
if (data.hasOwnProperty(property))
|
|
1763
|
+
this[property] = data[property];
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
init(_data) {
|
|
1768
|
+
if (_data) {
|
|
1769
|
+
this.errorMessage = _data["errorMessage"];
|
|
1770
|
+
this.isSuccess = _data["isSuccess"];
|
|
1771
|
+
this.statusCode = _data["statusCode"];
|
|
1772
|
+
this.data = _data["data"] ? HealthDto.fromJS(_data["data"]) : undefined;
|
|
1773
|
+
this.successMessage = _data["successMessage"];
|
|
1774
|
+
}
|
|
1775
|
+
}
|
|
1776
|
+
static fromJS(data) {
|
|
1777
|
+
data = typeof data === 'object' ? data : {};
|
|
1778
|
+
let result = new HealthDtoHttpResponseData();
|
|
1779
|
+
result.init(data);
|
|
1780
|
+
return result;
|
|
1781
|
+
}
|
|
1782
|
+
toJSON(data) {
|
|
1783
|
+
data = typeof data === 'object' ? data : {};
|
|
1784
|
+
data["errorMessage"] = this.errorMessage;
|
|
1785
|
+
data["isSuccess"] = this.isSuccess;
|
|
1786
|
+
data["statusCode"] = this.statusCode;
|
|
1787
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
1788
|
+
data["successMessage"] = this.successMessage;
|
|
1789
|
+
return data;
|
|
1790
|
+
}
|
|
1791
|
+
clone() {
|
|
1792
|
+
const json = this.toJSON();
|
|
1793
|
+
let result = new HealthDtoHttpResponseData();
|
|
1794
|
+
result.init(json);
|
|
1795
|
+
return result;
|
|
1796
|
+
}
|
|
1797
|
+
}
|
|
1798
|
+
export var HealthStatus;
|
|
1799
|
+
(function (HealthStatus) {
|
|
1800
|
+
HealthStatus[HealthStatus["Down"] = 0] = "Down";
|
|
1801
|
+
HealthStatus[HealthStatus["Up"] = 1] = "Up";
|
|
1802
|
+
})(HealthStatus || (HealthStatus = {}));
|
|
1803
|
+
export var HttpStatusCode;
|
|
1804
|
+
(function (HttpStatusCode) {
|
|
1805
|
+
HttpStatusCode[HttpStatusCode["Continue"] = 100] = "Continue";
|
|
1806
|
+
HttpStatusCode[HttpStatusCode["SwitchingProtocols"] = 101] = "SwitchingProtocols";
|
|
1807
|
+
HttpStatusCode[HttpStatusCode["Processing"] = 102] = "Processing";
|
|
1808
|
+
HttpStatusCode[HttpStatusCode["EarlyHints"] = 103] = "EarlyHints";
|
|
1809
|
+
HttpStatusCode[HttpStatusCode["OK"] = 200] = "OK";
|
|
1810
|
+
HttpStatusCode[HttpStatusCode["Created"] = 201] = "Created";
|
|
1811
|
+
HttpStatusCode[HttpStatusCode["Accepted"] = 202] = "Accepted";
|
|
1812
|
+
HttpStatusCode[HttpStatusCode["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation";
|
|
1813
|
+
HttpStatusCode[HttpStatusCode["NoContent"] = 204] = "NoContent";
|
|
1814
|
+
HttpStatusCode[HttpStatusCode["ResetContent"] = 205] = "ResetContent";
|
|
1815
|
+
HttpStatusCode[HttpStatusCode["PartialContent"] = 206] = "PartialContent";
|
|
1816
|
+
HttpStatusCode[HttpStatusCode["MultiStatus"] = 207] = "MultiStatus";
|
|
1817
|
+
HttpStatusCode[HttpStatusCode["AlreadyReported"] = 208] = "AlreadyReported";
|
|
1818
|
+
HttpStatusCode[HttpStatusCode["IMUsed"] = 226] = "IMUsed";
|
|
1819
|
+
HttpStatusCode[HttpStatusCode["MultipleChoices"] = 300] = "MultipleChoices";
|
|
1820
|
+
HttpStatusCode[HttpStatusCode["Ambiguous"] = 301] = "Ambiguous";
|
|
1821
|
+
HttpStatusCode[HttpStatusCode["MovedPermanently"] = 302] = "MovedPermanently";
|
|
1822
|
+
HttpStatusCode[HttpStatusCode["Moved"] = 303] = "Moved";
|
|
1823
|
+
HttpStatusCode[HttpStatusCode["Found"] = 304] = "Found";
|
|
1824
|
+
HttpStatusCode[HttpStatusCode["Redirect"] = 305] = "Redirect";
|
|
1825
|
+
HttpStatusCode[HttpStatusCode["SeeOther"] = 306] = "SeeOther";
|
|
1826
|
+
HttpStatusCode[HttpStatusCode["RedirectMethod"] = 307] = "RedirectMethod";
|
|
1827
|
+
HttpStatusCode[HttpStatusCode["NotModified"] = 308] = "NotModified";
|
|
1828
|
+
HttpStatusCode[HttpStatusCode["UseProxy"] = 400] = "UseProxy";
|
|
1829
|
+
HttpStatusCode[HttpStatusCode["Unused"] = 401] = "Unused";
|
|
1830
|
+
HttpStatusCode[HttpStatusCode["TemporaryRedirect"] = 402] = "TemporaryRedirect";
|
|
1831
|
+
HttpStatusCode[HttpStatusCode["RedirectKeepVerb"] = 403] = "RedirectKeepVerb";
|
|
1832
|
+
HttpStatusCode[HttpStatusCode["PermanentRedirect"] = 404] = "PermanentRedirect";
|
|
1833
|
+
HttpStatusCode[HttpStatusCode["BadRequest"] = 405] = "BadRequest";
|
|
1834
|
+
HttpStatusCode[HttpStatusCode["Unauthorized"] = 406] = "Unauthorized";
|
|
1835
|
+
HttpStatusCode[HttpStatusCode["PaymentRequired"] = 407] = "PaymentRequired";
|
|
1836
|
+
HttpStatusCode[HttpStatusCode["Forbidden"] = 408] = "Forbidden";
|
|
1837
|
+
HttpStatusCode[HttpStatusCode["NotFound"] = 409] = "NotFound";
|
|
1838
|
+
HttpStatusCode[HttpStatusCode["MethodNotAllowed"] = 410] = "MethodNotAllowed";
|
|
1839
|
+
HttpStatusCode[HttpStatusCode["NotAcceptable"] = 411] = "NotAcceptable";
|
|
1840
|
+
HttpStatusCode[HttpStatusCode["ProxyAuthenticationRequired"] = 412] = "ProxyAuthenticationRequired";
|
|
1841
|
+
HttpStatusCode[HttpStatusCode["RequestTimeout"] = 413] = "RequestTimeout";
|
|
1842
|
+
HttpStatusCode[HttpStatusCode["Conflict"] = 414] = "Conflict";
|
|
1843
|
+
HttpStatusCode[HttpStatusCode["Gone"] = 415] = "Gone";
|
|
1844
|
+
HttpStatusCode[HttpStatusCode["LengthRequired"] = 416] = "LengthRequired";
|
|
1845
|
+
HttpStatusCode[HttpStatusCode["PreconditionFailed"] = 417] = "PreconditionFailed";
|
|
1846
|
+
HttpStatusCode[HttpStatusCode["RequestEntityTooLarge"] = 421] = "RequestEntityTooLarge";
|
|
1847
|
+
HttpStatusCode[HttpStatusCode["RequestUriTooLong"] = 422] = "RequestUriTooLong";
|
|
1848
|
+
HttpStatusCode[HttpStatusCode["UnsupportedMediaType"] = 423] = "UnsupportedMediaType";
|
|
1849
|
+
HttpStatusCode[HttpStatusCode["RequestedRangeNotSatisfiable"] = 424] = "RequestedRangeNotSatisfiable";
|
|
1850
|
+
HttpStatusCode[HttpStatusCode["ExpectationFailed"] = 426] = "ExpectationFailed";
|
|
1851
|
+
HttpStatusCode[HttpStatusCode["MisdirectedRequest"] = 428] = "MisdirectedRequest";
|
|
1852
|
+
HttpStatusCode[HttpStatusCode["UnprocessableEntity"] = 429] = "UnprocessableEntity";
|
|
1853
|
+
HttpStatusCode[HttpStatusCode["UnprocessableContent"] = 431] = "UnprocessableContent";
|
|
1854
|
+
HttpStatusCode[HttpStatusCode["Locked"] = 451] = "Locked";
|
|
1855
|
+
HttpStatusCode[HttpStatusCode["FailedDependency"] = 500] = "FailedDependency";
|
|
1856
|
+
HttpStatusCode[HttpStatusCode["UpgradeRequired"] = 501] = "UpgradeRequired";
|
|
1857
|
+
HttpStatusCode[HttpStatusCode["PreconditionRequired"] = 502] = "PreconditionRequired";
|
|
1858
|
+
HttpStatusCode[HttpStatusCode["TooManyRequests"] = 503] = "TooManyRequests";
|
|
1859
|
+
HttpStatusCode[HttpStatusCode["RequestHeaderFieldsTooLarge"] = 504] = "RequestHeaderFieldsTooLarge";
|
|
1860
|
+
HttpStatusCode[HttpStatusCode["UnavailableForLegalReasons"] = 505] = "UnavailableForLegalReasons";
|
|
1861
|
+
HttpStatusCode[HttpStatusCode["InternalServerError"] = 506] = "InternalServerError";
|
|
1862
|
+
HttpStatusCode[HttpStatusCode["NotImplemented"] = 507] = "NotImplemented";
|
|
1863
|
+
HttpStatusCode[HttpStatusCode["BadGateway"] = 508] = "BadGateway";
|
|
1864
|
+
HttpStatusCode[HttpStatusCode["ServiceUnavailable"] = 510] = "ServiceUnavailable";
|
|
1865
|
+
HttpStatusCode[HttpStatusCode["GatewayTimeout"] = 511] = "GatewayTimeout";
|
|
1866
|
+
})(HttpStatusCode || (HttpStatusCode = {}));
|
|
1867
|
+
export class Int32AuthenticateResponseDtoIDictionaryHttpResponseData {
|
|
1868
|
+
constructor(data) {
|
|
1869
|
+
if (data) {
|
|
1870
|
+
for (var property in data) {
|
|
1871
|
+
if (data.hasOwnProperty(property))
|
|
1872
|
+
this[property] = data[property];
|
|
1873
|
+
}
|
|
1874
|
+
}
|
|
1875
|
+
}
|
|
1876
|
+
init(_data) {
|
|
1877
|
+
if (_data) {
|
|
1878
|
+
this.errorMessage = _data["errorMessage"];
|
|
1879
|
+
this.isSuccess = _data["isSuccess"];
|
|
1880
|
+
this.statusCode = _data["statusCode"];
|
|
1881
|
+
if (_data["data"]) {
|
|
1882
|
+
this.data = {};
|
|
1883
|
+
for (let key in _data["data"]) {
|
|
1884
|
+
if (_data["data"].hasOwnProperty(key))
|
|
1885
|
+
this.data[key] = _data["data"][key] ? AuthenticateResponseDto.fromJS(_data["data"][key]) : new AuthenticateResponseDto();
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
this.successMessage = _data["successMessage"];
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
static fromJS(data) {
|
|
1892
|
+
data = typeof data === 'object' ? data : {};
|
|
1893
|
+
let result = new Int32AuthenticateResponseDtoIDictionaryHttpResponseData();
|
|
1894
|
+
result.init(data);
|
|
1895
|
+
return result;
|
|
1896
|
+
}
|
|
1897
|
+
toJSON(data) {
|
|
1898
|
+
data = typeof data === 'object' ? data : {};
|
|
1899
|
+
data["errorMessage"] = this.errorMessage;
|
|
1900
|
+
data["isSuccess"] = this.isSuccess;
|
|
1901
|
+
data["statusCode"] = this.statusCode;
|
|
1902
|
+
if (this.data) {
|
|
1903
|
+
data["data"] = {};
|
|
1904
|
+
for (let key in this.data) {
|
|
1905
|
+
if (this.data.hasOwnProperty(key))
|
|
1906
|
+
data["data"][key] = this.data[key] ? this.data[key].toJSON() : undefined;
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
data["successMessage"] = this.successMessage;
|
|
1910
|
+
return data;
|
|
1911
|
+
}
|
|
1912
|
+
clone() {
|
|
1913
|
+
const json = this.toJSON();
|
|
1914
|
+
let result = new Int32AuthenticateResponseDtoIDictionaryHttpResponseData();
|
|
1915
|
+
result.init(json);
|
|
1916
|
+
return result;
|
|
1917
|
+
}
|
|
1918
|
+
}
|
|
1919
|
+
export class MobileLoginDTO {
|
|
1920
|
+
constructor(data) {
|
|
1921
|
+
if (data) {
|
|
1922
|
+
for (var property in data) {
|
|
1923
|
+
if (data.hasOwnProperty(property))
|
|
1924
|
+
this[property] = data[property];
|
|
1925
|
+
}
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
init(_data) {
|
|
1929
|
+
if (_data) {
|
|
1930
|
+
this.tenant_id = _data["tenant_id"];
|
|
1931
|
+
this.phone = _data["phone"];
|
|
1932
|
+
this.smsCode = _data["smsCode"];
|
|
1933
|
+
this.uniqueId = _data["uniqueId"];
|
|
1934
|
+
this.version = _data["version"];
|
|
1935
|
+
this.platform = _data["platform"];
|
|
1936
|
+
this.brand = _data["brand"];
|
|
1937
|
+
this.deviceName = _data["deviceName"];
|
|
1938
|
+
this.deviceModel = _data["deviceModel"];
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
static fromJS(data) {
|
|
1942
|
+
data = typeof data === 'object' ? data : {};
|
|
1943
|
+
let result = new MobileLoginDTO();
|
|
1944
|
+
result.init(data);
|
|
1945
|
+
return result;
|
|
1946
|
+
}
|
|
1947
|
+
toJSON(data) {
|
|
1948
|
+
data = typeof data === 'object' ? data : {};
|
|
1949
|
+
data["tenant_id"] = this.tenant_id;
|
|
1950
|
+
data["phone"] = this.phone;
|
|
1951
|
+
data["smsCode"] = this.smsCode;
|
|
1952
|
+
data["uniqueId"] = this.uniqueId;
|
|
1953
|
+
data["version"] = this.version;
|
|
1954
|
+
data["platform"] = this.platform;
|
|
1955
|
+
data["brand"] = this.brand;
|
|
1956
|
+
data["deviceName"] = this.deviceName;
|
|
1957
|
+
data["deviceModel"] = this.deviceModel;
|
|
1958
|
+
return data;
|
|
1959
|
+
}
|
|
1960
|
+
clone() {
|
|
1961
|
+
const json = this.toJSON();
|
|
1962
|
+
let result = new MobileLoginDTO();
|
|
1963
|
+
result.init(json);
|
|
1964
|
+
return result;
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
export class ObjectHttpResponseData {
|
|
1968
|
+
constructor(data) {
|
|
1969
|
+
if (data) {
|
|
1970
|
+
for (var property in data) {
|
|
1971
|
+
if (data.hasOwnProperty(property))
|
|
1972
|
+
this[property] = data[property];
|
|
1973
|
+
}
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
init(_data) {
|
|
1977
|
+
if (_data) {
|
|
1978
|
+
this.errorMessage = _data["errorMessage"];
|
|
1979
|
+
this.isSuccess = _data["isSuccess"];
|
|
1980
|
+
this.statusCode = _data["statusCode"];
|
|
1981
|
+
this.data = _data["data"];
|
|
1982
|
+
this.successMessage = _data["successMessage"];
|
|
1983
|
+
}
|
|
1984
|
+
}
|
|
1985
|
+
static fromJS(data) {
|
|
1986
|
+
data = typeof data === 'object' ? data : {};
|
|
1987
|
+
let result = new ObjectHttpResponseData();
|
|
1988
|
+
result.init(data);
|
|
1989
|
+
return result;
|
|
1990
|
+
}
|
|
1991
|
+
toJSON(data) {
|
|
1992
|
+
data = typeof data === 'object' ? data : {};
|
|
1993
|
+
data["errorMessage"] = this.errorMessage;
|
|
1994
|
+
data["isSuccess"] = this.isSuccess;
|
|
1995
|
+
data["statusCode"] = this.statusCode;
|
|
1996
|
+
data["data"] = this.data;
|
|
1997
|
+
data["successMessage"] = this.successMessage;
|
|
1998
|
+
return data;
|
|
1999
|
+
}
|
|
2000
|
+
clone() {
|
|
2001
|
+
const json = this.toJSON();
|
|
2002
|
+
let result = new ObjectHttpResponseData();
|
|
2003
|
+
result.init(json);
|
|
2004
|
+
return result;
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
export class OnlineValidatorContextDto {
|
|
2008
|
+
constructor(data) {
|
|
2009
|
+
if (data) {
|
|
2010
|
+
for (var property in data) {
|
|
2011
|
+
if (data.hasOwnProperty(property))
|
|
2012
|
+
this[property] = data[property];
|
|
2013
|
+
}
|
|
2014
|
+
}
|
|
2015
|
+
}
|
|
2016
|
+
init(_data) {
|
|
2017
|
+
if (_data) {
|
|
2018
|
+
this.guid = _data["guid"];
|
|
2019
|
+
this.parkId = _data["parkId"];
|
|
2020
|
+
this.parkName = _data["parkName"];
|
|
2021
|
+
this.companyId = _data["companyId"];
|
|
2022
|
+
this.subCompanyId = _data["subCompanyId"];
|
|
2023
|
+
this.validationTypeId = _data["validationTypeId"];
|
|
2024
|
+
}
|
|
2025
|
+
}
|
|
2026
|
+
static fromJS(data) {
|
|
2027
|
+
data = typeof data === 'object' ? data : {};
|
|
2028
|
+
let result = new OnlineValidatorContextDto();
|
|
2029
|
+
result.init(data);
|
|
2030
|
+
return result;
|
|
2031
|
+
}
|
|
2032
|
+
toJSON(data) {
|
|
2033
|
+
data = typeof data === 'object' ? data : {};
|
|
2034
|
+
data["guid"] = this.guid;
|
|
2035
|
+
data["parkId"] = this.parkId;
|
|
2036
|
+
data["parkName"] = this.parkName;
|
|
2037
|
+
data["companyId"] = this.companyId;
|
|
2038
|
+
data["subCompanyId"] = this.subCompanyId;
|
|
2039
|
+
data["validationTypeId"] = this.validationTypeId;
|
|
2040
|
+
return data;
|
|
2041
|
+
}
|
|
2042
|
+
clone() {
|
|
2043
|
+
const json = this.toJSON();
|
|
2044
|
+
let result = new OnlineValidatorContextDto();
|
|
2045
|
+
result.init(json);
|
|
2046
|
+
return result;
|
|
2047
|
+
}
|
|
2048
|
+
}
|
|
2049
|
+
export class OnlineValidatorContextDtoHttpResponseData {
|
|
2050
|
+
constructor(data) {
|
|
2051
|
+
if (data) {
|
|
2052
|
+
for (var property in data) {
|
|
2053
|
+
if (data.hasOwnProperty(property))
|
|
2054
|
+
this[property] = data[property];
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
init(_data) {
|
|
2059
|
+
if (_data) {
|
|
2060
|
+
this.errorMessage = _data["errorMessage"];
|
|
2061
|
+
this.isSuccess = _data["isSuccess"];
|
|
2062
|
+
this.statusCode = _data["statusCode"];
|
|
2063
|
+
this.data = _data["data"] ? OnlineValidatorContextDto.fromJS(_data["data"]) : undefined;
|
|
2064
|
+
this.successMessage = _data["successMessage"];
|
|
2065
|
+
}
|
|
2066
|
+
}
|
|
2067
|
+
static fromJS(data) {
|
|
2068
|
+
data = typeof data === 'object' ? data : {};
|
|
2069
|
+
let result = new OnlineValidatorContextDtoHttpResponseData();
|
|
2070
|
+
result.init(data);
|
|
2071
|
+
return result;
|
|
2072
|
+
}
|
|
2073
|
+
toJSON(data) {
|
|
2074
|
+
data = typeof data === 'object' ? data : {};
|
|
2075
|
+
data["errorMessage"] = this.errorMessage;
|
|
2076
|
+
data["isSuccess"] = this.isSuccess;
|
|
2077
|
+
data["statusCode"] = this.statusCode;
|
|
2078
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2079
|
+
data["successMessage"] = this.successMessage;
|
|
2080
|
+
return data;
|
|
2081
|
+
}
|
|
2082
|
+
clone() {
|
|
2083
|
+
const json = this.toJSON();
|
|
2084
|
+
let result = new OnlineValidatorContextDtoHttpResponseData();
|
|
2085
|
+
result.init(json);
|
|
2086
|
+
return result;
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
export var PasswordChangeType;
|
|
2090
|
+
(function (PasswordChangeType) {
|
|
2091
|
+
PasswordChangeType[PasswordChangeType["Registration"] = 0] = "Registration";
|
|
2092
|
+
PasswordChangeType[PasswordChangeType["Forgot"] = 1] = "Forgot";
|
|
2093
|
+
PasswordChangeType[PasswordChangeType["Expiration"] = 2] = "Expiration";
|
|
2094
|
+
})(PasswordChangeType || (PasswordChangeType = {}));
|
|
2095
|
+
export var PasswordExpirationState;
|
|
2096
|
+
(function (PasswordExpirationState) {
|
|
2097
|
+
PasswordExpirationState[PasswordExpirationState["NotExpired"] = 1] = "NotExpired";
|
|
2098
|
+
PasswordExpirationState[PasswordExpirationState["AboutToExpire"] = 2] = "AboutToExpire";
|
|
2099
|
+
PasswordExpirationState[PasswordExpirationState["Expired"] = 3] = "Expired";
|
|
2100
|
+
})(PasswordExpirationState || (PasswordExpirationState = {}));
|
|
2101
|
+
export var PermissionType;
|
|
2102
|
+
(function (PermissionType) {
|
|
2103
|
+
PermissionType[PermissionType["CcMain"] = 0] = "CcMain";
|
|
2104
|
+
PermissionType[PermissionType["DeprecatedAdminMain"] = 1] = "DeprecatedAdminMain";
|
|
2105
|
+
PermissionType[PermissionType["UnlockDoor"] = 2] = "UnlockDoor";
|
|
2106
|
+
PermissionType[PermissionType["VendGate"] = 3] = "VendGate";
|
|
2107
|
+
PermissionType[PermissionType["Validate"] = 4] = "Validate";
|
|
2108
|
+
PermissionType[PermissionType["SetPrice"] = 5] = "SetPrice";
|
|
2109
|
+
PermissionType[PermissionType["RestoreTicket"] = 6] = "RestoreTicket";
|
|
2110
|
+
PermissionType[PermissionType["ChangeDeviceAccessMode"] = 7] = "ChangeDeviceAccessMode";
|
|
2111
|
+
PermissionType[PermissionType["ResetDeviceAccessMode"] = 8] = "ResetDeviceAccessMode";
|
|
2112
|
+
PermissionType[PermissionType["RestartDevice"] = 9] = "RestartDevice";
|
|
2113
|
+
PermissionType[PermissionType["ResetBillDispenser"] = 10] = "ResetBillDispenser";
|
|
2114
|
+
PermissionType[PermissionType["CloseGate"] = 11] = "CloseGate";
|
|
2115
|
+
PermissionType[PermissionType["EjectJammedTicket"] = 12] = "EjectJammedTicket";
|
|
2116
|
+
PermissionType[PermissionType["SwallowJammedTicket"] = 13] = "SwallowJammedTicket";
|
|
2117
|
+
PermissionType[PermissionType["DeliverBundleBills"] = 14] = "DeliverBundleBills";
|
|
2118
|
+
PermissionType[PermissionType["LockCashRegister"] = 15] = "LockCashRegister";
|
|
2119
|
+
PermissionType[PermissionType["SetRate"] = 16] = "SetRate";
|
|
2120
|
+
PermissionType[PermissionType["InsertVirtualTicket"] = 17] = "InsertVirtualTicket";
|
|
2121
|
+
PermissionType[PermissionType["HoldRelay"] = 18] = "HoldRelay";
|
|
2122
|
+
PermissionType[PermissionType["OpenRelay"] = 19] = "OpenRelay";
|
|
2123
|
+
PermissionType[PermissionType["PrintTicket"] = 20] = "PrintTicket";
|
|
2124
|
+
PermissionType[PermissionType["TriggerLPRModule"] = 21] = "TriggerLPRModule";
|
|
2125
|
+
PermissionType[PermissionType["EnableReprintReceipt"] = 22] = "EnableReprintReceipt";
|
|
2126
|
+
PermissionType[PermissionType["OpenGateContinuously"] = 23] = "OpenGateContinuously";
|
|
2127
|
+
PermissionType[PermissionType["CloseGateContinuously"] = 24] = "CloseGateContinuously";
|
|
2128
|
+
PermissionType[PermissionType["ManuallyCloseTicket"] = 25] = "ManuallyCloseTicket";
|
|
2129
|
+
PermissionType[PermissionType["UpdateLocation"] = 26] = "UpdateLocation";
|
|
2130
|
+
PermissionType[PermissionType["UpdateOccupancy"] = 27] = "UpdateOccupancy";
|
|
2131
|
+
PermissionType[PermissionType["AttachTicket"] = 28] = "AttachTicket";
|
|
2132
|
+
PermissionType[PermissionType["UpdateLicensePlate"] = 29] = "UpdateLicensePlate";
|
|
2133
|
+
PermissionType[PermissionType["LostTicket"] = 30] = "LostTicket";
|
|
2134
|
+
PermissionType[PermissionType["InsertRemoteValidation"] = 31] = "InsertRemoteValidation";
|
|
2135
|
+
PermissionType[PermissionType["UpdatePayment"] = 32] = "UpdatePayment";
|
|
2136
|
+
PermissionType[PermissionType["UpdateZoneOccupancy"] = 33] = "UpdateZoneOccupancy";
|
|
2137
|
+
PermissionType[PermissionType["UpdateRemoteValidation"] = 34] = "UpdateRemoteValidation";
|
|
2138
|
+
PermissionType[PermissionType["ValidationMain"] = 35] = "ValidationMain";
|
|
2139
|
+
PermissionType[PermissionType["ValidationEValidationView"] = 36] = "ValidationEValidationView";
|
|
2140
|
+
PermissionType[PermissionType["ValidationStickerView"] = 37] = "ValidationStickerView";
|
|
2141
|
+
PermissionType[PermissionType["ValidationCouponView"] = 38] = "ValidationCouponView";
|
|
2142
|
+
PermissionType[PermissionType["ReportsMain"] = 39] = "ReportsMain";
|
|
2143
|
+
PermissionType[PermissionType["GuestMain"] = 40] = "GuestMain";
|
|
2144
|
+
PermissionType[PermissionType["UpdateDocument"] = 41] = "UpdateDocument";
|
|
2145
|
+
PermissionType[PermissionType["ViewRevenue"] = 42] = "ViewRevenue";
|
|
2146
|
+
PermissionType[PermissionType["PrintReceipt"] = 43] = "PrintReceipt";
|
|
2147
|
+
PermissionType[PermissionType["MonthliesMain"] = 44] = "MonthliesMain";
|
|
2148
|
+
PermissionType[PermissionType["PiMain"] = 45] = "PiMain";
|
|
2149
|
+
PermissionType[PermissionType["GuestGroupView"] = 46] = "GuestGroupView";
|
|
2150
|
+
PermissionType[PermissionType["SingleGuest"] = 47] = "SingleGuest";
|
|
2151
|
+
PermissionType[PermissionType["CloseTicketForISF"] = 48] = "CloseTicketForISF";
|
|
2152
|
+
PermissionType[PermissionType["PaymentForISF"] = 49] = "PaymentForISF";
|
|
2153
|
+
PermissionType[PermissionType["ManuallyRunZ"] = 50] = "ManuallyRunZ";
|
|
2154
|
+
PermissionType[PermissionType["UpdateSettings"] = 51] = "UpdateSettings";
|
|
2155
|
+
PermissionType[PermissionType["SetActiveRate"] = 52] = "SetActiveRate";
|
|
2156
|
+
PermissionType[PermissionType["UpdateMCDateTime"] = 53] = "UpdateMCDateTime";
|
|
2157
|
+
PermissionType[PermissionType["GuestHotelGuestView"] = 54] = "GuestHotelGuestView";
|
|
2158
|
+
PermissionType[PermissionType["GuestView"] = 55] = "GuestView";
|
|
2159
|
+
PermissionType[PermissionType["AccountManagementMain"] = 56] = "AccountManagementMain";
|
|
2160
|
+
PermissionType[PermissionType["AccountManagementAccountView"] = 57] = "AccountManagementAccountView";
|
|
2161
|
+
PermissionType[PermissionType["MonthliesView"] = 58] = "MonthliesView";
|
|
2162
|
+
PermissionType[PermissionType["MonthlySeriesCreate"] = 59] = "MonthlySeriesCreate";
|
|
2163
|
+
PermissionType[PermissionType["RunMacro"] = 60] = "RunMacro";
|
|
2164
|
+
PermissionType[PermissionType["TenantSettingsMain"] = 61] = "TenantSettingsMain";
|
|
2165
|
+
PermissionType[PermissionType["ManagementAdmin"] = 62] = "ManagementAdmin";
|
|
2166
|
+
PermissionType[PermissionType["BlackList"] = 63] = "BlackList";
|
|
2167
|
+
PermissionType[PermissionType["SystemAdmin"] = 64] = "SystemAdmin";
|
|
2168
|
+
PermissionType[PermissionType["OperationalAdmin"] = 65] = "OperationalAdmin";
|
|
2169
|
+
PermissionType[PermissionType["FacilitiesAndSmartparks"] = 66] = "FacilitiesAndSmartparks";
|
|
2170
|
+
PermissionType[PermissionType["Logo"] = 67] = "Logo";
|
|
2171
|
+
PermissionType[PermissionType["SmtpSettings"] = 68] = "SmtpSettings";
|
|
2172
|
+
PermissionType[PermissionType["DefaultUserSettings"] = 69] = "DefaultUserSettings";
|
|
2173
|
+
PermissionType[PermissionType["Audit"] = 70] = "Audit";
|
|
2174
|
+
PermissionType[PermissionType["BackofficeMain"] = 71] = "BackofficeMain";
|
|
2175
|
+
PermissionType[PermissionType["LotConfigurationMain"] = 72] = "LotConfigurationMain";
|
|
2176
|
+
PermissionType[PermissionType["LotConfigurationRates"] = 73] = "LotConfigurationRates";
|
|
2177
|
+
PermissionType[PermissionType["LotConfigurationScheduler"] = 74] = "LotConfigurationScheduler";
|
|
2178
|
+
PermissionType[PermissionType["LotConfigurationValidationProfile"] = 75] = "LotConfigurationValidationProfile";
|
|
2179
|
+
PermissionType[PermissionType["HotelGuestIOCreate"] = 76] = "HotelGuestIOCreate";
|
|
2180
|
+
PermissionType[PermissionType["ECommerceBackofficeMain"] = 77] = "ECommerceBackofficeMain";
|
|
2181
|
+
PermissionType[PermissionType["ValidationEValidationCreate"] = 78] = "ValidationEValidationCreate";
|
|
2182
|
+
PermissionType[PermissionType["ValidationEValidationUpdate"] = 79] = "ValidationEValidationUpdate";
|
|
2183
|
+
PermissionType[PermissionType["ValidationEValidationDelete"] = 80] = "ValidationEValidationDelete";
|
|
2184
|
+
PermissionType[PermissionType["ValidationStickerCreate"] = 81] = "ValidationStickerCreate";
|
|
2185
|
+
PermissionType[PermissionType["ValidationStickerUpdate"] = 82] = "ValidationStickerUpdate";
|
|
2186
|
+
PermissionType[PermissionType["ValidationStickerDelete"] = 83] = "ValidationStickerDelete";
|
|
2187
|
+
PermissionType[PermissionType["ValidationCouponCreate"] = 84] = "ValidationCouponCreate";
|
|
2188
|
+
PermissionType[PermissionType["ValidationCouponUpdate"] = 85] = "ValidationCouponUpdate";
|
|
2189
|
+
PermissionType[PermissionType["ValidationCouponDelete"] = 86] = "ValidationCouponDelete";
|
|
2190
|
+
PermissionType[PermissionType["GuestGroupCreate"] = 87] = "GuestGroupCreate";
|
|
2191
|
+
PermissionType[PermissionType["AccountManagementAccountCreate"] = 88] = "AccountManagementAccountCreate";
|
|
2192
|
+
PermissionType[PermissionType["AccountManagementAccountUpdate"] = 89] = "AccountManagementAccountUpdate";
|
|
2193
|
+
PermissionType[PermissionType["AccountManagementAccountDelete"] = 90] = "AccountManagementAccountDelete";
|
|
2194
|
+
PermissionType[PermissionType["MonthliesCreate"] = 91] = "MonthliesCreate";
|
|
2195
|
+
PermissionType[PermissionType["MonthliesUpdate"] = 92] = "MonthliesUpdate";
|
|
2196
|
+
PermissionType[PermissionType["MonthliesDelete"] = 93] = "MonthliesDelete";
|
|
2197
|
+
PermissionType[PermissionType["GuestCreate"] = 94] = "GuestCreate";
|
|
2198
|
+
PermissionType[PermissionType["GuestUpdate"] = 95] = "GuestUpdate";
|
|
2199
|
+
PermissionType[PermissionType["GuestDelete"] = 96] = "GuestDelete";
|
|
2200
|
+
PermissionType[PermissionType["ClosePaymentScreen"] = 97] = "ClosePaymentScreen";
|
|
2201
|
+
PermissionType[PermissionType["ECommerceAdmin"] = 98] = "ECommerceAdmin";
|
|
2202
|
+
PermissionType[PermissionType["ECommerceRegular"] = 99] = "ECommerceRegular";
|
|
2203
|
+
PermissionType[PermissionType["LotConfigurationAccessProfile"] = 100] = "LotConfigurationAccessProfile";
|
|
2204
|
+
})(PermissionType || (PermissionType = {}));
|
|
2205
|
+
export class RefreshTokenDto {
|
|
2206
|
+
constructor(data) {
|
|
2207
|
+
if (data) {
|
|
2208
|
+
for (var property in data) {
|
|
2209
|
+
if (data.hasOwnProperty(property))
|
|
2210
|
+
this[property] = data[property];
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2214
|
+
init(_data) {
|
|
2215
|
+
if (_data) {
|
|
2216
|
+
this.accessToken = _data["accessToken"];
|
|
2217
|
+
this.refreshToken = _data["refreshToken"];
|
|
2218
|
+
this.expiration = _data["expiration"] ? moment(_data["expiration"].toString()) : undefined;
|
|
2219
|
+
}
|
|
2220
|
+
}
|
|
2221
|
+
static fromJS(data) {
|
|
2222
|
+
data = typeof data === 'object' ? data : {};
|
|
2223
|
+
let result = new RefreshTokenDto();
|
|
2224
|
+
result.init(data);
|
|
2225
|
+
return result;
|
|
2226
|
+
}
|
|
2227
|
+
toJSON(data) {
|
|
2228
|
+
data = typeof data === 'object' ? data : {};
|
|
2229
|
+
data["accessToken"] = this.accessToken;
|
|
2230
|
+
data["refreshToken"] = this.refreshToken;
|
|
2231
|
+
data["expiration"] = this.expiration ? this.expiration.toISOString() : undefined;
|
|
2232
|
+
return data;
|
|
2233
|
+
}
|
|
2234
|
+
clone() {
|
|
2235
|
+
const json = this.toJSON();
|
|
2236
|
+
let result = new RefreshTokenDto();
|
|
2237
|
+
result.init(json);
|
|
2238
|
+
return result;
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2241
|
+
export class RefreshTokenDtoHttpResponseData {
|
|
2242
|
+
constructor(data) {
|
|
2243
|
+
if (data) {
|
|
2244
|
+
for (var property in data) {
|
|
2245
|
+
if (data.hasOwnProperty(property))
|
|
2246
|
+
this[property] = data[property];
|
|
2247
|
+
}
|
|
2248
|
+
}
|
|
2249
|
+
}
|
|
2250
|
+
init(_data) {
|
|
2251
|
+
if (_data) {
|
|
2252
|
+
this.errorMessage = _data["errorMessage"];
|
|
2253
|
+
this.isSuccess = _data["isSuccess"];
|
|
2254
|
+
this.statusCode = _data["statusCode"];
|
|
2255
|
+
this.data = _data["data"] ? RefreshTokenDto.fromJS(_data["data"]) : undefined;
|
|
2256
|
+
this.successMessage = _data["successMessage"];
|
|
2257
|
+
}
|
|
2258
|
+
}
|
|
2259
|
+
static fromJS(data) {
|
|
2260
|
+
data = typeof data === 'object' ? data : {};
|
|
2261
|
+
let result = new RefreshTokenDtoHttpResponseData();
|
|
2262
|
+
result.init(data);
|
|
2263
|
+
return result;
|
|
2264
|
+
}
|
|
2265
|
+
toJSON(data) {
|
|
2266
|
+
data = typeof data === 'object' ? data : {};
|
|
2267
|
+
data["errorMessage"] = this.errorMessage;
|
|
2268
|
+
data["isSuccess"] = this.isSuccess;
|
|
2269
|
+
data["statusCode"] = this.statusCode;
|
|
2270
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2271
|
+
data["successMessage"] = this.successMessage;
|
|
2272
|
+
return data;
|
|
2273
|
+
}
|
|
2274
|
+
clone() {
|
|
2275
|
+
const json = this.toJSON();
|
|
2276
|
+
let result = new RefreshTokenDtoHttpResponseData();
|
|
2277
|
+
result.init(json);
|
|
2278
|
+
return result;
|
|
2279
|
+
}
|
|
2280
|
+
}
|
|
2281
|
+
export class ServicesRunningStatusDto {
|
|
2282
|
+
constructor(data) {
|
|
2283
|
+
if (data) {
|
|
2284
|
+
for (var property in data) {
|
|
2285
|
+
if (data.hasOwnProperty(property))
|
|
2286
|
+
this[property] = data[property];
|
|
2287
|
+
}
|
|
2288
|
+
}
|
|
2289
|
+
}
|
|
2290
|
+
init(_data) {
|
|
2291
|
+
if (_data) {
|
|
2292
|
+
this.id = _data["id"];
|
|
2293
|
+
this.isSmartParkConnected = _data["isSmartParkConnected"];
|
|
2294
|
+
this.isSmartParkCoreConnected = _data["isSmartParkCoreConnected"];
|
|
2295
|
+
this.isSparkCoreConnected = _data["isSparkCoreConnected"];
|
|
2296
|
+
this.isSparkCloudConnected = _data["isSparkCloudConnected"];
|
|
2297
|
+
this.smartParkDisconnectedTimestamp = _data["smartParkDisconnectedTimestamp"] ? moment(_data["smartParkDisconnectedTimestamp"].toString()) : undefined;
|
|
2298
|
+
this.smartParkCoreDisconnectedTimestamp = _data["smartParkCoreDisconnectedTimestamp"] ? moment(_data["smartParkCoreDisconnectedTimestamp"].toString()) : undefined;
|
|
2299
|
+
this.sparkCoreDisconnectedTimestamp = _data["sparkCoreDisconnectedTimestamp"] ? moment(_data["sparkCoreDisconnectedTimestamp"].toString()) : undefined;
|
|
2300
|
+
this.sparkCloudDisconnectedTimestamp = _data["sparkCloudDisconnectedTimestamp"] ? moment(_data["sparkCloudDisconnectedTimestamp"].toString()) : undefined;
|
|
2301
|
+
}
|
|
2302
|
+
}
|
|
2303
|
+
static fromJS(data) {
|
|
2304
|
+
data = typeof data === 'object' ? data : {};
|
|
2305
|
+
let result = new ServicesRunningStatusDto();
|
|
2306
|
+
result.init(data);
|
|
2307
|
+
return result;
|
|
2308
|
+
}
|
|
2309
|
+
toJSON(data) {
|
|
2310
|
+
data = typeof data === 'object' ? data : {};
|
|
2311
|
+
data["id"] = this.id;
|
|
2312
|
+
data["isSmartParkConnected"] = this.isSmartParkConnected;
|
|
2313
|
+
data["isSmartParkCoreConnected"] = this.isSmartParkCoreConnected;
|
|
2314
|
+
data["isSparkCoreConnected"] = this.isSparkCoreConnected;
|
|
2315
|
+
data["isSparkCloudConnected"] = this.isSparkCloudConnected;
|
|
2316
|
+
data["smartParkDisconnectedTimestamp"] = this.smartParkDisconnectedTimestamp ? this.smartParkDisconnectedTimestamp.toISOString() : undefined;
|
|
2317
|
+
data["smartParkCoreDisconnectedTimestamp"] = this.smartParkCoreDisconnectedTimestamp ? this.smartParkCoreDisconnectedTimestamp.toISOString() : undefined;
|
|
2318
|
+
data["sparkCoreDisconnectedTimestamp"] = this.sparkCoreDisconnectedTimestamp ? this.sparkCoreDisconnectedTimestamp.toISOString() : undefined;
|
|
2319
|
+
data["sparkCloudDisconnectedTimestamp"] = this.sparkCloudDisconnectedTimestamp ? this.sparkCloudDisconnectedTimestamp.toISOString() : undefined;
|
|
2320
|
+
return data;
|
|
2321
|
+
}
|
|
2322
|
+
clone() {
|
|
2323
|
+
const json = this.toJSON();
|
|
2324
|
+
let result = new ServicesRunningStatusDto();
|
|
2325
|
+
result.init(json);
|
|
2326
|
+
return result;
|
|
2327
|
+
}
|
|
2328
|
+
}
|
|
2329
|
+
export var SettingsCategory;
|
|
2330
|
+
(function (SettingsCategory) {
|
|
2331
|
+
SettingsCategory[SettingsCategory["DateFormats"] = 0] = "DateFormats";
|
|
2332
|
+
SettingsCategory[SettingsCategory["Alerts"] = 1] = "Alerts";
|
|
2333
|
+
SettingsCategory[SettingsCategory["TicketsSpecifications"] = 2] = "TicketsSpecifications";
|
|
2334
|
+
SettingsCategory[SettingsCategory["Localization"] = 3] = "Localization";
|
|
2335
|
+
SettingsCategory[SettingsCategory["AlertsPreferences"] = 4] = "AlertsPreferences";
|
|
2336
|
+
SettingsCategory[SettingsCategory["TwoFactorAuthentication"] = 5] = "TwoFactorAuthentication";
|
|
2337
|
+
SettingsCategory[SettingsCategory["ECommerceBackofficeURL"] = 6] = "ECommerceBackofficeURL";
|
|
2338
|
+
SettingsCategory[SettingsCategory["SSO"] = 7] = "SSO";
|
|
2339
|
+
SettingsCategory[SettingsCategory["PasswordPolicy"] = 8] = "PasswordPolicy";
|
|
2340
|
+
})(SettingsCategory || (SettingsCategory = {}));
|
|
2341
|
+
export class SingleSignOnAuthenticationDto {
|
|
2342
|
+
constructor(data) {
|
|
2343
|
+
if (data) {
|
|
2344
|
+
for (var property in data) {
|
|
2345
|
+
if (data.hasOwnProperty(property))
|
|
2346
|
+
this[property] = data[property];
|
|
2347
|
+
}
|
|
2348
|
+
}
|
|
2349
|
+
}
|
|
2350
|
+
init(_data) {
|
|
2351
|
+
if (_data) {
|
|
2352
|
+
this.userStatus = _data["userStatus"];
|
|
2353
|
+
this.isAuthenticated = _data["isAuthenticated"];
|
|
2354
|
+
this.singleSignOnProvider = _data["singleSignOnProvider"];
|
|
2355
|
+
}
|
|
2356
|
+
}
|
|
2357
|
+
static fromJS(data) {
|
|
2358
|
+
data = typeof data === 'object' ? data : {};
|
|
2359
|
+
let result = new SingleSignOnAuthenticationDto();
|
|
2360
|
+
result.init(data);
|
|
2361
|
+
return result;
|
|
2362
|
+
}
|
|
2363
|
+
toJSON(data) {
|
|
2364
|
+
data = typeof data === 'object' ? data : {};
|
|
2365
|
+
data["userStatus"] = this.userStatus;
|
|
2366
|
+
data["isAuthenticated"] = this.isAuthenticated;
|
|
2367
|
+
data["singleSignOnProvider"] = this.singleSignOnProvider;
|
|
2368
|
+
return data;
|
|
2369
|
+
}
|
|
2370
|
+
clone() {
|
|
2371
|
+
const json = this.toJSON();
|
|
2372
|
+
let result = new SingleSignOnAuthenticationDto();
|
|
2373
|
+
result.init(json);
|
|
2374
|
+
return result;
|
|
2375
|
+
}
|
|
2376
|
+
}
|
|
2377
|
+
export var SingleSignOnProvider;
|
|
2378
|
+
(function (SingleSignOnProvider) {
|
|
2379
|
+
SingleSignOnProvider[SingleSignOnProvider["Microsoft"] = 1] = "Microsoft";
|
|
2380
|
+
SingleSignOnProvider[SingleSignOnProvider["PingFederate"] = 2] = "PingFederate";
|
|
2381
|
+
})(SingleSignOnProvider || (SingleSignOnProvider = {}));
|
|
2382
|
+
export class SingleSignOnSettings {
|
|
2383
|
+
constructor(data) {
|
|
2384
|
+
if (data) {
|
|
2385
|
+
for (var property in data) {
|
|
2386
|
+
if (data.hasOwnProperty(property))
|
|
2387
|
+
this[property] = data[property];
|
|
2388
|
+
}
|
|
2389
|
+
}
|
|
2390
|
+
}
|
|
2391
|
+
init(_data) {
|
|
2392
|
+
if (_data) {
|
|
2393
|
+
this.isEnabled = _data["isEnabled"];
|
|
2394
|
+
this.provider = _data["provider"];
|
|
2395
|
+
this.configurations = _data["configurations"];
|
|
2396
|
+
}
|
|
2397
|
+
}
|
|
2398
|
+
static fromJS(data) {
|
|
2399
|
+
data = typeof data === 'object' ? data : {};
|
|
2400
|
+
let result = new SingleSignOnSettings();
|
|
2401
|
+
result.init(data);
|
|
2402
|
+
return result;
|
|
2403
|
+
}
|
|
2404
|
+
toJSON(data) {
|
|
2405
|
+
data = typeof data === 'object' ? data : {};
|
|
2406
|
+
data["isEnabled"] = this.isEnabled;
|
|
2407
|
+
data["provider"] = this.provider;
|
|
2408
|
+
data["configurations"] = this.configurations;
|
|
2409
|
+
return data;
|
|
2410
|
+
}
|
|
2411
|
+
clone() {
|
|
2412
|
+
const json = this.toJSON();
|
|
2413
|
+
let result = new SingleSignOnSettings();
|
|
2414
|
+
result.init(json);
|
|
2415
|
+
return result;
|
|
2416
|
+
}
|
|
2417
|
+
}
|
|
2418
|
+
export class SmsAuthDTO {
|
|
2419
|
+
constructor(data) {
|
|
2420
|
+
if (data) {
|
|
2421
|
+
for (var property in data) {
|
|
2422
|
+
if (data.hasOwnProperty(property))
|
|
2423
|
+
this[property] = data[property];
|
|
2424
|
+
}
|
|
2425
|
+
}
|
|
2426
|
+
}
|
|
2427
|
+
init(_data) {
|
|
2428
|
+
if (_data) {
|
|
2429
|
+
this.tenant_id = _data["tenant_id"];
|
|
2430
|
+
this.phone = _data["phone"];
|
|
2431
|
+
this.appName = _data["appName"];
|
|
2432
|
+
}
|
|
2433
|
+
}
|
|
2434
|
+
static fromJS(data) {
|
|
2435
|
+
data = typeof data === 'object' ? data : {};
|
|
2436
|
+
let result = new SmsAuthDTO();
|
|
2437
|
+
result.init(data);
|
|
2438
|
+
return result;
|
|
2439
|
+
}
|
|
2440
|
+
toJSON(data) {
|
|
2441
|
+
data = typeof data === 'object' ? data : {};
|
|
2442
|
+
data["tenant_id"] = this.tenant_id;
|
|
2443
|
+
data["phone"] = this.phone;
|
|
2444
|
+
data["appName"] = this.appName;
|
|
2445
|
+
return data;
|
|
2446
|
+
}
|
|
2447
|
+
clone() {
|
|
2448
|
+
const json = this.toJSON();
|
|
2449
|
+
let result = new SmsAuthDTO();
|
|
2450
|
+
result.init(json);
|
|
2451
|
+
return result;
|
|
2452
|
+
}
|
|
2453
|
+
}
|
|
2454
|
+
export class SparkSettingsDto {
|
|
2455
|
+
constructor(data) {
|
|
2456
|
+
if (data) {
|
|
2457
|
+
for (var property in data) {
|
|
2458
|
+
if (data.hasOwnProperty(property))
|
|
2459
|
+
this[property] = data[property];
|
|
2460
|
+
}
|
|
2461
|
+
}
|
|
2462
|
+
}
|
|
2463
|
+
init(_data) {
|
|
2464
|
+
if (_data) {
|
|
2465
|
+
this.category = _data["category"];
|
|
2466
|
+
this.settingsJson = _data["settingsJson"];
|
|
2467
|
+
}
|
|
2468
|
+
}
|
|
2469
|
+
static fromJS(data) {
|
|
2470
|
+
data = typeof data === 'object' ? data : {};
|
|
2471
|
+
let result = new SparkSettingsDto();
|
|
2472
|
+
result.init(data);
|
|
2473
|
+
return result;
|
|
2474
|
+
}
|
|
2475
|
+
toJSON(data) {
|
|
2476
|
+
data = typeof data === 'object' ? data : {};
|
|
2477
|
+
data["category"] = this.category;
|
|
2478
|
+
data["settingsJson"] = this.settingsJson;
|
|
2479
|
+
return data;
|
|
2480
|
+
}
|
|
2481
|
+
clone() {
|
|
2482
|
+
const json = this.toJSON();
|
|
2483
|
+
let result = new SparkSettingsDto();
|
|
2484
|
+
result.init(json);
|
|
2485
|
+
return result;
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
export var SubModule;
|
|
2489
|
+
(function (SubModule) {
|
|
2490
|
+
SubModule[SubModule["EValidation"] = 0] = "EValidation";
|
|
2491
|
+
SubModule[SubModule["Stickers"] = 1] = "Stickers";
|
|
2492
|
+
SubModule[SubModule["Coupons"] = 2] = "Coupons";
|
|
2493
|
+
SubModule[SubModule["Guests"] = 3] = "Guests";
|
|
2494
|
+
SubModule[SubModule["HotelGuests"] = 4] = "HotelGuests";
|
|
2495
|
+
SubModule[SubModule["Monthlies"] = 5] = "Monthlies";
|
|
2496
|
+
SubModule[SubModule["Accounts"] = 6] = "Accounts";
|
|
2497
|
+
SubModule[SubModule["UserManagement"] = 7] = "UserManagement";
|
|
2498
|
+
SubModule[SubModule["FacilitiesAndSmartparks"] = 8] = "FacilitiesAndSmartparks";
|
|
2499
|
+
SubModule[SubModule["Logo"] = 9] = "Logo";
|
|
2500
|
+
SubModule[SubModule["SmtpSettings"] = 10] = "SmtpSettings";
|
|
2501
|
+
SubModule[SubModule["DefaultUserSettings"] = 11] = "DefaultUserSettings";
|
|
2502
|
+
SubModule[SubModule["Audit"] = 12] = "Audit";
|
|
2503
|
+
SubModule[SubModule["Rates"] = 13] = "Rates";
|
|
2504
|
+
SubModule[SubModule["Scheduler"] = 14] = "Scheduler";
|
|
2505
|
+
SubModule[SubModule["ValidationProfiles"] = 15] = "ValidationProfiles";
|
|
2506
|
+
SubModule[SubModule["HotelGuestsIO"] = 16] = "HotelGuestsIO";
|
|
2507
|
+
SubModule[SubModule["AccessProfiles"] = 17] = "AccessProfiles";
|
|
2508
|
+
})(SubModule || (SubModule = {}));
|
|
2509
|
+
export class TenantDto {
|
|
2510
|
+
constructor(data) {
|
|
2511
|
+
if (data) {
|
|
2512
|
+
for (var property in data) {
|
|
2513
|
+
if (data.hasOwnProperty(property))
|
|
2514
|
+
this[property] = data[property];
|
|
2515
|
+
}
|
|
2516
|
+
}
|
|
2517
|
+
}
|
|
2518
|
+
init(_data) {
|
|
2519
|
+
if (_data) {
|
|
2520
|
+
this.name = _data["name"];
|
|
2521
|
+
this.displayName = _data["displayName"];
|
|
2522
|
+
if (_data["props"]) {
|
|
2523
|
+
this.props = {};
|
|
2524
|
+
for (let key in _data["props"]) {
|
|
2525
|
+
if (_data["props"].hasOwnProperty(key))
|
|
2526
|
+
this.props[key] = _data["props"][key];
|
|
2527
|
+
}
|
|
2528
|
+
}
|
|
2529
|
+
this.id = _data["id"];
|
|
2530
|
+
this.treeId = _data["treeId"];
|
|
2531
|
+
}
|
|
2532
|
+
}
|
|
2533
|
+
static fromJS(data) {
|
|
2534
|
+
data = typeof data === 'object' ? data : {};
|
|
2535
|
+
let result = new TenantDto();
|
|
2536
|
+
result.init(data);
|
|
2537
|
+
return result;
|
|
2538
|
+
}
|
|
2539
|
+
toJSON(data) {
|
|
2540
|
+
data = typeof data === 'object' ? data : {};
|
|
2541
|
+
data["name"] = this.name;
|
|
2542
|
+
data["displayName"] = this.displayName;
|
|
2543
|
+
if (this.props) {
|
|
2544
|
+
data["props"] = {};
|
|
2545
|
+
for (let key in this.props) {
|
|
2546
|
+
if (this.props.hasOwnProperty(key))
|
|
2547
|
+
data["props"][key] = this.props[key];
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
data["id"] = this.id;
|
|
2551
|
+
data["treeId"] = this.treeId;
|
|
2552
|
+
return data;
|
|
2553
|
+
}
|
|
2554
|
+
clone() {
|
|
2555
|
+
const json = this.toJSON();
|
|
2556
|
+
let result = new TenantDto();
|
|
2557
|
+
result.init(json);
|
|
2558
|
+
return result;
|
|
2559
|
+
}
|
|
2560
|
+
}
|
|
2561
|
+
export class TfaSetupDto {
|
|
2562
|
+
constructor(data) {
|
|
2563
|
+
if (data) {
|
|
2564
|
+
for (var property in data) {
|
|
2565
|
+
if (data.hasOwnProperty(property))
|
|
2566
|
+
this[property] = data[property];
|
|
2567
|
+
}
|
|
2568
|
+
}
|
|
2569
|
+
}
|
|
2570
|
+
init(_data) {
|
|
2571
|
+
if (_data) {
|
|
2572
|
+
this.email = _data["email"];
|
|
2573
|
+
this.isTfaEnabled = _data["isTfaEnabled"];
|
|
2574
|
+
this.authenticatorKey = _data["authenticatorKey"];
|
|
2575
|
+
this.qrCodeImageUrl = _data["qrCodeImageUrl"];
|
|
2576
|
+
this.registered = _data["registered"];
|
|
2577
|
+
}
|
|
2578
|
+
}
|
|
2579
|
+
static fromJS(data) {
|
|
2580
|
+
data = typeof data === 'object' ? data : {};
|
|
2581
|
+
let result = new TfaSetupDto();
|
|
2582
|
+
result.init(data);
|
|
2583
|
+
return result;
|
|
2584
|
+
}
|
|
2585
|
+
toJSON(data) {
|
|
2586
|
+
data = typeof data === 'object' ? data : {};
|
|
2587
|
+
data["email"] = this.email;
|
|
2588
|
+
data["isTfaEnabled"] = this.isTfaEnabled;
|
|
2589
|
+
data["authenticatorKey"] = this.authenticatorKey;
|
|
2590
|
+
data["qrCodeImageUrl"] = this.qrCodeImageUrl;
|
|
2591
|
+
data["registered"] = this.registered;
|
|
2592
|
+
return data;
|
|
2593
|
+
}
|
|
2594
|
+
clone() {
|
|
2595
|
+
const json = this.toJSON();
|
|
2596
|
+
let result = new TfaSetupDto();
|
|
2597
|
+
result.init(json);
|
|
2598
|
+
return result;
|
|
2599
|
+
}
|
|
2600
|
+
}
|
|
2601
|
+
export class ThirdPartyVendorDto {
|
|
2602
|
+
constructor(data) {
|
|
2603
|
+
if (data) {
|
|
2604
|
+
for (var property in data) {
|
|
2605
|
+
if (data.hasOwnProperty(property))
|
|
2606
|
+
this[property] = data[property];
|
|
2607
|
+
}
|
|
2608
|
+
}
|
|
2609
|
+
}
|
|
2610
|
+
init(_data) {
|
|
2611
|
+
if (_data) {
|
|
2612
|
+
this.accountId = _data["accountId"];
|
|
2613
|
+
if (Array.isArray(_data["permissionTypes"])) {
|
|
2614
|
+
this.permissionTypes = [];
|
|
2615
|
+
for (let item of _data["permissionTypes"])
|
|
2616
|
+
this.permissionTypes.push(item);
|
|
2617
|
+
}
|
|
2618
|
+
this.parkCloudId = _data["parkCloudId"];
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2621
|
+
static fromJS(data) {
|
|
2622
|
+
data = typeof data === 'object' ? data : {};
|
|
2623
|
+
let result = new ThirdPartyVendorDto();
|
|
2624
|
+
result.init(data);
|
|
2625
|
+
return result;
|
|
2626
|
+
}
|
|
2627
|
+
toJSON(data) {
|
|
2628
|
+
data = typeof data === 'object' ? data : {};
|
|
2629
|
+
data["accountId"] = this.accountId;
|
|
2630
|
+
if (Array.isArray(this.permissionTypes)) {
|
|
2631
|
+
data["permissionTypes"] = [];
|
|
2632
|
+
for (let item of this.permissionTypes)
|
|
2633
|
+
data["permissionTypes"].push(item);
|
|
2634
|
+
}
|
|
2635
|
+
data["parkCloudId"] = this.parkCloudId;
|
|
2636
|
+
return data;
|
|
2637
|
+
}
|
|
2638
|
+
clone() {
|
|
2639
|
+
const json = this.toJSON();
|
|
2640
|
+
let result = new ThirdPartyVendorDto();
|
|
2641
|
+
result.init(json);
|
|
2642
|
+
return result;
|
|
2643
|
+
}
|
|
2644
|
+
}
|
|
2645
|
+
export class ThirdPartyVendorDtoHttpResponseData {
|
|
2646
|
+
constructor(data) {
|
|
2647
|
+
if (data) {
|
|
2648
|
+
for (var property in data) {
|
|
2649
|
+
if (data.hasOwnProperty(property))
|
|
2650
|
+
this[property] = data[property];
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
}
|
|
2654
|
+
init(_data) {
|
|
2655
|
+
if (_data) {
|
|
2656
|
+
this.errorMessage = _data["errorMessage"];
|
|
2657
|
+
this.isSuccess = _data["isSuccess"];
|
|
2658
|
+
this.statusCode = _data["statusCode"];
|
|
2659
|
+
this.data = _data["data"] ? ThirdPartyVendorDto.fromJS(_data["data"]) : undefined;
|
|
2660
|
+
this.successMessage = _data["successMessage"];
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2663
|
+
static fromJS(data) {
|
|
2664
|
+
data = typeof data === 'object' ? data : {};
|
|
2665
|
+
let result = new ThirdPartyVendorDtoHttpResponseData();
|
|
2666
|
+
result.init(data);
|
|
2667
|
+
return result;
|
|
2668
|
+
}
|
|
2669
|
+
toJSON(data) {
|
|
2670
|
+
data = typeof data === 'object' ? data : {};
|
|
2671
|
+
data["errorMessage"] = this.errorMessage;
|
|
2672
|
+
data["isSuccess"] = this.isSuccess;
|
|
2673
|
+
data["statusCode"] = this.statusCode;
|
|
2674
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2675
|
+
data["successMessage"] = this.successMessage;
|
|
2676
|
+
return data;
|
|
2677
|
+
}
|
|
2678
|
+
clone() {
|
|
2679
|
+
const json = this.toJSON();
|
|
2680
|
+
let result = new ThirdPartyVendorDtoHttpResponseData();
|
|
2681
|
+
result.init(json);
|
|
2682
|
+
return result;
|
|
2683
|
+
}
|
|
2684
|
+
}
|
|
2685
|
+
export class Toggle2FactorAuthForUserResponseDto {
|
|
2686
|
+
constructor(data) {
|
|
2687
|
+
if (data) {
|
|
2688
|
+
for (var property in data) {
|
|
2689
|
+
if (data.hasOwnProperty(property))
|
|
2690
|
+
this[property] = data[property];
|
|
2691
|
+
}
|
|
2692
|
+
}
|
|
2693
|
+
}
|
|
2694
|
+
init(_data) {
|
|
2695
|
+
if (_data) {
|
|
2696
|
+
this.isSuccess = _data["isSuccess"];
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
static fromJS(data) {
|
|
2700
|
+
data = typeof data === 'object' ? data : {};
|
|
2701
|
+
let result = new Toggle2FactorAuthForUserResponseDto();
|
|
2702
|
+
result.init(data);
|
|
2703
|
+
return result;
|
|
2704
|
+
}
|
|
2705
|
+
toJSON(data) {
|
|
2706
|
+
data = typeof data === 'object' ? data : {};
|
|
2707
|
+
data["isSuccess"] = this.isSuccess;
|
|
2708
|
+
return data;
|
|
2709
|
+
}
|
|
2710
|
+
clone() {
|
|
2711
|
+
const json = this.toJSON();
|
|
2712
|
+
let result = new Toggle2FactorAuthForUserResponseDto();
|
|
2713
|
+
result.init(json);
|
|
2714
|
+
return result;
|
|
2715
|
+
}
|
|
2716
|
+
}
|
|
2717
|
+
export class Toggle2FactorAuthForUserResponseDtoHttpResponseData {
|
|
2718
|
+
constructor(data) {
|
|
2719
|
+
if (data) {
|
|
2720
|
+
for (var property in data) {
|
|
2721
|
+
if (data.hasOwnProperty(property))
|
|
2722
|
+
this[property] = data[property];
|
|
2723
|
+
}
|
|
2724
|
+
}
|
|
2725
|
+
}
|
|
2726
|
+
init(_data) {
|
|
2727
|
+
if (_data) {
|
|
2728
|
+
this.errorMessage = _data["errorMessage"];
|
|
2729
|
+
this.isSuccess = _data["isSuccess"];
|
|
2730
|
+
this.statusCode = _data["statusCode"];
|
|
2731
|
+
this.data = _data["data"] ? Toggle2FactorAuthForUserResponseDto.fromJS(_data["data"]) : undefined;
|
|
2732
|
+
this.successMessage = _data["successMessage"];
|
|
2733
|
+
}
|
|
2734
|
+
}
|
|
2735
|
+
static fromJS(data) {
|
|
2736
|
+
data = typeof data === 'object' ? data : {};
|
|
2737
|
+
let result = new Toggle2FactorAuthForUserResponseDtoHttpResponseData();
|
|
2738
|
+
result.init(data);
|
|
2739
|
+
return result;
|
|
2740
|
+
}
|
|
2741
|
+
toJSON(data) {
|
|
2742
|
+
data = typeof data === 'object' ? data : {};
|
|
2743
|
+
data["errorMessage"] = this.errorMessage;
|
|
2744
|
+
data["isSuccess"] = this.isSuccess;
|
|
2745
|
+
data["statusCode"] = this.statusCode;
|
|
2746
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2747
|
+
data["successMessage"] = this.successMessage;
|
|
2748
|
+
return data;
|
|
2749
|
+
}
|
|
2750
|
+
clone() {
|
|
2751
|
+
const json = this.toJSON();
|
|
2752
|
+
let result = new Toggle2FactorAuthForUserResponseDtoHttpResponseData();
|
|
2753
|
+
result.init(json);
|
|
2754
|
+
return result;
|
|
2755
|
+
}
|
|
2756
|
+
}
|
|
2757
|
+
export class TwoFactorAuthenticationDto {
|
|
2758
|
+
constructor(data) {
|
|
2759
|
+
if (data) {
|
|
2760
|
+
for (var property in data) {
|
|
2761
|
+
if (data.hasOwnProperty(property))
|
|
2762
|
+
this[property] = data[property];
|
|
2763
|
+
}
|
|
2764
|
+
}
|
|
2765
|
+
}
|
|
2766
|
+
init(_data) {
|
|
2767
|
+
if (_data) {
|
|
2768
|
+
this.isEnabledForUser = _data["isEnabledForUser"];
|
|
2769
|
+
this.isRequierd2FASetup = _data["isRequierd2FASetup"];
|
|
2770
|
+
this.activateResponseDto = _data["activateResponseDto"] ? ActivateResponseDto.fromJS(_data["activateResponseDto"]) : undefined;
|
|
2771
|
+
}
|
|
2772
|
+
}
|
|
2773
|
+
static fromJS(data) {
|
|
2774
|
+
data = typeof data === 'object' ? data : {};
|
|
2775
|
+
let result = new TwoFactorAuthenticationDto();
|
|
2776
|
+
result.init(data);
|
|
2777
|
+
return result;
|
|
2778
|
+
}
|
|
2779
|
+
toJSON(data) {
|
|
2780
|
+
data = typeof data === 'object' ? data : {};
|
|
2781
|
+
data["isEnabledForUser"] = this.isEnabledForUser;
|
|
2782
|
+
data["isRequierd2FASetup"] = this.isRequierd2FASetup;
|
|
2783
|
+
data["activateResponseDto"] = this.activateResponseDto ? this.activateResponseDto.toJSON() : undefined;
|
|
2784
|
+
return data;
|
|
2785
|
+
}
|
|
2786
|
+
clone() {
|
|
2787
|
+
const json = this.toJSON();
|
|
2788
|
+
let result = new TwoFactorAuthenticationDto();
|
|
2789
|
+
result.init(json);
|
|
2790
|
+
return result;
|
|
2791
|
+
}
|
|
2792
|
+
}
|
|
2793
|
+
export var UserStatus;
|
|
2794
|
+
(function (UserStatus) {
|
|
2795
|
+
UserStatus[UserStatus["Active"] = 0] = "Active";
|
|
2796
|
+
UserStatus[UserStatus["Blocked"] = 1] = "Blocked";
|
|
2797
|
+
UserStatus[UserStatus["Invited"] = 2] = "Invited";
|
|
2798
|
+
UserStatus[UserStatus["Ignore"] = 3] = "Ignore";
|
|
2799
|
+
UserStatus[UserStatus["PasswordExpired"] = 4] = "PasswordExpired";
|
|
2800
|
+
UserStatus[UserStatus["Revoked"] = 5] = "Revoked";
|
|
2801
|
+
UserStatus[UserStatus["TemporaryBlocked"] = 6] = "TemporaryBlocked";
|
|
2802
|
+
UserStatus[UserStatus["AwaitingAccess"] = 7] = "AwaitingAccess";
|
|
2803
|
+
})(UserStatus || (UserStatus = {}));
|
|
2804
|
+
export class ValidateActivationUserDto {
|
|
2805
|
+
constructor(data) {
|
|
2806
|
+
if (data) {
|
|
2807
|
+
for (var property in data) {
|
|
2808
|
+
if (data.hasOwnProperty(property))
|
|
2809
|
+
this[property] = data[property];
|
|
2810
|
+
}
|
|
2811
|
+
}
|
|
2812
|
+
}
|
|
2813
|
+
init(_data) {
|
|
2814
|
+
if (_data) {
|
|
2815
|
+
this.name = _data["name"];
|
|
2816
|
+
this.lastName = _data["lastName"];
|
|
2817
|
+
this.uName = _data["uName"];
|
|
2818
|
+
this.status = _data["status"];
|
|
2819
|
+
this.id = _data["id"];
|
|
2820
|
+
this.pml = _data["pml"];
|
|
2821
|
+
}
|
|
2822
|
+
}
|
|
2823
|
+
static fromJS(data) {
|
|
2824
|
+
data = typeof data === 'object' ? data : {};
|
|
2825
|
+
let result = new ValidateActivationUserDto();
|
|
2826
|
+
result.init(data);
|
|
2827
|
+
return result;
|
|
2828
|
+
}
|
|
2829
|
+
toJSON(data) {
|
|
2830
|
+
data = typeof data === 'object' ? data : {};
|
|
2831
|
+
data["name"] = this.name;
|
|
2832
|
+
data["lastName"] = this.lastName;
|
|
2833
|
+
data["uName"] = this.uName;
|
|
2834
|
+
data["status"] = this.status;
|
|
2835
|
+
data["id"] = this.id;
|
|
2836
|
+
data["pml"] = this.pml;
|
|
2837
|
+
return data;
|
|
2838
|
+
}
|
|
2839
|
+
clone() {
|
|
2840
|
+
const json = this.toJSON();
|
|
2841
|
+
let result = new ValidateActivationUserDto();
|
|
2842
|
+
result.init(json);
|
|
2843
|
+
return result;
|
|
2844
|
+
}
|
|
2845
|
+
}
|
|
2846
|
+
export class ValidateActivationUserDtoHttpResponseData {
|
|
2847
|
+
constructor(data) {
|
|
2848
|
+
if (data) {
|
|
2849
|
+
for (var property in data) {
|
|
2850
|
+
if (data.hasOwnProperty(property))
|
|
2851
|
+
this[property] = data[property];
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
}
|
|
2855
|
+
init(_data) {
|
|
2856
|
+
if (_data) {
|
|
2857
|
+
this.errorMessage = _data["errorMessage"];
|
|
2858
|
+
this.isSuccess = _data["isSuccess"];
|
|
2859
|
+
this.statusCode = _data["statusCode"];
|
|
2860
|
+
this.data = _data["data"] ? ValidateActivationUserDto.fromJS(_data["data"]) : undefined;
|
|
2861
|
+
this.successMessage = _data["successMessage"];
|
|
2862
|
+
}
|
|
2863
|
+
}
|
|
2864
|
+
static fromJS(data) {
|
|
2865
|
+
data = typeof data === 'object' ? data : {};
|
|
2866
|
+
let result = new ValidateActivationUserDtoHttpResponseData();
|
|
2867
|
+
result.init(data);
|
|
2868
|
+
return result;
|
|
2869
|
+
}
|
|
2870
|
+
toJSON(data) {
|
|
2871
|
+
data = typeof data === 'object' ? data : {};
|
|
2872
|
+
data["errorMessage"] = this.errorMessage;
|
|
2873
|
+
data["isSuccess"] = this.isSuccess;
|
|
2874
|
+
data["statusCode"] = this.statusCode;
|
|
2875
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2876
|
+
data["successMessage"] = this.successMessage;
|
|
2877
|
+
return data;
|
|
2878
|
+
}
|
|
2879
|
+
clone() {
|
|
2880
|
+
const json = this.toJSON();
|
|
2881
|
+
let result = new ValidateActivationUserDtoHttpResponseData();
|
|
2882
|
+
result.init(json);
|
|
2883
|
+
return result;
|
|
2884
|
+
}
|
|
2885
|
+
}
|
|
2886
|
+
export class Verify2FactorAuthRequestDto {
|
|
2887
|
+
constructor(data) {
|
|
2888
|
+
if (data) {
|
|
2889
|
+
for (var property in data) {
|
|
2890
|
+
if (data.hasOwnProperty(property))
|
|
2891
|
+
this[property] = data[property];
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
}
|
|
2895
|
+
init(_data) {
|
|
2896
|
+
if (_data) {
|
|
2897
|
+
this.code = _data["code"];
|
|
2898
|
+
this.userName = _data["userName"];
|
|
2899
|
+
}
|
|
2900
|
+
}
|
|
2901
|
+
static fromJS(data) {
|
|
2902
|
+
data = typeof data === 'object' ? data : {};
|
|
2903
|
+
let result = new Verify2FactorAuthRequestDto();
|
|
2904
|
+
result.init(data);
|
|
2905
|
+
return result;
|
|
2906
|
+
}
|
|
2907
|
+
toJSON(data) {
|
|
2908
|
+
data = typeof data === 'object' ? data : {};
|
|
2909
|
+
data["code"] = this.code;
|
|
2910
|
+
data["userName"] = this.userName;
|
|
2911
|
+
return data;
|
|
2912
|
+
}
|
|
2913
|
+
clone() {
|
|
2914
|
+
const json = this.toJSON();
|
|
2915
|
+
let result = new Verify2FactorAuthRequestDto();
|
|
2916
|
+
result.init(json);
|
|
2917
|
+
return result;
|
|
2918
|
+
}
|
|
2919
|
+
}
|
|
2920
|
+
export class Verify2FactorAuthResponsetDto {
|
|
2921
|
+
constructor(data) {
|
|
2922
|
+
if (data) {
|
|
2923
|
+
for (var property in data) {
|
|
2924
|
+
if (data.hasOwnProperty(property))
|
|
2925
|
+
this[property] = data[property];
|
|
2926
|
+
}
|
|
2927
|
+
}
|
|
2928
|
+
}
|
|
2929
|
+
init(_data) {
|
|
2930
|
+
if (_data) {
|
|
2931
|
+
this.isSuccess = _data["isSuccess"];
|
|
2932
|
+
}
|
|
2933
|
+
}
|
|
2934
|
+
static fromJS(data) {
|
|
2935
|
+
data = typeof data === 'object' ? data : {};
|
|
2936
|
+
let result = new Verify2FactorAuthResponsetDto();
|
|
2937
|
+
result.init(data);
|
|
2938
|
+
return result;
|
|
2939
|
+
}
|
|
2940
|
+
toJSON(data) {
|
|
2941
|
+
data = typeof data === 'object' ? data : {};
|
|
2942
|
+
data["isSuccess"] = this.isSuccess;
|
|
2943
|
+
return data;
|
|
2944
|
+
}
|
|
2945
|
+
clone() {
|
|
2946
|
+
const json = this.toJSON();
|
|
2947
|
+
let result = new Verify2FactorAuthResponsetDto();
|
|
2948
|
+
result.init(json);
|
|
2949
|
+
return result;
|
|
2950
|
+
}
|
|
2951
|
+
}
|
|
2952
|
+
export class Verify2FactorAuthResponsetDtoHttpResponseData {
|
|
2953
|
+
constructor(data) {
|
|
2954
|
+
if (data) {
|
|
2955
|
+
for (var property in data) {
|
|
2956
|
+
if (data.hasOwnProperty(property))
|
|
2957
|
+
this[property] = data[property];
|
|
2958
|
+
}
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2961
|
+
init(_data) {
|
|
2962
|
+
if (_data) {
|
|
2963
|
+
this.errorMessage = _data["errorMessage"];
|
|
2964
|
+
this.isSuccess = _data["isSuccess"];
|
|
2965
|
+
this.statusCode = _data["statusCode"];
|
|
2966
|
+
this.data = _data["data"] ? Verify2FactorAuthResponsetDto.fromJS(_data["data"]) : undefined;
|
|
2967
|
+
this.successMessage = _data["successMessage"];
|
|
2968
|
+
}
|
|
2969
|
+
}
|
|
2970
|
+
static fromJS(data) {
|
|
2971
|
+
data = typeof data === 'object' ? data : {};
|
|
2972
|
+
let result = new Verify2FactorAuthResponsetDtoHttpResponseData();
|
|
2973
|
+
result.init(data);
|
|
2974
|
+
return result;
|
|
2975
|
+
}
|
|
2976
|
+
toJSON(data) {
|
|
2977
|
+
data = typeof data === 'object' ? data : {};
|
|
2978
|
+
data["errorMessage"] = this.errorMessage;
|
|
2979
|
+
data["isSuccess"] = this.isSuccess;
|
|
2980
|
+
data["statusCode"] = this.statusCode;
|
|
2981
|
+
data["data"] = this.data ? this.data.toJSON() : undefined;
|
|
2982
|
+
data["successMessage"] = this.successMessage;
|
|
2983
|
+
return data;
|
|
2984
|
+
}
|
|
2985
|
+
clone() {
|
|
2986
|
+
const json = this.toJSON();
|
|
2987
|
+
let result = new Verify2FactorAuthResponsetDtoHttpResponseData();
|
|
2988
|
+
result.init(json);
|
|
2989
|
+
return result;
|
|
2990
|
+
}
|
|
2991
|
+
}
|
|
2992
|
+
export class ApiException extends Error {
|
|
2993
|
+
constructor(message, status, response, headers, result) {
|
|
2994
|
+
super();
|
|
2995
|
+
this.isApiException = true;
|
|
2996
|
+
this.message = message;
|
|
2997
|
+
this.status = status;
|
|
2998
|
+
this.response = response;
|
|
2999
|
+
this.headers = headers;
|
|
3000
|
+
this.result = result;
|
|
3001
|
+
}
|
|
3002
|
+
static isApiException(obj) {
|
|
3003
|
+
return obj.isApiException === true;
|
|
3004
|
+
}
|
|
3005
|
+
}
|
|
3006
|
+
function throwException(message, status, response, headers, result) {
|
|
3007
|
+
if (result !== null && result !== undefined)
|
|
3008
|
+
return _observableThrow(result);
|
|
3009
|
+
else
|
|
3010
|
+
return _observableThrow(new ApiException(message, status, response, headers, null));
|
|
3011
|
+
}
|
|
3012
|
+
function blobToText(blob) {
|
|
3013
|
+
return new Observable((observer) => {
|
|
3014
|
+
if (!blob) {
|
|
3015
|
+
observer.next("");
|
|
3016
|
+
observer.complete();
|
|
3017
|
+
}
|
|
3018
|
+
else {
|
|
3019
|
+
let reader = new FileReader();
|
|
3020
|
+
reader.onload = event => {
|
|
3021
|
+
observer.next(event.target.result);
|
|
3022
|
+
observer.complete();
|
|
3023
|
+
};
|
|
3024
|
+
reader.readAsText(blob);
|
|
3025
|
+
}
|
|
3026
|
+
});
|
|
3027
|
+
}
|
|
3028
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbnRpdHktc2VydmljZS1wcm94aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXNoYXJlZC1saWIvc3JjL2xpYnJhcmllcy9zZXJ2aWNlLXByb3h5L2lkZW50aXR5LXNlcnZpY2UtcHJveGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3QkFBd0I7QUFDeEIsbUJBQW1CO0FBQ25CLDJIQUEySDtBQUMzSCxvQkFBb0I7QUFDcEIsd0JBQXdCO0FBRXhCLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsdUNBQXVDO0FBRXZDLE9BQU8sRUFBRSxRQUFRLElBQUksbUJBQW1CLEVBQUUsVUFBVSxJQUFJLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakcsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9GLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7O0FBRTVCLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUd2RSxNQUFNLE9BQU8saUNBQWlDO0lBSzFDLFlBQWdDLElBQWdCLEVBQW9DLE9BQWdCO1FBRjFGLHFCQUFnQixHQUFtRCxTQUFTLENBQUM7UUFHbkYsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVM7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Q0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gPGF1dG8tZ2VuZXJhdGVkPlxuLy8gICAgIEdlbmVyYXRlZCB1c2luZyB0aGUgTlN3YWcgdG9vbGNoYWluIHYxNC4wLjcuMCAoTkpzb25TY2hlbWEgdjExLjAuMC4wIChOZXd0b25zb2Z0Lkpzb24gdjEzLjAuMC4wKSkgKGh0dHA6Ly9OU3dhZy5vcmcpXG4vLyA8L2F1dG8tZ2VuZXJhdGVkPlxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLy8gUmVTaGFycGVyIGRpc2FibGUgSW5jb25zaXN0ZW50TmFtaW5nXG5cbmltcG9ydCB7IG1lcmdlTWFwIGFzIF9vYnNlcnZhYmxlTWVyZ2VNYXAsIGNhdGNoRXJyb3IgYXMgX29ic2VydmFibGVDYXRjaCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIHRocm93RXJyb3IgYXMgX29ic2VydmFibGVUaHJvdywgb2YgYXMgX29ic2VydmFibGVPZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbCwgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2UsIEh0dHBSZXNwb25zZUJhc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuZXhwb3J0IGNvbnN0IEFQSV9CQVNFX1VSTCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxzdHJpbmc+KCdBUElfQkFTRV9VUkwnKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25TZXJ2aWNlUHJveHlJZGVudGl0eSB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsID8/IFwiXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0SGVhbHRoKCk6IE9ic2VydmFibGU8SGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL2hlYWx0aFwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHZXRIZWFsdGgocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dldEhlYWx0aChyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPEhlYWx0aER0b0h0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8SGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldEhlYWx0aChyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8SGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBIZWFsdGhEdG9IdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEhlYWx0aER0b0h0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBnZXRPbmxpbmVWYWxpZGF0b3JWZXJzaW9uKCk6IE9ic2VydmFibGU8T2JqZWN0SHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS9zZXJ2aWNlcy9jb25maWd1cmF0aW9uL29ubGluZS12YWxpZGF0b3ItdmVyc2lvblwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHZXRPbmxpbmVWYWxpZGF0b3JWZXJzaW9uKHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NHZXRPbmxpbmVWYWxpZGF0b3JWZXJzaW9uKHJlc3BvbnNlXyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8T2JqZWN0SHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxPYmplY3RIdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzR2V0T25saW5lVmFsaWRhdG9yVmVyc2lvbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8T2JqZWN0SHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBPYmplY3RIdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPE9iamVjdEh0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUaGlyZFBhcnR5U2VydmljZVByb3h5SWRlbnRpdHkge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCA/PyBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIG1lKCk6IE9ic2VydmFibGU8VGhpcmRQYXJ0eVZlbmRvckR0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc2VydmljZXMvdGhpcmRwYXJ0eS9tZVwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcImdldFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNZShyZXNwb25zZV8pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWUocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc01lKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMCk7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVzZXJzU2VydmljZVByb3h5SWRlbnRpdHkge1xuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudDtcbiAgICBwcml2YXRlIGJhc2VVcmw6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQganNvblBhcnNlUmV2aXZlcjogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoSHR0cENsaWVudCkgaHR0cDogSHR0cENsaWVudCwgQE9wdGlvbmFsKCkgQEluamVjdChBUElfQkFTRV9VUkwpIGJhc2VVcmw/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5odHRwID0gaHR0cDtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gYmFzZVVybCA/PyBcIlwiO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgYXV0aGVudGljYXRlKGJvZHk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0ZVJlcXVlc3REdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL2F1dGhlbnRpY2F0ZVwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzQXV0aGVudGljYXRlKHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NBdXRoZW50aWNhdGUocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0F1dGhlbnRpY2F0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8QXV0aGVudGljYXRlUmVxdWVzdER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gQXV0aGVudGljYXRlUmVxdWVzdER0b0h0dHBSZXNwb25zZURhdGEuZnJvbUpTKHJlc3VsdERhdGEyMDApO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDQwMSkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0NDAxOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGE0MDEgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJlc3VsdDQwMSA9IEF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhNDAxKTtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIlVuYXV0aG9yaXplZFwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzLCByZXN1bHQ0MDEpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW4gKG9wdGlvbmFsKSBcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICByZWZyZXNoVG9rZW4ocmVmcmVzaFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFJlZnJlc2hUb2tlbkR0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc2VydmljZXMvdXNlcnMvcmVmcmVzaHRva2VuXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJSZWZyZXNoVG9rZW5cIjogcmVmcmVzaFRva2VuICE9PSB1bmRlZmluZWQgJiYgcmVmcmVzaFRva2VuICE9PSBudWxsID8gXCJcIiArIHJlZnJlc2hUb2tlbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZWZyZXNoVG9rZW4ocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1JlZnJlc2hUb2tlbihyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPFJlZnJlc2hUb2tlbkR0b0h0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8UmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1JlZnJlc2hUb2tlbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8UmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBSZWZyZXNoVG9rZW5EdG9IdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFJlZnJlc2hUb2tlbkR0b0h0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYWN0aXZhdGlvblRva2VuIChvcHRpb25hbCkgXG4gICAgICogQHBhcmFtIHBhc3N3b3JkQ2hhbmdlVHlwZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHZhbGlkYXRlQWN0aXZhdGlvbihhY3RpdmF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgcGFzc3dvcmRDaGFuZ2VUeXBlOiBQYXNzd29yZENoYW5nZVR5cGUgfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL3ZhbGlkYXRlLWFjdGl2YXRpb24/XCI7XG4gICAgICAgIGlmIChwYXNzd29yZENoYW5nZVR5cGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdwYXNzd29yZENoYW5nZVR5cGUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAocGFzc3dvcmRDaGFuZ2VUeXBlICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB1cmxfICs9IFwicGFzc3dvcmRDaGFuZ2VUeXBlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBwYXNzd29yZENoYW5nZVR5cGUpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY3RpdmF0aW9uVG9rZW5cIjogYWN0aXZhdGlvblRva2VuICE9PSB1bmRlZmluZWQgJiYgYWN0aXZhdGlvblRva2VuICE9PSBudWxsID8gXCJcIiArIGFjdGl2YXRpb25Ub2tlbiA6IFwiXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NWYWxpZGF0ZUFjdGl2YXRpb24ocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1ZhbGlkYXRlQWN0aXZhdGlvbihyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG9IdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG9IdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVmFsaWRhdGVBY3RpdmF0aW9uKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMCk7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbW9iaWxlQXV0aGVudGljYXRlKGJvZHk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc2VydmljZXMvdXNlcnMvYXV0aGVudGljYXRlLW1vYmlsZVwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTW9iaWxlQXV0aGVudGljYXRlKHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNb2JpbGVBdXRoZW50aWNhdGUocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxJbnQzMkF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSURpY3Rpb25hcnlIdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NNb2JpbGVBdXRoZW50aWNhdGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gSW50MzJBdXRoZW50aWNhdGVSZXNwb25zZUR0b0lEaWN0aW9uYXJ5SHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMCk7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTQwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmVzdWx0NDAxID0gQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEuZnJvbUpTKHJlc3VsdERhdGE0MDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIG11bHRpVGVuYW50c0F1dGhlbnRpY2F0ZShib2R5OiBBdXRoZW50aWNhdGVSZXF1ZXN0RHRvIHwgdW5kZWZpbmVkKTogT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGVSZXNwb25zZUR0b0xpc3RIdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL211bHRpLXRlbmFudHMtYXV0aGVudGljYXRlXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNdWx0aVRlbmFudHNBdXRoZW50aWNhdGUocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc011bHRpVGVuYW50c0F1dGhlbnRpY2F0ZShyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvTGlzdEh0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8QXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc011bHRpVGVuYW50c0F1dGhlbnRpY2F0ZShyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8QXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBBdXRoZW50aWNhdGVSZXNwb25zZUR0b0xpc3RIdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhNDAxID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQ0MDEgPSBBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTQwMSk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJVbmF1dGhvcml6ZWRcIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycywgcmVzdWx0NDAxKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8QXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgdmVyaWZ5MkZhY3RvckF1dGhlbnRpY2F0aW9uKGJvZHk6IFZlcmlmeTJGYWN0b3JBdXRoUmVxdWVzdER0byB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8VmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL3ZlcmlmeS0yZmEtYXV0aFwiO1xuICAgICAgICB1cmxfID0gdXJsXy5yZXBsYWNlKC9bPyZdJC8sIFwiXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbnRlbnRfID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgYm9keTogY29udGVudF8sXG4gICAgICAgICAgICBvYnNlcnZlOiBcInJlc3BvbnNlXCIsXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6IFwiYmxvYlwiLFxuICAgICAgICAgICAgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHtcbiAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvblwiLFxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwidGV4dC9wbGFpblwiXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzVmVyaWZ5MkZhY3RvckF1dGhlbnRpY2F0aW9uKHJlc3BvbnNlXyk7XG4gICAgICAgIH0pKS5waXBlKF9vYnNlcnZhYmxlQ2F0Y2goKHJlc3BvbnNlXzogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VfIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlQmFzZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NWZXJpZnkyRmFjdG9yQXV0aGVudGljYXRpb24ocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8VmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG9IdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzVmVyaWZ5MkZhY3RvckF1dGhlbnRpY2F0aW9uKHJlc3BvbnNlOiBIdHRwUmVzcG9uc2VCYXNlKTogT2JzZXJ2YWJsZTxWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQyMDA6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTIwMCA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmVzdWx0MjAwID0gVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG9IdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDQwMTogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhNDAxID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQ0MDEgPSBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEuZnJvbUpTKHJlc3VsdERhdGE0MDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPFZlcmlmeTJGYWN0b3JBdXRoUmVzcG9uc2V0RHRvSHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIGVuYWJsZTJGYWN0b3JBdXRoRm9yVXNlcih1c2VySWQ6IG51bWJlcik6IE9ic2VydmFibGU8VG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL3t1c2VySWR9L2VuYWJsZS0yZmFcIjtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gdW5kZWZpbmVkIHx8IHVzZXJJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3VzZXJJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt1c2VySWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdXNlcklkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0VuYWJsZTJGYWN0b3JBdXRoRm9yVXNlcihyZXNwb25zZV8pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzRW5hYmxlMkZhY3RvckF1dGhGb3JVc2VyKHJlc3BvbnNlXyBhcyBhbnkpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3coZSkgYXMgYW55IGFzIE9ic2VydmFibGU8VG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0VuYWJsZTJGYWN0b3JBdXRoRm9yVXNlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8VG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMCk7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIFN1Y2Nlc3NcbiAgICAgKi9cbiAgICBkaXNhYmxlMkZhY3RvckF1dGhGb3JVc2VyKHVzZXJJZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGE+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvc2VydmljZXMvdXNlcnMve3VzZXJJZH0vZGlzYWJsZS0yZmFcIjtcbiAgICAgICAgaWYgKHVzZXJJZCA9PT0gdW5kZWZpbmVkIHx8IHVzZXJJZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3VzZXJJZCcgbXVzdCBiZSBkZWZpbmVkLlwiKTtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZShcInt1c2VySWR9XCIsIGVuY29kZVVSSUNvbXBvbmVudChcIlwiICsgdXNlcklkKSk7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicHV0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Rpc2FibGUyRmFjdG9yQXV0aEZvclVzZXIocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Rpc2FibGUyRmFjdG9yQXV0aEZvclVzZXIocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8VG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPjtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBwcm9jZXNzRGlzYWJsZTJGYWN0b3JBdXRoRm9yVXNlcihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8VG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMCk7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjxUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGE+KG51bGwgYXMgYW55KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gYm9keSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIHNtc0F1dGgoYm9keTogU21zQXV0aERUTyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBsZXQgdXJsXyA9IHRoaXMuYmFzZVVybCArIFwiL2FwaS92MS4wL3VzZXJzL3Ntcy1hdXRoXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgY29uc3QgY29udGVudF8gPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgb3B0aW9uc18gOiBhbnkgPSB7XG4gICAgICAgICAgICBib2R5OiBjb250ZW50XyxcbiAgICAgICAgICAgIG9ic2VydmU6IFwicmVzcG9uc2VcIixcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogXCJibG9iXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnMoe1xuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uXCIsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdChcInBvc3RcIiwgdXJsXywgb3B0aW9uc18pLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcCgocmVzcG9uc2VfIDogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU21zQXV0aChyZXNwb25zZV8pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU21zQXV0aChyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KHJlc3BvbnNlXykgYXMgYW55IGFzIE9ic2VydmFibGU8dm9pZD47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc1Ntc0F1dGgocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICBjb25zdCByZXNwb25zZUJsb2IgPVxuICAgICAgICAgICAgcmVzcG9uc2UgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UgPyByZXNwb25zZS5ib2R5IDpcbiAgICAgICAgICAgIChyZXNwb25zZSBhcyBhbnkpLmVycm9yIGluc3RhbmNlb2YgQmxvYiA/IChyZXNwb25zZSBhcyBhbnkpLmVycm9yIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBfaGVhZGVyczogYW55ID0ge307IGlmIChyZXNwb25zZS5oZWFkZXJzKSB7IGZvciAobGV0IGtleSBvZiByZXNwb25zZS5oZWFkZXJzLmtleXMoKSkgeyBfaGVhZGVyc1trZXldID0gcmVzcG9uc2UuaGVhZGVycy5nZXQoa2V5KTsgfX1cbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPHZvaWQ+KG51bGwgYXMgYW55KTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT09IDIwMCAmJiBzdGF0dXMgIT09IDIwNCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFeGNlcHRpb24oXCJBbiB1bmV4cGVjdGVkIHNlcnZlciBlcnJvciBvY2N1cnJlZC5cIiwgc3RhdHVzLCBfcmVzcG9uc2VUZXh0LCBfaGVhZGVycyk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBib2R5IChvcHRpb25hbCkgXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgbW9iaWxlTG9naW4oYm9keTogTW9iaWxlTG9naW5EVE8gfCB1bmRlZmluZWQpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgbGV0IHVybF8gPSB0aGlzLmJhc2VVcmwgKyBcIi9hcGkvdjEuMC91c2Vycy9tb2JpbGUtbG9naW5cIjtcbiAgICAgICAgdXJsXyA9IHVybF8ucmVwbGFjZSgvWz8mXSQvLCBcIlwiKTtcblxuICAgICAgICBjb25zdCBjb250ZW50XyA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuXG4gICAgICAgIGxldCBvcHRpb25zXyA6IGFueSA9IHtcbiAgICAgICAgICAgIGJvZHk6IGNvbnRlbnRfLFxuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25cIixcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NNb2JpbGVMb2dpbihyZXNwb25zZV8pO1xuICAgICAgICB9KSkucGlwZShfb2JzZXJ2YWJsZUNhdGNoKChyZXNwb25zZV86IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlXyBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZUJhc2UpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTW9iaWxlTG9naW4ocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTx2b2lkPjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhyZXNwb25zZV8pIGFzIGFueSBhcyBPYnNlcnZhYmxlPHZvaWQ+O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NNb2JpbGVMb2dpbihyZXNwb25zZTogSHR0cFJlc3BvbnNlQmFzZSk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2Y8dm9pZD4obnVsbCBhcyBhbnkpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPT0gMjAwICYmIHN0YXR1cyAhPT0gMjA0KSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aHJvd0V4Y2VwdGlvbihcIkFuIHVuZXhwZWN0ZWQgc2VydmVyIGVycm9yIG9jY3VycmVkLlwiLCBzdGF0dXMsIF9yZXNwb25zZVRleHQsIF9oZWFkZXJzKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZjx2b2lkPihudWxsIGFzIGFueSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGNvZGUgKG9wdGlvbmFsKSBcbiAgICAgKiBAcGFyYW0gdGVuYW50TmFtZSAob3B0aW9uYWwpIFxuICAgICAqIEByZXR1cm4gU3VjY2Vzc1xuICAgICAqL1xuICAgIG9wZW5JZEF1dGhlbnRpY2F0ZShjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQsIHRlbmFudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IE9ic2VydmFibGU8QXV0aGVudGljYXRlUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3VzZXJzL29pZGMtYXV0aD9cIjtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcGFyYW1ldGVyICdjb2RlJyBjYW5ub3QgYmUgbnVsbC5cIik7XG4gICAgICAgIGVsc2UgaWYgKGNvZGUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHVybF8gKz0gXCJjb2RlPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KFwiXCIgKyBjb2RlKSArIFwiJlwiO1xuICAgICAgICBpZiAodGVuYW50TmFtZSA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBwYXJhbWV0ZXIgJ3RlbmFudE5hbWUnIGNhbm5vdCBiZSBudWxsLlwiKTtcbiAgICAgICAgZWxzZSBpZiAodGVuYW50TmFtZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgdXJsXyArPSBcInRlbmFudE5hbWU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoXCJcIiArIHRlbmFudE5hbWUpICsgXCImXCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwicG9zdFwiLCB1cmxfLCBvcHRpb25zXykucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKChyZXNwb25zZV8gOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NPcGVuSWRBdXRoZW50aWNhdGUocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc09wZW5JZEF1dGhlbnRpY2F0ZShyZXNwb25zZV8gYXMgYW55KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KGUpIGFzIGFueSBhcyBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxBdXRoZW50aWNhdGVSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGE+O1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHByb2Nlc3NPcGVuSWRBdXRoZW50aWNhdGUocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQmxvYiA9XG4gICAgICAgICAgICByZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSA/IHJlc3BvbnNlLmJvZHkgOlxuICAgICAgICAgICAgKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgaW5zdGFuY2VvZiBCbG9iID8gKHJlc3BvbnNlIGFzIGFueSkuZXJyb3IgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IF9oZWFkZXJzOiBhbnkgPSB7fTsgaWYgKHJlc3BvbnNlLmhlYWRlcnMpIHsgZm9yIChsZXQga2V5IG9mIHJlc3BvbnNlLmhlYWRlcnMua2V5cygpKSB7IF9oZWFkZXJzW2tleV0gPSByZXNwb25zZS5oZWFkZXJzLmdldChrZXkpOyB9fVxuICAgICAgICBpZiAoc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgbGV0IHJlc3VsdDIwMDogYW55ID0gbnVsbDtcbiAgICAgICAgICAgIGxldCByZXN1bHREYXRhMjAwID0gX3Jlc3BvbnNlVGV4dCA9PT0gXCJcIiA/IG51bGwgOiBKU09OLnBhcnNlKF9yZXNwb25zZVRleHQsIHRoaXMuanNvblBhcnNlUmV2aXZlcik7XG4gICAgICAgICAgICByZXN1bHQyMDAgPSBBdXRoZW50aWNhdGVSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEuZnJvbUpTKHJlc3VsdERhdGEyMDApO1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlT2YocmVzdWx0MjAwKTtcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IDIwMikge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAyOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEyMDIgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJlc3VsdDIwMiA9IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YS5mcm9tSlMocmVzdWx0RGF0YTIwMik7XG4gICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVPZihyZXN1bHQyMDIpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gNDAxKSB7XG4gICAgICAgICAgICByZXR1cm4gYmxvYlRvVGV4dChyZXNwb25zZUJsb2IpLnBpcGUoX29ic2VydmFibGVNZXJnZU1hcChfcmVzcG9uc2VUZXh0ID0+IHtcbiAgICAgICAgICAgIGxldCByZXN1bHQ0MDE6IGFueSA9IG51bGw7XG4gICAgICAgICAgICBsZXQgcmVzdWx0RGF0YTQwMSA9IF9yZXNwb25zZVRleHQgPT09IFwiXCIgPyBudWxsIDogSlNPTi5wYXJzZShfcmVzcG9uc2VUZXh0LCB0aGlzLmpzb25QYXJzZVJldml2ZXIpO1xuICAgICAgICAgICAgcmVzdWx0NDAxID0gQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEuZnJvbUpTKHJlc3VsdERhdGE0MDEpO1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiVW5hdXRob3JpemVkXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMsIHJlc3VsdDQwMSk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YT4obnVsbCBhcyBhbnkpO1xuICAgIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TZXJ2aWNlUHJveHlJZGVudGl0eSB7XG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50O1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCBqc29uUGFyc2VSZXZpdmVyOiAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoQEluamVjdChIdHRwQ2xpZW50KSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBASW5qZWN0KEFQSV9CQVNFX1VSTCkgYmFzZVVybD86IHN0cmluZykge1xuICAgICAgICB0aGlzLmh0dHAgPSBodHRwO1xuICAgICAgICB0aGlzLmJhc2VVcmwgPSBiYXNlVXJsID8/IFwiXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHJldHVybiBTdWNjZXNzXG4gICAgICovXG4gICAgZ2V0T25saW5lVmFsaWRhdG9yQ29udGV4dCgpOiBPYnNlcnZhYmxlPE9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGxldCB1cmxfID0gdGhpcy5iYXNlVXJsICsgXCIvYXBpL3NlcnZpY2VzL3ZhbGlkYXRpb24vb25saW5lLXZhbGlkYXRvci1jb250ZXh0XCI7XG4gICAgICAgIHVybF8gPSB1cmxfLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XG5cbiAgICAgICAgbGV0IG9wdGlvbnNfIDogYW55ID0ge1xuICAgICAgICAgICAgb2JzZXJ2ZTogXCJyZXNwb25zZVwiLFxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiBcImJsb2JcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJ0ZXh0L3BsYWluXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KFwiZ2V0XCIsIHVybF8sIG9wdGlvbnNfKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoKHJlc3BvbnNlXyA6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dldE9ubGluZVZhbGlkYXRvckNvbnRleHQocmVzcG9uc2VfKTtcbiAgICAgICAgfSkpLnBpcGUoX29ic2VydmFibGVDYXRjaCgocmVzcG9uc2VfOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZV8gaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2VCYXNlKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0dldE9ubGluZVZhbGlkYXRvckNvbnRleHQocmVzcG9uc2VfIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVUaHJvdyhlKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzcG9uc2VfKSBhcyBhbnkgYXMgT2JzZXJ2YWJsZTxPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvSHR0cFJlc3BvbnNlRGF0YT47XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcHJvY2Vzc0dldE9ubGluZVZhbGlkYXRvckNvbnRleHQocmVzcG9uc2U6IEh0dHBSZXNwb25zZUJhc2UpOiBPYnNlcnZhYmxlPE9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhPiB7XG4gICAgICAgIGNvbnN0IHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cztcbiAgICAgICAgY29uc3QgcmVzcG9uc2VCbG9iID1cbiAgICAgICAgICAgIHJlc3BvbnNlIGluc3RhbmNlb2YgSHR0cFJlc3BvbnNlID8gcmVzcG9uc2UuYm9keSA6XG4gICAgICAgICAgICAocmVzcG9uc2UgYXMgYW55KS5lcnJvciBpbnN0YW5jZW9mIEJsb2IgPyAocmVzcG9uc2UgYXMgYW55KS5lcnJvciA6IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgX2hlYWRlcnM6IGFueSA9IHt9OyBpZiAocmVzcG9uc2UuaGVhZGVycykgeyBmb3IgKGxldCBrZXkgb2YgcmVzcG9uc2UuaGVhZGVycy5rZXlzKCkpIHsgX2hlYWRlcnNba2V5XSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KGtleSk7IH19XG4gICAgICAgIGlmIChzdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgcmV0dXJuIGJsb2JUb1RleHQocmVzcG9uc2VCbG9iKS5waXBlKF9vYnNlcnZhYmxlTWVyZ2VNYXAoX3Jlc3BvbnNlVGV4dCA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0MjAwOiBhbnkgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHJlc3VsdERhdGEyMDAgPSBfcmVzcG9uc2VUZXh0ID09PSBcIlwiID8gbnVsbCA6IEpTT04ucGFyc2UoX3Jlc3BvbnNlVGV4dCwgdGhpcy5qc29uUGFyc2VSZXZpdmVyKTtcbiAgICAgICAgICAgIHJlc3VsdDIwMCA9IE9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhLmZyb21KUyhyZXN1bHREYXRhMjAwKTtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mKHJlc3VsdDIwMCk7XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9PSAyMDAgJiYgc3RhdHVzICE9PSAyMDQpIHtcbiAgICAgICAgICAgIHJldHVybiBibG9iVG9UZXh0KHJlc3BvbnNlQmxvYikucGlwZShfb2JzZXJ2YWJsZU1lcmdlTWFwKF9yZXNwb25zZVRleHQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXhjZXB0aW9uKFwiQW4gdW5leHBlY3RlZCBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuXCIsIHN0YXR1cywgX3Jlc3BvbnNlVGV4dCwgX2hlYWRlcnMpO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZU9mPE9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhPihudWxsIGFzIGFueSk7XG4gICAgfVxufVxuXG5leHBvcnQgZW51bSBBY3Rpb25UeXBlIHtcbiAgICBOb25lID0gMCxcbiAgICBDcmVhdGUgPSAxLFxuICAgIFVwZGF0ZSA9IDIsXG4gICAgRGVsZXRlID0gMyxcbiAgICBSZW1vdGVDb21tYW5kID0gNCxcbiAgICBBdWRpdExvZ0luID0gNSxcbiAgICBVc2VyTWFpbEludml0YXRpb24gPSA2LFxuICAgIFNlbmQgPSA3LFxuICAgIFByaW50ID0gOCxcbiAgICBGYWNpbGl0eVJlbW90ZUNvbW1hbmQgPSA5LFxuICAgIFNldEFzSU8gPSAxMCxcbiAgICBBdWRpdExvZ091dCA9IDExLFxufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZhdGVSZXNwb25zZUR0byBpbXBsZW1lbnRzIElBY3RpdmF0ZVJlc3BvbnNlRHRvIHtcbiAgICB0ZmFTZXR1cDogVGZhU2V0dXBEdG87XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElBY3RpdmF0ZVJlc3BvbnNlRHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy50ZmFTZXR1cCA9IF9kYXRhW1widGZhU2V0dXBcIl0gPyBUZmFTZXR1cER0by5mcm9tSlMoX2RhdGFbXCJ0ZmFTZXR1cFwiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuaXNTdWNjZXNzID0gX2RhdGFbXCJpc1N1Y2Nlc3NcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEFjdGl2YXRlUmVzcG9uc2VEdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEFjdGl2YXRlUmVzcG9uc2VEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcInRmYVNldHVwXCJdID0gdGhpcy50ZmFTZXR1cCA/IHRoaXMudGZhU2V0dXAudG9KU09OKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBBY3RpdmF0ZVJlc3BvbnNlRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQWN0aXZhdGVSZXNwb25zZUR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjdGl2YXRlUmVzcG9uc2VEdG8ge1xuICAgIHRmYVNldHVwOiBUZmFTZXR1cER0bztcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBBbGVydFByZWZlcmVuY2VzU2V0dGluZ3NEdG8gaW1wbGVtZW50cyBJQWxlcnRQcmVmZXJlbmNlc1NldHRpbmdzRHRvIHtcbiAgICBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJlZmVyZW5jZXM6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW47IH07IH07IH0gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSUFsZXJ0UHJlZmVyZW5jZXNTZXR0aW5nc0R0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuaXNFbmFibGVkID0gX2RhdGFbXCJpc0VuYWJsZWRcIl07XG4gICAgICAgICAgICBpZiAoX2RhdGFbXCJwcmVmZXJlbmNlc1wiXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlZmVyZW5jZXMgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIF9kYXRhW1wicHJlZmVyZW5jZXNcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kYXRhW1wicHJlZmVyZW5jZXNcIl0uaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMucHJlZmVyZW5jZXMpW2tleV0gPSBfZGF0YVtcInByZWZlcmVuY2VzXCJdW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBBbGVydFByZWZlcmVuY2VzU2V0dGluZ3NEdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEFsZXJ0UHJlZmVyZW5jZXNTZXR0aW5nc0R0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiaXNFbmFibGVkXCJdID0gdGhpcy5pc0VuYWJsZWQ7XG4gICAgICAgIGlmICh0aGlzLnByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICBkYXRhW1wicHJlZmVyZW5jZXNcIl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnByZWZlcmVuY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucHJlZmVyZW5jZXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+ZGF0YVtcInByZWZlcmVuY2VzXCJdKVtrZXldID0gKDxhbnk+dGhpcy5wcmVmZXJlbmNlcylba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBBbGVydFByZWZlcmVuY2VzU2V0dGluZ3NEdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBbGVydFByZWZlcmVuY2VzU2V0dGluZ3NEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBbGVydFByZWZlcmVuY2VzU2V0dGluZ3NEdG8ge1xuICAgIGlzRW5hYmxlZDogYm9vbGVhbjtcbiAgICBwcmVmZXJlbmNlczogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbjsgfTsgfTsgfSB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGVudW0gQWxlcnRzRGV2aWNlVHlwZSB7XG4gICAgTWFzdGVyID0gMSxcbiAgICBDYXNoUmVnaXN0ZXIgPSAyLFxuICAgIERpc3BlbnNlciA9IDMsXG4gICAgVmVyaWZpZXIgPSA0LFxuICAgIExvYmJ5U3RhdGlvbiA9IDUsXG4gICAgRW50cnlQaWwgPSA2LFxuICAgIEV4aXRQaWwgPSA3LFxuICAgIE1vbnRobHlWYWxpZGF0b3IgPSA4LFxuICAgIFZhbGlkYXRvciA9IDksXG59XG5cbmV4cG9ydCBlbnVtIEFwcE1vZHVsZSB7XG4gICAgQ2MgPSAwLFxuICAgIE1hbmFnZW1lbnQgPSAxLFxuICAgIFNldHRpbmdzID0gMixcbiAgICBWYWxpZGF0aW9uID0gMyxcbiAgICBHdWVzdHMgPSA0LFxuICAgIFJlcG9ydHMgPSA1LFxuICAgIE1vbnRobGllcyA9IDYsXG4gICAgQmFja29mZmljZSA9IDcsXG4gICAgUGkgPSA4LFxuICAgIEFjY291bnRzID0gOSxcbiAgICBMb3RDb25maWd1cmF0aW9uID0gMTAsXG4gICAgRUNvbW1lcmNlQmFja29mZmljZSA9IDExLFxufVxuXG5leHBvcnQgY2xhc3MgQXVkaXRGaWx0ZXIgaW1wbGVtZW50cyBJQXVkaXRGaWx0ZXIge1xuICAgIHN0YXJ0RGF0ZTogbW9tZW50Lk1vbWVudCB8IHVuZGVmaW5lZDtcbiAgICBlbmREYXRlOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuICAgIHRha2U6IG51bWJlcjtcbiAgICBza2lwOiBudW1iZXI7XG4gICAgc2VhcmNoVmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBlbnRpdHlOYW1lTGlzdDogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgYWN0aW9uVHlwZTogQWN0aW9uVHlwZVtdIHwgdW5kZWZpbmVkO1xuICAgIGd1aWRXaXRoRmFjaWxpdGllczogeyBba2V5OiBzdHJpbmddOiBudW1iZXJbXTsgfSB8IHVuZGVmaW5lZDtcbiAgICBzZWFyY2hCeVVzZXJJZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICB0ZW5hbnRJZHM6IG51bWJlcltdIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElBdWRpdEZpbHRlcikge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gX2RhdGFbXCJzdGFydERhdGVcIl0gPyBtb21lbnQoX2RhdGFbXCJzdGFydERhdGVcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZW5kRGF0ZSA9IF9kYXRhW1wiZW5kRGF0ZVwiXSA/IG1vbWVudChfZGF0YVtcImVuZERhdGVcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMudGFrZSA9IF9kYXRhW1widGFrZVwiXTtcbiAgICAgICAgICAgIHRoaXMuc2tpcCA9IF9kYXRhW1wic2tpcFwiXTtcbiAgICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSBfZGF0YVtcInNlYXJjaFZhbHVlXCJdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX2RhdGFbXCJlbnRpdHlOYW1lTGlzdFwiXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGl0eU5hbWVMaXN0ID0gW10gYXMgYW55O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgX2RhdGFbXCJlbnRpdHlOYW1lTGlzdFwiXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnRpdHlOYW1lTGlzdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX2RhdGFbXCJhY3Rpb25UeXBlXCJdKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uVHlwZSA9IFtdIGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIF9kYXRhW1wiYWN0aW9uVHlwZVwiXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25UeXBlLnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX2RhdGFbXCJndWlkV2l0aEZhY2lsaXRpZXNcIl0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLmd1aWRXaXRoRmFjaWxpdGllcyA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX2RhdGFbXCJndWlkV2l0aEZhY2lsaXRpZXNcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kYXRhW1wiZ3VpZFdpdGhGYWNpbGl0aWVzXCJdLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzLmd1aWRXaXRoRmFjaWxpdGllcylba2V5XSA9IF9kYXRhW1wiZ3VpZFdpdGhGYWNpbGl0aWVzXCJdW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5zZWFyY2hCeVVzZXJJZCA9IF9kYXRhW1wic2VhcmNoQnlVc2VySWRcIl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZGF0YVtcInRlbmFudElkc1wiXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbmFudElkcyA9IFtdIGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIF9kYXRhW1widGVuYW50SWRzXCJdKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbmFudElkcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBBdWRpdEZpbHRlciB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXVkaXRGaWx0ZXIoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcInN0YXJ0RGF0ZVwiXSA9IHRoaXMuc3RhcnREYXRlID8gdGhpcy5zdGFydERhdGUudG9JU09TdHJpbmcoKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wiZW5kRGF0ZVwiXSA9IHRoaXMuZW5kRGF0ZSA/IHRoaXMuZW5kRGF0ZS50b0lTT1N0cmluZygpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJ0YWtlXCJdID0gdGhpcy50YWtlO1xuICAgICAgICBkYXRhW1wic2tpcFwiXSA9IHRoaXMuc2tpcDtcbiAgICAgICAgZGF0YVtcInNlYXJjaFZhbHVlXCJdID0gdGhpcy5zZWFyY2hWYWx1ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5lbnRpdHlOYW1lTGlzdCkpIHtcbiAgICAgICAgICAgIGRhdGFbXCJlbnRpdHlOYW1lTGlzdFwiXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmVudGl0eU5hbWVMaXN0KVxuICAgICAgICAgICAgICAgIGRhdGFbXCJlbnRpdHlOYW1lTGlzdFwiXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYWN0aW9uVHlwZSkpIHtcbiAgICAgICAgICAgIGRhdGFbXCJhY3Rpb25UeXBlXCJdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuYWN0aW9uVHlwZSlcbiAgICAgICAgICAgICAgICBkYXRhW1wiYWN0aW9uVHlwZVwiXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmd1aWRXaXRoRmFjaWxpdGllcykge1xuICAgICAgICAgICAgZGF0YVtcImd1aWRXaXRoRmFjaWxpdGllc1wiXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuZ3VpZFdpdGhGYWNpbGl0aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ3VpZFdpdGhGYWNpbGl0aWVzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PmRhdGFbXCJndWlkV2l0aEZhY2lsaXRpZXNcIl0pW2tleV0gPSAoPGFueT50aGlzLmd1aWRXaXRoRmFjaWxpdGllcylba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkYXRhW1wic2VhcmNoQnlVc2VySWRcIl0gPSB0aGlzLnNlYXJjaEJ5VXNlcklkO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnRlbmFudElkcykpIHtcbiAgICAgICAgICAgIGRhdGFbXCJ0ZW5hbnRJZHNcIl0gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy50ZW5hbnRJZHMpXG4gICAgICAgICAgICAgICAgZGF0YVtcInRlbmFudElkc1wiXS5wdXNoKGl0ZW0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1ZGl0RmlsdGVyIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXVkaXRGaWx0ZXIoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBdWRpdEZpbHRlciB7XG4gICAgc3RhcnREYXRlOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuICAgIGVuZERhdGU6IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gICAgdGFrZTogbnVtYmVyO1xuICAgIHNraXA6IG51bWJlcjtcbiAgICBzZWFyY2hWYWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGVudGl0eU5hbWVMaXN0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBhY3Rpb25UeXBlOiBBY3Rpb25UeXBlW10gfCB1bmRlZmluZWQ7XG4gICAgZ3VpZFdpdGhGYWNpbGl0aWVzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlcltdOyB9IHwgdW5kZWZpbmVkO1xuICAgIHNlYXJjaEJ5VXNlcklkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIHRlbmFudElkczogbnVtYmVyW10gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG8ge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdGVtcG9yYXJ5QmxvY2tlZFRpbWU6IG51bWJlcjtcbiAgICB0ZW5hbnQ6IFRlbmFudER0bztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBfZGF0YVtcImFjY2Vzc1Rva2VuXCJdO1xuICAgICAgICAgICAgdGhpcy50ZW1wb3JhcnlCbG9ja2VkVGltZSA9IF9kYXRhW1widGVtcG9yYXJ5QmxvY2tlZFRpbWVcIl07XG4gICAgICAgICAgICB0aGlzLnRlbmFudCA9IF9kYXRhW1widGVuYW50XCJdID8gVGVuYW50RHRvLmZyb21KUyhfZGF0YVtcInRlbmFudFwiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiYWNjZXNzVG9rZW5cIl0gPSB0aGlzLmFjY2Vzc1Rva2VuO1xuICAgICAgICBkYXRhW1widGVtcG9yYXJ5QmxvY2tlZFRpbWVcIl0gPSB0aGlzLnRlbXBvcmFyeUJsb2NrZWRUaW1lO1xuICAgICAgICBkYXRhW1widGVuYW50XCJdID0gdGhpcy50ZW5hbnQgPyB0aGlzLnRlbmFudC50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG8ge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdGVtcG9yYXJ5QmxvY2tlZFRpbWU6IG51bWJlcjtcbiAgICB0ZW5hbnQ6IFRlbmFudER0bztcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XG4gICAgZGF0YTogQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gX2RhdGFbXCJkYXRhXCJdID8gQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0by5mcm9tSlMoX2RhdGFbXCJkYXRhXCJdKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZSA9IF9kYXRhW1wic3VjY2Vzc01lc3NhZ2VcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGRhdGFbXCJkYXRhXCJdID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlRXJyb3JSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBdXRoZW50aWNhdGVFcnJvclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEF1dGhlbnRpY2F0ZUVycm9yUmVzcG9uc2VEdG87XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8gaW1wbGVtZW50cyBJQXV0aGVudGljYXRlUmVxdWVzdER0byB7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIHRlbmFudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJQXV0aGVudGljYXRlUmVxdWVzdER0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSBfZGF0YVtcInVzZXJuYW1lXCJdO1xuICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IF9kYXRhW1wicGFzc3dvcmRcIl07XG4gICAgICAgICAgICB0aGlzLnRlbmFudE5hbWUgPSBfZGF0YVtcInRlbmFudE5hbWVcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcInVzZXJuYW1lXCJdID0gdGhpcy51c2VybmFtZTtcbiAgICAgICAgZGF0YVtcInBhc3N3b3JkXCJdID0gdGhpcy5wYXNzd29yZDtcbiAgICAgICAgZGF0YVtcInRlbmFudE5hbWVcIl0gPSB0aGlzLnRlbmFudE5hbWU7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBdXRoZW50aWNhdGVSZXF1ZXN0RHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRlUmVxdWVzdER0byB7XG4gICAgdXNlcm5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZDogc3RyaW5nO1xuICAgIHRlbmFudE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZVJlcXVlc3REdG9IdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZVJlcXVlc3REdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XG4gICAgZGF0YTogQXV0aGVudGljYXRlUmVxdWVzdER0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gX2RhdGFbXCJkYXRhXCJdID8gQXV0aGVudGljYXRlUmVxdWVzdER0by5mcm9tSlMoX2RhdGFbXCJkYXRhXCJdKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5zdWNjZXNzTWVzc2FnZSA9IF9kYXRhW1wic3VjY2Vzc01lc3NhZ2VcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGRhdGFbXCJkYXRhXCJdID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlUmVxdWVzdER0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBdXRoZW50aWNhdGVSZXF1ZXN0RHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEF1dGhlbnRpY2F0ZVJlcXVlc3REdG87XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvIHtcbiAgICB1c2VySWQ6IG51bWJlcjtcbiAgICBmaXJzdE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsYXN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHVzZXJuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdXNlclN0YXR1czogVXNlclN0YXR1cztcbiAgICBwYXNzd29yZEV4cGlyYXRpb246IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gICAgbW9kdWxlczogQXV0aGVudGljYXRlVXNlck1vZHVsZUR0b1tdIHwgdW5kZWZpbmVkO1xuICAgIGRlZmF1bHRNb2R1bGU6IEFwcE1vZHVsZTtcbiAgICB0aGlyZFBhcnR5VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlZnJlc2hJbnRlcnZhbDogbnVtYmVyO1xuICAgIGV4cGlyYXRpb246IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gICAgc2V0dGluZ3M6IFNwYXJrU2V0dGluZ3NEdG9bXSB8IHVuZGVmaW5lZDtcbiAgICB0ZW5hbnQ6IFRlbmFudER0bztcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBtZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdXNlcklzVGVtcG9yYXJ5QmxvY2tlZDogYm9vbGVhbjtcbiAgICBwYXNzd29yZEV4cGlyYXRpb25TdGF0ZTogUGFzc3dvcmRFeHBpcmF0aW9uU3RhdGU7XG4gICAgZGF5c1RvRXhwaXJlOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgdHdvRmFjdG9yQXV0aGVudGljYXRpb246IGJvb2xlYW47XG4gICAgdHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG86IFR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvO1xuICAgIHNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvOiBTaW5nbGVTaWduT25BdXRoZW50aWNhdGlvbkR0bztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJQXV0aGVudGljYXRlUmVzcG9uc2VEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJJZCA9IF9kYXRhW1widXNlcklkXCJdO1xuICAgICAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBfZGF0YVtcImZpcnN0TmFtZVwiXTtcbiAgICAgICAgICAgIHRoaXMubGFzdE5hbWUgPSBfZGF0YVtcImxhc3ROYW1lXCJdO1xuICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IF9kYXRhW1widXNlcm5hbWVcIl07XG4gICAgICAgICAgICB0aGlzLnVzZXJTdGF0dXMgPSBfZGF0YVtcInVzZXJTdGF0dXNcIl07XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkRXhwaXJhdGlvbiA9IF9kYXRhW1wicGFzc3dvcmRFeHBpcmF0aW9uXCJdID8gbW9tZW50KF9kYXRhW1wicGFzc3dvcmRFeHBpcmF0aW9uXCJdLnRvU3RyaW5nKCkpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZGF0YVtcIm1vZHVsZXNcIl0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVzID0gW10gYXMgYW55O1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgX2RhdGFbXCJtb2R1bGVzXCJdKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXMucHVzaChBdXRoZW50aWNhdGVVc2VyTW9kdWxlRHRvLmZyb21KUyhpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRNb2R1bGUgPSBfZGF0YVtcImRlZmF1bHRNb2R1bGVcIl07XG4gICAgICAgICAgICB0aGlzLnRoaXJkUGFydHlUb2tlbiA9IF9kYXRhW1widGhpcmRQYXJ0eVRva2VuXCJdO1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IF9kYXRhW1wiYWNjZXNzVG9rZW5cIl07XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IF9kYXRhW1wicmVmcmVzaFRva2VuXCJdO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoSW50ZXJ2YWwgPSBfZGF0YVtcInJlZnJlc2hJbnRlcnZhbFwiXTtcbiAgICAgICAgICAgIHRoaXMuZXhwaXJhdGlvbiA9IF9kYXRhW1wiZXhwaXJhdGlvblwiXSA/IG1vbWVudChfZGF0YVtcImV4cGlyYXRpb25cIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9kYXRhW1wic2V0dGluZ3NcIl0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncyA9IFtdIGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIF9kYXRhW1wic2V0dGluZ3NcIl0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MucHVzaChTcGFya1NldHRpbmdzRHRvLmZyb21KUyhpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRlbmFudCA9IF9kYXRhW1widGVuYW50XCJdID8gVGVuYW50RHRvLmZyb21KUyhfZGF0YVtcInRlbmFudFwiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBfZGF0YVtcIm1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLnVzZXJJc1RlbXBvcmFyeUJsb2NrZWQgPSBfZGF0YVtcInVzZXJJc1RlbXBvcmFyeUJsb2NrZWRcIl07XG4gICAgICAgICAgICB0aGlzLnBhc3N3b3JkRXhwaXJhdGlvblN0YXRlID0gX2RhdGFbXCJwYXNzd29yZEV4cGlyYXRpb25TdGF0ZVwiXTtcbiAgICAgICAgICAgIHRoaXMuZGF5c1RvRXhwaXJlID0gX2RhdGFbXCJkYXlzVG9FeHBpcmVcIl07XG4gICAgICAgICAgICB0aGlzLnR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uID0gX2RhdGFbXCJ0d29GYWN0b3JBdXRoZW50aWNhdGlvblwiXTtcbiAgICAgICAgICAgIHRoaXMudHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8gPSBfZGF0YVtcInR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvXCJdID8gVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8uZnJvbUpTKF9kYXRhW1widHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG9cIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvID0gX2RhdGFbXCJzaW5nbGVTaWduT25BdXRoZW50aWNhdGlvbkR0b1wiXSA/IFNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvLmZyb21KUyhfZGF0YVtcInNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvXCJdKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBBdXRoZW50aWNhdGVSZXNwb25zZUR0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlUmVzcG9uc2VEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcInVzZXJJZFwiXSA9IHRoaXMudXNlcklkO1xuICAgICAgICBkYXRhW1wiZmlyc3ROYW1lXCJdID0gdGhpcy5maXJzdE5hbWU7XG4gICAgICAgIGRhdGFbXCJsYXN0TmFtZVwiXSA9IHRoaXMubGFzdE5hbWU7XG4gICAgICAgIGRhdGFbXCJ1c2VybmFtZVwiXSA9IHRoaXMudXNlcm5hbWU7XG4gICAgICAgIGRhdGFbXCJ1c2VyU3RhdHVzXCJdID0gdGhpcy51c2VyU3RhdHVzO1xuICAgICAgICBkYXRhW1wicGFzc3dvcmRFeHBpcmF0aW9uXCJdID0gdGhpcy5wYXNzd29yZEV4cGlyYXRpb24gPyB0aGlzLnBhc3N3b3JkRXhwaXJhdGlvbi50b0lTT1N0cmluZygpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubW9kdWxlcykpIHtcbiAgICAgICAgICAgIGRhdGFbXCJtb2R1bGVzXCJdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMubW9kdWxlcylcbiAgICAgICAgICAgICAgICBkYXRhW1wibW9kdWxlc1wiXS5wdXNoKGl0ZW0udG9KU09OKCkpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbXCJkZWZhdWx0TW9kdWxlXCJdID0gdGhpcy5kZWZhdWx0TW9kdWxlO1xuICAgICAgICBkYXRhW1widGhpcmRQYXJ0eVRva2VuXCJdID0gdGhpcy50aGlyZFBhcnR5VG9rZW47XG4gICAgICAgIGRhdGFbXCJhY2Nlc3NUb2tlblwiXSA9IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgICAgIGRhdGFbXCJyZWZyZXNoVG9rZW5cIl0gPSB0aGlzLnJlZnJlc2hUb2tlbjtcbiAgICAgICAgZGF0YVtcInJlZnJlc2hJbnRlcnZhbFwiXSA9IHRoaXMucmVmcmVzaEludGVydmFsO1xuICAgICAgICBkYXRhW1wiZXhwaXJhdGlvblwiXSA9IHRoaXMuZXhwaXJhdGlvbiA/IHRoaXMuZXhwaXJhdGlvbi50b0lTT1N0cmluZygpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2V0dGluZ3MpKSB7XG4gICAgICAgICAgICBkYXRhW1wic2V0dGluZ3NcIl0gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5zZXR0aW5ncylcbiAgICAgICAgICAgICAgICBkYXRhW1wic2V0dGluZ3NcIl0ucHVzaChpdGVtLnRvSlNPTigpKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW1widGVuYW50XCJdID0gdGhpcy50ZW5hbnQgPyB0aGlzLnRlbmFudC50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJtZXNzYWdlXCJdID0gdGhpcy5tZXNzYWdlO1xuICAgICAgICBkYXRhW1widXNlcklzVGVtcG9yYXJ5QmxvY2tlZFwiXSA9IHRoaXMudXNlcklzVGVtcG9yYXJ5QmxvY2tlZDtcbiAgICAgICAgZGF0YVtcInBhc3N3b3JkRXhwaXJhdGlvblN0YXRlXCJdID0gdGhpcy5wYXNzd29yZEV4cGlyYXRpb25TdGF0ZTtcbiAgICAgICAgZGF0YVtcImRheXNUb0V4cGlyZVwiXSA9IHRoaXMuZGF5c1RvRXhwaXJlO1xuICAgICAgICBkYXRhW1widHdvRmFjdG9yQXV0aGVudGljYXRpb25cIl0gPSB0aGlzLnR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uO1xuICAgICAgICBkYXRhW1widHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG9cIl0gPSB0aGlzLnR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvID8gdGhpcy50d29GYWN0b3JBdXRoZW50aWNhdGlvbkR0by50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wic2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG9cIl0gPSB0aGlzLnNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvID8gdGhpcy5zaW5nbGVTaWduT25BdXRoZW50aWNhdGlvbkR0by50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBBdXRoZW50aWNhdGVSZXNwb25zZUR0byB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRlUmVzcG9uc2VEdG8ge1xuICAgIHVzZXJJZDogbnVtYmVyO1xuICAgIGZpcnN0TmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxhc3ROYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdXNlcm5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB1c2VyU3RhdHVzOiBVc2VyU3RhdHVzO1xuICAgIHBhc3N3b3JkRXhwaXJhdGlvbjogbW9tZW50Lk1vbWVudCB8IHVuZGVmaW5lZDtcbiAgICBtb2R1bGVzOiBBdXRoZW50aWNhdGVVc2VyTW9kdWxlRHRvW10gfCB1bmRlZmluZWQ7XG4gICAgZGVmYXVsdE1vZHVsZTogQXBwTW9kdWxlO1xuICAgIHRoaXJkUGFydHlUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVmcmVzaEludGVydmFsOiBudW1iZXI7XG4gICAgZXhwaXJhdGlvbjogbW9tZW50Lk1vbWVudCB8IHVuZGVmaW5lZDtcbiAgICBzZXR0aW5nczogU3BhcmtTZXR0aW5nc0R0b1tdIHwgdW5kZWZpbmVkO1xuICAgIHRlbmFudDogVGVuYW50RHRvO1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIG1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB1c2VySXNUZW1wb3JhcnlCbG9ja2VkOiBib29sZWFuO1xuICAgIHBhc3N3b3JkRXhwaXJhdGlvblN0YXRlOiBQYXNzd29yZEV4cGlyYXRpb25TdGF0ZTtcbiAgICBkYXlzVG9FeHBpcmU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICB0d29GYWN0b3JBdXRoZW50aWNhdGlvbjogYm9vbGVhbjtcbiAgICB0d29GYWN0b3JBdXRoZW50aWNhdGlvbkR0bzogVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG87XG4gICAgc2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG86IFNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRlUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gX2RhdGFbXCJkYXRhXCJdID8gQXV0aGVudGljYXRlUmVzcG9uc2VEdG8uZnJvbUpTKF9kYXRhW1wiZGF0YVwiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSBfZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBBdXRoZW50aWNhdGVSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGRhdGFbXCJkYXRhXCJdID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoZW50aWNhdGVSZXNwb25zZUR0b0xpc3RIdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvTGlzdEh0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBBdXRoZW50aWNhdGVSZXNwb25zZUR0b1tdIHwgdW5kZWZpbmVkO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSUF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvTGlzdEh0dHBSZXNwb25zZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IF9kYXRhW1wiZXJyb3JNZXNzYWdlXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1N1Y2Nlc3MgPSBfZGF0YVtcImlzU3VjY2Vzc1wiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IF9kYXRhW1wic3RhdHVzQ29kZVwiXTtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KF9kYXRhW1wiZGF0YVwiXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSBbXSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBfZGF0YVtcImRhdGFcIl0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wdXNoKEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvLmZyb21KUyhpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogQXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIGRhdGFbXCJkYXRhXCJdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZGF0YSlcbiAgICAgICAgICAgICAgICBkYXRhW1wiZGF0YVwiXS5wdXNoKGl0ZW0udG9KU09OKCkpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvTGlzdEh0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBdXRoZW50aWNhdGVSZXNwb25zZUR0b0xpc3RIdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRlUmVzcG9uc2VEdG9MaXN0SHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvW10gfCB1bmRlZmluZWQ7XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0ZVVzZXJNb2R1bGVEdG8gaW1wbGVtZW50cyBJQXV0aGVudGljYXRlVXNlck1vZHVsZUR0byB7XG4gICAgbW9kdWxlOiBBcHBNb2R1bGU7XG4gICAgc3ViTW9kdWxlOiBTdWJNb2R1bGVbXSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJQXV0aGVudGljYXRlVXNlck1vZHVsZUR0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubW9kdWxlID0gX2RhdGFbXCJtb2R1bGVcIl07XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShfZGF0YVtcInN1Yk1vZHVsZVwiXSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Yk1vZHVsZSA9IFtdIGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIF9kYXRhW1wic3ViTW9kdWxlXCJdKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Yk1vZHVsZS5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBBdXRoZW50aWNhdGVVc2VyTW9kdWxlRHRvIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBBdXRoZW50aWNhdGVVc2VyTW9kdWxlRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJtb2R1bGVcIl0gPSB0aGlzLm1vZHVsZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zdWJNb2R1bGUpKSB7XG4gICAgICAgICAgICBkYXRhW1wic3ViTW9kdWxlXCJdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuc3ViTW9kdWxlKVxuICAgICAgICAgICAgICAgIGRhdGFbXCJzdWJNb2R1bGVcIl0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBBdXRoZW50aWNhdGVVc2VyTW9kdWxlRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgQXV0aGVudGljYXRlVXNlck1vZHVsZUR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUF1dGhlbnRpY2F0ZVVzZXJNb2R1bGVEdG8ge1xuICAgIG1vZHVsZTogQXBwTW9kdWxlO1xuICAgIHN1Yk1vZHVsZTogU3ViTW9kdWxlW10gfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBenVyZVNldHRpbmdzIGltcGxlbWVudHMgSUF6dXJlU2V0dGluZ3Mge1xuICAgIGNsaWVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdGVuYW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJQXp1cmVTZXR0aW5ncykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY2xpZW50SWQgPSBfZGF0YVtcImNsaWVudElkXCJdO1xuICAgICAgICAgICAgdGhpcy50ZW5hbnRJZCA9IF9kYXRhW1widGVuYW50SWRcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEF6dXJlU2V0dGluZ3Mge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF6dXJlU2V0dGluZ3MoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImNsaWVudElkXCJdID0gdGhpcy5jbGllbnRJZDtcbiAgICAgICAgZGF0YVtcInRlbmFudElkXCJdID0gdGhpcy50ZW5hbnRJZDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogQXp1cmVTZXR0aW5ncyB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEF6dXJlU2V0dGluZ3MoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBenVyZVNldHRpbmdzIHtcbiAgICBjbGllbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHRlbmFudElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBlbnVtIERhdGVUaW1lRmllbGQge1xuICAgIFZhbGlkVG8gPSAwLFxuICAgIFZhbGlkRnJvbSA9IDEsXG4gICAgRnJvbURhdGVUaW1lID0gMixcbiAgICBUb0RhdGVUaW1lID0gMyxcbiAgICBDcmVhdGlvbiA9IDQsXG4gICAgTW9kaWZpZWQgPSA1LFxuICAgIFByb2R1Y2VkRGF0ZVRpbWUgPSA2LFxuICAgIFByaW50ZWREYXRlVGltZSA9IDcsXG4gICAgTGFzdFRyYW5zRGF0ZVRpbWUgPSA4LFxuICAgIExhc3RJTkRhdGVUaW1lID0gOSxcbiAgICBMYXN0QWN0aXZpdHkgPSAxMCxcbiAgICBDcmVhdGVkQXQgPSAxMSxcbiAgICBQYXNzd29yZEV4cGlyYXRpb24gPSAxMixcbiAgICBUZXJtc0FwcHJvdmFsRGF0ZSA9IDEzLFxuICAgIFVwZGF0ZWRBdCA9IDE0LFxuICAgIExhc3RDb25uZWN0aW9uID0gMTUsXG4gICAgRGF0ZVRpbWUgPSAxNixcbiAgICBVcGRhdGVEYXRlID0gMTcsXG4gICAgVmFsaWRUaW1lID0gMTgsXG59XG5cbmV4cG9ydCBlbnVtIEVudmlyb25tZW50TW9kZSB7XG4gICAgRGV2ZWxvcG1lbnQgPSAxLFxuICAgIFByb2R1Y3Rpb24gPSAyLFxuICAgIFN0YWdpbmcgPSAzLFxuICAgIFNhbmRib3ggPSA0LFxuICAgIExvY2FsID0gNSxcbiAgICBBdXRvbWF0aW9uID0gNixcbn1cblxuZXhwb3J0IGVudW0gRmlsZVR5cGUge1xuICAgIFhMU1ggPSAxLFxuICAgIENTViA9IDIsXG4gICAgUERGID0gMyxcbn1cblxuZXhwb3J0IGVudW0gR2VuZXJhbEFjdGlvblR5cGUge1xuICAgIERpc2Nvbm5lY3RGcm9tU2Vzc2lvbnMgPSAxLFxufVxuXG5leHBvcnQgY2xhc3MgR2V0TG9nb0R0byBpbXBsZW1lbnRzIElHZXRMb2dvRHRvIHtcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSUdldExvZ29EdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlkZW50aWZpZXIgPSBfZGF0YVtcImlkZW50aWZpZXJcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IEdldExvZ29EdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEdldExvZ29EdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImlkZW50aWZpZXJcIl0gPSB0aGlzLmlkZW50aWZpZXI7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEdldExvZ29EdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBHZXRMb2dvRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJR2V0TG9nb0R0byB7XG4gICAgaWRlbnRpZmllcjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgSGVhbHRoQmFzZSBpbXBsZW1lbnRzIElIZWFsdGhCYXNlIHtcbiAgICBsaW5rOiBIZWFsdGhTdGF0dXM7XG4gICAgc3RhdHVzOiBIZWFsdGhTdGF0dXM7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElIZWFsdGhCYXNlKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5saW5rID0gX2RhdGFbXCJsaW5rXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBfZGF0YVtcInN0YXR1c1wiXTtcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IF9kYXRhW1widmVyc2lvblwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogSGVhbHRoQmFzZSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgSGVhbHRoQmFzZSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wibGlua1wiXSA9IHRoaXMubGluaztcbiAgICAgICAgZGF0YVtcInN0YXR1c1wiXSA9IHRoaXMuc3RhdHVzO1xuICAgICAgICBkYXRhW1widmVyc2lvblwiXSA9IHRoaXMudmVyc2lvbjtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogSGVhbHRoQmFzZSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEhlYWx0aEJhc2UoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElIZWFsdGhCYXNlIHtcbiAgICBsaW5rOiBIZWFsdGhTdGF0dXM7XG4gICAgc3RhdHVzOiBIZWFsdGhTdGF0dXM7XG4gICAgdmVyc2lvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgSGVhbHRoRHRvIGltcGxlbWVudHMgSUhlYWx0aER0byB7XG4gICAgZW52aXJvbm1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzcGFya0FwaVNlcnZpY2VWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHNlcnZpY2VzOiB7IFtrZXk6IHN0cmluZ106IEhlYWx0aEJhc2U7IH0gfCB1bmRlZmluZWQ7XG4gICAgcnVubmluZ1N0YXR1czogU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElIZWFsdGhEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVudmlyb25tZW50ID0gX2RhdGFbXCJlbnZpcm9ubWVudFwiXTtcbiAgICAgICAgICAgIHRoaXMuc3BhcmtBcGlTZXJ2aWNlVmVyc2lvbiA9IF9kYXRhW1wic3BhcmtBcGlTZXJ2aWNlVmVyc2lvblwiXTtcbiAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IF9kYXRhW1widmVyc2lvblwiXTtcbiAgICAgICAgICAgIGlmIChfZGF0YVtcInNlcnZpY2VzXCJdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXJ2aWNlcyA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX2RhdGFbXCJzZXJ2aWNlc1wiXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX2RhdGFbXCJzZXJ2aWNlc1wiXS5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcy5zZXJ2aWNlcylba2V5XSA9IF9kYXRhW1wic2VydmljZXNcIl1ba2V5XSA/IEhlYWx0aEJhc2UuZnJvbUpTKF9kYXRhW1wic2VydmljZXNcIl1ba2V5XSkgOiBuZXcgSGVhbHRoQmFzZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucnVubmluZ1N0YXR1cyA9IF9kYXRhW1wicnVubmluZ1N0YXR1c1wiXSA/IFNlcnZpY2VzUnVubmluZ1N0YXR1c0R0by5mcm9tSlMoX2RhdGFbXCJydW5uaW5nU3RhdHVzXCJdKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBIZWFsdGhEdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEhlYWx0aER0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZW52aXJvbm1lbnRcIl0gPSB0aGlzLmVudmlyb25tZW50O1xuICAgICAgICBkYXRhW1wic3BhcmtBcGlTZXJ2aWNlVmVyc2lvblwiXSA9IHRoaXMuc3BhcmtBcGlTZXJ2aWNlVmVyc2lvbjtcbiAgICAgICAgZGF0YVtcInZlcnNpb25cIl0gPSB0aGlzLnZlcnNpb247XG4gICAgICAgIGlmICh0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBkYXRhW1wic2VydmljZXNcIl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VydmljZXMuaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+ZGF0YVtcInNlcnZpY2VzXCJdKVtrZXldID0gdGhpcy5zZXJ2aWNlc1trZXldID8gdGhpcy5zZXJ2aWNlc1trZXldLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVtcInJ1bm5pbmdTdGF0dXNcIl0gPSB0aGlzLnJ1bm5pbmdTdGF0dXMgPyB0aGlzLnJ1bm5pbmdTdGF0dXMudG9KU09OKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogSGVhbHRoRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgSGVhbHRoRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSGVhbHRoRHRvIHtcbiAgICBlbnZpcm9ubWVudDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHNwYXJrQXBpU2VydmljZVZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc2VydmljZXM6IHsgW2tleTogc3RyaW5nXTogSGVhbHRoQmFzZTsgfSB8IHVuZGVmaW5lZDtcbiAgICBydW5uaW5nU3RhdHVzOiBTZXJ2aWNlc1J1bm5pbmdTdGF0dXNEdG87XG59XG5cbmV4cG9ydCBjbGFzcyBIZWFsdGhEdG9IdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSUhlYWx0aER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBIZWFsdGhEdG87XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJSGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gX2RhdGFbXCJkYXRhXCJdID8gSGVhbHRoRHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogSGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgSGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGRhdGFbXCJkYXRhXCJdID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEhlYWx0aER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBIZWFsdGhEdG9IdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSGVhbHRoRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IEhlYWx0aER0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZW51bSBIZWFsdGhTdGF0dXMge1xuICAgIERvd24gPSAwLFxuICAgIFVwID0gMSxcbn1cblxuZXhwb3J0IGVudW0gSHR0cFN0YXR1c0NvZGUge1xuICAgIENvbnRpbnVlID0gMTAwLFxuICAgIFN3aXRjaGluZ1Byb3RvY29scyA9IDEwMSxcbiAgICBQcm9jZXNzaW5nID0gMTAyLFxuICAgIEVhcmx5SGludHMgPSAxMDMsXG4gICAgT0sgPSAyMDAsXG4gICAgQ3JlYXRlZCA9IDIwMSxcbiAgICBBY2NlcHRlZCA9IDIwMixcbiAgICBOb25BdXRob3JpdGF0aXZlSW5mb3JtYXRpb24gPSAyMDMsXG4gICAgTm9Db250ZW50ID0gMjA0LFxuICAgIFJlc2V0Q29udGVudCA9IDIwNSxcbiAgICBQYXJ0aWFsQ29udGVudCA9IDIwNixcbiAgICBNdWx0aVN0YXR1cyA9IDIwNyxcbiAgICBBbHJlYWR5UmVwb3J0ZWQgPSAyMDgsXG4gICAgSU1Vc2VkID0gMjI2LFxuICAgIE11bHRpcGxlQ2hvaWNlcyA9IDMwMCxcbiAgICBBbWJpZ3VvdXMgPSAzMDEsXG4gICAgTW92ZWRQZXJtYW5lbnRseSA9IDMwMixcbiAgICBNb3ZlZCA9IDMwMyxcbiAgICBGb3VuZCA9IDMwNCxcbiAgICBSZWRpcmVjdCA9IDMwNSxcbiAgICBTZWVPdGhlciA9IDMwNixcbiAgICBSZWRpcmVjdE1ldGhvZCA9IDMwNyxcbiAgICBOb3RNb2RpZmllZCA9IDMwOCxcbiAgICBVc2VQcm94eSA9IDQwMCxcbiAgICBVbnVzZWQgPSA0MDEsXG4gICAgVGVtcG9yYXJ5UmVkaXJlY3QgPSA0MDIsXG4gICAgUmVkaXJlY3RLZWVwVmVyYiA9IDQwMyxcbiAgICBQZXJtYW5lbnRSZWRpcmVjdCA9IDQwNCxcbiAgICBCYWRSZXF1ZXN0ID0gNDA1LFxuICAgIFVuYXV0aG9yaXplZCA9IDQwNixcbiAgICBQYXltZW50UmVxdWlyZWQgPSA0MDcsXG4gICAgRm9yYmlkZGVuID0gNDA4LFxuICAgIE5vdEZvdW5kID0gNDA5LFxuICAgIE1ldGhvZE5vdEFsbG93ZWQgPSA0MTAsXG4gICAgTm90QWNjZXB0YWJsZSA9IDQxMSxcbiAgICBQcm94eUF1dGhlbnRpY2F0aW9uUmVxdWlyZWQgPSA0MTIsXG4gICAgUmVxdWVzdFRpbWVvdXQgPSA0MTMsXG4gICAgQ29uZmxpY3QgPSA0MTQsXG4gICAgR29uZSA9IDQxNSxcbiAgICBMZW5ndGhSZXF1aXJlZCA9IDQxNixcbiAgICBQcmVjb25kaXRpb25GYWlsZWQgPSA0MTcsXG4gICAgUmVxdWVzdEVudGl0eVRvb0xhcmdlID0gNDIxLFxuICAgIFJlcXVlc3RVcmlUb29Mb25nID0gNDIyLFxuICAgIFVuc3VwcG9ydGVkTWVkaWFUeXBlID0gNDIzLFxuICAgIFJlcXVlc3RlZFJhbmdlTm90U2F0aXNmaWFibGUgPSA0MjQsXG4gICAgRXhwZWN0YXRpb25GYWlsZWQgPSA0MjYsXG4gICAgTWlzZGlyZWN0ZWRSZXF1ZXN0ID0gNDI4LFxuICAgIFVucHJvY2Vzc2FibGVFbnRpdHkgPSA0MjksXG4gICAgVW5wcm9jZXNzYWJsZUNvbnRlbnQgPSA0MzEsXG4gICAgTG9ja2VkID0gNDUxLFxuICAgIEZhaWxlZERlcGVuZGVuY3kgPSA1MDAsXG4gICAgVXBncmFkZVJlcXVpcmVkID0gNTAxLFxuICAgIFByZWNvbmRpdGlvblJlcXVpcmVkID0gNTAyLFxuICAgIFRvb01hbnlSZXF1ZXN0cyA9IDUwMyxcbiAgICBSZXF1ZXN0SGVhZGVyRmllbGRzVG9vTGFyZ2UgPSA1MDQsXG4gICAgVW5hdmFpbGFibGVGb3JMZWdhbFJlYXNvbnMgPSA1MDUsXG4gICAgSW50ZXJuYWxTZXJ2ZXJFcnJvciA9IDUwNixcbiAgICBOb3RJbXBsZW1lbnRlZCA9IDUwNyxcbiAgICBCYWRHYXRld2F5ID0gNTA4LFxuICAgIFNlcnZpY2VVbmF2YWlsYWJsZSA9IDUxMCxcbiAgICBHYXRld2F5VGltZW91dCA9IDUxMSxcbn1cblxuZXhwb3J0IGNsYXNzIEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGEgaW1wbGVtZW50cyBJSW50MzJBdXRoZW50aWNhdGVSZXNwb25zZUR0b0lEaWN0aW9uYXJ5SHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IHsgW2tleTogc3RyaW5nXTogQXV0aGVudGljYXRlUmVzcG9uc2VEdG87IH0gfCB1bmRlZmluZWQ7XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJSW50MzJBdXRoZW50aWNhdGVSZXNwb25zZUR0b0lEaWN0aW9uYXJ5SHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgaWYgKF9kYXRhW1wiZGF0YVwiXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gX2RhdGFbXCJkYXRhXCJdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfZGF0YVtcImRhdGFcIl0uaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMuZGF0YSlba2V5XSA9IF9kYXRhW1wiZGF0YVwiXVtrZXldID8gQXV0aGVudGljYXRlUmVzcG9uc2VEdG8uZnJvbUpTKF9kYXRhW1wiZGF0YVwiXVtrZXldKSA6IG5ldyBBdXRoZW50aWNhdGVSZXNwb25zZUR0bygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSBfZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBJbnQzMkF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSURpY3Rpb25hcnlIdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJbnQzMkF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSURpY3Rpb25hcnlIdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJlcnJvck1lc3NhZ2VcIl0gPSB0aGlzLmVycm9yTWVzc2FnZTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICBkYXRhW1wic3RhdHVzQ29kZVwiXSA9IHRoaXMuc3RhdHVzQ29kZTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YSkge1xuICAgICAgICAgICAgZGF0YVtcImRhdGFcIl0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PmRhdGFbXCJkYXRhXCJdKVtrZXldID0gdGhpcy5kYXRhW2tleV0gPyB0aGlzLmRhdGFba2V5XS50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IEludDMyQXV0aGVudGljYXRlUmVzcG9uc2VEdG9JRGljdGlvbmFyeUh0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJbnQzMkF1dGhlbnRpY2F0ZVJlc3BvbnNlRHRvSURpY3Rpb25hcnlIdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW50MzJBdXRoZW50aWNhdGVSZXNwb25zZUR0b0lEaWN0aW9uYXJ5SHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IHsgW2tleTogc3RyaW5nXTogQXV0aGVudGljYXRlUmVzcG9uc2VEdG87IH0gfCB1bmRlZmluZWQ7XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIE1vYmlsZUxvZ2luRFRPIGltcGxlbWVudHMgSU1vYmlsZUxvZ2luRFRPIHtcbiAgICB0ZW5hbnRfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHNtc0NvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB1bmlxdWVJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwbGF0Zm9ybTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGJyYW5kOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZGV2aWNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGRldmljZU1vZGVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSU1vYmlsZUxvZ2luRFRPKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy50ZW5hbnRfaWQgPSBfZGF0YVtcInRlbmFudF9pZFwiXTtcbiAgICAgICAgICAgIHRoaXMucGhvbmUgPSBfZGF0YVtcInBob25lXCJdO1xuICAgICAgICAgICAgdGhpcy5zbXNDb2RlID0gX2RhdGFbXCJzbXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IF9kYXRhW1widW5pcXVlSWRcIl07XG4gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSBfZGF0YVtcInZlcnNpb25cIl07XG4gICAgICAgICAgICB0aGlzLnBsYXRmb3JtID0gX2RhdGFbXCJwbGF0Zm9ybVwiXTtcbiAgICAgICAgICAgIHRoaXMuYnJhbmQgPSBfZGF0YVtcImJyYW5kXCJdO1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VOYW1lID0gX2RhdGFbXCJkZXZpY2VOYW1lXCJdO1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VNb2RlbCA9IF9kYXRhW1wiZGV2aWNlTW9kZWxcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IE1vYmlsZUxvZ2luRFRPIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBNb2JpbGVMb2dpbkRUTygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1widGVuYW50X2lkXCJdID0gdGhpcy50ZW5hbnRfaWQ7XG4gICAgICAgIGRhdGFbXCJwaG9uZVwiXSA9IHRoaXMucGhvbmU7XG4gICAgICAgIGRhdGFbXCJzbXNDb2RlXCJdID0gdGhpcy5zbXNDb2RlO1xuICAgICAgICBkYXRhW1widW5pcXVlSWRcIl0gPSB0aGlzLnVuaXF1ZUlkO1xuICAgICAgICBkYXRhW1widmVyc2lvblwiXSA9IHRoaXMudmVyc2lvbjtcbiAgICAgICAgZGF0YVtcInBsYXRmb3JtXCJdID0gdGhpcy5wbGF0Zm9ybTtcbiAgICAgICAgZGF0YVtcImJyYW5kXCJdID0gdGhpcy5icmFuZDtcbiAgICAgICAgZGF0YVtcImRldmljZU5hbWVcIl0gPSB0aGlzLmRldmljZU5hbWU7XG4gICAgICAgIGRhdGFbXCJkZXZpY2VNb2RlbFwiXSA9IHRoaXMuZGV2aWNlTW9kZWw7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IE1vYmlsZUxvZ2luRFRPIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgTW9iaWxlTG9naW5EVE8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNb2JpbGVMb2dpbkRUTyB7XG4gICAgdGVuYW50X2lkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBzbXNDb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdW5pcXVlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB2ZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBicmFuZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGRldmljZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBkZXZpY2VNb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgT2JqZWN0SHR0cFJlc3BvbnNlRGF0YSBpbXBsZW1lbnRzIElPYmplY3RIdHRwUmVzcG9uc2VEYXRhIHtcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XG4gICAgZGF0YTogYW55IHwgdW5kZWZpbmVkO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSU9iamVjdEh0dHBSZXNwb25zZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IF9kYXRhW1wiZXJyb3JNZXNzYWdlXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1N1Y2Nlc3MgPSBfZGF0YVtcImlzU3VjY2Vzc1wiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IF9kYXRhW1wic3RhdHVzQ29kZVwiXTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IF9kYXRhW1wiZGF0YVwiXTtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSBfZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBPYmplY3RIdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBPYmplY3RIdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJlcnJvck1lc3NhZ2VcIl0gPSB0aGlzLmVycm9yTWVzc2FnZTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICBkYXRhW1wic3RhdHVzQ29kZVwiXSA9IHRoaXMuc3RhdHVzQ29kZTtcbiAgICAgICAgZGF0YVtcImRhdGFcIl0gPSB0aGlzLmRhdGE7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IE9iamVjdEh0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBPYmplY3RIdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT2JqZWN0SHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IGFueSB8IHVuZGVmaW5lZDtcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgT25saW5lVmFsaWRhdG9yQ29udGV4dER0byBpbXBsZW1lbnRzIElPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvIHtcbiAgICBndWlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcGFya0lkOiBudW1iZXI7XG4gICAgcGFya05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb21wYW55SWQ6IG51bWJlcjtcbiAgICBzdWJDb21wYW55SWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICB2YWxpZGF0aW9uVHlwZUlkOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSU9ubGluZVZhbGlkYXRvckNvbnRleHREdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmd1aWQgPSBfZGF0YVtcImd1aWRcIl07XG4gICAgICAgICAgICB0aGlzLnBhcmtJZCA9IF9kYXRhW1wicGFya0lkXCJdO1xuICAgICAgICAgICAgdGhpcy5wYXJrTmFtZSA9IF9kYXRhW1wicGFya05hbWVcIl07XG4gICAgICAgICAgICB0aGlzLmNvbXBhbnlJZCA9IF9kYXRhW1wiY29tcGFueUlkXCJdO1xuICAgICAgICAgICAgdGhpcy5zdWJDb21wYW55SWQgPSBfZGF0YVtcInN1YkNvbXBhbnlJZFwiXTtcbiAgICAgICAgICAgIHRoaXMudmFsaWRhdGlvblR5cGVJZCA9IF9kYXRhW1widmFsaWRhdGlvblR5cGVJZFwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogT25saW5lVmFsaWRhdG9yQ29udGV4dER0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgT25saW5lVmFsaWRhdG9yQ29udGV4dER0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZ3VpZFwiXSA9IHRoaXMuZ3VpZDtcbiAgICAgICAgZGF0YVtcInBhcmtJZFwiXSA9IHRoaXMucGFya0lkO1xuICAgICAgICBkYXRhW1wicGFya05hbWVcIl0gPSB0aGlzLnBhcmtOYW1lO1xuICAgICAgICBkYXRhW1wiY29tcGFueUlkXCJdID0gdGhpcy5jb21wYW55SWQ7XG4gICAgICAgIGRhdGFbXCJzdWJDb21wYW55SWRcIl0gPSB0aGlzLnN1YkNvbXBhbnlJZDtcbiAgICAgICAgZGF0YVtcInZhbGlkYXRpb25UeXBlSWRcIl0gPSB0aGlzLnZhbGlkYXRpb25UeXBlSWQ7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IE9ubGluZVZhbGlkYXRvckNvbnRleHREdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJT25saW5lVmFsaWRhdG9yQ29udGV4dER0byB7XG4gICAgZ3VpZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHBhcmtJZDogbnVtYmVyO1xuICAgIHBhcmtOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgY29tcGFueUlkOiBudW1iZXI7XG4gICAgc3ViQ29tcGFueUlkOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgdmFsaWRhdGlvblR5cGVJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgT25saW5lVmFsaWRhdG9yQ29udGV4dER0b0h0dHBSZXNwb25zZURhdGEgaW1wbGVtZW50cyBJT25saW5lVmFsaWRhdG9yQ29udGV4dER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSU9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBfZGF0YVtcImVycm9yTWVzc2FnZVwiXTtcbiAgICAgICAgICAgIHRoaXMuaXNTdWNjZXNzID0gX2RhdGFbXCJpc1N1Y2Nlc3NcIl07XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBfZGF0YVtcInN0YXR1c0NvZGVcIl07XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBfZGF0YVtcImRhdGFcIl0gPyBPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogT25saW5lVmFsaWRhdG9yQ29udGV4dER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJlcnJvck1lc3NhZ2VcIl0gPSB0aGlzLmVycm9yTWVzc2FnZTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICBkYXRhW1wic3RhdHVzQ29kZVwiXSA9IHRoaXMuc3RhdHVzQ29kZTtcbiAgICAgICAgZGF0YVtcImRhdGFcIl0gPSB0aGlzLmRhdGEgPyB0aGlzLmRhdGEudG9KU09OKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdID0gdGhpcy5zdWNjZXNzTWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogT25saW5lVmFsaWRhdG9yQ29udGV4dER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBPbmxpbmVWYWxpZGF0b3JDb250ZXh0RHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU9ubGluZVZhbGlkYXRvckNvbnRleHREdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XG4gICAgZGF0YTogT25saW5lVmFsaWRhdG9yQ29udGV4dER0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZW51bSBQYXNzd29yZENoYW5nZVR5cGUge1xuICAgIFJlZ2lzdHJhdGlvbiA9IDAsXG4gICAgRm9yZ290ID0gMSxcbiAgICBFeHBpcmF0aW9uID0gMixcbn1cblxuZXhwb3J0IGVudW0gUGFzc3dvcmRFeHBpcmF0aW9uU3RhdGUge1xuICAgIE5vdEV4cGlyZWQgPSAxLFxuICAgIEFib3V0VG9FeHBpcmUgPSAyLFxuICAgIEV4cGlyZWQgPSAzLFxufVxuXG5leHBvcnQgZW51bSBQZXJtaXNzaW9uVHlwZSB7XG4gICAgQ2NNYWluID0gMCxcbiAgICBEZXByZWNhdGVkQWRtaW5NYWluID0gMSxcbiAgICBVbmxvY2tEb29yID0gMixcbiAgICBWZW5kR2F0ZSA9IDMsXG4gICAgVmFsaWRhdGUgPSA0LFxuICAgIFNldFByaWNlID0gNSxcbiAgICBSZXN0b3JlVGlja2V0ID0gNixcbiAgICBDaGFuZ2VEZXZpY2VBY2Nlc3NNb2RlID0gNyxcbiAgICBSZXNldERldmljZUFjY2Vzc01vZGUgPSA4LFxuICAgIFJlc3RhcnREZXZpY2UgPSA5LFxuICAgIFJlc2V0QmlsbERpc3BlbnNlciA9IDEwLFxuICAgIENsb3NlR2F0ZSA9IDExLFxuICAgIEVqZWN0SmFtbWVkVGlja2V0ID0gMTIsXG4gICAgU3dhbGxvd0phbW1lZFRpY2tldCA9IDEzLFxuICAgIERlbGl2ZXJCdW5kbGVCaWxscyA9IDE0LFxuICAgIExvY2tDYXNoUmVnaXN0ZXIgPSAxNSxcbiAgICBTZXRSYXRlID0gMTYsXG4gICAgSW5zZXJ0VmlydHVhbFRpY2tldCA9IDE3LFxuICAgIEhvbGRSZWxheSA9IDE4LFxuICAgIE9wZW5SZWxheSA9IDE5LFxuICAgIFByaW50VGlja2V0ID0gMjAsXG4gICAgVHJpZ2dlckxQUk1vZHVsZSA9IDIxLFxuICAgIEVuYWJsZVJlcHJpbnRSZWNlaXB0ID0gMjIsXG4gICAgT3BlbkdhdGVDb250aW51b3VzbHkgPSAyMyxcbiAgICBDbG9zZUdhdGVDb250aW51b3VzbHkgPSAyNCxcbiAgICBNYW51YWxseUNsb3NlVGlja2V0ID0gMjUsXG4gICAgVXBkYXRlTG9jYXRpb24gPSAyNixcbiAgICBVcGRhdGVPY2N1cGFuY3kgPSAyNyxcbiAgICBBdHRhY2hUaWNrZXQgPSAyOCxcbiAgICBVcGRhdGVMaWNlbnNlUGxhdGUgPSAyOSxcbiAgICBMb3N0VGlja2V0ID0gMzAsXG4gICAgSW5zZXJ0UmVtb3RlVmFsaWRhdGlvbiA9IDMxLFxuICAgIFVwZGF0ZVBheW1lbnQgPSAzMixcbiAgICBVcGRhdGVab25lT2NjdXBhbmN5ID0gMzMsXG4gICAgVXBkYXRlUmVtb3RlVmFsaWRhdGlvbiA9IDM0LFxuICAgIFZhbGlkYXRpb25NYWluID0gMzUsXG4gICAgVmFsaWRhdGlvbkVWYWxpZGF0aW9uVmlldyA9IDM2LFxuICAgIFZhbGlkYXRpb25TdGlja2VyVmlldyA9IDM3LFxuICAgIFZhbGlkYXRpb25Db3Vwb25WaWV3ID0gMzgsXG4gICAgUmVwb3J0c01haW4gPSAzOSxcbiAgICBHdWVzdE1haW4gPSA0MCxcbiAgICBVcGRhdGVEb2N1bWVudCA9IDQxLFxuICAgIFZpZXdSZXZlbnVlID0gNDIsXG4gICAgUHJpbnRSZWNlaXB0ID0gNDMsXG4gICAgTW9udGhsaWVzTWFpbiA9IDQ0LFxuICAgIFBpTWFpbiA9IDQ1LFxuICAgIEd1ZXN0R3JvdXBWaWV3ID0gNDYsXG4gICAgU2luZ2xlR3Vlc3QgPSA0NyxcbiAgICBDbG9zZVRpY2tldEZvcklTRiA9IDQ4LFxuICAgIFBheW1lbnRGb3JJU0YgPSA0OSxcbiAgICBNYW51YWxseVJ1blogPSA1MCxcbiAgICBVcGRhdGVTZXR0aW5ncyA9IDUxLFxuICAgIFNldEFjdGl2ZVJhdGUgPSA1MixcbiAgICBVcGRhdGVNQ0RhdGVUaW1lID0gNTMsXG4gICAgR3Vlc3RIb3RlbEd1ZXN0VmlldyA9IDU0LFxuICAgIEd1ZXN0VmlldyA9IDU1LFxuICAgIEFjY291bnRNYW5hZ2VtZW50TWFpbiA9IDU2LFxuICAgIEFjY291bnRNYW5hZ2VtZW50QWNjb3VudFZpZXcgPSA1NyxcbiAgICBNb250aGxpZXNWaWV3ID0gNTgsXG4gICAgTW9udGhseVNlcmllc0NyZWF0ZSA9IDU5LFxuICAgIFJ1bk1hY3JvID0gNjAsXG4gICAgVGVuYW50U2V0dGluZ3NNYWluID0gNjEsXG4gICAgTWFuYWdlbWVudEFkbWluID0gNjIsXG4gICAgQmxhY2tMaXN0ID0gNjMsXG4gICAgU3lzdGVtQWRtaW4gPSA2NCxcbiAgICBPcGVyYXRpb25hbEFkbWluID0gNjUsXG4gICAgRmFjaWxpdGllc0FuZFNtYXJ0cGFya3MgPSA2NixcbiAgICBMb2dvID0gNjcsXG4gICAgU210cFNldHRpbmdzID0gNjgsXG4gICAgRGVmYXVsdFVzZXJTZXR0aW5ncyA9IDY5LFxuICAgIEF1ZGl0ID0gNzAsXG4gICAgQmFja29mZmljZU1haW4gPSA3MSxcbiAgICBMb3RDb25maWd1cmF0aW9uTWFpbiA9IDcyLFxuICAgIExvdENvbmZpZ3VyYXRpb25SYXRlcyA9IDczLFxuICAgIExvdENvbmZpZ3VyYXRpb25TY2hlZHVsZXIgPSA3NCxcbiAgICBMb3RDb25maWd1cmF0aW9uVmFsaWRhdGlvblByb2ZpbGUgPSA3NSxcbiAgICBIb3RlbEd1ZXN0SU9DcmVhdGUgPSA3NixcbiAgICBFQ29tbWVyY2VCYWNrb2ZmaWNlTWFpbiA9IDc3LFxuICAgIFZhbGlkYXRpb25FVmFsaWRhdGlvbkNyZWF0ZSA9IDc4LFxuICAgIFZhbGlkYXRpb25FVmFsaWRhdGlvblVwZGF0ZSA9IDc5LFxuICAgIFZhbGlkYXRpb25FVmFsaWRhdGlvbkRlbGV0ZSA9IDgwLFxuICAgIFZhbGlkYXRpb25TdGlja2VyQ3JlYXRlID0gODEsXG4gICAgVmFsaWRhdGlvblN0aWNrZXJVcGRhdGUgPSA4MixcbiAgICBWYWxpZGF0aW9uU3RpY2tlckRlbGV0ZSA9IDgzLFxuICAgIFZhbGlkYXRpb25Db3Vwb25DcmVhdGUgPSA4NCxcbiAgICBWYWxpZGF0aW9uQ291cG9uVXBkYXRlID0gODUsXG4gICAgVmFsaWRhdGlvbkNvdXBvbkRlbGV0ZSA9IDg2LFxuICAgIEd1ZXN0R3JvdXBDcmVhdGUgPSA4NyxcbiAgICBBY2NvdW50TWFuYWdlbWVudEFjY291bnRDcmVhdGUgPSA4OCxcbiAgICBBY2NvdW50TWFuYWdlbWVudEFjY291bnRVcGRhdGUgPSA4OSxcbiAgICBBY2NvdW50TWFuYWdlbWVudEFjY291bnREZWxldGUgPSA5MCxcbiAgICBNb250aGxpZXNDcmVhdGUgPSA5MSxcbiAgICBNb250aGxpZXNVcGRhdGUgPSA5MixcbiAgICBNb250aGxpZXNEZWxldGUgPSA5MyxcbiAgICBHdWVzdENyZWF0ZSA9IDk0LFxuICAgIEd1ZXN0VXBkYXRlID0gOTUsXG4gICAgR3Vlc3REZWxldGUgPSA5NixcbiAgICBDbG9zZVBheW1lbnRTY3JlZW4gPSA5NyxcbiAgICBFQ29tbWVyY2VBZG1pbiA9IDk4LFxuICAgIEVDb21tZXJjZVJlZ3VsYXIgPSA5OSxcbiAgICBMb3RDb25maWd1cmF0aW9uQWNjZXNzUHJvZmlsZSA9IDEwMCxcbn1cblxuZXhwb3J0IGNsYXNzIFJlZnJlc2hUb2tlbkR0byBpbXBsZW1lbnRzIElSZWZyZXNoVG9rZW5EdG8ge1xuICAgIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVmcmVzaFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZXhwaXJhdGlvbjogbW9tZW50Lk1vbWVudDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJUmVmcmVzaFRva2VuRHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IF9kYXRhW1wiYWNjZXNzVG9rZW5cIl07XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbiA9IF9kYXRhW1wicmVmcmVzaFRva2VuXCJdO1xuICAgICAgICAgICAgdGhpcy5leHBpcmF0aW9uID0gX2RhdGFbXCJleHBpcmF0aW9uXCJdID8gbW9tZW50KF9kYXRhW1wiZXhwaXJhdGlvblwiXS50b1N0cmluZygpKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBSZWZyZXNoVG9rZW5EdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFJlZnJlc2hUb2tlbkR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiYWNjZXNzVG9rZW5cIl0gPSB0aGlzLmFjY2Vzc1Rva2VuO1xuICAgICAgICBkYXRhW1wicmVmcmVzaFRva2VuXCJdID0gdGhpcy5yZWZyZXNoVG9rZW47XG4gICAgICAgIGRhdGFbXCJleHBpcmF0aW9uXCJdID0gdGhpcy5leHBpcmF0aW9uID8gdGhpcy5leHBpcmF0aW9uLnRvSVNPU3RyaW5nKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogUmVmcmVzaFRva2VuRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgUmVmcmVzaFRva2VuRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaFRva2VuRHRvIHtcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGV4cGlyYXRpb246IG1vbWVudC5Nb21lbnQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWZyZXNoVG9rZW5EdG9IdHRwUmVzcG9uc2VEYXRhIGltcGxlbWVudHMgSVJlZnJlc2hUb2tlbkR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBSZWZyZXNoVG9rZW5EdG87XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJUmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YSkge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gX2RhdGFbXCJlcnJvck1lc3NhZ2VcIl07XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXNDb2RlID0gX2RhdGFbXCJzdGF0dXNDb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy5kYXRhID0gX2RhdGFbXCJkYXRhXCJdID8gUmVmcmVzaFRva2VuRHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogUmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgUmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiZXJyb3JNZXNzYWdlXCJdID0gdGhpcy5lcnJvck1lc3NhZ2U7XG4gICAgICAgIGRhdGFbXCJpc1N1Y2Nlc3NcIl0gPSB0aGlzLmlzU3VjY2VzcztcbiAgICAgICAgZGF0YVtcInN0YXR1c0NvZGVcIl0gPSB0aGlzLnN0YXR1c0NvZGU7XG4gICAgICAgIGRhdGFbXCJkYXRhXCJdID0gdGhpcy5kYXRhID8gdGhpcy5kYXRhLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXSA9IHRoaXMuc3VjY2Vzc01lc3NhZ2U7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFJlZnJlc2hUb2tlbkR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBSZWZyZXNoVG9rZW5EdG9IdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmcmVzaFRva2VuRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IFJlZnJlc2hUb2tlbkR0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvIGltcGxlbWVudHMgSVNlcnZpY2VzUnVubmluZ1N0YXR1c0R0byB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBpc1NtYXJ0UGFya0Nvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBpc1NtYXJ0UGFya0NvcmVDb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgaXNTcGFya0NvcmVDb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgaXNTcGFya0Nsb3VkQ29ubmVjdGVkOiBib29sZWFuO1xuICAgIHNtYXJ0UGFya0Rpc2Nvbm5lY3RlZFRpbWVzdGFtcDogbW9tZW50Lk1vbWVudCB8IHVuZGVmaW5lZDtcbiAgICBzbWFydFBhcmtDb3JlRGlzY29ubmVjdGVkVGltZXN0YW1wOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuICAgIHNwYXJrQ29yZURpc2Nvbm5lY3RlZFRpbWVzdGFtcDogbW9tZW50Lk1vbWVudCB8IHVuZGVmaW5lZDtcbiAgICBzcGFya0Nsb3VkRGlzY29ubmVjdGVkVGltZXN0YW1wOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElTZXJ2aWNlc1J1bm5pbmdTdGF0dXNEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlkID0gX2RhdGFbXCJpZFwiXTtcbiAgICAgICAgICAgIHRoaXMuaXNTbWFydFBhcmtDb25uZWN0ZWQgPSBfZGF0YVtcImlzU21hcnRQYXJrQ29ubmVjdGVkXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1NtYXJ0UGFya0NvcmVDb25uZWN0ZWQgPSBfZGF0YVtcImlzU21hcnRQYXJrQ29yZUNvbm5lY3RlZFwiXTtcbiAgICAgICAgICAgIHRoaXMuaXNTcGFya0NvcmVDb25uZWN0ZWQgPSBfZGF0YVtcImlzU3BhcmtDb3JlQ29ubmVjdGVkXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1NwYXJrQ2xvdWRDb25uZWN0ZWQgPSBfZGF0YVtcImlzU3BhcmtDbG91ZENvbm5lY3RlZFwiXTtcbiAgICAgICAgICAgIHRoaXMuc21hcnRQYXJrRGlzY29ubmVjdGVkVGltZXN0YW1wID0gX2RhdGFbXCJzbWFydFBhcmtEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0gPyBtb21lbnQoX2RhdGFbXCJzbWFydFBhcmtEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc21hcnRQYXJrQ29yZURpc2Nvbm5lY3RlZFRpbWVzdGFtcCA9IF9kYXRhW1wic21hcnRQYXJrQ29yZURpc2Nvbm5lY3RlZFRpbWVzdGFtcFwiXSA/IG1vbWVudChfZGF0YVtcInNtYXJ0UGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3BhcmtDb3JlRGlzY29ubmVjdGVkVGltZXN0YW1wID0gX2RhdGFbXCJzcGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0gPyBtb21lbnQoX2RhdGFbXCJzcGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3BhcmtDbG91ZERpc2Nvbm5lY3RlZFRpbWVzdGFtcCA9IF9kYXRhW1wic3BhcmtDbG91ZERpc2Nvbm5lY3RlZFRpbWVzdGFtcFwiXSA/IG1vbWVudChfZGF0YVtcInNwYXJrQ2xvdWREaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0udG9TdHJpbmcoKSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTZXJ2aWNlc1J1bm5pbmdTdGF0dXNEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImlkXCJdID0gdGhpcy5pZDtcbiAgICAgICAgZGF0YVtcImlzU21hcnRQYXJrQ29ubmVjdGVkXCJdID0gdGhpcy5pc1NtYXJ0UGFya0Nvbm5lY3RlZDtcbiAgICAgICAgZGF0YVtcImlzU21hcnRQYXJrQ29yZUNvbm5lY3RlZFwiXSA9IHRoaXMuaXNTbWFydFBhcmtDb3JlQ29ubmVjdGVkO1xuICAgICAgICBkYXRhW1wiaXNTcGFya0NvcmVDb25uZWN0ZWRcIl0gPSB0aGlzLmlzU3BhcmtDb3JlQ29ubmVjdGVkO1xuICAgICAgICBkYXRhW1wiaXNTcGFya0Nsb3VkQ29ubmVjdGVkXCJdID0gdGhpcy5pc1NwYXJrQ2xvdWRDb25uZWN0ZWQ7XG4gICAgICAgIGRhdGFbXCJzbWFydFBhcmtEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0gPSB0aGlzLnNtYXJ0UGFya0Rpc2Nvbm5lY3RlZFRpbWVzdGFtcCA/IHRoaXMuc21hcnRQYXJrRGlzY29ubmVjdGVkVGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgZGF0YVtcInNtYXJ0UGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXBcIl0gPSB0aGlzLnNtYXJ0UGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXAgPyB0aGlzLnNtYXJ0UGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXAudG9JU09TdHJpbmcoKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wic3BhcmtDb3JlRGlzY29ubmVjdGVkVGltZXN0YW1wXCJdID0gdGhpcy5zcGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXAgPyB0aGlzLnNwYXJrQ29yZURpc2Nvbm5lY3RlZFRpbWVzdGFtcC50b0lTT1N0cmluZygpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIGRhdGFbXCJzcGFya0Nsb3VkRGlzY29ubmVjdGVkVGltZXN0YW1wXCJdID0gdGhpcy5zcGFya0Nsb3VkRGlzY29ubmVjdGVkVGltZXN0YW1wID8gdGhpcy5zcGFya0Nsb3VkRGlzY29ubmVjdGVkVGltZXN0YW1wLnRvSVNPU3RyaW5nKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VydmljZXNSdW5uaW5nU3RhdHVzRHRvIHtcbiAgICBpZDogbnVtYmVyO1xuICAgIGlzU21hcnRQYXJrQ29ubmVjdGVkOiBib29sZWFuO1xuICAgIGlzU21hcnRQYXJrQ29yZUNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBpc1NwYXJrQ29yZUNvbm5lY3RlZDogYm9vbGVhbjtcbiAgICBpc1NwYXJrQ2xvdWRDb25uZWN0ZWQ6IGJvb2xlYW47XG4gICAgc21hcnRQYXJrRGlzY29ubmVjdGVkVGltZXN0YW1wOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuICAgIHNtYXJ0UGFya0NvcmVEaXNjb25uZWN0ZWRUaW1lc3RhbXA6IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG4gICAgc3BhcmtDb3JlRGlzY29ubmVjdGVkVGltZXN0YW1wOiBtb21lbnQuTW9tZW50IHwgdW5kZWZpbmVkO1xuICAgIHNwYXJrQ2xvdWREaXNjb25uZWN0ZWRUaW1lc3RhbXA6IG1vbWVudC5Nb21lbnQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBlbnVtIFNldHRpbmdzQ2F0ZWdvcnkge1xuICAgIERhdGVGb3JtYXRzID0gMCxcbiAgICBBbGVydHMgPSAxLFxuICAgIFRpY2tldHNTcGVjaWZpY2F0aW9ucyA9IDIsXG4gICAgTG9jYWxpemF0aW9uID0gMyxcbiAgICBBbGVydHNQcmVmZXJlbmNlcyA9IDQsXG4gICAgVHdvRmFjdG9yQXV0aGVudGljYXRpb24gPSA1LFxuICAgIEVDb21tZXJjZUJhY2tvZmZpY2VVUkwgPSA2LFxuICAgIFNTTyA9IDcsXG4gICAgUGFzc3dvcmRQb2xpY3kgPSA4LFxufVxuXG5leHBvcnQgY2xhc3MgU2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG8gaW1wbGVtZW50cyBJU2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG8ge1xuICAgIHVzZXJTdGF0dXM6IFVzZXJTdGF0dXM7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICAgIHNpbmdsZVNpZ25PblByb3ZpZGVyOiBTaW5nbGVTaWduT25Qcm92aWRlcjtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJU2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnVzZXJTdGF0dXMgPSBfZGF0YVtcInVzZXJTdGF0dXNcIl07XG4gICAgICAgICAgICB0aGlzLmlzQXV0aGVudGljYXRlZCA9IF9kYXRhW1wiaXNBdXRoZW50aWNhdGVkXCJdO1xuICAgICAgICAgICAgdGhpcy5zaW5nbGVTaWduT25Qcm92aWRlciA9IF9kYXRhW1wic2luZ2xlU2lnbk9uUHJvdmlkZXJcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IFNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTaW5nbGVTaWduT25BdXRoZW50aWNhdGlvbkR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1widXNlclN0YXR1c1wiXSA9IHRoaXMudXNlclN0YXR1cztcbiAgICAgICAgZGF0YVtcImlzQXV0aGVudGljYXRlZFwiXSA9IHRoaXMuaXNBdXRoZW50aWNhdGVkO1xuICAgICAgICBkYXRhW1wic2luZ2xlU2lnbk9uUHJvdmlkZXJcIl0gPSB0aGlzLnNpbmdsZVNpZ25PblByb3ZpZGVyO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBTaW5nbGVTaWduT25BdXRoZW50aWNhdGlvbkR0byB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNpbmdsZVNpZ25PbkF1dGhlbnRpY2F0aW9uRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2luZ2xlU2lnbk9uQXV0aGVudGljYXRpb25EdG8ge1xuICAgIHVzZXJTdGF0dXM6IFVzZXJTdGF0dXM7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICAgIHNpbmdsZVNpZ25PblByb3ZpZGVyOiBTaW5nbGVTaWduT25Qcm92aWRlcjtcbn1cblxuZXhwb3J0IGVudW0gU2luZ2xlU2lnbk9uUHJvdmlkZXIge1xuICAgIE1pY3Jvc29mdCA9IDEsXG4gICAgUGluZ0ZlZGVyYXRlID0gMixcbn1cblxuZXhwb3J0IGNsYXNzIFNpbmdsZVNpZ25PblNldHRpbmdzIGltcGxlbWVudHMgSVNpbmdsZVNpZ25PblNldHRpbmdzIHtcbiAgICBpc0VuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJvdmlkZXI6IFNpbmdsZVNpZ25PblByb3ZpZGVyO1xuICAgIGNvbmZpZ3VyYXRpb25zOiBhbnkgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSVNpbmdsZVNpZ25PblNldHRpbmdzKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pc0VuYWJsZWQgPSBfZGF0YVtcImlzRW5hYmxlZFwiXTtcbiAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBfZGF0YVtcInByb3ZpZGVyXCJdO1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9ucyA9IF9kYXRhW1wiY29uZmlndXJhdGlvbnNcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IFNpbmdsZVNpZ25PblNldHRpbmdzIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTaW5nbGVTaWduT25TZXR0aW5ncygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiaXNFbmFibGVkXCJdID0gdGhpcy5pc0VuYWJsZWQ7XG4gICAgICAgIGRhdGFbXCJwcm92aWRlclwiXSA9IHRoaXMucHJvdmlkZXI7XG4gICAgICAgIGRhdGFbXCJjb25maWd1cmF0aW9uc1wiXSA9IHRoaXMuY29uZmlndXJhdGlvbnM7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFNpbmdsZVNpZ25PblNldHRpbmdzIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2luZ2xlU2lnbk9uU2V0dGluZ3MoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTaW5nbGVTaWduT25TZXR0aW5ncyB7XG4gICAgaXNFbmFibGVkOiBib29sZWFuO1xuICAgIHByb3ZpZGVyOiBTaW5nbGVTaWduT25Qcm92aWRlcjtcbiAgICBjb25maWd1cmF0aW9uczogYW55IHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU21zQXV0aERUTyBpbXBsZW1lbnRzIElTbXNBdXRoRFRPIHtcbiAgICB0ZW5hbnRfaWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGFwcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJU21zQXV0aERUTykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGVuYW50X2lkID0gX2RhdGFbXCJ0ZW5hbnRfaWRcIl07XG4gICAgICAgICAgICB0aGlzLnBob25lID0gX2RhdGFbXCJwaG9uZVwiXTtcbiAgICAgICAgICAgIHRoaXMuYXBwTmFtZSA9IF9kYXRhW1wiYXBwTmFtZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogU21zQXV0aERUTyB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgU21zQXV0aERUTygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1widGVuYW50X2lkXCJdID0gdGhpcy50ZW5hbnRfaWQ7XG4gICAgICAgIGRhdGFbXCJwaG9uZVwiXSA9IHRoaXMucGhvbmU7XG4gICAgICAgIGRhdGFbXCJhcHBOYW1lXCJdID0gdGhpcy5hcHBOYW1lO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBTbXNBdXRoRFRPIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgU21zQXV0aERUTygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNtc0F1dGhEVE8ge1xuICAgIHRlbmFudF9pZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHBob25lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgU3BhcmtTZXR0aW5nc0R0byBpbXBsZW1lbnRzIElTcGFya1NldHRpbmdzRHRvIHtcbiAgICBjYXRlZ29yeTogU2V0dGluZ3NDYXRlZ29yeTtcbiAgICBzZXR0aW5nc0pzb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJU3BhcmtTZXR0aW5nc0R0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBfZGF0YVtcImNhdGVnb3J5XCJdO1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5nc0pzb24gPSBfZGF0YVtcInNldHRpbmdzSnNvblwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogU3BhcmtTZXR0aW5nc0R0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgU3BhcmtTZXR0aW5nc0R0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wiY2F0ZWdvcnlcIl0gPSB0aGlzLmNhdGVnb3J5O1xuICAgICAgICBkYXRhW1wic2V0dGluZ3NKc29uXCJdID0gdGhpcy5zZXR0aW5nc0pzb247XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFNwYXJrU2V0dGluZ3NEdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTcGFya1NldHRpbmdzRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU3BhcmtTZXR0aW5nc0R0byB7XG4gICAgY2F0ZWdvcnk6IFNldHRpbmdzQ2F0ZWdvcnk7XG4gICAgc2V0dGluZ3NKc29uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBlbnVtIFN1Yk1vZHVsZSB7XG4gICAgRVZhbGlkYXRpb24gPSAwLFxuICAgIFN0aWNrZXJzID0gMSxcbiAgICBDb3Vwb25zID0gMixcbiAgICBHdWVzdHMgPSAzLFxuICAgIEhvdGVsR3Vlc3RzID0gNCxcbiAgICBNb250aGxpZXMgPSA1LFxuICAgIEFjY291bnRzID0gNixcbiAgICBVc2VyTWFuYWdlbWVudCA9IDcsXG4gICAgRmFjaWxpdGllc0FuZFNtYXJ0cGFya3MgPSA4LFxuICAgIExvZ28gPSA5LFxuICAgIFNtdHBTZXR0aW5ncyA9IDEwLFxuICAgIERlZmF1bHRVc2VyU2V0dGluZ3MgPSAxMSxcbiAgICBBdWRpdCA9IDEyLFxuICAgIFJhdGVzID0gMTMsXG4gICAgU2NoZWR1bGVyID0gMTQsXG4gICAgVmFsaWRhdGlvblByb2ZpbGVzID0gMTUsXG4gICAgSG90ZWxHdWVzdHNJTyA9IDE2LFxuICAgIEFjY2Vzc1Byb2ZpbGVzID0gMTcsXG59XG5cbmV4cG9ydCBjbGFzcyBUZW5hbnREdG8gaW1wbGVtZW50cyBJVGVuYW50RHRvIHtcbiAgICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZGlzcGxheU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0cmVlSWQ6IG51bWJlcjtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJVGVuYW50RHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gX2RhdGFbXCJuYW1lXCJdO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IF9kYXRhW1wiZGlzcGxheU5hbWVcIl07XG4gICAgICAgICAgICBpZiAoX2RhdGFbXCJwcm9wc1wiXSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIF9kYXRhW1wicHJvcHNcIl0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9kYXRhW1wicHJvcHNcIl0uaGFzT3duUHJvcGVydHkoa2V5KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMucHJvcHMpW2tleV0gPSBfZGF0YVtcInByb3BzXCJdW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pZCA9IF9kYXRhW1wiaWRcIl07XG4gICAgICAgICAgICB0aGlzLnRyZWVJZCA9IF9kYXRhW1widHJlZUlkXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBUZW5hbnREdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRlbmFudER0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICB0b0pTT04oZGF0YT86IGFueSkge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBkYXRhW1wibmFtZVwiXSA9IHRoaXMubmFtZTtcbiAgICAgICAgZGF0YVtcImRpc3BsYXlOYW1lXCJdID0gdGhpcy5kaXNwbGF5TmFtZTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMpIHtcbiAgICAgICAgICAgIGRhdGFbXCJwcm9wc1wiXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMucHJvcHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT5kYXRhW1wicHJvcHNcIl0pW2tleV0gPSAoPGFueT50aGlzLnByb3BzKVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRhdGFbXCJpZFwiXSA9IHRoaXMuaWQ7XG4gICAgICAgIGRhdGFbXCJ0cmVlSWRcIl0gPSB0aGlzLnRyZWVJZDtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogVGVuYW50RHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGVuYW50RHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVGVuYW50RHRvIHtcbiAgICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgZGlzcGxheU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBwcm9wczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0gfCB1bmRlZmluZWQ7XG4gICAgaWQ6IG51bWJlcjtcbiAgICB0cmVlSWQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRmYVNldHVwRHRvIGltcGxlbWVudHMgSVRmYVNldHVwRHRvIHtcbiAgICBlbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzVGZhRW5hYmxlZDogYm9vbGVhbjtcbiAgICBhdXRoZW50aWNhdG9yS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcXJDb2RlSW1hZ2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICByZWdpc3RlcmVkOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElUZmFTZXR1cER0bykge1xuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KHByb3BlcnR5KSlcbiAgICAgICAgICAgICAgICAgICAgKDxhbnk+dGhpcylbcHJvcGVydHldID0gKDxhbnk+ZGF0YSlbcHJvcGVydHldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaW5pdChfZGF0YT86IGFueSkge1xuICAgICAgICBpZiAoX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZW1haWwgPSBfZGF0YVtcImVtYWlsXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1RmYUVuYWJsZWQgPSBfZGF0YVtcImlzVGZhRW5hYmxlZFwiXTtcbiAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRvcktleSA9IF9kYXRhW1wiYXV0aGVudGljYXRvcktleVwiXTtcbiAgICAgICAgICAgIHRoaXMucXJDb2RlSW1hZ2VVcmwgPSBfZGF0YVtcInFyQ29kZUltYWdlVXJsXCJdO1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkID0gX2RhdGFbXCJyZWdpc3RlcmVkXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBUZmFTZXR1cER0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGZhU2V0dXBEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImVtYWlsXCJdID0gdGhpcy5lbWFpbDtcbiAgICAgICAgZGF0YVtcImlzVGZhRW5hYmxlZFwiXSA9IHRoaXMuaXNUZmFFbmFibGVkO1xuICAgICAgICBkYXRhW1wiYXV0aGVudGljYXRvcktleVwiXSA9IHRoaXMuYXV0aGVudGljYXRvcktleTtcbiAgICAgICAgZGF0YVtcInFyQ29kZUltYWdlVXJsXCJdID0gdGhpcy5xckNvZGVJbWFnZVVybDtcbiAgICAgICAgZGF0YVtcInJlZ2lzdGVyZWRcIl0gPSB0aGlzLnJlZ2lzdGVyZWQ7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFRmYVNldHVwRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGZhU2V0dXBEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUZmFTZXR1cER0byB7XG4gICAgZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1RmYUVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYXV0aGVudGljYXRvcktleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHFyQ29kZUltYWdlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgcmVnaXN0ZXJlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRoaXJkUGFydHlWZW5kb3JEdG8gaW1wbGVtZW50cyBJVGhpcmRQYXJ0eVZlbmRvckR0byB7XG4gICAgYWNjb3VudElkOiBudW1iZXI7XG4gICAgcGVybWlzc2lvblR5cGVzOiBQZXJtaXNzaW9uVHlwZVtdIHwgdW5kZWZpbmVkO1xuICAgIHBhcmtDbG91ZElkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSVRoaXJkUGFydHlWZW5kb3JEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRJZCA9IF9kYXRhW1wiYWNjb3VudElkXCJdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoX2RhdGFbXCJwZXJtaXNzaW9uVHlwZXNcIl0pKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uVHlwZXMgPSBbXSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiBfZGF0YVtcInBlcm1pc3Npb25UeXBlc1wiXSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uVHlwZXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucGFya0Nsb3VkSWQgPSBfZGF0YVtcInBhcmtDbG91ZElkXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBUaGlyZFBhcnR5VmVuZG9yRHRvIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUaGlyZFBhcnR5VmVuZG9yRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJhY2NvdW50SWRcIl0gPSB0aGlzLmFjY291bnRJZDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5wZXJtaXNzaW9uVHlwZXMpKSB7XG4gICAgICAgICAgICBkYXRhW1wicGVybWlzc2lvblR5cGVzXCJdID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMucGVybWlzc2lvblR5cGVzKVxuICAgICAgICAgICAgICAgIGRhdGFbXCJwZXJtaXNzaW9uVHlwZXNcIl0ucHVzaChpdGVtKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW1wicGFya0Nsb3VkSWRcIl0gPSB0aGlzLnBhcmtDbG91ZElkO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBUaGlyZFBhcnR5VmVuZG9yRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVGhpcmRQYXJ0eVZlbmRvckR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoaXJkUGFydHlWZW5kb3JEdG8ge1xuICAgIGFjY291bnRJZDogbnVtYmVyO1xuICAgIHBlcm1pc3Npb25UeXBlczogUGVybWlzc2lvblR5cGVbXSB8IHVuZGVmaW5lZDtcbiAgICBwYXJrQ2xvdWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgVGhpcmRQYXJ0eVZlbmRvckR0b0h0dHBSZXNwb25zZURhdGEgaW1wbGVtZW50cyBJVGhpcmRQYXJ0eVZlbmRvckR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBUaGlyZFBhcnR5VmVuZG9yRHRvO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSVRoaXJkUGFydHlWZW5kb3JEdG9IdHRwUmVzcG9uc2VEYXRhKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBfZGF0YVtcImVycm9yTWVzc2FnZVwiXTtcbiAgICAgICAgICAgIHRoaXMuaXNTdWNjZXNzID0gX2RhdGFbXCJpc1N1Y2Nlc3NcIl07XG4gICAgICAgICAgICB0aGlzLnN0YXR1c0NvZGUgPSBfZGF0YVtcInN0YXR1c0NvZGVcIl07XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBfZGF0YVtcImRhdGFcIl0gPyBUaGlyZFBhcnR5VmVuZG9yRHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogVGhpcmRQYXJ0eVZlbmRvckR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRoaXJkUGFydHlWZW5kb3JEdG9IdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJlcnJvck1lc3NhZ2VcIl0gPSB0aGlzLmVycm9yTWVzc2FnZTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICBkYXRhW1wic3RhdHVzQ29kZVwiXSA9IHRoaXMuc3RhdHVzQ29kZTtcbiAgICAgICAgZGF0YVtcImRhdGFcIl0gPSB0aGlzLmRhdGEgPyB0aGlzLmRhdGEudG9KU09OKCkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdID0gdGhpcy5zdWNjZXNzTWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgY2xvbmUoKTogVGhpcmRQYXJ0eVZlbmRvckR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUaGlyZFBhcnR5VmVuZG9yRHRvSHR0cFJlc3BvbnNlRGF0YSgpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVRoaXJkUGFydHlWZW5kb3JEdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgc3RhdHVzQ29kZTogSHR0cFN0YXR1c0NvZGU7XG4gICAgZGF0YTogVGhpcmRQYXJ0eVZlbmRvckR0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG8gaW1wbGVtZW50cyBJVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG8ge1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0byB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG8ge1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvSHR0cFJlc3BvbnNlRGF0YSBpbXBsZW1lbnRzIElUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IF9kYXRhW1wiZXJyb3JNZXNzYWdlXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1N1Y2Nlc3MgPSBfZGF0YVtcImlzU3VjY2Vzc1wiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IF9kYXRhW1wic3RhdHVzQ29kZVwiXTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IF9kYXRhW1wiZGF0YVwiXSA/IFRvZ2dsZTJGYWN0b3JBdXRoRm9yVXNlclJlc3BvbnNlRHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogVG9nZ2xlMkZhY3RvckF1dGhGb3JVc2VyUmVzcG9uc2VEdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImVycm9yTWVzc2FnZVwiXSA9IHRoaXMuZXJyb3JNZXNzYWdlO1xuICAgICAgICBkYXRhW1wiaXNTdWNjZXNzXCJdID0gdGhpcy5pc1N1Y2Nlc3M7XG4gICAgICAgIGRhdGFbXCJzdGF0dXNDb2RlXCJdID0gdGhpcy5zdGF0dXNDb2RlO1xuICAgICAgICBkYXRhW1wiZGF0YVwiXSA9IHRoaXMuZGF0YSA/IHRoaXMuZGF0YS50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wic3VjY2Vzc01lc3NhZ2VcIl0gPSB0aGlzLnN1Y2Nlc3NNZXNzYWdlO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBUb2dnbGUyRmFjdG9yQXV0aEZvclVzZXJSZXNwb25zZUR0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8gaW1wbGVtZW50cyBJVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8ge1xuICAgIGlzRW5hYmxlZEZvclVzZXI6IGJvb2xlYW47XG4gICAgaXNSZXF1aWVyZDJGQVNldHVwOiBib29sZWFuO1xuICAgIGFjdGl2YXRlUmVzcG9uc2VEdG86IEFjdGl2YXRlUmVzcG9uc2VEdG87XG5cbiAgICBjb25zdHJ1Y3RvcihkYXRhPzogSVR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5pc0VuYWJsZWRGb3JVc2VyID0gX2RhdGFbXCJpc0VuYWJsZWRGb3JVc2VyXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1JlcXVpZXJkMkZBU2V0dXAgPSBfZGF0YVtcImlzUmVxdWllcmQyRkFTZXR1cFwiXTtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZhdGVSZXNwb25zZUR0byA9IF9kYXRhW1wiYWN0aXZhdGVSZXNwb25zZUR0b1wiXSA/IEFjdGl2YXRlUmVzcG9uc2VEdG8uZnJvbUpTKF9kYXRhW1wiYWN0aXZhdGVSZXNwb25zZUR0b1wiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJpc0VuYWJsZWRGb3JVc2VyXCJdID0gdGhpcy5pc0VuYWJsZWRGb3JVc2VyO1xuICAgICAgICBkYXRhW1wiaXNSZXF1aWVyZDJGQVNldHVwXCJdID0gdGhpcy5pc1JlcXVpZXJkMkZBU2V0dXA7XG4gICAgICAgIGRhdGFbXCJhY3RpdmF0ZVJlc3BvbnNlRHRvXCJdID0gdGhpcy5hY3RpdmF0ZVJlc3BvbnNlRHRvID8gdGhpcy5hY3RpdmF0ZVJlc3BvbnNlRHRvLnRvSlNPTigpIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIGNsb25lKCk6IFR3b0ZhY3RvckF1dGhlbnRpY2F0aW9uRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHdvRmFjdG9yQXV0aGVudGljYXRpb25EdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElUd29GYWN0b3JBdXRoZW50aWNhdGlvbkR0byB7XG4gICAgaXNFbmFibGVkRm9yVXNlcjogYm9vbGVhbjtcbiAgICBpc1JlcXVpZXJkMkZBU2V0dXA6IGJvb2xlYW47XG4gICAgYWN0aXZhdGVSZXNwb25zZUR0bzogQWN0aXZhdGVSZXNwb25zZUR0bztcbn1cblxuZXhwb3J0IGVudW0gVXNlclN0YXR1cyB7XG4gICAgQWN0aXZlID0gMCxcbiAgICBCbG9ja2VkID0gMSxcbiAgICBJbnZpdGVkID0gMixcbiAgICBJZ25vcmUgPSAzLFxuICAgIFBhc3N3b3JkRXhwaXJlZCA9IDQsXG4gICAgUmV2b2tlZCA9IDUsXG4gICAgVGVtcG9yYXJ5QmxvY2tlZCA9IDYsXG4gICAgQXdhaXRpbmdBY2Nlc3MgPSA3LFxufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGVBY3RpdmF0aW9uVXNlckR0byBpbXBsZW1lbnRzIElWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvIHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgbGFzdE5hbWU6IHN0cmluZztcbiAgICB1TmFtZTogc3RyaW5nO1xuICAgIHN0YXR1czogVXNlclN0YXR1cztcbiAgICBpZDogbnVtYmVyO1xuICAgIHBtbDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gX2RhdGFbXCJuYW1lXCJdO1xuICAgICAgICAgICAgdGhpcy5sYXN0TmFtZSA9IF9kYXRhW1wibGFzdE5hbWVcIl07XG4gICAgICAgICAgICB0aGlzLnVOYW1lID0gX2RhdGFbXCJ1TmFtZVwiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gX2RhdGFbXCJzdGF0dXNcIl07XG4gICAgICAgICAgICB0aGlzLmlkID0gX2RhdGFbXCJpZFwiXTtcbiAgICAgICAgICAgIHRoaXMucG1sID0gX2RhdGFbXCJwbWxcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG8ge1xuICAgICAgICBkYXRhID0gdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnID8gZGF0YSA6IHt9O1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcIm5hbWVcIl0gPSB0aGlzLm5hbWU7XG4gICAgICAgIGRhdGFbXCJsYXN0TmFtZVwiXSA9IHRoaXMubGFzdE5hbWU7XG4gICAgICAgIGRhdGFbXCJ1TmFtZVwiXSA9IHRoaXMudU5hbWU7XG4gICAgICAgIGRhdGFbXCJzdGF0dXNcIl0gPSB0aGlzLnN0YXR1cztcbiAgICAgICAgZGF0YVtcImlkXCJdID0gdGhpcy5pZDtcbiAgICAgICAgZGF0YVtcInBtbFwiXSA9IHRoaXMucG1sO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvIHtcbiAgICAgICAgY29uc3QganNvbiA9IHRoaXMudG9KU09OKCk7XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVmFsaWRhdGVBY3RpdmF0aW9uVXNlckR0bygpO1xuICAgICAgICByZXN1bHQuaW5pdChqc29uKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG8ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBsYXN0TmFtZTogc3RyaW5nO1xuICAgIHVOYW1lOiBzdHJpbmc7XG4gICAgc3RhdHVzOiBVc2VyU3RhdHVzO1xuICAgIGlkOiBudW1iZXI7XG4gICAgcG1sOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YSBpbXBsZW1lbnRzIElWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgIHN0YXR1c0NvZGU6IEh0dHBTdGF0dXNDb2RlO1xuICAgIGRhdGE6IFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG87XG4gICAgc3VjY2Vzc01lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJVmFsaWRhdGVBY3RpdmF0aW9uVXNlckR0b0h0dHBSZXNwb25zZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IF9kYXRhW1wiZXJyb3JNZXNzYWdlXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1N1Y2Nlc3MgPSBfZGF0YVtcImlzU3VjY2Vzc1wiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IF9kYXRhW1wic3RhdHVzQ29kZVwiXTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IF9kYXRhW1wiZGF0YVwiXSA/IFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG8uZnJvbUpTKF9kYXRhW1wiZGF0YVwiXSkgOiA8YW55PnVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2UgPSBfZGF0YVtcInN1Y2Nlc3NNZXNzYWdlXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVmFsaWRhdGVBY3RpdmF0aW9uVXNlckR0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImVycm9yTWVzc2FnZVwiXSA9IHRoaXMuZXJyb3JNZXNzYWdlO1xuICAgICAgICBkYXRhW1wiaXNTdWNjZXNzXCJdID0gdGhpcy5pc1N1Y2Nlc3M7XG4gICAgICAgIGRhdGFbXCJzdGF0dXNDb2RlXCJdID0gdGhpcy5zdGF0dXNDb2RlO1xuICAgICAgICBkYXRhW1wiZGF0YVwiXSA9IHRoaXMuZGF0YSA/IHRoaXMuZGF0YS50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wic3VjY2Vzc01lc3NhZ2VcIl0gPSB0aGlzLnN1Y2Nlc3NNZXNzYWdlO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvSHR0cFJlc3BvbnNlRGF0YSB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFZhbGlkYXRlQWN0aXZhdGlvblVzZXJEdG9IdHRwUmVzcG9uc2VEYXRhKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmFsaWRhdGVBY3RpdmF0aW9uVXNlckR0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBWYWxpZGF0ZUFjdGl2YXRpb25Vc2VyRHRvO1xuICAgIHN1Y2Nlc3NNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBWZXJpZnkyRmFjdG9yQXV0aFJlcXVlc3REdG8gaW1wbGVtZW50cyBJVmVyaWZ5MkZhY3RvckF1dGhSZXF1ZXN0RHRvIHtcbiAgICBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdXNlck5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJVmVyaWZ5MkZhY3RvckF1dGhSZXF1ZXN0RHRvKSB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkocHJvcGVydHkpKVxuICAgICAgICAgICAgICAgICAgICAoPGFueT50aGlzKVtwcm9wZXJ0eV0gPSAoPGFueT5kYXRhKVtwcm9wZXJ0eV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpbml0KF9kYXRhPzogYW55KSB7XG4gICAgICAgIGlmIChfZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb2RlID0gX2RhdGFbXCJjb2RlXCJdO1xuICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IF9kYXRhW1widXNlck5hbWVcIl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZnJvbUpTKGRhdGE6IGFueSk6IFZlcmlmeTJGYWN0b3JBdXRoUmVxdWVzdER0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVmVyaWZ5MkZhY3RvckF1dGhSZXF1ZXN0RHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGRhdGEpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHRvSlNPTihkYXRhPzogYW55KSB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGRhdGFbXCJjb2RlXCJdID0gdGhpcy5jb2RlO1xuICAgICAgICBkYXRhW1widXNlck5hbWVcIl0gPSB0aGlzLnVzZXJOYW1lO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBWZXJpZnkyRmFjdG9yQXV0aFJlcXVlc3REdG8ge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBWZXJpZnkyRmFjdG9yQXV0aFJlcXVlc3REdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElWZXJpZnkyRmFjdG9yQXV0aFJlcXVlc3REdG8ge1xuICAgIGNvZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB1c2VyTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG8gaW1wbGVtZW50cyBJVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG8ge1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBJVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG8pIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmlzU3VjY2VzcyA9IF9kYXRhW1wiaXNTdWNjZXNzXCJdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb21KUyhkYXRhOiBhbnkpOiBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0byB7XG4gICAgICAgIGRhdGEgPSB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgPyBkYXRhIDoge307XG4gICAgICAgIGxldCByZXN1bHQgPSBuZXcgVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG8oKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImlzU3VjY2Vzc1wiXSA9IHRoaXMuaXNTdWNjZXNzO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0byB7XG4gICAgICAgIGNvbnN0IGpzb24gPSB0aGlzLnRvSlNPTigpO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFZlcmlmeTJGYWN0b3JBdXRoUmVzcG9uc2V0RHRvKCk7XG4gICAgICAgIHJlc3VsdC5pbml0KGpzb24pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG8ge1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcmlmeTJGYWN0b3JBdXRoUmVzcG9uc2V0RHRvSHR0cFJlc3BvbnNlRGF0YSBpbXBsZW1lbnRzIElWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3RydWN0b3IoZGF0YT86IElWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSkpXG4gICAgICAgICAgICAgICAgICAgICg8YW55PnRoaXMpW3Byb3BlcnR5XSA9ICg8YW55PmRhdGEpW3Byb3BlcnR5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGluaXQoX2RhdGE/OiBhbnkpIHtcbiAgICAgICAgaWYgKF9kYXRhKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9IF9kYXRhW1wiZXJyb3JNZXNzYWdlXCJdO1xuICAgICAgICAgICAgdGhpcy5pc1N1Y2Nlc3MgPSBfZGF0YVtcImlzU3VjY2Vzc1wiXTtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IF9kYXRhW1wic3RhdHVzQ29kZVwiXTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IF9kYXRhW1wiZGF0YVwiXSA/IFZlcmlmeTJGYWN0b3JBdXRoUmVzcG9uc2V0RHRvLmZyb21KUyhfZGF0YVtcImRhdGFcIl0pIDogPGFueT51bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlID0gX2RhdGFbXCJzdWNjZXNzTWVzc2FnZVwiXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tSlMoZGF0YTogYW55KTogVmVyaWZ5MkZhY3RvckF1dGhSZXNwb25zZXREdG9IdHRwUmVzcG9uc2VEYXRhIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoZGF0YSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgdG9KU09OKGRhdGE/OiBhbnkpIHtcbiAgICAgICAgZGF0YSA9IHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IGRhdGEgOiB7fTtcbiAgICAgICAgZGF0YVtcImVycm9yTWVzc2FnZVwiXSA9IHRoaXMuZXJyb3JNZXNzYWdlO1xuICAgICAgICBkYXRhW1wiaXNTdWNjZXNzXCJdID0gdGhpcy5pc1N1Y2Nlc3M7XG4gICAgICAgIGRhdGFbXCJzdGF0dXNDb2RlXCJdID0gdGhpcy5zdGF0dXNDb2RlO1xuICAgICAgICBkYXRhW1wiZGF0YVwiXSA9IHRoaXMuZGF0YSA/IHRoaXMuZGF0YS50b0pTT04oKSA6IDxhbnk+dW5kZWZpbmVkO1xuICAgICAgICBkYXRhW1wic3VjY2Vzc01lc3NhZ2VcIl0gPSB0aGlzLnN1Y2Nlc3NNZXNzYWdlO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBjbG9uZSgpOiBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgICAgICBjb25zdCBqc29uID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEoKTtcbiAgICAgICAgcmVzdWx0LmluaXQoanNvbik7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0b0h0dHBSZXNwb25zZURhdGEge1xuICAgIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGlzU3VjY2VzczogYm9vbGVhbjtcbiAgICBzdGF0dXNDb2RlOiBIdHRwU3RhdHVzQ29kZTtcbiAgICBkYXRhOiBWZXJpZnkyRmFjdG9yQXV0aFJlc3BvbnNldER0bztcbiAgICBzdWNjZXNzTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgQXBpRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICBzdGF0dXM6IG51bWJlcjtcbiAgICByZXNwb25zZTogc3RyaW5nO1xuICAgIGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55OyB9O1xuICAgIHJlc3VsdDogYW55O1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdDogYW55KSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgdGhpcy5yZXN1bHQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGlzQXBpRXhjZXB0aW9uID0gdHJ1ZTtcblxuICAgIHN0YXRpYyBpc0FwaUV4Y2VwdGlvbihvYmo6IGFueSk6IG9iaiBpcyBBcGlFeGNlcHRpb24ge1xuICAgICAgICByZXR1cm4gb2JqLmlzQXBpRXhjZXB0aW9uID09PSB0cnVlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24obWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgcmVzcG9uc2U6IHN0cmluZywgaGVhZGVyczogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sIHJlc3VsdD86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHJlc3VsdCAhPT0gbnVsbCAmJiByZXN1bHQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlVGhyb3cocmVzdWx0KTtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiBfb2JzZXJ2YWJsZVRocm93KG5ldyBBcGlFeGNlcHRpb24obWVzc2FnZSwgc3RhdHVzLCByZXNwb25zZSwgaGVhZGVycywgbnVsbCkpO1xufVxuXG5mdW5jdGlvbiBibG9iVG9UZXh0KGJsb2I6IGFueSk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHN0cmluZz4oKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KFwiXCIpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAgICAgcmVhZGVyLm9ubG9hZCA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KChldmVudC50YXJnZXQgYXMgYW55KS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYik7XG4gICAgICAgIH1cbiAgICB9KTtcbn0iXX0=
|