@nauth-toolkit/client-angular 0.1.90 → 0.1.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/recaptcha.service.mjs +359 -0
- package/esm2022/lib/social-redirect-callback.guard.mjs +28 -21
- package/esm2022/ngmodule/auth.service.mjs +94 -12
- package/esm2022/ngmodule/tokens.mjs +1 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/nauth-toolkit-client-angular.mjs +477 -33
- package/fesm2022/nauth-toolkit-client-angular.mjs.map +1 -1
- package/lib/recaptcha.service.d.ts +195 -0
- package/lib/social-redirect-callback.guard.d.ts +1 -0
- package/ngmodule/auth.service.d.ts +45 -10
- package/ngmodule/tokens.d.ts +97 -0
- package/package.json +2 -2
- package/public-api.d.ts +1 -0
|
@@ -6,6 +6,7 @@ import { NAuthClient, } from '@nauth-toolkit/client';
|
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import * as i1 from "./http-adapter";
|
|
8
8
|
import * as i2 from "@angular/router";
|
|
9
|
+
import * as i3 from "../lib/recaptcha.service";
|
|
9
10
|
/**
|
|
10
11
|
* Angular wrapper around NAuthClient that provides promise-based auth methods and reactive state.
|
|
11
12
|
*
|
|
@@ -40,6 +41,7 @@ import * as i2 from "@angular/router";
|
|
|
40
41
|
*/
|
|
41
42
|
export class AuthService {
|
|
42
43
|
router;
|
|
44
|
+
recaptchaService;
|
|
43
45
|
client;
|
|
44
46
|
config;
|
|
45
47
|
currentUserSubject = new BehaviorSubject(null);
|
|
@@ -51,9 +53,11 @@ export class AuthService {
|
|
|
51
53
|
* @param config - Injected client configuration (required)
|
|
52
54
|
* @param httpAdapter - Angular HTTP adapter for making requests (required)
|
|
53
55
|
* @param router - Angular Router (optional, automatically used for navigation if available)
|
|
56
|
+
* @param recaptchaService - RecaptchaService (optional, for automatic token generation)
|
|
54
57
|
*/
|
|
55
|
-
constructor(config, httpAdapter, router) {
|
|
58
|
+
constructor(config, httpAdapter, router, recaptchaService) {
|
|
56
59
|
this.router = router;
|
|
60
|
+
this.recaptchaService = recaptchaService;
|
|
57
61
|
this.config = config;
|
|
58
62
|
// Use provided httpAdapter (from config or injected)
|
|
59
63
|
const adapter = config.httpAdapter ?? httpAdapter;
|
|
@@ -204,31 +208,39 @@ export class AuthService {
|
|
|
204
208
|
/**
|
|
205
209
|
* Login with identifier and password.
|
|
206
210
|
*
|
|
211
|
+
* Automatically generates reCAPTCHA token if configured (v3 only).
|
|
212
|
+
* For v2 manual mode, pass the token explicitly.
|
|
213
|
+
*
|
|
207
214
|
* @param identifier - User email or username
|
|
208
215
|
* @param password - User password
|
|
216
|
+
* @param recaptchaToken - Optional reCAPTCHA token (for v2 manual mode or when auto-generation is disabled)
|
|
209
217
|
* @returns Promise with auth response or challenge
|
|
210
218
|
*
|
|
211
|
-
* @example
|
|
219
|
+
* @example Basic Login
|
|
212
220
|
* ```typescript
|
|
213
221
|
* const response = await this.auth.login('user@example.com', 'password');
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
222
|
+
* ```
|
|
223
|
+
*
|
|
224
|
+
* @example With Manual reCAPTCHA (v2)
|
|
225
|
+
* ```typescript
|
|
226
|
+
* const response = await this.auth.login('user@example.com', 'password', recaptchaToken);
|
|
219
227
|
* ```
|
|
220
228
|
*/
|
|
221
|
-
async login(identifier, password) {
|
|
222
|
-
const
|
|
229
|
+
async login(identifier, password, recaptchaToken) {
|
|
230
|
+
const token = await this.getRecaptchaToken(recaptchaToken, 'login');
|
|
231
|
+
const res = await this.client.login(identifier, password, token);
|
|
223
232
|
return this.updateChallengeState(res);
|
|
224
233
|
}
|
|
225
234
|
/**
|
|
226
235
|
* Signup with credentials.
|
|
227
236
|
*
|
|
237
|
+
* Automatically generates reCAPTCHA token if configured (v3 only).
|
|
238
|
+
* For v2 manual mode, include token in payload.
|
|
239
|
+
*
|
|
228
240
|
* @param payload - Signup request payload
|
|
229
241
|
* @returns Promise with auth response or challenge
|
|
230
242
|
*
|
|
231
|
-
* @example
|
|
243
|
+
* @example Basic Signup
|
|
232
244
|
* ```typescript
|
|
233
245
|
* const response = await this.auth.signup({
|
|
234
246
|
* email: 'new@example.com',
|
|
@@ -236,8 +248,25 @@ export class AuthService {
|
|
|
236
248
|
* firstName: 'John',
|
|
237
249
|
* });
|
|
238
250
|
* ```
|
|
251
|
+
*
|
|
252
|
+
* @example With Manual reCAPTCHA (v2)
|
|
253
|
+
* ```typescript
|
|
254
|
+
* const response = await this.auth.signup({
|
|
255
|
+
* email: 'new@example.com',
|
|
256
|
+
* password: 'SecurePass123!',
|
|
257
|
+
* recaptchaToken: token,
|
|
258
|
+
* });
|
|
259
|
+
* ```
|
|
239
260
|
*/
|
|
240
261
|
async signup(payload) {
|
|
262
|
+
// Auto-generate reCAPTCHA token for v3 if configured and not already provided
|
|
263
|
+
const payloadWithRecaptcha = payload;
|
|
264
|
+
if (!payloadWithRecaptcha.recaptchaToken) {
|
|
265
|
+
const token = await this.getRecaptchaToken(undefined, 'signup');
|
|
266
|
+
if (token) {
|
|
267
|
+
payload = { ...payload, recaptchaToken: token };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
241
270
|
const res = await this.client.signup(payload);
|
|
242
271
|
return this.updateChallengeState(res);
|
|
243
272
|
}
|
|
@@ -899,7 +928,58 @@ export class AuthService {
|
|
|
899
928
|
}
|
|
900
929
|
return response;
|
|
901
930
|
}
|
|
902
|
-
|
|
931
|
+
// ============================================================================
|
|
932
|
+
// reCAPTCHA Helper
|
|
933
|
+
// ============================================================================
|
|
934
|
+
/**
|
|
935
|
+
* Get reCAPTCHA token - auto-generate for v3 or use provided token.
|
|
936
|
+
*
|
|
937
|
+
* Handles platform detection:
|
|
938
|
+
* - Web browser: Generate token if enabled and v3
|
|
939
|
+
* - Capacitor native: Skip (use device attestation instead)
|
|
940
|
+
* - SSR: Skip
|
|
941
|
+
* - Manual mode (v2 or manualChallenge=true): Requires explicit token
|
|
942
|
+
*
|
|
943
|
+
* @param providedToken - Explicitly provided token (v2 manual mode)
|
|
944
|
+
* @param action - Action name for v3 analytics
|
|
945
|
+
* @returns reCAPTCHA token or undefined
|
|
946
|
+
*
|
|
947
|
+
* @private
|
|
948
|
+
*/
|
|
949
|
+
async getRecaptchaToken(providedToken, action) {
|
|
950
|
+
// If token explicitly provided, use it (v2 manual mode)
|
|
951
|
+
if (providedToken) {
|
|
952
|
+
return providedToken;
|
|
953
|
+
}
|
|
954
|
+
// No reCAPTCHA service available
|
|
955
|
+
if (!this.recaptchaService) {
|
|
956
|
+
return undefined;
|
|
957
|
+
}
|
|
958
|
+
// Check if reCAPTCHA is configured
|
|
959
|
+
const recaptchaConfig = this.config.recaptcha;
|
|
960
|
+
if (!recaptchaConfig?.enabled) {
|
|
961
|
+
return undefined;
|
|
962
|
+
}
|
|
963
|
+
// Skip for platforms that don't support reCAPTCHA (SSR, Capacitor native)
|
|
964
|
+
if (this.recaptchaService.shouldSkip()) {
|
|
965
|
+
return undefined;
|
|
966
|
+
}
|
|
967
|
+
// v2 or manual mode - user must provide token explicitly
|
|
968
|
+
if (recaptchaConfig.version === 'v2' || recaptchaConfig.manualChallenge) {
|
|
969
|
+
return undefined;
|
|
970
|
+
}
|
|
971
|
+
// Auto-generate token for v3/Enterprise
|
|
972
|
+
try {
|
|
973
|
+
return await this.recaptchaService.execute(action);
|
|
974
|
+
}
|
|
975
|
+
catch (error) {
|
|
976
|
+
// Log error but don't block authentication
|
|
977
|
+
// Server will enforce if required
|
|
978
|
+
console.warn('[AuthService] Failed to generate reCAPTCHA token:', error);
|
|
979
|
+
return undefined;
|
|
980
|
+
}
|
|
981
|
+
}
|
|
982
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: NAUTH_CLIENT_CONFIG }, { token: i1.AngularHttpAdapter }, { token: i2.Router, optional: true }, { token: i3.RecaptchaService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
903
983
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService });
|
|
904
984
|
}
|
|
905
985
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
|
|
@@ -909,5 +989,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
909
989
|
args: [NAUTH_CLIENT_CONFIG]
|
|
910
990
|
}] }, { type: i1.AngularHttpAdapter }, { type: i2.Router, decorators: [{
|
|
911
991
|
type: Optional
|
|
992
|
+
}] }, { type: i3.RecaptchaService, decorators: [{
|
|
993
|
+
type: Optional
|
|
912
994
|
}] }] });
|
|
913
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsV0FBVyxHQXNCWixNQUFNLHVCQUF1QixDQUFDOzs7O0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBRUgsTUFBTSxPQUFPLFdBQVc7SUFpQkE7SUFoQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7T0FJRztJQUNILFlBQytCLE1BQXlCLEVBQ3RELFdBQStCLEVBQ1gsTUFBZTtRQUFmLFdBQU0sR0FBTixNQUFNLENBQVM7UUFFbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksV0FBVyxDQUFDO1FBQ2xELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1B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LFdBQVc7WUFBRSxPQUFPO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRXhCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUUvQiwwQkFBMEI7UUFDMUIsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDL0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxvQ0FBb0M7UUFDcEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxvQkFBb0IsQ0FBQyxRQUFzQjtRQUNqRCxJQUFJLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzt3R0F2N0JVLFdBQVcsa0JBZVosbUJBQW1COzRHQWZsQixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFnQk4sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7XG4gIE5BdXRoQ2xpZW50LFxuICBOQXV0aENsaWVudENvbmZpZyxcbiAgQXV0aFJlc3BvbnNlQ29udGV4dCxcbiAgQ2hhbGxlbmdlUmVzcG9uc2UsXG4gIEF1dGhSZXNwb25zZSxcbiAgVG9rZW5SZXNwb25zZSxcbiAgQXV0aFVzZXIsXG4gIENvbmZpcm1Gb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBGb3Jnb3RQYXNzd29yZFJlc3BvbnNlLFxuICBSZXNldFBhc3N3b3JkV2l0aENvZGVSZXNwb25zZSxcbiAgVXBkYXRlUHJvZmlsZVJlcXVlc3QsXG4gIEdldENoYWxsZW5nZURhdGFSZXNwb25zZSxcbiAgR2V0U2V0dXBEYXRhUmVzcG9uc2UsXG4gIE1GQVN0YXR1cyxcbiAgTUZBRGV2aWNlLFxuICBBdXRoRXZlbnQsXG4gIFNvY2lhbFByb3ZpZGVyLFxuICBTb2NpYWxMb2dpbk9wdGlvbnMsXG4gIExpbmtlZEFjY291bnRzUmVzcG9uc2UsXG4gIFNvY2lhbFZlcmlmeVJlcXVlc3QsXG4gIEF1ZGl0SGlzdG9yeVJlc3BvbnNlLFxuICBBZG1pbk9wZXJhdGlvbnMsXG59IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGFyb3VuZCBOQXV0aENsaWVudCB0aGF0IHByb3ZpZGVzIHByb21pc2UtYmFzZWQgYXV0aCBtZXRob2RzIGFuZCByZWFjdGl2ZSBzdGF0ZS5cbiAqXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXM6XG4gKiAtIFJlYWN0aXZlIHN0YXRlIChjdXJyZW50VXNlciQsIGlzQXV0aGVudGljYXRlZCQsIGNoYWxsZW5nZSQpXG4gKiAtIEFsbCBjb3JlIGF1dGggbWV0aG9kcyBhcyBQcm9taXNlcyAobG9naW4sIHNpZ251cCwgbG9nb3V0LCByZWZyZXNoKVxuICogLSBQcm9maWxlIG1hbmFnZW1lbnQgKGdldFByb2ZpbGUsIHVwZGF0ZVByb2ZpbGUsIGNoYW5nZVBhc3N3b3JkKVxuICogLSBDaGFsbGVuZ2UgZmxvdyBtZXRob2RzIChyZXNwb25kVG9DaGFsbGVuZ2UsIHJlc2VuZENvZGUpXG4gKiAtIE1GQSBtYW5hZ2VtZW50IChnZXRNZmFTdGF0dXMsIHNldHVwTWZhRGV2aWNlLCBldGMuKVxuICogLSBTb2NpYWwgYXV0aGVudGljYXRpb24gYW5kIGFjY291bnQgbGlua2luZ1xuICogLSBEZXZpY2UgdHJ1c3QgbWFuYWdlbWVudFxuICogLSBBdWRpdCBoaXN0b3J5XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgYXV0aDogQXV0aFNlcnZpY2UpIHt9XG4gKlxuICogLy8gUmVhY3RpdmUgc3RhdGVcbiAqIHRoaXMuYXV0aC5jdXJyZW50VXNlciQuc3Vic2NyaWJlKHVzZXIgPT4gLi4uKTtcbiAqIHRoaXMuYXV0aC5pc0F1dGhlbnRpY2F0ZWQkLnN1YnNjcmliZShpc0F1dGggPT4gLi4uKTtcbiAqXG4gKiAvLyBBdXRoIG9wZXJhdGlvbnMgd2l0aCBhc3luYy9hd2FpdFxuICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkKTtcbiAqXG4gKiAvLyBQcm9maWxlIG1hbmFnZW1lbnRcbiAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC51cGRhdGVQcm9maWxlKHsgZmlyc3ROYW1lOiAnSm9obicgfSk7XG4gKlxuICogLy8gTUZBIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRNZmFTdGF0dXMoKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudDogTkF1dGhDbGllbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjdXJyZW50VXNlclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaXNBdXRoZW50aWNhdGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNoYWxsZW5nZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhSZXNwb25zZSB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGhFdmVudHNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8QXV0aEV2ZW50PigpO1xuICBwcml2YXRlIGluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb25maWcgLSBJbmplY3RlZCBjbGllbnQgY29uZmlndXJhdGlvbiAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSBodHRwQWRhcHRlciAtIEFuZ3VsYXIgSFRUUCBhZGFwdGVyIGZvciBtYWtpbmcgcmVxdWVzdHMgKHJlcXVpcmVkKVxuICAgKiBAcGFyYW0gcm91dGVyIC0gQW5ndWxhciBSb3V0ZXIgKG9wdGlvbmFsLCBhdXRvbWF0aWNhbGx5IHVzZWQgZm9yIG5hdmlnYXRpb24gaWYgYXZhaWxhYmxlKVxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChOQVVUSF9DTElFTlRfQ09ORklHKSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnLFxuICAgIGh0dHBBZGFwdGVyOiBBbmd1bGFySHR0cEFkYXB0ZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByb3V0ZXI/OiBSb3V0ZXIsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQXV0b21hdGljIEFuZ3VsYXIgUm91dGVyIGludGVncmF0aW9uXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIElmIFJvdXRlciBpcyBhdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBuYXZpZ2F0aW9uSGFuZGxlciBpcyBwcm92aWRlZCxcbiAgICAvLyBhdXRvbWF0aWNhbGx5IHVzZSBBbmd1bGFyIFJvdXRlcidzIG5hdmlnYXRlQnlVcmwoKSB0byBwcmV2ZW50IHBhZ2UgcmVmcmVzaGVzXG4gICAgY29uc3QgbmF2aWdhdGlvbkhhbmRsZXIgPVxuICAgICAgY29uZmlnLm5hdmlnYXRpb25IYW5kbGVyID8/XG4gICAgICAodGhpcy5yb3V0ZXJcbiAgICAgICAgPyBhc3luYyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm91dGVyIS5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSU1QT1JUQU5UOiBDaGFsbGVuZ2Utc3RhdGUgaHlkcmF0aW9uIEJFRk9SRSBuYXZpZ2F0aW9uIChBbmd1bGFyIGd1YXJkIHNhZmV0eSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBgTkF1dGhDbGllbnQubG9naW4oKWAgYXV0by1uYXZpZ2F0ZXMgdmlhIENoYWxsZW5nZVJvdXRlciAqYmVmb3JlKiByZXR1cm5pbmcuXG4gICAgLy8gVGhlIEFuZ3VsYXIgc2FtcGxlIGFwcCB1c2VzIGEgc3luY2hyb25vdXMgZ3VhcmQgKGBjaGFsbGVuZ2VSb3V0ZUd1YXJkYCkgdGhhdFxuICAgIC8vIHJlYWRzIHRoZSBjdXJyZW50IGNoYWxsZW5nZSB2aWEgYEF1dGhTZXJ2aWNlLmdldEN1cnJlbnRDaGFsbGVuZ2UoKWAgKGJhY2tlZCBieVxuICAgIC8vIGBjaGFsbGVuZ2VTdWJqZWN0LnZhbHVlYCkuIElmIG5hdmlnYXRpb24gaGFwcGVucyBiZWZvcmUgYGNoYWxsZW5nZVN1YmplY3RgIGlzXG4gICAgLy8gdXBkYXRlZCwgdGhlIGd1YXJkIGluY29ycmVjdGx5IHJlZGlyZWN0cyBiYWNrIHRvIGAvbG9naW5gLlxuICAgIC8vXG4gICAgLy8gRml4OiBpbnRlcmNlcHQgdGhlIFNESydzIGF1dG8tbmF2aWdhdGlvbiBob29rIChgb25BdXRoUmVzcG9uc2VgKSwgcHVibGlzaCB0aGVcbiAgICAvLyBjaGFsbGVuZ2Ugc3RhdGUgaW1tZWRpYXRlbHksIHRoZW4gcGVyZm9ybSBkZWZhdWx0IG5hdmlnYXRpb24gKG9yIGRlbGVnYXRlIHRvXG4gICAgLy8gdGhlIHVzZXIncyBjdXN0b20gYG9uQXV0aFJlc3BvbnNlYCBpZiBwcm92aWRlZCkuXG4gICAgY29uc3QgdXNlck9uQXV0aFJlc3BvbnNlID0gY29uZmlnLm9uQXV0aFJlc3BvbnNlO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBuYXZpZ2F0aW9uSGFuZGxlcixcbiAgICAgIG9uQXV0aFJlc3BvbnNlOiBhc3luYyAocmVzcG9uc2U6IEF1dGhSZXNwb25zZSwgY29udGV4dDogQXV0aFJlc3BvbnNlQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBFbnN1cmUgZ3VhcmRzIGNhbiBzeW5jaHJvbm91c2x5IHNlZSB0aGUgYWN0aXZlIGNoYWxsZW5nZSBiZWZvcmUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIHRoZWlyIG93biBoYW5kbGVyLCBsZXQgdGhlbSB0YWtlIGZ1bGwgY29udHJvbC5cbiAgICAgICAgaWYgKHVzZXJPbkF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHVzZXJPbkF1dGhSZXNwb25zZShyZXNwb25zZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCBuYXZpZ2F0aW9uIGJlaGF2aW9yIChtYXRjaGVzIENoYWxsZW5nZVJvdXRlci5oYW5kbGVBdXRoUmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IHJvdXRlciA9IHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgICAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVmZXIgYXBwU3RhdGUgcHJvdmlkZWQgdmlhIGNvbnRleHQgKHNvY2lhbCByZWRpcmVjdCBndWFyZCAvIGV4Y2hhbmdlIGZsb3cpLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IERvIG5vdCBjb25zdW1lL2NsZWFyIHBlcnNpc3RlZCBPQXV0aCBzdGF0ZSBoZXJlOyBsZWF2ZSBpdCBhdmFpbGFibGVcbiAgICAgICAgLy8gZm9yIGNvbnN1bWVycyB2aWEgZ2V0TGFzdE9hdXRoU3RhdGUoKS5cbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGNvbnRleHQuYXBwU3RhdGUgPyB7IGFwcFN0YXRlOiBjb250ZXh0LmFwcFN0YXRlIH0gOiB1bmRlZmluZWQsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcjogQXV0aFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQ6IEF1dGhFdmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwgb3IgdXNlcm5hbWVcbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBjaGFsbGVuZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbigndXNlckBleGFtcGxlLmNvbScsICdwYXNzd29yZCcpO1xuICAgKiBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgKiAgIC8vIEhhbmRsZSBjaGFsbGVuZ2VcbiAgICogfSBlbHNlIHtcbiAgICogICAvLyBMb2dpbiBzdWNjZXNzZnVsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dpbihpZGVudGlmaWVyOiBzdHJpbmcsIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ2luKGlkZW50aWZpZXIsIHBhc3N3b3JkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgZmlyc3ROYW1lOiAnSm9obicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNpZ251cChwYXlsb2FkOiBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydzaWdudXAnXT5bMF0pOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNpZ251cChwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2UgLSBJZiB0cnVlLCByZW1vdmVzIGRldmljZSB0cnVzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dvdXQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXQoZm9yZ2V0RGV2aWNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dChmb3JnZXREZXZpY2UpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAvLyBDbGVhciBDU1JGIHRva2VuIGNvb2tpZSBpZiBpbiBjb29raWVzIG1vZGVcbiAgICAvLyBOb3RlOiBCYWNrZW5kIHNob3VsZCBjbGVhciBodHRwT25seSBjb29raWVzLCBidXQgd2UgY2xlYXIgbm9uLWh0dHBPbmx5IG9uZXNcbiAgICBpZiAodGhpcy5jb25maWcudG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGNzcmZDb29raWVOYW1lID0gdGhpcy5jb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAvLyBFeHRyYWN0IGRvbWFpbiBmcm9tIGJhc2VVcmwgaWYgcG9zc2libGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgZG9tYWluPSR7dXJsLmhvc3RuYW1lfWA7XG4gICAgICAgIC8vIEFsc28gdHJ5IHdpdGhvdXQgZG9tYWluIChmb3IgbG9jYWxob3N0KVxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGJhc2VVcmwgcGFyc2luZyBmYWlsc1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgYWxsIHNlc3Npb25zLlxuICAgKlxuICAgKiBSZXZva2VzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgYWNyb3NzIGFsbCBkZXZpY2VzLlxuICAgKiBPcHRpb25hbGx5IHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyBpZiBmb3JnZXREZXZpY2VzIGlzIHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2VzIC0gSWYgdHJ1ZSwgYWxzbyByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zIHJldm9rZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgubG9nb3V0QWxsKCk7XG4gICAqIGNvbnNvbGUubG9nKGBSZXZva2VkICR7cmVzdWx0LnJldm9rZWRDb3VudH0gc2Vzc2lvbnNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgcmV2b2tlZENvdW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dEFsbChmb3JnZXREZXZpY2VzKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5hdXRoLnJlZnJlc2goKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZWZyZXNoVG9rZW5zKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFjY291bnQgUmVjb3ZlcnkgKEZvcmdvdCBQYXNzd29yZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgY29kZSAoZm9yZ290IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhc3N3b3JkIHJlc2V0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBwYXNzd29yZCByZXNldCBjb2RlIGFuZCBzZXQgYSBuZXcgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEBwYXJhbSBjb2RlIC0gT25lLXRpbWUgcmVzZXQgY29kZVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGNvbmZpcm1hdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jb25maXJtRm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY29uZmlybUZvcmdvdFBhc3N3b3JkKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maXJtRm9yZ290UGFzc3dvcmQoaWRlbnRpZmllciwgY29kZSwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkIHdpdGggY29kZSBvciB0b2tlbiAoZ2VuZXJpYyBtZXRob2QgZm9yIGJvdGggYWRtaW4gYW5kIHVzZXItaW5pdGlhdGVkIHJlc2V0cykuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyOlxuICAgKiAtIGNvZGU6IFNob3J0IG51bWVyaWMgY29kZSBmcm9tIGVtYWlsL1NNUyAoNi0xMCBkaWdpdHMpXG4gICAqIC0gdG9rZW46IExvbmcgaGV4IHRva2VuIGZyb20gcmVzZXQgbGluayAoNjQgY2hhcnMpXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBpZGVudGlmaWVyIChlbWFpbCwgdXNlcm5hbWUsIHBob25lKVxuICAgKiBAcGFyYW0gY29kZU9yVG9rZW4gLSBWZXJpZmljYXRpb24gY29kZSBPUiB0b2tlbiBmcm9tIGxpbmtcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBjb2RlIGZyb20gZW1haWxcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICpcbiAgICogLy8gV2l0aCB0b2tlbiBmcm9tIGxpbmtcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICc2NC1jaGFyLXRva2VuJywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZXRQYXNzd29yZFdpdGhDb2RlKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlT3JUb2tlbjogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZFdpdGhDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZXRQYXNzd29yZFdpdGhDb2RlKGlkZW50aWZpZXIsIGNvZGVPclRva2VuLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHVzZXIgcGFzc3dvcmQgKHJlcXVpcmVzIGN1cnJlbnQgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQgLSBDdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZCAobXVzdCBtZWV0IHJlcXVpcmVtZW50cylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcGFzc3dvcmQgaXMgY2hhbmdlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZCgnb2xkUGFzc3dvcmQxMjMnLCAnbmV3U2VjdXJlUGFzc3dvcmQ0NTYhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBjaGFsbGVuZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGVzdGluYXRpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgICogY29uc29sZS5sb2coJ0NvZGUgc2VudCB0bzonLCByZXN1bHQuZGVzdGluYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2VuZENvZGUoc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx7IGRlc3RpbmF0aW9uOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc2V0dXAgZGF0YSAoZm9yIE1GQV9TRVRVUF9SRVFVSVJFRCBjaGFsbGVuZ2UpLlxuICAgKlxuICAgKiBSZXR1cm5zIG1ldGhvZC1zcGVjaWZpYyBzZXR1cCBpbmZvcm1hdGlvbjpcbiAgICogLSBUT1RQOiB7IHNlY3JldCwgcXJDb2RlLCBtYW51YWxFbnRyeUtleSB9XG4gICAqIC0gU01TOiB7IG1hc2tlZFBob25lIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9XG4gICAqIC0gUGFzc2tleTogV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byBzZXQgdXBcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBzZXR1cCBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0dXBEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldFNldHVwRGF0YShzZXNzaW9uLCAndG90cCcpO1xuICAgKiBjb25zb2xlLmxvZygnUVIgQ29kZTonLCBzZXR1cERhdGEuc2V0dXBEYXRhLnFyQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U2V0dXBEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldFNldHVwRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFNldHVwRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0U2V0dXBEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGNoYWxsZW5nZSBkYXRhIChmb3IgTUZBX1JFUVVJUkVEIGNoYWxsZW5nZSAtIGUuZy4sIHBhc3NrZXkgb3B0aW9ucykuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIENoYWxsZW5nZSBtZXRob2RcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjaGFsbGVuZ2UgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNoYWxsZW5nZURhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCAncGFzc2tleScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZURhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldENoYWxsZW5nZURhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBjaGFsbGVuZ2UgKHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY2hhbGxlbmdlIGZsb3cpLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjaGFsbGVuZ2UgaXMgY2xlYXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jbGVhckNoYWxsZW5nZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsZWFyQ2hhbGxlbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsZWFyU3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgYWNjZXNzIHRva2VuIChKU09OIG1vZGUgb25seSkuXG4gICAqXG4gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29uc3VtZXJzIHVzaW5nIEFuZ3VsYXIgYEh0dHBDbGllbnRgIGRpcmVjdGx5XG4gICAqIChvdXRzaWRlIG9mIHRoZSBTREsgbWV0aG9kcykgYW5kIHJlbHlpbmcgb24gYW4gaW50ZXJjZXB0b3IgdG8gYXR0YWNoIEJlYXJlciB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFjY2VzcyB0b2tlbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuZ2V0QWNjZXNzVG9rZW4oKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU29jaWFsIEF1dGhlbnRpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhdGUgc29jaWFsIE9BdXRoIGxvZ2luIGZsb3cuXG4gICAqIFJlZGlyZWN0cyB0aGUgYnJvd3NlciB0byBiYWNrZW5kIGAvYXV0aC9zb2NpYWwvOnByb3ZpZGVyL3JlZGlyZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyICgnZ29vZ2xlJywgJ2FwcGxlJywgJ2ZhY2Vib29rJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCByZWRpcmVjdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlZGlyZWN0IHN0YXJ0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dpbldpdGhTb2NpYWwoJ2dvb2dsZScsIHsgcmV0dXJuVG86ICcvYXV0aC9jYWxsYmFjaycgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoU29jaWFsKHByb3ZpZGVyOiBTb2NpYWxQcm92aWRlciwgb3B0aW9ucz86IFNvY2lhbExvZ2luT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5sb2dpbldpdGhTb2NpYWwocHJvdmlkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2hhbmdlIGFuIGV4Y2hhbmdlVG9rZW4gKGZyb20gcmVkaXJlY3QgY2FsbGJhY2sgVVJMKSBpbnRvIGFuIEF1dGhSZXNwb25zZS5cbiAgICpcbiAgICogVXNlZCBmb3IgYHRva2VuRGVsaXZlcnk6ICdqc29uJ2Agb3IgaHlicmlkIGZsb3dzIHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0cyBiYWNrXG4gICAqIHdpdGggYGV4Y2hhbmdlVG9rZW5gIGluc3RlYWQgb2Ygc2V0dGluZyBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZXhjaGFuZ2VUb2tlbiAtIE9uZS10aW1lIGV4Y2hhbmdlIHRva2VuIGZyb20gdGhlIGNhbGxiYWNrIFVSTFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgbmF0aXZlIHNvY2lhbCB0b2tlbiAobW9iaWxlKS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgLSBTb2NpYWwgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2l0aCBwcm92aWRlciBhbmQgdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TmF0aXZlU29jaWFsKHtcbiAgICogICBwcm92aWRlcjogJ2dvb2dsZScsXG4gICAqICAgaWRUb2tlbjogbmF0aXZlSWRUb2tlbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3Q6IFNvY2lhbFZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0KTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaW5rZWQgc29jaWFsIGFjY291bnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGxpbmtlZCBhY2NvdW50cyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGFjY291bnRzID0gYXdhaXQgdGhpcy5hdXRoLmdldExpbmtlZEFjY291bnRzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdMaW5rZWQgcHJvdmlkZXJzOicsIGFjY291bnRzLnByb3ZpZGVycyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TGlua2VkQWNjb3VudHMoKTogUHJvbWlzZTxMaW5rZWRBY2NvdW50c1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldExpbmtlZEFjY291bnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogTGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIGxpbmtcbiAgICogQHBhcmFtIGNvZGUgLSBPQXV0aCBhdXRob3JpemF0aW9uIGNvZGVcbiAgICogQHBhcmFtIHN0YXRlIC0gT0F1dGggc3RhdGUgcGFyYW1ldGVyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScsIGNvZGUsIHN0YXRlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIsIGNvZGUsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byB1bmxpbmtcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC51bmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IE9BdXRoIGFwcFN0YXRlIGZyb20gc29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHBTdGF0ZSB0aGF0IHdhcyBzdG9yZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCBzb2NpYWxcbiAgICogbG9naW4gcmVkaXJlY3QgY2FsbGJhY2suIFRoaXMgaXMgdXNlZnVsIGZvciByZXN0b3JpbmcgVUkgc3RhdGUsXG4gICAqIGFwcGx5aW5nIGludml0ZSBjb2Rlcywgb3IgdHJhY2tpbmcgcmVmZXJyYWwgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFRoZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgcmV0cmlldmFsIHRvIHByZXZlbnQgcmV1c2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdG9yZWQgYXBwU3RhdGUsIG9yIG51bGwgaWYgbm9uZSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICAgKiBpZiAoYXBwU3RhdGUpIHtcbiAgICogICAvLyBBcHBseSBpbnZpdGUgY29kZSBvciByZXN0b3JlIFVJIHN0YXRlXG4gICAqICAgY29uc29sZS5sb2coJ09BdXRoIHN0YXRlOicsIGFwcFN0YXRlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExhc3RPYXV0aFN0YXRlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdNRkEgZW5hYmxlZDonLCBzdGF0dXMuZW5hYmxlZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWZhU3RhdHVzKCk6IFByb21pc2U8TUZBU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1mYVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgZGV2aWNlcyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgZGV2aWNlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxNRkFEZXZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFEZXZpY2VzKCkgYXMgUHJvbWlzZTxNRkFEZXZpY2VbXT47XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgTUZBIGRldmljZSAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cE1mYURldmljZSgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldHVwTWZhRGV2aWNlKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IE1GQSBzZXR1cCAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2RcbiAgICogQHBhcmFtIHNldHVwRGF0YSAtIFNldHVwIGRhdGEgZnJvbSBzZXR1cE1mYURldmljZVxuICAgKiBAcGFyYW0gZGV2aWNlTmFtZSAtIE9wdGlvbmFsIGRldmljZSBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3RvdHAnLCB7IGNvZGU6ICcxMjM0NTYnIH0sICdNeSBQaG9uZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU1mYVNldHVwKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNldHVwRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGV2aWNlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGRldmljZUlkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC52ZXJpZnlNZmFTZXR1cChtZXRob2QsIHNldHVwRGF0YSwgZGV2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIE1GQSBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlbW92ZU1mYURldmljZSgnc21zJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlbW92ZU1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmVmZXJyZWQgTUZBIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIERldmljZSBtZXRob2QgdG8gc2V0IGFzIHByZWZlcnJlZCAoJ3RvdHAnLCAnc21zJywgJ2VtYWlsJywgb3IgJ3Bhc3NrZXknKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnNldFByZWZlcnJlZE1mYU1ldGhvZCgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldFByZWZlcnJlZE1mYU1ldGhvZChtZXRob2Q6ICd0b3RwJyB8ICdzbXMnIHwgJ2VtYWlsJyB8ICdwYXNza2V5Jyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiYWNrdXAgY29kZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYmFja3VwIGNvZGVzIGFycmF5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICAgKiBjb25zb2xlLmxvZygnQmFja3VwIGNvZGVzOicsIGNvZGVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGVzOiBbJ0xPR0lOX1NVQ0NFU1MnXSxcbiAgICogICBldmVudFN0YXR1czogWydGQUlMVVJFJ10sXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQXVkaXQgaGlzdG9yeTonLCBoaXN0b3J5KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdEhpc3RvcnkoXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PixcbiAgKTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcblxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIE9wZXJhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBZG1pbiBvcGVyYXRpb25zIChpZiBlbmFibGVkIGluIGNvbmZpZykuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFkbWluLWxldmVsIHVzZXIgbWFuYWdlbWVudCBtZXRob2RzOlxuICAgKiAtIFVzZXIgQ1JVRCBvcGVyYXRpb25zXG4gICAqIC0gUGFzc3dvcmQgbWFuYWdlbWVudFxuICAgKiAtIFNlc3Npb24gbWFuYWdlbWVudFxuICAgKiAtIE1GQSBtYW5hZ2VtZW50XG4gICAqIC0gQXVkaXQgaGlzdG9yeVxuICAgKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBhZG1pbiB3YXMgbm90IGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFkbWluT3BlcmF0aW9ucyBpbnN0YW5jZSBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDaGVjayBpZiBhZG1pbiBpcyBhdmFpbGFibGVcbiAgICogaWYgKHRoaXMuYXV0aC5hZG1pbikge1xuICAgKiAgIGNvbnN0IHVzZXJzID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluLmdldFVzZXJzKHsgcGFnZTogMSB9KTtcbiAgICogfVxuICAgKlxuICAgKiAvLyBXaXRoIG9wdGlvbmFsIGNoYWluaW5nXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5hZG1pbj8uZGVsZXRlVXNlcihzdWIpO1xuICAgKlxuICAgKiAvLyBDcmVhdGUgdXNlclxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmNyZWF0ZVVzZXIoe1xuICAgKiAgIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgaXNFbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgYWRtaW4oKTogQWRtaW5PcGVyYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRtaW47XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxufVxuIl19
|
|
995
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQyxPQUFPLEVBQ0wsV0FBVyxHQXNCWixNQUFNLHVCQUF1QixDQUFDOzs7OztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUVILE1BQU0sT0FBTyxXQUFXO0lBa0JBO0lBQ0E7SUFsQkwsTUFBTSxDQUFjO0lBQ3BCLE1BQU0sQ0FBb0I7SUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElBQUksQ0FBQyxDQUFDO0lBQ2hFLHNCQUFzQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO0lBQzdELGdCQUFnQixHQUFHLElBQUksZUFBZSxDQUFzQixJQUFJLENBQUMsQ0FBQztJQUNsRSxpQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO0lBQ3RELFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFNUI7Ozs7O09BS0c7SUFDSCxZQUMrQixNQUF5QixFQUN0RCxXQUErQixFQUNYLE1BQWUsRUFDZixnQkFBbUM7UUFEbkMsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUI7UUFFdkQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFFckIscURBQXFEO1FBQ3JELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLElB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QU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QiwyQ0FBMkM7WUFDM0Msa0NBQWtDO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsbURBQW1ELEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekUsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztJQUNILENBQUM7d0dBaGhDVSxXQUFXLGtCQWdCWixtQkFBbUI7NEdBaEJsQixXQUFXOzs0RkFBWCxXQUFXO2tCQUR2QixVQUFVOzswQkFpQk4sTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUUxQixRQUFROzswQkFDUixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTkF1dGhDbGllbnQsXG4gIE5BdXRoQ2xpZW50Q29uZmlnLFxuICBBdXRoUmVzcG9uc2VDb250ZXh0LFxuICBDaGFsbGVuZ2VSZXNwb25zZSxcbiAgQXV0aFJlc3BvbnNlLFxuICBUb2tlblJlc3BvbnNlLFxuICBBdXRoVXNlcixcbiAgQ29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIEZvcmdvdFBhc3N3b3JkUmVzcG9uc2UsXG4gIFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlLFxuICBVcGRhdGVQcm9maWxlUmVxdWVzdCxcbiAgR2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlLFxuICBHZXRTZXR1cERhdGFSZXNwb25zZSxcbiAgTUZBU3RhdHVzLFxuICBNRkFEZXZpY2UsXG4gIEF1dGhFdmVudCxcbiAgU29jaWFsUHJvdmlkZXIsXG4gIFNvY2lhbExvZ2luT3B0aW9ucyxcbiAgTGlua2VkQWNjb3VudHNSZXNwb25zZSxcbiAgU29jaWFsVmVyaWZ5UmVxdWVzdCxcbiAgQXVkaXRIaXN0b3J5UmVzcG9uc2UsXG4gIEFkbWluT3BlcmF0aW9ucyxcbn0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgYXJvdW5kIE5BdXRoQ2xpZW50IHRoYXQgcHJvdmlkZXMgcHJvbWlzZS1iYXNlZCBhdXRoIG1ldGhvZHMgYW5kIHJlYWN0aXZlIHN0YXRlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlczpcbiAqIC0gUmVhY3RpdmUgc3RhdGUgKGN1cnJlbnRVc2VyJCwgaXNBdXRoZW50aWNhdGVkJCwgY2hhbGxlbmdlJClcbiAqIC0gQWxsIGNvcmUgYXV0aCBtZXRob2RzIGFzIFByb21pc2VzIChsb2dpbiwgc2lnbnVwLCBsb2dvdXQsIHJlZnJlc2gpXG4gKiAtIFByb2ZpbGUgbWFuYWdlbWVudCAoZ2V0UHJvZmlsZSwgdXBkYXRlUHJvZmlsZSwgY2hhbmdlUGFzc3dvcmQpXG4gKiAtIENoYWxsZW5nZSBmbG93IG1ldGhvZHMgKHJlc3BvbmRUb0NoYWxsZW5nZSwgcmVzZW5kQ29kZSlcbiAqIC0gTUZBIG1hbmFnZW1lbnQgKGdldE1mYVN0YXR1cywgc2V0dXBNZmFEZXZpY2UsIGV0Yy4pXG4gKiAtIFNvY2lhbCBhdXRoZW50aWNhdGlvbiBhbmQgYWNjb3VudCBsaW5raW5nXG4gKiAtIERldmljZSB0cnVzdCBtYW5hZ2VtZW50XG4gKiAtIEF1ZGl0IGhpc3RvcnlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSBhdXRoOiBBdXRoU2VydmljZSkge31cbiAqXG4gKiAvLyBSZWFjdGl2ZSBzdGF0ZVxuICogdGhpcy5hdXRoLmN1cnJlbnRVc2VyJC5zdWJzY3JpYmUodXNlciA9PiAuLi4pO1xuICogdGhpcy5hdXRoLmlzQXV0aGVudGljYXRlZCQuc3Vic2NyaWJlKGlzQXV0aCA9PiAuLi4pO1xuICpcbiAqIC8vIEF1dGggb3BlcmF0aW9ucyB3aXRoIGFzeW5jL2F3YWl0XG4gKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5sb2dpbihlbWFpbCwgcGFzc3dvcmQpO1xuICpcbiAqIC8vIFByb2ZpbGUgbWFuYWdlbWVudFxuICogYXdhaXQgdGhpcy5hdXRoLmNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkLCBuZXdQYXNzd29yZCk7XG4gKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJyB9KTtcbiAqXG4gKiAvLyBNRkEgb3BlcmF0aW9uc1xuICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBdXRoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50OiBOQXV0aENsaWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnO1xuICBwcml2YXRlIHJlYWRvbmx5IGN1cnJlbnRVc2VyU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFVzZXIgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpc0F1dGhlbnRpY2F0ZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbGxlbmdlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFJlc3BvbnNlIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aEV2ZW50c1N1YmplY3QgPSBuZXcgU3ViamVjdDxBdXRoRXZlbnQ+KCk7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQHBhcmFtIGNvbmZpZyAtIEluamVjdGVkIGNsaWVudCBjb25maWd1cmF0aW9uIChyZXF1aXJlZClcbiAgICogQHBhcmFtIGh0dHBBZGFwdGVyIC0gQW5ndWxhciBIVFRQIGFkYXB0ZXIgZm9yIG1ha2luZyByZXF1ZXN0cyAocmVxdWlyZWQpXG4gICAqIEBwYXJhbSByb3V0ZXIgLSBBbmd1bGFyIFJvdXRlciAob3B0aW9uYWwsIGF1dG9tYXRpY2FsbHkgdXNlZCBmb3IgbmF2aWdhdGlvbiBpZiBhdmFpbGFibGUpXG4gICAqIEBwYXJhbSByZWNhcHRjaGFTZXJ2aWNlIC0gUmVjYXB0Y2hhU2VydmljZSAob3B0aW9uYWwsIGZvciBhdXRvbWF0aWMgdG9rZW4gZ2VuZXJhdGlvbilcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTkFVVEhfQ0xJRU5UX0NPTkZJRykgY29uZmlnOiBOQXV0aENsaWVudENvbmZpZyxcbiAgICBodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcm91dGVyPzogUm91dGVyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVjYXB0Y2hhU2VydmljZT86IFJlY2FwdGNoYVNlcnZpY2UsXG4gICkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuXG4gICAgLy8gVXNlIHByb3ZpZGVkIGh0dHBBZGFwdGVyIChmcm9tIGNvbmZpZyBvciBpbmplY3RlZClcbiAgICBjb25zdCBhZGFwdGVyID0gY29uZmlnLmh0dHBBZGFwdGVyID8/IGh0dHBBZGFwdGVyO1xuICAgIGlmICghYWRhcHRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSHR0cEFkYXB0ZXIgbm90IGZvdW5kLiBFaXRoZXIgcHJvdmlkZSBodHRwQWRhcHRlciBpbiBOQVVUSF9DTElFTlRfQ09ORklHIG9yIGVuc3VyZSBIdHRwQ2xpZW50IGlzIGF2YWlsYWJsZS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gQXV0b21hdGljIEFuZ3VsYXIgUm91dGVyIGludGVncmF0aW9uXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIElmIFJvdXRlciBpcyBhdmFpbGFibGUgYW5kIG5vIGN1c3RvbSBuYXZpZ2F0aW9uSGFuZGxlciBpcyBwcm92aWRlZCxcbiAgICAvLyBhdXRvbWF0aWNhbGx5IHVzZSBBbmd1bGFyIFJvdXRlcidzIG5hdmlnYXRlQnlVcmwoKSB0byBwcmV2ZW50IHBhZ2UgcmVmcmVzaGVzXG4gICAgY29uc3QgbmF2aWdhdGlvbkhhbmRsZXIgPVxuICAgICAgY29uZmlnLm5hdmlnYXRpb25IYW5kbGVyID8/XG4gICAgICAodGhpcy5yb3V0ZXJcbiAgICAgICAgPyBhc3luYyAodXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucm91dGVyIS5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gSU1QT1JUQU5UOiBDaGFsbGVuZ2Utc3RhdGUgaHlkcmF0aW9uIEJFRk9SRSBuYXZpZ2F0aW9uIChBbmd1bGFyIGd1YXJkIHNhZmV0eSlcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBgTkF1dGhDbGllbnQubG9naW4oKWAgYXV0by1uYXZpZ2F0ZXMgdmlhIENoYWxsZW5nZVJvdXRlciAqYmVmb3JlKiByZXR1cm5pbmcuXG4gICAgLy8gVGhlIEFuZ3VsYXIgc2FtcGxlIGFwcCB1c2VzIGEgc3luY2hyb25vdXMgZ3VhcmQgKGBjaGFsbGVuZ2VSb3V0ZUd1YXJkYCkgdGhhdFxuICAgIC8vIHJlYWRzIHRoZSBjdXJyZW50IGNoYWxsZW5nZSB2aWEgYEF1dGhTZXJ2aWNlLmdldEN1cnJlbnRDaGFsbGVuZ2UoKWAgKGJhY2tlZCBieVxuICAgIC8vIGBjaGFsbGVuZ2VTdWJqZWN0LnZhbHVlYCkuIElmIG5hdmlnYXRpb24gaGFwcGVucyBiZWZvcmUgYGNoYWxsZW5nZVN1YmplY3RgIGlzXG4gICAgLy8gdXBkYXRlZCwgdGhlIGd1YXJkIGluY29ycmVjdGx5IHJlZGlyZWN0cyBiYWNrIHRvIGAvbG9naW5gLlxuICAgIC8vXG4gICAgLy8gRml4OiBpbnRlcmNlcHQgdGhlIFNESydzIGF1dG8tbmF2aWdhdGlvbiBob29rIChgb25BdXRoUmVzcG9uc2VgKSwgcHVibGlzaCB0aGVcbiAgICAvLyBjaGFsbGVuZ2Ugc3RhdGUgaW1tZWRpYXRlbHksIHRoZW4gcGVyZm9ybSBkZWZhdWx0IG5hdmlnYXRpb24gKG9yIGRlbGVnYXRlIHRvXG4gICAgLy8gdGhlIHVzZXIncyBjdXN0b20gYG9uQXV0aFJlc3BvbnNlYCBpZiBwcm92aWRlZCkuXG4gICAgY29uc3QgdXNlck9uQXV0aFJlc3BvbnNlID0gY29uZmlnLm9uQXV0aFJlc3BvbnNlO1xuXG4gICAgdGhpcy5jbGllbnQgPSBuZXcgTkF1dGhDbGllbnQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgaHR0cEFkYXB0ZXI6IGFkYXB0ZXIsXG4gICAgICBuYXZpZ2F0aW9uSGFuZGxlcixcbiAgICAgIG9uQXV0aFJlc3BvbnNlOiBhc3luYyAocmVzcG9uc2U6IEF1dGhSZXNwb25zZSwgY29udGV4dDogQXV0aFJlc3BvbnNlQ29udGV4dCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBFbnN1cmUgZ3VhcmRzIGNhbiBzeW5jaHJvbm91c2x5IHNlZSB0aGUgYWN0aXZlIGNoYWxsZW5nZSBiZWZvcmUgbmF2aWdhdGlvbi5cbiAgICAgICAgdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXNwb25zZSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIGNvbnN1bWVyIHByb3ZpZGVkIHRoZWlyIG93biBoYW5kbGVyLCBsZXQgdGhlbSB0YWtlIGZ1bGwgY29udHJvbC5cbiAgICAgICAgaWYgKHVzZXJPbkF1dGhSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHVzZXJPbkF1dGhSZXNwb25zZShyZXNwb25zZSwgY29udGV4dCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVmYXVsdCBuYXZpZ2F0aW9uIGJlaGF2aW9yIChtYXRjaGVzIENoYWxsZW5nZVJvdXRlci5oYW5kbGVBdXRoUmVzcG9uc2UpXG4gICAgICAgIGNvbnN0IHJvdXRlciA9IHRoaXMuY2xpZW50LmdldENoYWxsZW5nZVJvdXRlcigpO1xuICAgICAgICBpZiAocmVzcG9uc2UuY2hhbGxlbmdlTmFtZSkge1xuICAgICAgICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQcmVmZXIgYXBwU3RhdGUgcHJvdmlkZWQgdmlhIGNvbnRleHQgKHNvY2lhbCByZWRpcmVjdCBndWFyZCAvIGV4Y2hhbmdlIGZsb3cpLlxuICAgICAgICAvLyBJTVBPUlRBTlQ6IERvIG5vdCBjb25zdW1lL2NsZWFyIHBlcnNpc3RlZCBPQXV0aCBzdGF0ZSBoZXJlOyBsZWF2ZSBpdCBhdmFpbGFibGVcbiAgICAgICAgLy8gZm9yIGNvbnN1bWVycyB2aWEgZ2V0TGFzdE9hdXRoU3RhdGUoKS5cbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGNvbnRleHQuYXBwU3RhdGUgPyB7IGFwcFN0YXRlOiBjb250ZXh0LmFwcFN0YXRlIH0gOiB1bmRlZmluZWQsIGNvbnRleHQpO1xuICAgICAgfSxcbiAgICAgIG9uQXV0aFN0YXRlQ2hhbmdlOiAodXNlcjogQXV0aFVzZXIgfCBudWxsKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KEJvb2xlYW4odXNlcikpO1xuICAgICAgICBjb25maWcub25BdXRoU3RhdGVDaGFuZ2U/Lih1c2VyKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBGb3J3YXJkIGFsbCBjbGllbnQgZXZlbnRzIHRvIE9ic2VydmFibGUgc3RyZWFtXG4gICAgdGhpcy5jbGllbnQub24oJyonLCAoZXZlbnQ6IEF1dGhFdmVudCkgPT4ge1xuICAgICAgdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5uZXh0KGV2ZW50KTtcbiAgICB9KTtcblxuICAgIC8vIEF1dG8taW5pdGlhbGl6ZSBvbiBjb25zdHJ1Y3Rpb24gKGh5ZHJhdGUgZnJvbSBzdG9yYWdlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBSZWFjdGl2ZSBTdGF0ZSBPYnNlcnZhYmxlc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgdXNlciBvYnNlcnZhYmxlLlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRVc2VyJCgpOiBPYnNlcnZhYmxlPEF1dGhVc2VyIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVkIHN0YXRlIG9ic2VydmFibGUuXG4gICAqL1xuICBnZXQgaXNBdXRoZW50aWNhdGVkJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEN1cnJlbnQgY2hhbGxlbmdlIG9ic2VydmFibGUgKGZvciByZWFjdGl2ZSBjaGFsbGVuZ2UgbmF2aWdhdGlvbikuXG4gICAqL1xuICBnZXQgY2hhbGxlbmdlJCgpOiBPYnNlcnZhYmxlPEF1dGhSZXNwb25zZSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jaGFsbGVuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIGFsbCBhdXRoIGxpZmVjeWNsZSBldmVudHMgZm9yIGN1c3RvbSBsb2dpYywgYW5hbHl0aWNzLCBvciBVSSB1cGRhdGVzLlxuICAgKi9cbiAgZ2V0IGF1dGhFdmVudHMkKCk6IE9ic2VydmFibGU8QXV0aEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aEV2ZW50c1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3VjY2Vzc2Z1bCBhdXRoZW50aWNhdGlvbiBldmVudHMgc3RyZWFtLlxuICAgKiBFbWl0cyB3aGVuIHVzZXIgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZXMgKGxvZ2luLCBzaWdudXAsIHNvY2lhbCBhdXRoKS5cbiAgICovXG4gIGdldCBhdXRoU3VjY2VzcyQoKTogT2JzZXJ2YWJsZTxBdXRoRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5hdXRoRXZlbnRzU3ViamVjdC5waXBlKGZpbHRlcigoZSkgPT4gZS50eXBlID09PSAnYXV0aDpzdWNjZXNzJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIGVycm9yIGV2ZW50cyBzdHJlYW0uXG4gICAqIEVtaXRzIHdoZW4gYXV0aGVudGljYXRpb24gZmFpbHMgKGxvZ2luIGVycm9yLCBPQXV0aCBlcnJvciwgZXRjLikuXG4gICAqL1xuICBnZXQgYXV0aEVycm9yJCgpOiBPYnNlcnZhYmxlPEF1dGhFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhFdmVudHNTdWJqZWN0LnBpcGUoZmlsdGVyKChlKSA9PiBlLnR5cGUgPT09ICdhdXRoOmVycm9yJyB8fCBlLnR5cGUgPT09ICdvYXV0aDplcnJvcicpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU3luYyBTdGF0ZSBBY2Nlc3NvcnMgKGZvciBndWFyZHMsIHRlbXBsYXRlcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhdXRoZW50aWNhdGVkIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBpc0F1dGhlbnRpY2F0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzQXV0aGVudGljYXRlZFN5bmMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIChzeW5jLCB1c2VzIGNhY2hlZCBzdGF0ZSkuXG4gICAqL1xuICBnZXRDdXJyZW50VXNlcigpOiBBdXRoVXNlciB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGNoYWxsZW5nZSAoc3luYykuXG4gICAqL1xuICBnZXRDdXJyZW50Q2hhbGxlbmdlKCk6IEF1dGhSZXNwb25zZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmNoYWxsZW5nZVN1YmplY3QudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNoYWxsZW5nZSByb3V0ZXIgZm9yIG1hbnVhbCBuYXZpZ2F0aW9uIGNvbnRyb2wuXG4gICAqIFVzZWZ1bCBmb3IgZ3VhcmRzIHRoYXQgbmVlZCB0byBoYW5kbGUgZXJyb3JzIG9yIGJ1aWxkIGN1c3RvbSBVUkxzLlxuICAgKlxuICAgKiBAcmV0dXJucyBDaGFsbGVuZ2VSb3V0ZXIgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb3V0ZXIgPSB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlUm91dGVyKCk7XG4gICAqIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hhbGxlbmdlUm91dGVyKCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29yZSBBdXRoIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBMb2dpbiB3aXRoIGlkZW50aWZpZXIgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgcGFzcyB0aGUgdG9rZW4gZXhwbGljaXRseS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsIG9yIHVzZXJuYW1lXG4gICAqIEBwYXJhbSBwYXNzd29yZCAtIFVzZXIgcGFzc3dvcmRcbiAgICogQHBhcmFtIHJlY2FwdGNoYVRva2VuIC0gT3B0aW9uYWwgcmVDQVBUQ0hBIHRva2VuIChmb3IgdjIgbWFudWFsIG1vZGUgb3Igd2hlbiBhdXRvLWdlbmVyYXRpb24gaXMgZGlzYWJsZWQpXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZSBCYXNpYyBMb2dpblxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBXaXRoIE1hbnVhbCByZUNBUFRDSEEgKHYyKVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmxvZ2luKCd1c2VyQGV4YW1wbGUuY29tJywgJ3Bhc3N3b3JkJywgcmVjYXB0Y2hhVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luKGlkZW50aWZpZXI6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZywgcmVjYXB0Y2hhVG9rZW4/OiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbihyZWNhcHRjaGFUb2tlbiwgJ2xvZ2luJyk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQubG9naW4oaWRlbnRpZmllciwgcGFzc3dvcmQsIHRva2VuKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ251cCB3aXRoIGNyZWRlbnRpYWxzLlxuICAgKlxuICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyByZUNBUFRDSEEgdG9rZW4gaWYgY29uZmlndXJlZCAodjMgb25seSkuXG4gICAqIEZvciB2MiBtYW51YWwgbW9kZSwgaW5jbHVkZSB0b2tlbiBpbiBwYXlsb2FkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCAtIFNpZ251cCByZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGF1dGggcmVzcG9uc2Ugb3IgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlIEJhc2ljIFNpZ251cFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLnNpZ251cCh7XG4gICAqICAgZW1haWw6ICduZXdAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGZpcnN0TmFtZTogJ0pvaG4nLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFdpdGggTWFudWFsIHJlQ0FQVENIQSAodjIpXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguc2lnbnVwKHtcbiAgICogICBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgcmVjYXB0Y2hhVG9rZW46IHRva2VuLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzaWdudXAocGF5bG9hZDogUGFyYW1ldGVyczxOQXV0aENsaWVudFsnc2lnbnVwJ10+WzBdKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICAvLyBBdXRvLWdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbiBmb3IgdjMgaWYgY29uZmlndXJlZCBhbmQgbm90IGFscmVhZHkgcHJvdmlkZWRcbiAgICBjb25zdCBwYXlsb2FkV2l0aFJlY2FwdGNoYSA9IHBheWxvYWQgYXMgeyByZWNhcHRjaGFUb2tlbj86IHN0cmluZyB9O1xuICAgIFxuICAgIGlmICghcGF5bG9hZFdpdGhSZWNhcHRjaGEucmVjYXB0Y2hhVG9rZW4pIHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRSZWNhcHRjaGFUb2tlbih1bmRlZmluZWQsICdzaWdudXAnKTtcbiAgICAgIGlmICh0b2tlbikge1xuICAgICAgICBwYXlsb2FkID0geyAuLi5wYXlsb2FkLCByZWNhcHRjaGFUb2tlbjogdG9rZW4gfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5zaWdudXAocGF5bG9hZCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgY3VycmVudCBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlIC0gSWYgdHJ1ZSwgcmVtb3ZlcyBkZXZpY2UgdHJ1c3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9nb3V0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0KGZvcmdldERldmljZT86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXQoZm9yZ2V0RGV2aWNlKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuXG4gICAgLy8gQ2xlYXIgQ1NSRiB0b2tlbiBjb29raWUgaWYgaW4gY29va2llcyBtb2RlXG4gICAgLy8gTm90ZTogQmFja2VuZCBzaG91bGQgY2xlYXIgaHR0cE9ubHkgY29va2llcywgYnV0IHdlIGNsZWFyIG5vbi1odHRwT25seSBvbmVzXG4gICAgaWYgKHRoaXMuY29uZmlnLnRva2VuRGVsaXZlcnkgPT09ICdjb29raWVzJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25zdCBjc3JmQ29va2llTmFtZSA9IHRoaXMuY29uZmlnLmNzcmY/LmNvb2tpZU5hbWUgPz8gJ25hdXRoX2NzcmZfdG9rZW4nO1xuICAgICAgLy8gRXh0cmFjdCBkb21haW4gZnJvbSBiYXNlVXJsIGlmIHBvc3NpYmxlXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHRoaXMuY29uZmlnLmJhc2VVcmwpO1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS87IGRvbWFpbj0ke3VybC5ob3N0bmFtZX1gO1xuICAgICAgICAvLyBBbHNvIHRyeSB3aXRob3V0IGRvbWFpbiAoZm9yIGxvY2FsaG9zdClcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBGYWxsYmFjayBpZiBiYXNlVXJsIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYCR7Y3NyZkNvb2tpZU5hbWV9PTsgZXhwaXJlcz1UaHUsIDAxIEphbiAxOTcwIDAwOjAwOjAwIFVUQzsgcGF0aD0vYDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9nb3V0IGFsbCBzZXNzaW9ucy5cbiAgICpcbiAgICogUmV2b2tlcyBhbGwgYWN0aXZlIHNlc3Npb25zIGZvciB0aGUgY3VycmVudCB1c2VyIGFjcm9zcyBhbGwgZGV2aWNlcy5cbiAgICogT3B0aW9uYWxseSByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgaWYgZm9yZ2V0RGV2aWNlcyBpcyB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gZm9yZ2V0RGV2aWNlcyAtIElmIHRydWUsIGFsc28gcmV2b2tlcyBhbGwgdHJ1c3RlZCBkZXZpY2VzIChkZWZhdWx0OiBmYWxzZSlcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIG51bWJlciBvZiBzZXNzaW9ucyByZXZva2VkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmxvZ291dEFsbCgpO1xuICAgKiBjb25zb2xlLmxvZyhgUmV2b2tlZCAke3Jlc3VsdC5yZXZva2VkQ291bnR9IHNlc3Npb25zYCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9nb3V0QWxsKGZvcmdldERldmljZXM/OiBib29sZWFuKTogUHJvbWlzZTx7IHJldm9rZWRDb3VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5sb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcyk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgLy8gRXhwbGljaXRseSB1cGRhdGUgYXV0aCBzdGF0ZSBhZnRlciBsb2dvdXRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2ggdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbmV3IHRva2Vuc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VucyA9IGF3YWl0IHRoaXMuYXV0aC5yZWZyZXNoKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVmcmVzaFRva2VucygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBY2NvdW50IFJlY292ZXJ5IChGb3Jnb3QgUGFzc3dvcmQpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVxdWVzdCBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgKGZvcmdvdCBwYXNzd29yZCkuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBwYXNzd29yZCByZXNldCByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5mb3Jnb3RQYXNzd29yZCgndXNlckBleGFtcGxlLmNvbScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXI6IHN0cmluZyk6IFByb21pc2U8Rm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5mb3Jnb3RQYXNzd29yZChpZGVudGlmaWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maXJtIGEgcGFzc3dvcmQgcmVzZXQgY29kZSBhbmQgc2V0IGEgbmV3IHBhc3N3b3JkLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgZW1haWwsIHVzZXJuYW1lLCBvciBwaG9uZVxuICAgKiBAcGFyYW0gY29kZSAtIE9uZS10aW1lIHJlc2V0IGNvZGVcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBjb25maXJtYXRpb24gcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY29uZmlybUZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJywgJzEyMzQ1NicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNvbmZpcm1Gb3Jnb3RQYXNzd29yZChcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Q29uZmlybUZvcmdvdFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY29uZmlybUZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIsIGNvZGUsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCBwYXNzd29yZCB3aXRoIGNvZGUgb3IgdG9rZW4gKGdlbmVyaWMgbWV0aG9kIGZvciBib3RoIGFkbWluIGFuZCB1c2VyLWluaXRpYXRlZCByZXNldHMpLlxuICAgKlxuICAgKiBBY2NlcHRzIGVpdGhlcjpcbiAgICogLSBjb2RlOiBTaG9ydCBudW1lcmljIGNvZGUgZnJvbSBlbWFpbC9TTVMgKDYtMTAgZGlnaXRzKVxuICAgKiAtIHRva2VuOiBMb25nIGhleCB0b2tlbiBmcm9tIHJlc2V0IGxpbmsgKDY0IGNoYXJzKVxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciAtIFVzZXIgaWRlbnRpZmllciAoZW1haWwsIHVzZXJuYW1lLCBwaG9uZSlcbiAgICogQHBhcmFtIGNvZGVPclRva2VuIC0gVmVyaWZpY2F0aW9uIGNvZGUgT1IgdG9rZW4gZnJvbSBsaW5rXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFdpdGggY29kZSBmcm9tIGVtYWlsXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqXG4gICAqIC8vIFdpdGggdG9rZW4gZnJvbSBsaW5rXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZXNldFBhc3N3b3JkV2l0aENvZGUoJ3VzZXJAZXhhbXBsZS5jb20nLCAnNjQtY2hhci10b2tlbicsICdOZXdQYXNzMTIzIScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2V0UGFzc3dvcmRXaXRoQ29kZShcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcsXG4gICAgY29kZU9yVG9rZW46IHN0cmluZyxcbiAgICBuZXdQYXNzd29yZDogc3RyaW5nLFxuICApOiBQcm9taXNlPFJlc2V0UGFzc3dvcmRXaXRoQ29kZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlc2V0UGFzc3dvcmRXaXRoQ29kZShpZGVudGlmaWVyLCBjb2RlT3JUb2tlbiwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZSB1c2VyIHBhc3N3b3JkIChyZXF1aXJlcyBjdXJyZW50IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIG9sZFBhc3N3b3JkIC0gQ3VycmVudCBwYXNzd29yZFxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmQgKG11c3QgbWVldCByZXF1aXJlbWVudHMpXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHBhc3N3b3JkIGlzIGNoYW5nZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoJ29sZFBhc3N3b3JkMTIzJywgJ25ld1NlY3VyZVBhc3N3b3JkNDU2IScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNoYW5nZVBhc3N3b3JkKG9sZFBhc3N3b3JkOiBzdHJpbmcsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQsIG5ld1Bhc3N3b3JkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUHJvZmlsZSBNYW5hZ2VtZW50XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGN1cnJlbnQgdXNlciBwcm9maWxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXV0aC5nZXRQcm9maWxlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdVc2VyIHByb2ZpbGU6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0UHJvZmlsZSgpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFByb2ZpbGUoKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIGZldGNoZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSB1cGRhdGVzIC0gUHJvZmlsZSBmaWVsZHMgdG8gdXBkYXRlXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgdXBkYXRlZCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLnVwZGF0ZVByb2ZpbGUoeyBmaXJzdE5hbWU6ICdKb2huJywgbGFzdE5hbWU6ICdEb2UnIH0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJvZmlsZSB1cGRhdGVkOicsIHVzZXIpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZVByb2ZpbGUodXBkYXRlczogVXBkYXRlUHJvZmlsZVJlcXVlc3QpOiBQcm9taXNlPEF1dGhVc2VyPiB7XG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuY2xpZW50LnVwZGF0ZVByb2ZpbGUodXBkYXRlcyk7XG4gICAgLy8gVXBkYXRlIGxvY2FsIHN0YXRlIHdoZW4gcHJvZmlsZSBpcyB1cGRhdGVkXG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICByZXR1cm4gdXNlcjtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ2hhbGxlbmdlIEZsb3cgTWV0aG9kcyAoRXNzZW50aWFsIGZvciBhbnkgYXV0aCBmbG93KVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFJlc3BvbmQgdG8gYSBjaGFsbGVuZ2UgKFZFUklGWV9FTUFJTCwgVkVSSUZZX1BIT05FLCBNRkFfUkVRVUlSRUQsIGV0Yy4pLlxuICAgKlxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBDaGFsbGVuZ2UgcmVzcG9uc2UgZGF0YVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggYXV0aCByZXNwb25zZSBvciBuZXh0IGNoYWxsZW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5yZXNwb25kVG9DaGFsbGVuZ2Uoe1xuICAgKiAgIHNlc3Npb246IGNoYWxsZW5nZVNlc3Npb24sXG4gICAqICAgdHlwZTogJ1ZFUklGWV9FTUFJTCcsXG4gICAqICAgY29kZTogJzEyMzQ1NicsXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZTogQ2hhbGxlbmdlUmVzcG9uc2UpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnJlc3BvbmRUb0NoYWxsZW5nZShyZXNwb25zZSk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNlbmQgY2hhbGxlbmdlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRlc3RpbmF0aW9uIGluZm9ybWF0aW9uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc2VuZENvZGUoc2Vzc2lvbik7XG4gICAqIGNvbnNvbGUubG9nKCdDb2RlIHNlbnQgdG86JywgcmVzdWx0LmRlc3RpbmF0aW9uKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXNlbmRDb2RlKHNlc3Npb246IHN0cmluZyk6IFByb21pc2U8eyBkZXN0aW5hdGlvbjogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHNldHVwIGRhdGEgKGZvciBNRkFfU0VUVVBfUkVRVUlSRUQgY2hhbGxlbmdlKS5cbiAgICpcbiAgICogUmV0dXJucyBtZXRob2Qtc3BlY2lmaWMgc2V0dXAgaW5mb3JtYXRpb246XG4gICAqIC0gVE9UUDogeyBzZWNyZXQsIHFyQ29kZSwgbWFudWFsRW50cnlLZXkgfVxuICAgKiAtIFNNUzogeyBtYXNrZWRQaG9uZSB9XG4gICAqIC0gRW1haWw6IHsgbWFza2VkRW1haWwgfVxuICAgKiAtIFBhc3NrZXk6IFdlYkF1dGhuIHJlZ2lzdHJhdGlvbiBvcHRpb25zXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgJ3RvdHAnKTtcbiAgICogY29uc29sZS5sb2coJ1FSIENvZGU6Jywgc2V0dXBEYXRhLnNldHVwRGF0YS5xckNvZGUpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFNldHVwRGF0YShzZXNzaW9uOiBzdHJpbmcsIG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTxHZXRTZXR1cERhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRTZXR1cERhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldFNldHVwRGF0YSddPlsxXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IE1GQSBjaGFsbGVuZ2UgZGF0YSAoZm9yIE1GQV9SRVFVSVJFRCBjaGFsbGVuZ2UgLSBlLmcuLCBwYXNza2V5IG9wdGlvbnMpLlxuICAgKlxuICAgKiBAcGFyYW0gc2Vzc2lvbiAtIENoYWxsZW5nZSBzZXNzaW9uIHRva2VuXG4gICAqIEBwYXJhbSBtZXRob2QgLSBDaGFsbGVuZ2UgbWV0aG9kXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY2hhbGxlbmdlIGRhdGEgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjaGFsbGVuZ2VEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgJ3Bhc3NrZXknKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldENoYWxsZW5nZURhdGFSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRDaGFsbGVuZ2VEYXRhKHNlc3Npb24sIG1ldGhvZCBhcyBQYXJhbWV0ZXJzPE5BdXRoQ2xpZW50WydnZXRDaGFsbGVuZ2VEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBzdG9yZWQgY2hhbGxlbmdlICh3aGVuIG5hdmlnYXRpbmcgYXdheSBmcm9tIGNoYWxsZW5nZSBmbG93KS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gY2hhbGxlbmdlIGlzIGNsZWFyZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGguY2xlYXJDaGFsbGVuZ2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBjbGVhckNoYWxsZW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5jbGVhclN0b3JlZENoYWxsZW5nZSgpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IGFjY2VzcyB0b2tlbiAoSlNPTiBtb2RlIG9ubHkpLlxuICAgKlxuICAgKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGNvbnN1bWVycyB1c2luZyBBbmd1bGFyIGBIdHRwQ2xpZW50YCBkaXJlY3RseVxuICAgKiAob3V0c2lkZSBvZiB0aGUgU0RLIG1ldGhvZHMpIGFuZCByZWx5aW5nIG9uIGFuIGludGVyY2VwdG9yIHRvIGF0dGFjaCBCZWFyZXIgdG9rZW5zLlxuICAgKlxuICAgKiBAcmV0dXJucyBBY2Nlc3MgdG9rZW4sIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hdXRoLmdldEFjY2Vzc1Rva2VuKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QWNjZXNzVG9rZW4oKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmdldEFjY2Vzc1Rva2VuKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNvY2lhbCBBdXRoZW50aWNhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlIHNvY2lhbCBPQXV0aCBsb2dpbiBmbG93LlxuICAgKiBSZWRpcmVjdHMgdGhlIGJyb3dzZXIgdG8gYmFja2VuZCBgL2F1dGgvc29jaWFsLzpwcm92aWRlci9yZWRpcmVjdGAuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciAoJ2dvb2dsZScsICdhcHBsZScsICdmYWNlYm9vaycpXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgcmVkaXJlY3Qgb3B0aW9uc1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiByZWRpcmVjdCBzdGFydHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubG9naW5XaXRoU29jaWFsKCdnb29nbGUnLCB7IHJldHVyblRvOiAnL2F1dGgvY2FsbGJhY2snIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGxvZ2luV2l0aFNvY2lhbChwcm92aWRlcjogU29jaWFsUHJvdmlkZXIsIG9wdGlvbnM/OiBTb2NpYWxMb2dpbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubG9naW5XaXRoU29jaWFsKHByb3ZpZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGNoYW5nZSBhbiBleGNoYW5nZVRva2VuIChmcm9tIHJlZGlyZWN0IGNhbGxiYWNrIFVSTCkgaW50byBhbiBBdXRoUmVzcG9uc2UuXG4gICAqXG4gICAqIFVzZWQgZm9yIGB0b2tlbkRlbGl2ZXJ5OiAnanNvbidgIG9yIGh5YnJpZCBmbG93cyB3aGVyZSB0aGUgYmFja2VuZCByZWRpcmVjdHMgYmFja1xuICAgKiB3aXRoIGBleGNoYW5nZVRva2VuYCBpbnN0ZWFkIG9mIHNldHRpbmcgY29va2llcy5cbiAgICpcbiAgICogQHBhcmFtIGV4Y2hhbmdlVG9rZW4gLSBPbmUtdGltZSBleGNoYW5nZSB0b2tlbiBmcm9tIHRoZSBjYWxsYmFjayBVUkxcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbjogc3RyaW5nKTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlcyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IG5hdGl2ZSBzb2NpYWwgdG9rZW4gKG1vYmlsZSkuXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IC0gU29jaWFsIHZlcmlmaWNhdGlvbiByZXF1ZXN0IHdpdGggcHJvdmlkZXIgYW5kIHRva2VuXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgQXV0aFJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU5hdGl2ZVNvY2lhbCh7XG4gICAqICAgcHJvdmlkZXI6ICdnb29nbGUnLFxuICAgKiAgIGlkVG9rZW46IG5hdGl2ZUlkVG9rZW4sXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0OiBTb2NpYWxWZXJpZnlSZXF1ZXN0KTogUHJvbWlzZTxBdXRoUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC52ZXJpZnlOYXRpdmVTb2NpYWwocmVxdWVzdCk7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbGlua2VkIHNvY2lhbCBhY2NvdW50cy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBsaW5rZWQgYWNjb3VudHMgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhY2NvdW50cyA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICAgKiBjb25zb2xlLmxvZygnTGlua2VkIHByb3ZpZGVyczonLCBhY2NvdW50cy5wcm92aWRlcnMpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExpbmtlZEFjY291bnRzKCk6IFByb21pc2U8TGlua2VkQWNjb3VudHNSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMaW5rZWRBY2NvdW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byBsaW5rXG4gICAqIEBwYXJhbSBjb2RlIC0gT0F1dGggYXV0aG9yaXphdGlvbiBjb2RlXG4gICAqIEBwYXJhbSBzdGF0ZSAtIE9BdXRoIHN0YXRlIHBhcmFtZXRlclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnLCBjb2RlLCBzdGF0ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbGlua1NvY2lhbEFjY291bnQocHJvdmlkZXI6IHN0cmluZywgY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyLCBjb2RlLCBzdGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogVW5saW5rIHNvY2lhbCBhY2NvdW50LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXIgLSBTb2NpYWwgcHJvdmlkZXIgdG8gdW5saW5rXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgudW5saW5rU29jaWFsQWNjb3VudCgnZ29vZ2xlJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnVubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGFzdCBPQXV0aCBhcHBTdGF0ZSBmcm9tIHNvY2lhbCByZWRpcmVjdCBjYWxsYmFjay5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgYXBwU3RhdGUgdGhhdCB3YXMgc3RvcmVkIGR1cmluZyB0aGUgbW9zdCByZWNlbnQgc29jaWFsXG4gICAqIGxvZ2luIHJlZGlyZWN0IGNhbGxiYWNrLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVzdG9yaW5nIFVJIHN0YXRlLFxuICAgKiBhcHBseWluZyBpbnZpdGUgY29kZXMsIG9yIHRyYWNraW5nIHJlZmVycmFsIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBUaGUgc3RhdGUgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIGFmdGVyIHJldHJpZXZhbCB0byBwcmV2ZW50IHJldXNlLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgc3RvcmVkIGFwcFN0YXRlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TGFzdE9hdXRoU3RhdGUoKTtcbiAgICogaWYgKGFwcFN0YXRlKSB7XG4gICAqICAgLy8gQXBwbHkgaW52aXRlIGNvZGUgb3IgcmVzdG9yZSBVSSBzdGF0ZVxuICAgKiAgIGNvbnNvbGUubG9nKCdPQXV0aCBzdGF0ZTonLCBhcHBTdGF0ZSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRMYXN0T2F1dGhTdGF0ZSgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TGFzdE9hdXRoU3RhdGUoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTUZBIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIHN0YXR1cyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgc3RhdHVzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBjb25zb2xlLmxvZygnTUZBIGVuYWJsZWQ6Jywgc3RhdHVzLmVuYWJsZWQpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYVN0YXR1cygpOiBQcm9taXNlPE1GQVN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFTdGF0dXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGRldmljZXMgZm9yIHRoZSBjdXJyZW50IHVzZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgTUZBIGRldmljZXMgYXJyYXlcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYURldmljZXMoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRNZmFEZXZpY2VzKCk6IFByb21pc2U8TUZBRGV2aWNlW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0TWZhRGV2aWNlcygpIGFzIFByb21pc2U8TUZBRGV2aWNlW10+O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHVwIE1GQSBkZXZpY2UgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHNldCB1cFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIHNldHVwIGRhdGFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzZXR1cERhdGEgPSBhd2FpdCB0aGlzLmF1dGguc2V0dXBNZmFEZXZpY2UoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXR1cE1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXR1cE1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBNRkEgc2V0dXAgKGF1dGhlbnRpY2F0ZWQgdXNlcikuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kXG4gICAqIEBwYXJhbSBzZXR1cERhdGEgLSBTZXR1cCBkYXRhIGZyb20gc2V0dXBNZmFEZXZpY2VcbiAgICogQHBhcmFtIGRldmljZU5hbWUgLSBPcHRpb25hbCBkZXZpY2UgbmFtZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGV2aWNlIElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnZlcmlmeU1mYVNldHVwKCd0b3RwJywgeyBjb2RlOiAnMTIzNDU2JyB9LCAnTXkgUGhvbmUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB2ZXJpZnlNZmFTZXR1cChcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBzZXR1cERhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRldmljZU5hbWU/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBkZXZpY2VJZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudmVyaWZ5TWZhU2V0dXAobWV0aG9kLCBzZXR1cERhdGEsIGRldmljZU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBNRkEgZGV2aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byByZW1vdmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5yZW1vdmVNZmFEZXZpY2UoJ3NtcycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbW92ZU1mYURldmljZShtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZW1vdmVNZmFEZXZpY2UobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJlZmVycmVkIE1GQSBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBEZXZpY2UgbWV0aG9kIHRvIHNldCBhcyBwcmVmZXJyZWQgKCd0b3RwJywgJ3NtcycsICdlbWFpbCcsIG9yICdwYXNza2V5JylcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5zZXRQcmVmZXJyZWRNZmFNZXRob2QoJ3RvdHAnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBzZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kOiAndG90cCcgfCAnc21zJyB8ICdlbWFpbCcgfCAncGFzc2tleScpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuc2V0UHJlZmVycmVkTWZhTWV0aG9kKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYmFja3VwIGNvZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGJhY2t1cCBjb2RlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvZGVzID0gYXdhaXQgdGhpcy5hdXRoLmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgICogY29uc29sZS5sb2coJ0JhY2t1cCBjb2RlczonLCBjb2Rlcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVCYWNrdXBDb2RlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdlbmVyYXRlQmFja3VwQ29kZXMoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRGV2aWNlIFRydXN0XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVHJ1c3QgY3VycmVudCBkZXZpY2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgdG9rZW5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudHJ1c3REZXZpY2UoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0cnVzdGVkOicsIHJlc3VsdC5kZXZpY2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdHJ1c3REZXZpY2UoKTogUHJvbWlzZTx7IGRldmljZVRva2VuOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC50cnVzdERldmljZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBjdXJyZW50IGRldmljZSBpcyB0cnVzdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggdHJ1c3RlZCBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguaXNUcnVzdGVkRGV2aWNlKCk7XG4gICAqIGlmIChyZXN1bHQudHJ1c3RlZCkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdUaGlzIGRldmljZSBpcyB0cnVzdGVkJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBpc1RydXN0ZWREZXZpY2UoKTogUHJvbWlzZTx7IHRydXN0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQXVkaXQgSGlzdG9yeVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBwYWdpbmF0ZWQgYXVkaXQgaGlzdG9yeSBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFF1ZXJ5IHBhcmFtZXRlcnMgZm9yIGZpbHRlcmluZyBhbmQgcGFnaW5hdGlvblxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGF1ZGl0IGhpc3RvcnkgcmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgdGhpcy5hdXRoLmdldEF1ZGl0SGlzdG9yeSh7XG4gICAqICAgcGFnZTogMSxcbiAgICogICBsaW1pdDogMjAsXG4gICAqICAgZXZlbnRUeXBlczogWydMT0dJTl9TVUNDRVNTJ10sXG4gICAqICAgZXZlbnRTdGF0dXM6IFsnRkFJTFVSRSddLFxuICAgKiB9KTtcbiAgICogY29uc29sZS5sb2coJ0F1ZGl0IGhpc3Rvcnk6JywgaGlzdG9yeSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0QXVkaXRIaXN0b3J5KFxuICAgIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPj4sXG4gICk6IFByb21pc2U8QXVkaXRIaXN0b3J5UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0QXVkaXRIaXN0b3J5KHBhcmFtcyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVzY2FwZSBIYXRjaFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEV4cG9zZSB1bmRlcmx5aW5nIE5BdXRoQ2xpZW50IGZvciBhZHZhbmNlZCBzY2VuYXJpb3MuXG4gICAqXG5cbiAgICogQHJldHVybnMgVGhlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgaW5zdGFuY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBEZXByZWNhdGVkIC0gdXNlIGRpcmVjdCBtZXRob2RzIGluc3RlYWRcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldENsaWVudCgpLmdldE1mYVN0YXR1cygpO1xuICAgKlxuICAgKiAvLyBQcmVmZXJyZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHNcbiAgICogY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5hdXRoLmdldE1mYVN0YXR1cygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldENsaWVudCgpOiBOQXV0aENsaWVudCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50O1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBPcGVyYXRpb25zXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWRtaW4gb3BlcmF0aW9ucyAoaWYgZW5hYmxlZCBpbiBjb25maWcpLlxuICAgKlxuICAgKiBQcm92aWRlcyBhZG1pbi1sZXZlbCB1c2VyIG1hbmFnZW1lbnQgbWV0aG9kczpcbiAgICogLSBVc2VyIENSVUQgb3BlcmF0aW9uc1xuICAgKiAtIFBhc3N3b3JkIG1hbmFnZW1lbnRcbiAgICogLSBTZXNzaW9uIG1hbmFnZW1lbnRcbiAgICogLSBNRkEgbWFuYWdlbWVudFxuICAgKiAtIEF1ZGl0IGhpc3RvcnlcbiAgICpcbiAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgYWRtaW4gd2FzIG5vdCBjb25maWd1cmVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBZG1pbk9wZXJhdGlvbnMgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQ2hlY2sgaWYgYWRtaW4gaXMgYXZhaWxhYmxlXG4gICAqIGlmICh0aGlzLmF1dGguYWRtaW4pIHtcbiAgICogICBjb25zdCB1c2VycyA9IGF3YWl0IHRoaXMuYXV0aC5hZG1pbi5nZXRVc2Vycyh7IHBhZ2U6IDEgfSk7XG4gICAqIH1cbiAgICpcbiAgICogLy8gV2l0aCBvcHRpb25hbCBjaGFpbmluZ1xuICAgKiBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmRlbGV0ZVVzZXIoc3ViKTtcbiAgICpcbiAgICogLy8gQ3JlYXRlIHVzZXJcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluPy5jcmVhdGVVc2VyKHtcbiAgICogICBlbWFpbDogJ3VzZXJAZXhhbXBsZS5jb20nLFxuICAgKiAgIHBhc3N3b3JkOiAnU2VjdXJlUGFzczEyMyEnLFxuICAgKiAgIGlzRW1haWxWZXJpZmllZDogdHJ1ZSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IGFkbWluKCk6IEFkbWluT3BlcmF0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmFkbWluO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnRlcm5hbCBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBieSBoeWRyYXRpbmcgc3RhdGUgZnJvbSBzdG9yYWdlLlxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBjb25zdHJ1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHJldHVybjtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmluaXRpYWxpemUoKTtcblxuICAgIC8vIEh5ZHJhdGUgY2hhbGxlbmdlIHN0YXRlXG4gICAgY29uc3Qgc3RvcmVkQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgaWYgKHN0b3JlZENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQoc3RvcmVkQ2hhbGxlbmdlKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3ViamVjdHMgZnJvbSBjbGllbnQgc3RhdGVcbiAgICBjb25zdCB1c2VyID0gdGhpcy5jbGllbnQuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBpZiAodXNlcikge1xuICAgICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dCh1c2VyKTtcbiAgICAgIHRoaXMuaXNBdXRoZW50aWNhdGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY2hhbGxlbmdlIHN0YXRlIGFmdGVyIGF1dGggcmVzcG9uc2UuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUNoYWxsZW5nZVN0YXRlKHJlc3BvbnNlOiBBdXRoUmVzcG9uc2UpOiBBdXRoUmVzcG9uc2Uge1xuICAgIGlmIChyZXNwb25zZS5jaGFsbGVuZ2VOYW1lKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChyZXNwb25zZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHJlQ0FQVENIQSBIZWxwZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgcmVDQVBUQ0hBIHRva2VuIC0gYXV0by1nZW5lcmF0ZSBmb3IgdjMgb3IgdXNlIHByb3ZpZGVkIHRva2VuLlxuICAgKlxuICAgKiBIYW5kbGVzIHBsYXRmb3JtIGRldGVjdGlvbjpcbiAgICogLSBXZWIgYnJvd3NlcjogR2VuZXJhdGUgdG9rZW4gaWYgZW5hYmxlZCBhbmQgdjNcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlOiBTa2lwICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqIC0gU1NSOiBTa2lwXG4gICAqIC0gTWFudWFsIG1vZGUgKHYyIG9yIG1hbnVhbENoYWxsZW5nZT10cnVlKTogUmVxdWlyZXMgZXhwbGljaXQgdG9rZW5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVkVG9rZW4gLSBFeHBsaWNpdGx5IHByb3ZpZGVkIHRva2VuICh2MiBtYW51YWwgbW9kZSlcbiAgICogQHBhcmFtIGFjdGlvbiAtIEFjdGlvbiBuYW1lIGZvciB2MyBhbmFseXRpY3NcbiAgICogQHJldHVybnMgcmVDQVBUQ0hBIHRva2VuIG9yIHVuZGVmaW5lZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZXRSZWNhcHRjaGFUb2tlbihwcm92aWRlZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjdGlvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICAvLyBJZiB0b2tlbiBleHBsaWNpdGx5IHByb3ZpZGVkLCB1c2UgaXQgKHYyIG1hbnVhbCBtb2RlKVxuICAgIGlmIChwcm92aWRlZFRva2VuKSB7XG4gICAgICByZXR1cm4gcHJvdmlkZWRUb2tlbjtcbiAgICB9XG5cbiAgICAvLyBObyByZUNBUFRDSEEgc2VydmljZSBhdmFpbGFibGVcbiAgICBpZiAoIXRoaXMucmVjYXB0Y2hhU2VydmljZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiByZUNBUFRDSEEgaXMgY29uZmlndXJlZFxuICAgIGNvbnN0IHJlY2FwdGNoYUNvbmZpZyA9IChcbiAgICAgIHRoaXMuY29uZmlnIGFzIHsgcmVjYXB0Y2hhPzogeyBlbmFibGVkPzogYm9vbGVhbjsgdmVyc2lvbj86IHN0cmluZzsgbWFudWFsQ2hhbGxlbmdlPzogYm9vbGVhbiB9IH1cbiAgICApLnJlY2FwdGNoYTtcblxuICAgIGlmICghcmVjYXB0Y2hhQ29uZmlnPy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBIChTU1IsIENhcGFjaXRvciBuYXRpdmUpXG4gICAgaWYgKHRoaXMucmVjYXB0Y2hhU2VydmljZS5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgb3IgbWFudWFsIG1vZGUgLSB1c2VyIG11c3QgcHJvdmlkZSB0b2tlbiBleHBsaWNpdGx5XG4gICAgaWYgKHJlY2FwdGNoYUNvbmZpZy52ZXJzaW9uID09PSAndjInIHx8IHJlY2FwdGNoYUNvbmZpZy5tYW51YWxDaGFsbGVuZ2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gQXV0by1nZW5lcmF0ZSB0b2tlbiBmb3IgdjMvRW50ZXJwcmlzZVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5yZWNhcHRjaGFTZXJ2aWNlLmV4ZWN1dGUoYWN0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLy8gTG9nIGVycm9yIGJ1dCBkb24ndCBibG9jayBhdXRoZW50aWNhdGlvblxuICAgICAgLy8gU2VydmVyIHdpbGwgZW5mb3JjZSBpZiByZXF1aXJlZFxuICAgICAgY29uc29sZS53YXJuKCdbQXV0aFNlcnZpY2VdIEZhaWxlZCB0byBnZW5lcmF0ZSByZUNBUFRDSEEgdG9rZW46JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -3,4 +3,4 @@ import { InjectionToken } from '@angular/core';
|
|
|
3
3
|
* Injection token for providing NAuthClientConfig in Angular apps.
|
|
4
4
|
*/
|
|
5
5
|
export const NAUTH_CLIENT_CONFIG = new InjectionToken('NAUTH_CLIENT_CONFIG');
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL3Rva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBNEcvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFvQixxQkFBcUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50Q29uZmlnIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBmb3IgQW5ndWxhciBjbGllbnQuXG4gKlxuICogRXh0ZW5kcyBiYXNlIGNsaWVudCBSZWNhcHRjaGFDb25maWcgd2l0aCBBbmd1bGFyLXNwZWNpZmljIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGUgdjMgQXV0b21hdGljIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHtcbiAqICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgdmVyc2lvbjogJ3YzJyxcbiAqICAgc2l0ZUtleTogJzZMY0V4YW1wbGVfU2l0ZV9LZXknLFxuICogICBhY3Rpb246ICdsb2dpbicsXG4gKiAgIGF1dG9Mb2FkU2NyaXB0OiB0cnVlLFxuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgdjIgTWFudWFsIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHtcbiAqICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgdmVyc2lvbjogJ3YyJyxcbiAqICAgc2l0ZUtleTogJzZMY0V4YW1wbGVfU2l0ZV9LZXknLFxuICogICBtYW51YWxDaGFsbGVuZ2U6IHRydWUsXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFBbmd1bGFyQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHJlQ0FQVENIQS5cbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgZXZlbiBpZiBjb25maWd1cmVkICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogcmVDQVBUQ0hBIHZlcnNpb246IHYyIChjaGVja2JveCksIHYzIChpbnZpc2libGUpLCBvciBlbnRlcnByaXNlLlxuICAgKi9cbiAgdmVyc2lvbjogJ3YyJyB8ICd2MycgfCAnZW50ZXJwcmlzZSc7XG5cbiAgLyoqXG4gICAqIFNpdGUga2V5IGZyb20gR29vZ2xlIHJlQ0FQVENIQSBjb25zb2xlLlxuICAgKiBUaGlzIGlzIHNhZmUgdG8gZXhwb3NlIHB1YmxpY2x5IChpdCdzIHRoZSBwdWJsaWMga2V5KS5cbiAgICovXG4gIHNpdGVLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogQWN0aW9uIG5hbWUgZm9yIHYzL0VudGVycHJpc2UgYW5hbHl0aWNzLlxuICAgKiBIZWxwcyB0cmFjayB3aGljaCBhY3Rpb25zIGFyZSBiZWluZyBwcm90ZWN0ZWQuXG4gICAqIENvbW1vbiB2YWx1ZXM6ICdsb2dpbicsICdzaWdudXAnLCAnc3VibWl0J1xuICAgKlxuICAgKiBAZGVmYXVsdCAnc3VibWl0J1xuICAgKi9cbiAgYWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYW51YWwgY2hhbGxlbmdlIG1vZGUgKHYyIG9ubHkpLlxuICAgKiBJZiB0cnVlLCB5b3UgbXVzdCBtYW51YWxseSBjYWxsIFJlY2FwdGNoYVNlcnZpY2UucmVuZGVyKCkgYW5kIGdldCB0b2tlbi5cbiAgICogSWYgZmFsc2UsIEF1dGhTZXJ2aWNlIGF1dG8tZ2VuZXJhdGVzIHRva2VuIGJlZm9yZSBsb2dpbi9zaWdudXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtYW51YWxDaGFsbGVuZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGxvYWQgdGhlIEdvb2dsZSByZUNBUFRDSEEgc2NyaXB0LlxuICAgKiBJZiBmYWxzZSwgeW91IG11c3QgbWFudWFsbHkgbG9hZCB0aGUgc2NyaXB0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhdXRvTG9hZFNjcmlwdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExhbmd1YWdlIGNvZGUgZm9yIHJlQ0FQVENIQSB3aWRnZXQgKHYyIG9ubHkpLlxuICAgKiBAZXhhbXBsZSAnZW4nLCAnZXMnLCAnZnInLCAnZGUnXG4gICAqIEBkZWZhdWx0IEJyb3dzZXIgbGFuZ3VhZ2VcbiAgICovXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuZ3VsYXItc3BlY2lmaWMgTkF1dGggY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFeHRlbmRzIGJhc2UgTkF1dGhDbGllbnRDb25maWcgd2l0aCBBbmd1bGFyLXNwZWNpZmljIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbmZpZzogTkF1dGhBbmd1bGFyQ29uZmlnID0ge1xuICogICBiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vYXV0aCcsXG4gKiAgIHRva2VuRGVsaXZlcnk6ICdjb29raWVzJyxcbiAqICAgcmVjYXB0Y2hhOiB7XG4gKiAgICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgICB2ZXJzaW9uOiAndjMnLFxuICogICAgIHNpdGVLZXk6ICc2TGNFeGFtcGxlX1NpdGVfS2V5JyxcbiAqICAgICBhY3Rpb246ICdsb2dpbicsXG4gKiAgIH0sXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTkF1dGhBbmd1bGFyQ29uZmlnIGV4dGVuZHMgTkF1dGhDbGllbnRDb25maWcge1xuICAvKipcbiAgICogR29vZ2xlIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uIChvcHRpb25hbCkuXG4gICAqIFByb3ZpZGVzIGJvdCBwcm90ZWN0aW9uIGZvciBsb2dpbi9zaWdudXAgZW5kcG9pbnRzLlxuICAgKi9cbiAgcmVjYXB0Y2hhPzogUmVjYXB0Y2hhQW5ndWxhckNvbmZpZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHByb3ZpZGluZyBOQXV0aENsaWVudENvbmZpZyBpbiBBbmd1bGFyIGFwcHMuXG4gKi9cbmV4cG9ydCBjb25zdCBOQVVUSF9DTElFTlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE5BdXRoQ2xpZW50Q29uZmlnPignTkFVVEhfQ0xJRU5UX0NPTkZJRycpO1xuIl19
|
package/esm2022/public-api.mjs
CHANGED
|
@@ -16,4 +16,5 @@ export * from './ngmodule/nauth.module';
|
|
|
16
16
|
export * from './lib/auth.interceptor';
|
|
17
17
|
export * from './lib/auth.guard';
|
|
18
18
|
export * from './lib/social-redirect-callback.guard';
|
|
19
|
-
|
|
19
|
+
export * from './lib/recaptcha.service';
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsNENBQTRDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsb0RBQW9EO0FBQ3BELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxzRUFBc0U7QUFDdEUsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIEBuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyIChOZ01vZHVsZSlcbiAqXG4gKiBUaGlzIGlzIHRoZSBkZWZhdWx0IGVudHJ5IHBvaW50IGZvciBOZ01vZHVsZS1iYXNlZCBBbmd1bGFyIGFwcHMuXG4gKiBGb3Igc3RhbmRhbG9uZSBjb21wb25lbnRzLCB1c2U6IEBuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyL3N0YW5kYWxvbmVcbiAqL1xuXG4vLyBSZS1leHBvcnQgY29yZSBjbGllbnQgdHlwZXMgYW5kIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLy8gRXhwb3J0IE5nTW9kdWxlLXNwZWNpZmljIGNvbXBvbmVudHMgKGNsYXNzLWJhc2VkKVxuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS90b2tlbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS9hdXRoLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS9odHRwLWFkYXB0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS9hdXRoLmludGVyY2VwdG9yLmNsYXNzJztcbmV4cG9ydCAqIGZyb20gJy4vbmdtb2R1bGUvbmF1dGgubW9kdWxlJztcblxuLy8gRXhwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50cyAoZm9yIGZsZXhpYmlsaXR5IGluIE5nTW9kdWxlIGFwcHMgdG9vKVxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXV0aC5pbnRlcmNlcHRvcic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9hdXRoLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NvY2lhbC1yZWRpcmVjdC1jYWxsYmFjay5ndWFyZCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yZWNhcHRjaGEuc2VydmljZSc7XG4iXX0=
|