ngx-oauth 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -22
- package/esm2020/lib/components/login/oauth-login.component.mjs +30 -15
- package/esm2020/lib/models/index.mjs +2 -1
- package/esm2020/lib/oauth.module.mjs +6 -7
- package/esm2020/lib/services/oauth.interceptor.mjs +14 -11
- package/esm2020/lib/services/oauth.service.mjs +141 -88
- package/fesm2015/ngx-oauth.mjs +192 -124
- package/fesm2015/ngx-oauth.mjs.map +1 -1
- package/fesm2020/ngx-oauth.mjs +189 -118
- package/fesm2020/ngx-oauth.mjs.map +1 -1
- package/lib/components/login/oauth-login.component.d.ts +11 -6
- package/lib/models/index.d.ts +42 -1
- package/lib/services/oauth.service.d.ts +20 -5
- package/package.json +22 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Inject, Injectable } from '@angular/core';
|
|
2
2
|
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
3
|
-
import { catchError, concatMap, delay, switchMap } from 'rxjs/operators';
|
|
3
|
+
import { catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
4
4
|
import { EMPTY, from, noop, of, ReplaySubject } from 'rxjs';
|
|
5
5
|
import { LOCATION, OAUTH_CONFIG, OAuthStatus, OAuthType } from '../models';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import * as i1 from "@angular/common/http";
|
|
8
|
+
import * as i2 from "@angular/common";
|
|
8
9
|
const arrToString = (buf) => buf.reduce((s, b) => s + String.fromCharCode(b), '');
|
|
9
10
|
const base64url = (str) => btoa(str)
|
|
10
11
|
.replace(/\+/g, '-')
|
|
@@ -32,113 +33,142 @@ const parseOauthUri = (hash) => {
|
|
|
32
33
|
}
|
|
33
34
|
return null;
|
|
34
35
|
};
|
|
36
|
+
const jwt = (token) => JSON.parse(atob(token.split('.')[1]));
|
|
35
37
|
export class OAuthService {
|
|
36
|
-
constructor(http, zone, authConfig, locationService) {
|
|
38
|
+
constructor(http, zone, authConfig, location, locationService) {
|
|
37
39
|
this.http = http;
|
|
38
40
|
this.zone = zone;
|
|
39
41
|
this.authConfig = authConfig;
|
|
42
|
+
this.location = location;
|
|
40
43
|
this.locationService = locationService;
|
|
41
44
|
this._token = null;
|
|
42
45
|
this._status = OAuthStatus.NOT_AUTHORIZED;
|
|
43
46
|
this.state$ = new ReplaySubject(1);
|
|
44
47
|
this.status$ = new ReplaySubject(1);
|
|
45
|
-
this.
|
|
48
|
+
this.userInfo$ = this.status$.pipe(filter(s => s === OAuthStatus.AUTHORIZED), map(() => {
|
|
49
|
+
const { config } = this.authConfig;
|
|
50
|
+
return config.userPath;
|
|
51
|
+
}), filter(p => !!p), switchMap(path => this.http.get(path)), shareReplay());
|
|
52
|
+
setTimeout(() => this.init()); // decouple for http interceptor
|
|
46
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Get the oauth config for initialize. If OpenId with issuerPath is configured then configure from server openid configuration.
|
|
56
|
+
* @protected
|
|
57
|
+
*/
|
|
58
|
+
get config$() {
|
|
59
|
+
let { config } = this.authConfig;
|
|
60
|
+
if (config && config.clientId) {
|
|
61
|
+
const { issuerPath, scope } = config;
|
|
62
|
+
if (issuerPath) {
|
|
63
|
+
return this.http.get(`${issuerPath}/.well-known/openid-configuration`).pipe(tap(v => this.set(this.type, {
|
|
64
|
+
...v.authorization_endpoint && { authorizePath: v.authorization_endpoint } || {},
|
|
65
|
+
...v.token_endpoint && { tokenPath: v.token_endpoint } || {},
|
|
66
|
+
...v.revocation_endpoint && { revokePath: v.revocation_endpoint } || {},
|
|
67
|
+
...v.code_challenge_methods_supported && { pkce: v.code_challenge_methods_supported.indexOf('S256') > -1 } || {},
|
|
68
|
+
...v.userinfo_endpoint && { userPath: v.userinfo_endpoint } || {},
|
|
69
|
+
...v.introspection_endpoint && { introspectionPath: v.introspection_endpoint } || {},
|
|
70
|
+
...v.end_session_endpoint && { logoutPath: v.end_session_endpoint } || {},
|
|
71
|
+
...scope && {} || { scope: 'openid' }
|
|
72
|
+
})), map(() => this.authConfig.config));
|
|
73
|
+
}
|
|
74
|
+
return of(config);
|
|
75
|
+
}
|
|
76
|
+
console.warn('clientId is missing in oauth config');
|
|
77
|
+
return EMPTY;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Init. Will check the url implicit or authorization flow or existing saved token.
|
|
81
|
+
* @protected
|
|
82
|
+
*/
|
|
47
83
|
init() {
|
|
48
|
-
const { hash, search, origin, pathname } = this.
|
|
49
|
-
const isImplicitRedirect = hash && /(
|
|
84
|
+
const { hash, search, origin, pathname } = this.location;
|
|
85
|
+
const isImplicitRedirect = hash && /(access_token=)|(error=)/.test(hash);
|
|
50
86
|
const isAuthCodeRedirect = search && /(code=)|(error=)/.test(search);
|
|
51
87
|
const { storageKey } = this.authConfig;
|
|
52
88
|
const savedToken = storageKey && this.authConfig.storage && this.authConfig.storage[storageKey] &&
|
|
53
89
|
JSON.parse(this.authConfig.storage[storageKey]);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.cleanLocationHash();
|
|
58
|
-
if (!parameters || parameters.error) {
|
|
59
|
-
this.token = null;
|
|
60
|
-
this.status = OAuthStatus.DENIED;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
90
|
+
this.config$.subscribe(config => {
|
|
91
|
+
if (isImplicitRedirect) {
|
|
92
|
+
const parameters = parseOauthUri(hash.substr(1));
|
|
63
93
|
this.token = parameters;
|
|
64
|
-
this.status = OAuthStatus.AUTHORIZED;
|
|
94
|
+
this.status = this.checkResponse(savedToken, parameters) && OAuthStatus.AUTHORIZED || OAuthStatus.DENIED;
|
|
65
95
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
96
|
+
else if (isAuthCodeRedirect) {
|
|
97
|
+
const parameters = parseOauthUri(search.substr(1));
|
|
98
|
+
if (!this.checkResponse(savedToken, parameters)) {
|
|
99
|
+
this.token = parameters;
|
|
100
|
+
this.status = OAuthStatus.DENIED;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const newParametersString = this.getCleanedUnSearchParameters();
|
|
104
|
+
const { clientId, clientSecret, tokenPath, scope } = config;
|
|
105
|
+
const codeVerifier = savedToken && savedToken.codeVerifier;
|
|
75
106
|
this.http.post(tokenPath, new HttpParams({
|
|
76
107
|
fromObject: {
|
|
77
|
-
code: parameters
|
|
108
|
+
code: parameters?.code,
|
|
78
109
|
client_id: clientId,
|
|
79
110
|
...clientSecret && { client_secret: clientSecret } || {},
|
|
80
|
-
redirect_uri: `${origin}${pathname}
|
|
111
|
+
redirect_uri: `${origin}${pathname}`,
|
|
81
112
|
grant_type: 'authorization_code',
|
|
82
113
|
...scope && { scope } || {},
|
|
83
114
|
...codeVerifier && { code_verifier: codeVerifier } || {}
|
|
84
115
|
}
|
|
85
|
-
}), { headers: REQUEST_HEADER }).pipe(catchError(() => {
|
|
86
|
-
this.token =
|
|
116
|
+
}), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
|
|
117
|
+
this.token = err;
|
|
87
118
|
this.status = OAuthStatus.DENIED;
|
|
88
|
-
this.locationService.
|
|
119
|
+
this.locationService.replaceState(`${pathname}${newParametersString}`);
|
|
89
120
|
return EMPTY;
|
|
90
121
|
})).subscribe(token => {
|
|
91
122
|
this.token = token;
|
|
92
|
-
|
|
93
|
-
this.locationService.
|
|
123
|
+
this.status = OAuthStatus.AUTHORIZED;
|
|
124
|
+
this.locationService.replaceState(`${pathname}${newParametersString}`);
|
|
94
125
|
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this.token = null;
|
|
99
|
-
this.status = OAuthStatus.DENIED;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else if (savedToken) {
|
|
103
|
-
const { access_token, refresh_token, error } = savedToken;
|
|
104
|
-
if (error) {
|
|
105
|
-
this.token = null;
|
|
106
|
-
this.status = OAuthStatus.DENIED;
|
|
126
|
+
}
|
|
107
127
|
}
|
|
108
|
-
else if (
|
|
109
|
-
this.
|
|
110
|
-
|
|
111
|
-
|
|
128
|
+
else if (savedToken) {
|
|
129
|
+
this._token = savedToken;
|
|
130
|
+
const { access_token, refresh_token, error } = savedToken;
|
|
131
|
+
if (access_token) {
|
|
132
|
+
if (refresh_token) { // force refresh since might be a manual page refresh
|
|
112
133
|
this.refreshToken();
|
|
113
|
-
}
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
this.status = OAuthStatus.AUTHORIZED;
|
|
137
|
+
}
|
|
114
138
|
}
|
|
115
139
|
else {
|
|
116
|
-
this.status = OAuthStatus.
|
|
140
|
+
this.status = error && OAuthStatus.DENIED || OAuthStatus.NOT_AUTHORIZED;
|
|
117
141
|
}
|
|
118
142
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
143
|
+
else {
|
|
144
|
+
this.status = OAuthStatus.NOT_AUTHORIZED;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
123
147
|
}
|
|
124
|
-
login(parameters) {
|
|
148
|
+
async login(parameters) {
|
|
125
149
|
if (this.isResourceType(parameters)) {
|
|
126
150
|
this.resourceLogin(parameters);
|
|
127
151
|
}
|
|
128
152
|
else if (this.isAuthorizationCodeType(parameters)) {
|
|
129
|
-
this.authorizationCodeLogin(parameters)
|
|
153
|
+
await this.authorizationCodeLogin(parameters);
|
|
130
154
|
}
|
|
131
155
|
else if (this.isImplicitType(parameters)) {
|
|
132
|
-
this.implicitLogin(parameters)
|
|
156
|
+
await this.implicitLogin(parameters);
|
|
133
157
|
}
|
|
134
158
|
else if (this.isClientCredentialType()) {
|
|
135
159
|
this.clientCredentialLogin();
|
|
136
160
|
}
|
|
137
161
|
}
|
|
138
|
-
logout() {
|
|
162
|
+
logout(useLogoutUrl) {
|
|
139
163
|
this.revoke();
|
|
140
164
|
this.token = null;
|
|
141
165
|
this.status = OAuthStatus.NOT_AUTHORIZED;
|
|
166
|
+
const { logoutPath, logoutRedirectUri } = this.authConfig.config;
|
|
167
|
+
if (useLogoutUrl && logoutPath) {
|
|
168
|
+
const { origin, pathname } = this.location;
|
|
169
|
+
const currentPath = `${origin}${pathname}`;
|
|
170
|
+
this.location.replace(`${logoutPath}?post_logout_redirect_uri=${logoutRedirectUri || currentPath}`);
|
|
171
|
+
}
|
|
142
172
|
}
|
|
143
173
|
revoke() {
|
|
144
174
|
const { revokePath, clientId, clientSecret } = this.authConfig.config;
|
|
@@ -193,14 +223,14 @@ export class OAuthService {
|
|
|
193
223
|
this.http.post(tokenPath, new HttpParams({
|
|
194
224
|
fromObject: {
|
|
195
225
|
client_id: clientId,
|
|
196
|
-
client_secret: clientSecret,
|
|
226
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
197
227
|
grant_type: OAuthType.RESOURCE,
|
|
198
|
-
...scope
|
|
228
|
+
...scope && { scope } || {},
|
|
199
229
|
username,
|
|
200
230
|
password
|
|
201
231
|
}
|
|
202
|
-
}), { headers: REQUEST_HEADER }).pipe(catchError(
|
|
203
|
-
this.token =
|
|
232
|
+
}), { headers: REQUEST_HEADER }).pipe(catchError(err => {
|
|
233
|
+
this.token = err;
|
|
204
234
|
this.status = OAuthStatus.DENIED;
|
|
205
235
|
return EMPTY;
|
|
206
236
|
})).subscribe(params => {
|
|
@@ -210,11 +240,11 @@ export class OAuthService {
|
|
|
210
240
|
}
|
|
211
241
|
async authorizationCodeLogin(parameters) {
|
|
212
242
|
const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);
|
|
213
|
-
this.
|
|
243
|
+
this.location.replace(authUrl);
|
|
214
244
|
}
|
|
215
245
|
async implicitLogin(parameters) {
|
|
216
246
|
const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);
|
|
217
|
-
this.
|
|
247
|
+
this.location.replace(authUrl);
|
|
218
248
|
}
|
|
219
249
|
clientCredentialLogin() {
|
|
220
250
|
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
@@ -248,19 +278,42 @@ export class OAuthService {
|
|
|
248
278
|
}
|
|
249
279
|
async toAuthorizationUrl(parameters, responseType) {
|
|
250
280
|
const { config } = this.authConfig;
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
281
|
+
let authorizationUrl = `${config.authorizePath}`;
|
|
282
|
+
authorizationUrl += config.authorizePath.includes('?') && '&' || '?';
|
|
283
|
+
authorizationUrl += `client_id=${config.clientId}`;
|
|
284
|
+
authorizationUrl += `&redirect_uri=${encodeURIComponent(parameters.redirectUri)}`;
|
|
285
|
+
authorizationUrl += `&response_type=${responseType}`;
|
|
286
|
+
authorizationUrl += `&scope=${encodeURIComponent(config.scope || '')}`;
|
|
287
|
+
authorizationUrl += `&state=${encodeURIComponent(parameters.state || '')}`;
|
|
288
|
+
return `${authorizationUrl}${this.generateNonce(config)}${await this.generateCodeChallenge(config)}`;
|
|
289
|
+
}
|
|
290
|
+
async generateCodeChallenge(config) {
|
|
291
|
+
if (config.pkce) {
|
|
292
|
+
const codeVerifier = randomString();
|
|
293
|
+
this.token = { ...this.token, codeVerifier };
|
|
294
|
+
return `&code_challenge=${await pkce(codeVerifier)}&code_challenge_method=S256`;
|
|
295
|
+
}
|
|
296
|
+
return '';
|
|
297
|
+
}
|
|
298
|
+
generateNonce(config) {
|
|
299
|
+
if (config && config.scope && config.scope.indexOf('openid') > -1) {
|
|
300
|
+
const nonce = randomString(10);
|
|
301
|
+
this.token = { ...this.token, nonce };
|
|
302
|
+
return `&nonce=${nonce}`;
|
|
260
303
|
}
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
304
|
+
return '';
|
|
305
|
+
}
|
|
306
|
+
checkResponse(token, parameters) {
|
|
307
|
+
this.emitState(parameters);
|
|
308
|
+
this.cleanLocationHash();
|
|
309
|
+
if (!parameters || parameters.error) {
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
if (token && token.nonce && parameters.access_token) {
|
|
313
|
+
const jwtToken = jwt(parameters.access_token);
|
|
314
|
+
return token.nonce === jwtToken.nonce;
|
|
315
|
+
}
|
|
316
|
+
return parameters.access_token || parameters.code;
|
|
264
317
|
}
|
|
265
318
|
set token(token) {
|
|
266
319
|
this._token = token;
|
|
@@ -294,10 +347,10 @@ export class OAuthService {
|
|
|
294
347
|
this.http.post(tokenPath, new HttpParams({
|
|
295
348
|
fromObject: {
|
|
296
349
|
client_id: clientId,
|
|
297
|
-
...clientSecret
|
|
350
|
+
...clientSecret && { client_secret: clientSecret } || {},
|
|
298
351
|
grant_type: 'refresh_token',
|
|
299
352
|
refresh_token,
|
|
300
|
-
...scope
|
|
353
|
+
...scope && { scope } || {},
|
|
301
354
|
}
|
|
302
355
|
}), { headers: REQUEST_HEADER }).pipe(catchError(() => {
|
|
303
356
|
this.logout();
|
|
@@ -312,24 +365,24 @@ export class OAuthService {
|
|
|
312
365
|
}
|
|
313
366
|
}
|
|
314
367
|
getCleanedUnSearchParameters() {
|
|
315
|
-
const { search } = this.
|
|
368
|
+
const { search } = this.location;
|
|
316
369
|
let searchString = search.substr(1);
|
|
317
|
-
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state'];
|
|
370
|
+
const hashKeys = ['code', 'state', 'error', 'error_description', 'session_state', 'scope', 'authuser', 'prompt'];
|
|
318
371
|
hashKeys.forEach((hashKey) => {
|
|
319
372
|
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
320
373
|
searchString = searchString.replace(re, '');
|
|
321
374
|
});
|
|
322
|
-
return searchString.length
|
|
375
|
+
return searchString.length && `?${searchString}` || '';
|
|
323
376
|
}
|
|
324
377
|
cleanLocationHash() {
|
|
325
|
-
const { hash } = this.
|
|
378
|
+
const { hash } = this.location;
|
|
326
379
|
let curHash = hash.substr(1);
|
|
327
|
-
const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state'];
|
|
380
|
+
const hashKeys = ['access_token', 'token_type', 'expires_in', 'scope', 'state', 'error', 'error_description', 'session_state', 'nonce'];
|
|
328
381
|
hashKeys.forEach((hashKey) => {
|
|
329
382
|
const re = new RegExp('&' + hashKey + '(=[^&]*)?|^' + hashKey + '(=[^&]*)?&?');
|
|
330
383
|
curHash = curHash.replace(re, '');
|
|
331
384
|
});
|
|
332
|
-
this.
|
|
385
|
+
this.location.hash = curHash;
|
|
333
386
|
}
|
|
334
387
|
emitState(parameters) {
|
|
335
388
|
const { state } = parameters;
|
|
@@ -338,9 +391,9 @@ export class OAuthService {
|
|
|
338
391
|
}
|
|
339
392
|
}
|
|
340
393
|
}
|
|
341
|
-
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.
|
|
342
|
-
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.
|
|
343
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.
|
|
394
|
+
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: OAUTH_CONFIG }, { token: LOCATION }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
395
|
+
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService });
|
|
396
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.3", ngImport: i0, type: OAuthService, decorators: [{
|
|
344
397
|
type: Injectable
|
|
345
398
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
346
399
|
type: Inject,
|
|
@@ -348,5 +401,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImpor
|
|
|
348
401
|
}] }, { type: Location, decorators: [{
|
|
349
402
|
type: Inject,
|
|
350
403
|
args: [LOCATION]
|
|
351
|
-
}] }]; } });
|
|
352
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL29hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUdMLFFBQVEsRUFDUixZQUFZLEVBR1osV0FBVyxFQUVYLFNBQVMsRUFHVixNQUFNLFdBQVcsQ0FBQzs7O0FBRW5CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBZSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFOUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDekMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVyQixNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxFQUFFO0lBQzNDLE1BQU0sSUFBSSxHQUFHLFdB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QUFFO1lBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsYUFBYSxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDdEMsQ0FBQztJQUVPLFNBQVMsQ0FBQyxVQUF5QztRQUN6RCxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsVUFBaUIsQ0FBQztRQUNsQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7eUdBelVVLFlBQVksa0VBVUgsWUFBWSxhQUNaLFFBQVE7NkdBWGpCLFlBQVk7MkZBQVosWUFBWTtrQkFEeEIsVUFBVTs7MEJBV0ksTUFBTTsyQkFBQyxZQUFZOzhCQUN1QixRQUFROzBCQUFsRCxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgc3dpdGNoTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VNUFRZLCBmcm9tLCBub29wLCBvZiwgUmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMsXG4gIEltcGxpY2l0UGFyYW1ldGVycyxcbiAgTE9DQVRJT04sXG4gIE9BVVRIX0NPTkZJRyxcbiAgT0F1dGhDb25maWcsXG4gIE9BdXRoUGFyYW1ldGVycyxcbiAgT0F1dGhTdGF0dXMsXG4gIE9BdXRoVG9rZW4sXG4gIE9BdXRoVHlwZSxcbiAgT0F1dGhUeXBlQ29uZmlnLFxuICBSZXNvdXJjZVBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuY29uc3QgYXJyVG9TdHJpbmcgPSAoYnVmOiBVaW50OEFycmF5KSA9PiBidWYucmVkdWNlKChzLCBiKSA9PiBzICsgU3RyaW5nLmZyb21DaGFyQ29kZShiKSwgJycpO1xuXG5jb25zdCBiYXNlNjR1cmwgPSAoc3RyOiBzdHJpbmcpID0+IGJ0b2Eoc3RyKVxuICAucmVwbGFjZSgvXFwrL2csICctJylcbiAgLnJlcGxhY2UoL1xcLy9nLCAnXycpXG4gIC5yZXBsYWNlKC89L2csICcnKTtcblxuY29uc3QgcmFuZG9tU3RyaW5nID0gKGxlbmd0aDogbnVtYmVyID0gNDgpID0+IHtcbiAgY29uc3QgYnVmZiA9IGFyclRvU3RyaW5nKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkobGVuZ3RoICogMikpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChidWZmKS5zdWJzdHJpbmcoMCwgbGVuZ3RoKTtcbn07XG5cbmNvbnN0IHBrY2UgPSBhc3luYyAodmFsdWU6IHN0cmluZykgPT4ge1xuICBjb25zdCBidWZmID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5kaWdlc3QoJ1NIQS0yNTYnLCBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodmFsdWUpKTtcbiAgcmV0dXJuIGJhc2U2NHVybChhcnJUb1N0cmluZyhuZXcgVWludDhBcnJheShidWZmKSkpO1xufTtcblxuY29uc3QgUkVRVUVTVF9IRUFERVIgPSBuZXcgSHR0cEhlYWRlcnMoeydDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30pO1xuXG5jb25zdCBwYXJzZU9hdXRoVXJpID0gKGhhc2g6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsID0+IHtcbiAgY29uc3QgcmVnZXggPSAvKFteJj1dKyk9KFteJl0qKS9nO1xuICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgbGV0IG07XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25kaXRpb25hbC1hc3NpZ25tZW50XG4gIHdoaWxlICgobSA9IHJlZ2V4LmV4ZWMoaGFzaCkpICE9PSBudWxsKSB7XG4gICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChtWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQobVsyXSk7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3Rva2VuOiBPQXV0aFRva2VuIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIHN0YXRlJDogUmVwbGF5U3ViamVjdDxzdHJpbmc+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIHN0YXR1cyQ6IFJlcGxheVN1YmplY3Q8T0F1dGhTdGF0dXM+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgQEluamVjdChPQVVUSF9DT05GSUcpIHByaXZhdGUgYXV0aENvbmZpZzogT0F1dGhDb25maWcsXG4gICAgICAgICAgICAgIEBJbmplY3QoTE9DQVRJT04pIHByaXZhdGUgbG9jYXRpb25TZXJ2aWNlOiBMb2NhdGlvbikge1xuICAgIHRoaXMuaW5pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXQoKTogdm9pZCB7XG4gICAgY29uc3Qge2hhc2gsIHNlYXJjaCwgb3JpZ2luLCBwYXRobmFtZX0gPSB0aGlzLmxvY2F0aW9uU2VydmljZTtcbiAgICBjb25zdCBpc0ltcGxpY2l0UmVkaXJlY3QgPSBoYXNoICYmIC8oI2FjY2Vzc190b2tlbj0pfCgjZXJyb3I9KS8udGVzdChoYXNoKTtcbiAgICBjb25zdCBpc0F1dGhDb2RlUmVkaXJlY3QgPSBzZWFyY2ggJiYgLyhjb2RlPSl8KGVycm9yPSkvLnRlc3Qoc2VhcmNoKTtcbiAgICBjb25zdCB7c3RvcmFnZUtleX0gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgY29uc3Qgc2F2ZWRUb2tlbiA9IHN0b3JhZ2VLZXkgJiYgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2UgJiYgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV0gJiZcbiAgICAgIEpTT04ucGFyc2UodGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV0pO1xuICAgIGlmIChpc0ltcGxpY2l0UmVkaXJlY3QpIHtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKGhhc2guc3Vic3RyKDEpKTtcbiAgICAgIHRoaXMuZW1pdFN0YXRlKHBhcmFtZXRlcnMpO1xuICAgICAgdGhpcy5jbGVhbkxvY2F0aW9uSGFzaCgpO1xuICAgICAgaWYgKCFwYXJhbWV0ZXJzIHx8IHBhcmFtZXRlcnMuZXJyb3IpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHBhcmFtZXRlcnM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXV0aENvZGVSZWRpcmVjdCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcnNlT2F1dGhVcmkoc2VhcmNoLnN1YnN0cigxKSk7XG4gICAgICB0aGlzLmVtaXRTdGF0ZShwYXJhbWV0ZXJzKTtcbiAgICAgIGNvbnN0IG5ld1BhcmFtZXRlcnNTdHJpbmcgPSB0aGlzLmdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTtcbiAgICAgIGlmIChwYXJhbWV0ZXJzICYmIHBhcmFtZXRlcnMuY29kZSkge1xuICAgICAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICAgICAgY29uc3QgY29kZVZlcmlmaWVyID0gc2F2ZWRUb2tlbiAmJiBzYXZlZFRva2VuLmNvZGVWZXJpZmllcjtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgICAgIGNvZGU6IHBhcmFtZXRlcnMuY29kZSxcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgICAgICByZWRpcmVjdF91cmk6IGAke29yaWdpbn0ke3BhdGhuYW1lfSR7bmV3UGFyYW1ldGVyc1N0cmluZ31gLFxuICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgICAgICAgLi4uY29kZVZlcmlmaWVyICYmIHtjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXJ9IHx8IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IHtlcnJvcjogJ2Vycm9yJ307XG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5ocmVmID0gYCR7b3JpZ2lufSR7cGF0aG5hbWV9JHtuZXdQYXJhbWV0ZXJzU3RyaW5nfWA7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgLy8gYXV0aG9yaXplZCBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCBhZnRlciByZWRpcmVjdFxuICAgICAgICAgICAgdGhpcy5sb2NhdGlvblNlcnZpY2UuaHJlZiA9IGAke29yaWdpbn0ke3BhdGhuYW1lfSR7bmV3UGFyYW1ldGVyc1N0cmluZ31gO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNhdmVkVG9rZW4pIHtcbiAgICAgIGNvbnN0IHthY2Nlc3NfdG9rZW4sIHJlZnJlc2hfdG9rZW4sIGVycm9yfSA9IHNhdmVkVG9rZW47XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgfSBlbHNlIGlmIChhY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHNhdmVkVG9rZW47XG4gICAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2luKHBhcmFtZXRlcnM/OiBPQXV0aFBhcmFtZXRlcnMpIHtcbiAgICBpZiAodGhpcy5pc1Jlc291cmNlVHlwZShwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycykpIHtcbiAgICAgIHRoaXMucmVzb3VyY2VMb2dpbihwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQXV0aG9yaXphdGlvbkNvZGVUeXBlKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKSkge1xuICAgICAgdGhpcy5hdXRob3JpemF0aW9uQ29kZUxvZ2luKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKS50aGVuKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzSW1wbGljaXRUeXBlKHBhcmFtZXRlcnMgYXMgSW1wbGljaXRQYXJhbWV0ZXJzKSkge1xuICAgICAgdGhpcy5pbXBsaWNpdExvZ2luKHBhcmFtZXRlcnMgYXMgSW1wbGljaXRQYXJhbWV0ZXJzKS50aGVuKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ2xpZW50Q3JlZGVudGlhbFR5cGUoKSkge1xuICAgICAgdGhpcy5jbGllbnRDcmVkZW50aWFsTG9naW4oKTtcbiAgICB9XG4gIH1cblxuICBsb2dvdXQoKSB7XG4gICAgdGhpcy5yZXZva2UoKTtcbiAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICB9XG5cbiAgcmV2b2tlKCkge1xuICAgIGNvbnN0IHtyZXZva2VQYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0fSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmIChyZXZva2VQYXRoKSB7XG4gICAgICBjb25zdCB7YWNjZXNzX3Rva2VuLCByZWZyZXNoX3Rva2VufSA9IHRoaXMudG9rZW4gYXMgT0F1dGhUb2tlbjtcbiAgICAgIGNvbnN0IHRvUmV2b2tlID0gW107XG4gICAgICBpZiAoYWNjZXNzX3Rva2VuKSB7XG4gICAgICAgIHRvUmV2b2tlLnB1c2goe1xuICAgICAgICAgIC4uLmNsaWVudElkICYmIHtjbGllbnRfaWQ6IGNsaWVudElkfSB8fCB7fSxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgdG9rZW46IGFjY2Vzc190b2tlbixcbiAgICAgICAgICB0b2tlbl90eXBlX2hpbnQ6ICdhY2Nlc3NfdG9rZW4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHJlZnJlc2hfdG9rZW4pIHtcbiAgICAgICAgdG9SZXZva2UucHVzaCh7XG4gICAgICAgICAgLi4uY2xpZW50SWQgJiYge2NsaWVudF9pZDogY2xpZW50SWR9IHx8IHt9LFxuICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICB0b2tlbjogcmVmcmVzaF90b2tlbixcbiAgICAgICAgICB0b2tlbl90eXBlX2hpbnQ6ICdyZWZyZXNoX3Rva2VuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGZyb20odG9SZXZva2UpLnBpcGUoXG4gICAgICAgIGNvbmNhdE1hcChvID0+IG9mKG8pLnBpcGUoZGVsYXkoMzAwKSkpLCAvLyBzcGFjZSByZXF1ZXN0IHRvIGF2b2lkIGNhbmNlbGxhdGlvblxuICAgICAgICBzd2l0Y2hNYXAobyA9PiB0aGlzLmh0dHAucG9zdChyZXZva2VQYXRoLCBuZXcgSHR0cFBhcmFtcyh7ZnJvbU9iamVjdDogb30pKSksXG4gICAgICApLnN1YnNjcmliZShub29wKTtcbiAgICB9XG4gIH1cblxuICBnZXQgc3RhdHVzKCk6IE9BdXRoU3RhdHVzIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICB9XG5cbiAgc2V0IHN0YXR1cyhzdGF0dXMpIHtcbiAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5zdGF0dXMkLm5leHQoc3RhdHVzKTtcbiAgfVxuXG4gIHNldCh0eXBlOiBPQXV0aFR5cGUsIGNvbmZpZz86IE9BdXRoVHlwZUNvbmZpZyk6IHZvaWQge1xuICAgIHRoaXMuYXV0aENvbmZpZy50eXBlID0gdHlwZTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICB0aGlzLmF1dGhDb25maWcuY29uZmlnID0ge1xuICAgICAgICAuLi50aGlzLmF1dGhDb25maWcuY29uZmlnLFxuICAgICAgICAuLi5jb25maWdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0IHR5cGUoKTogT0F1dGhUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgaWdub3JlUGF0aHMoKTogUmVnRXhwW10ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcuaWdub3JlUGF0aHMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIHJlc291cmNlTG9naW4ocGFyYW1ldGVyczogUmVzb3VyY2VQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgY29uc3Qge3VzZXJuYW1lLCBwYXNzd29yZH0gPSBwYXJhbWV0ZXJzO1xuICAgIHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6IE9BdXRoVHlwZS5SRVNPVVJDRSxcbiAgICAgICAgLi4uc2NvcGUgPyB7c2NvcGV9IDoge30sXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgdGhpcy50b2tlbiA9IHBhcmFtcztcbiAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXV0aG9yaXphdGlvbkNvZGVMb2dpbihwYXJhbWV0ZXJzOiBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycywgT0F1dGhUeXBlLkFVVEhPUklaQVRJT05fQ09ERSk7XG4gICAgdGhpcy5sb2NhdGlvblNlcnZpY2UucmVwbGFjZShhdXRoVXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW1wbGljaXRMb2dpbihwYXJhbWV0ZXJzOiBJbXBsaWNpdFBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycywgT0F1dGhUeXBlLklNUExJQ0lUKTtcbiAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5yZXBsYWNlKGF1dGhVcmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGllbnRDcmVkZW50aWFsTG9naW4oKSB7XG4gICAgY29uc3Qge2NsaWVudElkLCBjbGllbnRTZWNyZXQsIHRva2VuUGF0aCwgc2NvcGV9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIGNsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldCxcbiAgICAgICAgZ3JhbnRfdHlwZTogT0F1dGhUeXBlLkNMSUVOVF9DUkVERU5USUFMLFxuICAgICAgICAuLi5zY29wZSA/IHtzY29wZX0gOiB7fSxcbiAgICAgIH1cbiAgICB9KSwge2hlYWRlcnM6IFJFUVVFU1RfSEVBREVSfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gbnVsbDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIHRoaXMudG9rZW4gPSBwYXJhbXM7XG4gICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzQ2xpZW50Q3JlZGVudGlhbFR5cGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlID09PSBPQXV0aFR5cGUuQ0xJRU5UX0NSRURFTlRJQUw7XG4gIH1cblxuICBwcml2YXRlIGlzUmVzb3VyY2VUeXBlKHBhcmFtZXRlcnM/OiBSZXNvdXJjZVBhcmFtZXRlcnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGUgPT09IE9BdXRoVHlwZS5SRVNPVVJDRSAmJiAhIXBhcmFtZXRlcnM/LnBhc3N3b3JkO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltcGxpY2l0VHlwZShwYXJhbWV0ZXJzPzogSW1wbGljaXRQYXJhbWV0ZXJzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlID09PSBPQXV0aFR5cGUuSU1QTElDSVQgJiYgISFwYXJhbWV0ZXJzPy5yZWRpcmVjdFVyaTtcbiAgfVxuXG4gIHByaXZhdGUgaXNBdXRob3JpemF0aW9uQ29kZVR5cGUocGFyYW1ldGVycz86IEF1dGhvcml6YXRpb25Db2RlUGFyYW1ldGVycyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLkFVVEhPUklaQVRJT05fQ09ERSAmJiAhIXBhcmFtZXRlcnM/LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVyczogQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzIHwgSW1wbGljaXRQYXJhbWV0ZXJzLCByZXNwb25zZVR5cGU6IE9BdXRoVHlwZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgIGNvbnN0IGFwcGVuZENoYXIgPSBjb25maWcuYXV0aG9yaXplUGF0aC5pbmNsdWRlcygnPycpID8gJyYnIDogJz8nO1xuICAgIGNvbnN0IGNsaWVudElkID0gYCR7YXBwZW5kQ2hhcn1jbGllbnRfaWQ9JHtjb25maWcuY2xpZW50SWR9YDtcbiAgICBjb25zdCByZWRpcmVjdFVyaSA9IGAmcmVkaXJlY3RfdXJpPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMucmVkaXJlY3RVcmkpfWA7XG4gICAgY29uc3QgcmVzcG9uc2VUeXBlU3RyaW5nID0gYCZyZXNwb25zZV90eXBlPSR7cmVzcG9uc2VUeXBlfWA7XG4gICAgY29uc3Qgc2NvcGUgPSBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zY29wZSB8fCAnJyl9YDtcbiAgICBjb25zdCBzdGF0ZSA9IGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5zdGF0ZSB8fCAnJyl9YDtcbiAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSBjb25maWcucGtjZSAmJiByYW5kb21TdHJpbmcoKSB8fCBudWxsO1xuICAgIGlmIChjb2RlVmVyaWZpZXIpIHtcbiAgICAgIHRoaXMudG9rZW4gPSB7Y29kZVZlcmlmaWVyfTsgLy9zYXZlIHRoZSBjb2RlIHZlcmlmaWVyIGJlZm9yZSB3ZSByZWRpcmVjdFxuICAgIH1cbiAgICBjb25zdCBjb2RlQ2hhbGxlbmdlID0gY29kZVZlcmlmaWVyID8gYCZjb2RlX2NoYWxsZW5nZT0ke2F3YWl0IHBrY2UoY29kZVZlcmlmaWVyKX0mY29kZV9jaGFsbGVuZ2VfbWV0aG9kPVMyNTZgIDogJyc7XG4gICAgY29uc3QgcGFyYW1ldGVyc1N0cmluZyA9IGAke2NsaWVudElkfSR7cmVkaXJlY3RVcml9JHtyZXNwb25zZVR5cGVTdHJpbmd9JHtzY29wZX0ke3N0YXRlfSR7Y29kZUNoYWxsZW5nZX1gO1xuICAgIHJldHVybiBgJHtjb25maWcuYXV0aG9yaXplUGF0aH0ke3BhcmFtZXRlcnNTdHJpbmd9YDtcbiAgfVxuXG4gIHNldCB0b2tlbih0b2tlbjogT0F1dGhUb2tlbiB8IG51bGwpIHtcbiAgICB0aGlzLl90b2tlbiA9IHRva2VuO1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5fSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldID0gSlNPTi5zdHJpbmdpZnkodGhpcy50b2tlbik7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICBpZiAodGhpcy50b2tlbiAmJiB0aGlzLnRva2VuLmV4cGlyZXNfaW4pIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIE51bWJlcih0aGlzLnRva2VuPy5leHBpcmVzX2luKSAqIDEwMDApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVsZXRlIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0b2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUb2tlbigpIHtcbiAgICBjb25zdCB7dG9rZW5QYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB7cmVmcmVzaF90b2tlbn0gPSB0aGlzLnRva2VuIGFzIE9BdXRoVG9rZW47XG4gICAgaWYgKHRva2VuUGF0aCAmJiByZWZyZXNoX3Rva2VuKSB7XG4gICAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ID8ge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gOiB7fSxcbiAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgcmVmcmVzaF90b2tlbixcbiAgICAgICAgICAuLi5zY29wZSA/IHtzY29wZX0gOiB7fSxcbiAgICAgICAgfVxuICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAuLi50aGlzLnRva2VuLFxuICAgICAgICAgIC4uLnBhcmFtc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7c2VhcmNofSA9IHRoaXMubG9jYXRpb25TZXJ2aWNlO1xuICAgIGxldCBzZWFyY2hTdHJpbmcgPSBzZWFyY2guc3Vic3RyKDEpO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydjb2RlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKChoYXNoS2V5KSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWFyY2hTdHJpbmcubGVuZ3RoID8gYD8ke3NlYXJjaFN0cmluZ31gIDogJyc7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuTG9jYXRpb25IYXNoKCkge1xuICAgIGNvbnN0IHtoYXNofSA9IHRoaXMubG9jYXRpb25TZXJ2aWNlO1xuICAgIGxldCBjdXJIYXNoID0gaGFzaC5zdWJzdHIoMSk7XG4gICAgY29uc3QgaGFzaEtleXMgPSBbJ2FjY2Vzc190b2tlbicsICd0b2tlbl90eXBlJywgJ2V4cGlyZXNfaW4nLCAnc2NvcGUnLCAnc3RhdGUnLCAnZXJyb3InLCAnZXJyb3JfZGVzY3JpcHRpb24nLCAnc2Vzc2lvbl9zdGF0ZSddO1xuICAgIGhhc2hLZXlzLmZvckVhY2goKGhhc2hLZXkpID0+IHtcbiAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnJicgKyBoYXNoS2V5ICsgJyg9W14mXSopP3xeJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/Jj8nKTtcbiAgICAgIGN1ckhhc2ggPSBjdXJIYXNoLnJlcGxhY2UocmUsICcnKTtcbiAgICB9KTtcbiAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5oYXNoID0gY3VySGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRlKHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsKSB7XG4gICAgY29uc3Qge3N0YXRlfSA9IHBhcmFtZXRlcnMgYXMgYW55O1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5zdGF0ZSQubmV4dChzdGF0ZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
404
|
+
}] }, { type: i2.Location }]; } });
|
|
405
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL29hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFHTCxRQUFRLEVBQ1IsWUFBWSxFQUdaLFdBQVcsRUFFWCxTQUFTLEVBR1YsTUFBTSxXQUFXLENBQUM7Ozs7QUFHbkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFlLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU5RixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUN6QyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztLQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztLQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FB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RyxHQUFHLE9BQU8sR0FBRyxhQUFhLEdBQUcsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1lBQy9FLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNwQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRU8sU0FBUyxDQUFDLFVBQXlDO1FBQ3pELE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxVQUFpQixDQUFDO1FBQ2xDLElBQUksS0FBSyxFQUFFO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekI7SUFDSCxDQUFDOzt5R0ExWVUsWUFBWSxrRUFvQkgsWUFBWSxhQUNaLFFBQVE7NkdBckJqQixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7OzBCQXFCSSxNQUFNOzJCQUFDLFlBQVk7OEJBQ2dCLFFBQVE7MEJBQTNDLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtc30gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtjYXRjaEVycm9yLCBjb25jYXRNYXAsIGRlbGF5LCBmaWx0ZXIsIG1hcCwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VNUFRZLCBmcm9tLCBub29wLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMsXG4gIEltcGxpY2l0UGFyYW1ldGVycyxcbiAgTE9DQVRJT04sXG4gIE9BVVRIX0NPTkZJRyxcbiAgT0F1dGhDb25maWcsXG4gIE9BdXRoUGFyYW1ldGVycyxcbiAgT0F1dGhTdGF0dXMsXG4gIE9BdXRoVG9rZW4sXG4gIE9BdXRoVHlwZSxcbiAgT0F1dGhUeXBlQ29uZmlnLCBPcGVuSWRDb25maWcsIE9wZW5JZENvbmZpZ3VyYXRpb24sXG4gIFJlc291cmNlUGFyYW1ldGVycywgVXNlckluZm9cbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TG9jYXRpb24gYXMgTG9jYXRpb24yfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5jb25zdCBhcnJUb1N0cmluZyA9IChidWY6IFVpbnQ4QXJyYXkpID0+IGJ1Zi5yZWR1Y2UoKHMsIGIpID0+IHMgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpLCAnJyk7XG5cbmNvbnN0IGJhc2U2NHVybCA9IChzdHI6IHN0cmluZykgPT4gYnRvYShzdHIpXG4gIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgLnJlcGxhY2UoLz0vZywgJycpO1xuXG5jb25zdCByYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIgPSA0OCkgPT4ge1xuICBjb25zdCBidWZmID0gYXJyVG9TdHJpbmcoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShsZW5ndGggKiAyKSkpO1xuICByZXR1cm4gYmFzZTY0dXJsKGJ1ZmYpLnN1YnN0cmluZygwLCBsZW5ndGgpO1xufTtcblxuY29uc3QgcGtjZSA9IGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGJ1ZmYgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSkpO1xuICByZXR1cm4gYmFzZTY0dXJsKGFyclRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGJ1ZmYpKSk7XG59O1xuXG5jb25zdCBSRVFVRVNUX0hFQURFUiA9IG5ldyBIdHRwSGVhZGVycyh7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSk7XG5cbmNvbnN0IHBhcnNlT2F1dGhVcmkgPSAoaGFzaDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPT4ge1xuICBjb25zdCByZWdleCA9IC8oW14mPV0rKT0oW14mXSopL2c7XG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBsZXQgbTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbmRpdGlvbmFsLWFzc2lnbm1lbnRcbiAgd2hpbGUgKChtID0gcmVnZXguZXhlYyhoYXNoKSkgIT09IG51bGwpIHtcbiAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChtWzJdKTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3Qgand0ID0gKHRva2VuOiBzdHJpbmcpID0+IEpTT04ucGFyc2UoYXRvYih0b2tlbi5zcGxpdCgnLicpWzFdKSk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3Rva2VuOiBPQXV0aFRva2VuIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIHN0YXRlJDogUmVwbGF5U3ViamVjdDxzdHJpbmc+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIHN0YXR1cyQ6IFJlcGxheVN1YmplY3Q8T0F1dGhTdGF0dXM+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIHVzZXJJbmZvJDogT2JzZXJ2YWJsZTxVc2VySW5mbz4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBmaWx0ZXIocyA9PiBzID09PSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEKSxcbiAgICBtYXAoKCkgPT4ge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgICAgcmV0dXJuIGNvbmZpZy51c2VyUGF0aDtcbiAgICB9KSxcbiAgICBmaWx0ZXIocCA9PiAhIXApLFxuICAgIHN3aXRjaE1hcChwYXRoID0+IHRoaXMuaHR0cC5nZXQ8VXNlckluZm8+KHBhdGgpKSxcbiAgICBzaGFyZVJlcGxheSgpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgQEluamVjdChPQVVUSF9DT05GSUcpIHByaXZhdGUgYXV0aENvbmZpZzogT0F1dGhDb25maWcsXG4gICAgICAgICAgICAgIEBJbmplY3QoTE9DQVRJT04pIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBwcml2YXRlIGxvY2F0aW9uU2VydmljZTogTG9jYXRpb24yKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXQoKSk7IC8vIGRlY291cGxlIGZvciBodHRwIGludGVyY2VwdG9yXG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvYXV0aCBjb25maWcgZm9yIGluaXRpYWxpemUuIElmIE9wZW5JZCB3aXRoIGlzc3VlclBhdGggaXMgY29uZmlndXJlZCB0aGVuIGNvbmZpZ3VyZSBmcm9tIHNlcnZlciBvcGVuaWQgY29uZmlndXJhdGlvbi5cbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBjb25maWckKCkge1xuICAgIGxldCB7Y29uZmlnfSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jbGllbnRJZCkge1xuICAgICAgY29uc3Qge2lzc3VlclBhdGgsIHNjb3BlfSA9IGNvbmZpZyBhcyBPcGVuSWRDb25maWc7XG4gICAgICBpZiAoaXNzdWVyUGF0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldDxPcGVuSWRDb25maWd1cmF0aW9uPihgJHtpc3N1ZXJQYXRofS8ud2VsbC1rbm93bi9vcGVuaWQtY29uZmlndXJhdGlvbmApLnBpcGUoXG4gICAgICAgICAgdGFwKHYgPT4gdGhpcy5zZXQodGhpcy50eXBlLCB7XG4gICAgICAgICAgICAuLi52LmF1dGhvcml6YXRpb25fZW5kcG9pbnQgJiYge2F1dGhvcml6ZVBhdGg6IHYuYXV0aG9yaXphdGlvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LnRva2VuX2VuZHBvaW50ICYmIHt0b2tlblBhdGg6IHYudG9rZW5fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5yZXZvY2F0aW9uX2VuZHBvaW50ICYmIHtyZXZva2VQYXRoOiB2LnJldm9jYXRpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZCAmJiB7cGtjZTogdi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZC5pbmRleE9mKCdTMjU2JykgPiAtMX0gfHwge30sXG4gICAgICAgICAgICAuLi52LnVzZXJpbmZvX2VuZHBvaW50ICYmIHt1c2VyUGF0aDogdi51c2VyaW5mb19lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LmludHJvc3BlY3Rpb25fZW5kcG9pbnQgJiYge2ludHJvc3BlY3Rpb25QYXRoOiB2LmludHJvc3BlY3Rpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5lbmRfc2Vzc2lvbl9lbmRwb2ludCAmJiB7bG9nb3V0UGF0aDogdi5lbmRfc2Vzc2lvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi5zY29wZSAmJiB7fSB8fCB7c2NvcGU6ICdvcGVuaWQnfVxuICAgICAgICAgIH0gYXMgYW55KSksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuYXV0aENvbmZpZy5jb25maWcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2YoY29uZmlnKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKCdjbGllbnRJZCBpcyBtaXNzaW5nIGluIG9hdXRoIGNvbmZpZycpO1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0LiBXaWxsIGNoZWNrIHRoZSB1cmwgaW1wbGljaXQgb3IgYXV0aG9yaXphdGlvbiBmbG93IG9yIGV4aXN0aW5nIHNhdmVkIHRva2VuLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCB7aGFzaCwgc2VhcmNoLCBvcmlnaW4sIHBhdGhuYW1lfSA9IHRoaXMubG9jYXRpb247XG4gICAgY29uc3QgaXNJbXBsaWNpdFJlZGlyZWN0ID0gaGFzaCAmJiAvKGFjY2Vzc190b2tlbj0pfChlcnJvcj0pLy50ZXN0KGhhc2gpO1xuICAgIGNvbnN0IGlzQXV0aENvZGVSZWRpcmVjdCA9IHNlYXJjaCAmJiAvKGNvZGU9KXwoZXJyb3I9KS8udGVzdChzZWFyY2gpO1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5fSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBjb25zdCBzYXZlZFRva2VuID0gc3RvcmFnZUtleSAmJiB0aGlzLmF1dGhDb25maWcuc3RvcmFnZSAmJiB0aGlzLmF1dGhDb25maWcuc3RvcmFnZVtzdG9yYWdlS2V5XSAmJlxuICAgICAgSlNPTi5wYXJzZSh0aGlzLmF1dGhDb25maWcuc3RvcmFnZVtzdG9yYWdlS2V5XSk7XG4gICAgdGhpcy5jb25maWckLnN1YnNjcmliZShjb25maWcgPT4ge1xuICAgICAgaWYgKGlzSW1wbGljaXRSZWRpcmVjdCkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyc2VPYXV0aFVyaShoYXNoLnN1YnN0cigxKSk7XG4gICAgICAgIHRoaXMudG9rZW4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuY2hlY2tSZXNwb25zZShzYXZlZFRva2VuLCBwYXJhbWV0ZXJzKSAmJiBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEIHx8IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBdXRoQ29kZVJlZGlyZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKHNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tSZXNwb25zZShzYXZlZFRva2VuLCBwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIHRoaXMudG9rZW4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld1BhcmFtZXRlcnNTdHJpbmcgPSB0aGlzLmdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSBjb25maWcgYXMgYW55O1xuICAgICAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHNhdmVkVG9rZW4gJiYgc2F2ZWRUb2tlbi5jb2RlVmVyaWZpZXI7XG4gICAgICAgICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgICAgIGNvZGU6IHBhcmFtZXRlcnM/LmNvZGUsXG4gICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiBgJHtvcmlnaW59JHtwYXRobmFtZX1gLFxuICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgICAgICAgLi4uY29kZVZlcmlmaWVyICYmIHtjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXJ9IHx8IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZXJ2aWNlLnJlcGxhY2VTdGF0ZShgJHtwYXRobmFtZX0ke25ld1BhcmFtZXRlcnNTdHJpbmd9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvblNlcnZpY2UucmVwbGFjZVN0YXRlKGAke3BhdGhuYW1lfSR7bmV3UGFyYW1ldGVyc1N0cmluZ31gKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzYXZlZFRva2VuKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gc2F2ZWRUb2tlbjtcbiAgICAgICAgY29uc3Qge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgZXJyb3J9ID0gc2F2ZWRUb2tlbjtcbiAgICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7IC8vIGZvcmNlIHJlZnJlc2ggc2luY2UgbWlnaHQgYmUgYSBtYW51YWwgcGFnZSByZWZyZXNoXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gZXJyb3IgJiYgT0F1dGhTdGF0dXMuREVOSUVEIHx8IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9naW4ocGFyYW1ldGVycz86IE9BdXRoUGFyYW1ldGVycykge1xuICAgIGlmICh0aGlzLmlzUmVzb3VyY2VUeXBlKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKSkge1xuICAgICAgdGhpcy5yZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNBdXRob3JpemF0aW9uQ29kZVR5cGUocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhvcml6YXRpb25Db2RlTG9naW4ocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0ltcGxpY2l0VHlwZShwYXJhbWV0ZXJzIGFzIEltcGxpY2l0UGFyYW1ldGVycykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1wbGljaXRMb2dpbihwYXJhbWV0ZXJzIGFzIEltcGxpY2l0UGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ2xpZW50Q3JlZGVudGlhbFR5cGUoKSkge1xuICAgICAgdGhpcy5jbGllbnRDcmVkZW50aWFsTG9naW4oKTtcbiAgICB9XG4gIH1cblxuICBsb2dvdXQodXNlTG9nb3V0VXJsPzogYm9vbGVhbikge1xuICAgIHRoaXMucmV2b2tlKCk7XG4gICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5OT1RfQVVUSE9SSVpFRDtcbiAgICBjb25zdCB7bG9nb3V0UGF0aCwgbG9nb3V0UmVkaXJlY3RVcml9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKHVzZUxvZ291dFVybCAmJiBsb2dvdXRQYXRoKSB7XG4gICAgICBjb25zdCB7b3JpZ2luLCBwYXRobmFtZX0gPSB0aGlzLmxvY2F0aW9uO1xuICAgICAgY29uc3QgY3VycmVudFBhdGggPSBgJHtvcmlnaW59JHtwYXRobmFtZX1gO1xuICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlKGAke2xvZ291dFBhdGh9P3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaT0ke2xvZ291dFJlZGlyZWN0VXJpIHx8IGN1cnJlbnRQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIHJldm9rZSgpIHtcbiAgICBjb25zdCB7cmV2b2tlUGF0aCwgY2xpZW50SWQsIGNsaWVudFNlY3JldH0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBpZiAocmV2b2tlUGF0aCkge1xuICAgICAgY29uc3Qge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbn0gPSB0aGlzLnRva2VuIGFzIE9BdXRoVG9rZW47XG4gICAgICBjb25zdCB0b1Jldm9rZSA9IFtdO1xuICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAnYWNjZXNzX3Rva2VuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRvUmV2b2tlLnB1c2goe1xuICAgICAgICAgIC4uLmNsaWVudElkICYmIHtjbGllbnRfaWQ6IGNsaWVudElkfSB8fCB7fSxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgdG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmcm9tKHRvUmV2b2tlKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAobyA9PiBvZihvKS5waXBlKGRlbGF5KDMwMCkpKSwgLy8gc3BhY2UgcmVxdWVzdCB0byBhdm9pZCBjYW5jZWxsYXRpb25cbiAgICAgICAgc3dpdGNoTWFwKG8gPT4gdGhpcy5odHRwLnBvc3QocmV2b2tlUGF0aCwgbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IG99KSkpLFxuICAgICAgKS5zdWJzY3JpYmUobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0YXR1cygpOiBPQXV0aFN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gIH1cblxuICBzZXQodHlwZTogT0F1dGhUeXBlLCBjb25maWc/OiBPQXV0aFR5cGVDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhDb25maWcudHlwZSA9IHR5cGU7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5hdXRoQ29uZmlnLmNvbmZpZyxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldCB0eXBlKCk6IE9BdXRoVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlO1xuICB9XG5cbiAgZ2V0IGlnbm9yZVBhdGhzKCk6IFJlZ0V4cFtdIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLmlnbm9yZVBhdGhzIHx8IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnM6IFJlc291cmNlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHt1c2VybmFtZSwgcGFzc3dvcmR9ID0gcGFyYW1ldGVycztcbiAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuUkVTT1VSQ0UsXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gZXJyO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZShwYXJhbXMgPT4ge1xuICAgICAgdGhpcy50b2tlbiA9IHBhcmFtcztcbiAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXV0aG9yaXphdGlvbkNvZGVMb2dpbihwYXJhbWV0ZXJzOiBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycywgT0F1dGhUeXBlLkFVVEhPUklaQVRJT05fQ09ERSk7XG4gICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlKGF1dGhVcmwpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbXBsaWNpdExvZ2luKHBhcmFtZXRlcnM6IEltcGxpY2l0UGFyYW1ldGVycykge1xuICAgIGNvbnN0IGF1dGhVcmwgPSBhd2FpdCB0aGlzLnRvQXV0aG9yaXphdGlvblVybChwYXJhbWV0ZXJzLCBPQXV0aFR5cGUuSU1QTElDSVQpO1xuICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShhdXRoVXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xpZW50Q3JlZGVudGlhbExvZ2luKCkge1xuICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICBjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXQsXG4gICAgICAgIGdyYW50X3R5cGU6IE9BdXRoVHlwZS5DTElFTlRfQ1JFREVOVElBTCxcbiAgICAgICAgLi4uc2NvcGUgPyB7c2NvcGV9IDoge30sXG4gICAgICB9XG4gICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICB0aGlzLnRva2VuID0gcGFyYW1zO1xuICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NsaWVudENyZWRlbnRpYWxUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLkNMSUVOVF9DUkVERU5USUFMO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jlc291cmNlVHlwZShwYXJhbWV0ZXJzPzogUmVzb3VyY2VQYXJhbWV0ZXJzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlID09PSBPQXV0aFR5cGUuUkVTT1VSQ0UgJiYgISFwYXJhbWV0ZXJzPy5wYXNzd29yZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbXBsaWNpdFR5cGUocGFyYW1ldGVycz86IEltcGxpY2l0UGFyYW1ldGVycyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLklNUExJQ0lUICYmICEhcGFyYW1ldGVycz8ucmVkaXJlY3RVcmk7XG4gIH1cblxuICBwcml2YXRlIGlzQXV0aG9yaXphdGlvbkNvZGVUeXBlKHBhcmFtZXRlcnM/OiBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGUgPT09IE9BdXRoVHlwZS5BVVRIT1JJWkFUSU9OX0NPREUgJiYgISFwYXJhbWV0ZXJzPy5yZWRpcmVjdFVyaTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnM6IEF1dGhvcml6YXRpb25Db2RlUGFyYW1ldGVycyB8IEltcGxpY2l0UGFyYW1ldGVycywgcmVzcG9uc2VUeXBlOiBPQXV0aFR5cGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5hdXRoQ29uZmlnIGFzIGFueTtcbiAgICBsZXQgYXV0aG9yaXphdGlvblVybCA9IGAke2NvbmZpZy5hdXRob3JpemVQYXRofWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBjb25maWcuYXV0aG9yaXplUGF0aC5pbmNsdWRlcygnPycpICYmICcmJyB8fCAnPyc7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgY2xpZW50X2lkPSR7Y29uZmlnLmNsaWVudElkfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbWV0ZXJzLnJlZGlyZWN0VXJpKX1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZyZXNwb25zZV90eXBlPSR7cmVzcG9uc2VUeXBlfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zY29wZSB8fCAnJyl9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5zdGF0ZSB8fCAnJyl9YDtcbiAgICByZXR1cm4gYCR7YXV0aG9yaXphdGlvblVybH0ke3RoaXMuZ2VuZXJhdGVOb25jZShjb25maWcpfSR7YXdhaXQgdGhpcy5nZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnLnBrY2UpIHtcbiAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHJhbmRvbVN0cmluZygpO1xuICAgICAgdGhpcy50b2tlbiA9IHsuLi50aGlzLnRva2VuLCBjb2RlVmVyaWZpZXJ9O1xuICAgICAgcmV0dXJuIGAmY29kZV9jaGFsbGVuZ2U9JHthd2FpdCBwa2NlKGNvZGVWZXJpZmllcil9JmNvZGVfY2hhbGxlbmdlX21ldGhvZD1TMjU2YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5vbmNlKGNvbmZpZzogYW55KSB7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2NvcGUgJiYgY29uZmlnLnNjb3BlLmluZGV4T2YoJ29wZW5pZCcpID4gLTEpIHtcbiAgICAgIGNvbnN0IG5vbmNlID0gcmFuZG9tU3RyaW5nKDEwKTtcbiAgICAgIHRoaXMudG9rZW4gPSB7Li4udGhpcy50b2tlbiwgbm9uY2V9O1xuICAgICAgcmV0dXJuIGAmbm9uY2U9JHtub25jZX1gO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVzcG9uc2UodG9rZW46IGFueSwgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwpIHtcbiAgICB0aGlzLmVtaXRTdGF0ZShwYXJhbWV0ZXJzKTtcbiAgICB0aGlzLmNsZWFuTG9jYXRpb25IYXNoKCk7XG4gICAgaWYgKCFwYXJhbWV0ZXJzIHx8IHBhcmFtZXRlcnMuZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRva2VuICYmIHRva2VuLm5vbmNlICYmIHBhcmFtZXRlcnMuYWNjZXNzX3Rva2VuKSB7XG4gICAgICBjb25zdCBqd3RUb2tlbiA9IGp3dChwYXJhbWV0ZXJzLmFjY2Vzc190b2tlbik7XG4gICAgICByZXR1cm4gdG9rZW4ubm9uY2UgPT09IGp3dFRva2VuLm5vbmNlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1ldGVycy5hY2Nlc3NfdG9rZW4gfHwgcGFyYW1ldGVycy5jb2RlO1xuICB9XG5cbiAgc2V0IHRva2VuKHRva2VuOiBPQXV0aFRva2VuIHwgbnVsbCkge1xuICAgIHRoaXMuX3Rva2VuID0gdG9rZW47XG4gICAgY29uc3Qge3N0b3JhZ2VLZXl9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRva2VuKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgIGlmICh0aGlzLnRva2VuICYmIHRoaXMudG9rZW4uZXhwaXJlc19pbikge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgTnVtYmVyKHRoaXMudG9rZW4/LmV4cGlyZXNfaW4pICogMTAwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBkZWxldGUgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLl90b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuKCkge1xuICAgIGNvbnN0IHt0b2tlblBhdGgsIGNsaWVudElkLCBjbGllbnRTZWNyZXQsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHtyZWZyZXNoX3Rva2VufSA9IHRoaXMudG9rZW4gYXMgT0F1dGhUb2tlbjtcbiAgICBpZiAodG9rZW5QYXRoICYmIHJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgfVxuICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAuLi50aGlzLnRva2VuLFxuICAgICAgICAgIC4uLnBhcmFtc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7c2VhcmNofSA9IHRoaXMubG9jYXRpb247XG4gICAgbGV0IHNlYXJjaFN0cmluZyA9IHNlYXJjaC5zdWJzdHIoMSk7XG4gICAgY29uc3QgaGFzaEtleXMgPSBbJ2NvZGUnLCAnc3RhdGUnLCAnZXJyb3InLCAnZXJyb3JfZGVzY3JpcHRpb24nLCAnc2Vzc2lvbl9zdGF0ZScsICdzY29wZScsICdhdXRodXNlcicsICdwcm9tcHQnXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKChoYXNoS2V5KSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWFyY2hTdHJpbmcubGVuZ3RoICYmIGA/JHtzZWFyY2hTdHJpbmd9YCB8fCAnJztcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5Mb2NhdGlvbkhhc2goKSB7XG4gICAgY29uc3Qge2hhc2h9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICBsZXQgY3VySGFzaCA9IGhhc2guc3Vic3RyKDEpO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydhY2Nlc3NfdG9rZW4nLCAndG9rZW5fdHlwZScsICdleHBpcmVzX2luJywgJ3Njb3BlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnbm9uY2UnXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKChoYXNoS2V5KSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBjdXJIYXNoID0gY3VySGFzaC5yZXBsYWNlKHJlLCAnJyk7XG4gICAgfSk7XG4gICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gY3VySGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRlKHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsKSB7XG4gICAgY29uc3Qge3N0YXRlfSA9IHBhcmFtZXRlcnMgYXMgYW55O1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5zdGF0ZSQubmV4dChzdGF0ZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|