@nauth-toolkit/client-angular 0.1.91 → 0.1.93

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.
@@ -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
- * if (response.challengeName) {
215
- * // Handle challenge
216
- * } else {
217
- * // Login successful
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 res = await this.client.login(identifier, password);
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
- 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 }], target: i0.ɵɵFactoryTarget.Injectable });
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+IHtcbiAgICAvLyBBdXRvLWdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbiBmb3IgdjMgaWYgY29uZmlndXJlZCBhbmQgbm90IGFscmVhZHkgcHJvdmlkZWRcbiAgICBjb25zdCBwYXlsb2FkV2l0aFJlY2FwdGNoYSA9IHBheWxvYWQgYXMgeyByZWNhcHRjaGFUb2tlbj86IHN0cmluZyB9O1xuXG4gICAgaWYgKCFwYXlsb2FkV2l0aFJlY2FwdGNoYS5yZWNhcHRjaGFUb2tlbikge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmdldFJlY2FwdGNoYVRva2VuKHVuZGVmaW5lZCwgJ3NpZ251cCcpO1xuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIHBheWxvYWQgPSB7IC4uLnBheWxvYWQsIHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnNpZ251cChwYXlsb2FkKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ291dCBjdXJyZW50IHNlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2UgLSBJZiB0cnVlLCByZW1vdmVzIGRldmljZSB0cnVzdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dvdXQoKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXQoZm9yZ2V0RGV2aWNlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dChmb3JnZXREZXZpY2UpO1xuICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIC8vIEV4cGxpY2l0bHkgdXBkYXRlIGF1dGggc3RhdGUgYWZ0ZXIgbG9nb3V0XG4gICAgdGhpcy5jdXJyZW50VXNlclN1YmplY3QubmV4dChudWxsKTtcbiAgICB0aGlzLmlzQXV0aGVudGljYXRlZFN1YmplY3QubmV4dChmYWxzZSk7XG5cbiAgICAvLyBDbGVhciBDU1JGIHRva2VuIGNvb2tpZSBpZiBpbiBjb29raWVzIG1vZGVcbiAgICAvLyBOb3RlOiBCYWNrZW5kIHNob3VsZCBjbGVhciBodHRwT25seSBjb29raWVzLCBidXQgd2UgY2xlYXIgbm9uLWh0dHBPbmx5IG9uZXNcbiAgICBpZiAodGhpcy5jb25maWcudG9rZW5EZWxpdmVyeSA9PT0gJ2Nvb2tpZXMnICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnN0IGNzcmZDb29raWVOYW1lID0gdGhpcy5jb25maWcuY3NyZj8uY29va2llTmFtZSA/PyAnbmF1dGhfY3NyZl90b2tlbic7XG4gICAgICAvLyBFeHRyYWN0IGRvbWFpbiBmcm9tIGJhc2VVcmwgaWYgcG9zc2libGVcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwodGhpcy5jb25maWcuYmFzZVVybCk7XG4gICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke2NzcmZDb29raWVOYW1lfT07IGV4cGlyZXM9VGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBVVEM7IHBhdGg9LzsgZG9tYWluPSR7dXJsLmhvc3RuYW1lfWA7XG4gICAgICAgIC8vIEFsc28gdHJ5IHdpdGhvdXQgZG9tYWluIChmb3IgbG9jYWxob3N0KVxuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEZhbGxiYWNrIGlmIGJhc2VVcmwgcGFyc2luZyBmYWlsc1xuICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgJHtjc3JmQ29va2llTmFtZX09OyBleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgVVRDOyBwYXRoPS9gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dvdXQgYWxsIHNlc3Npb25zLlxuICAgKlxuICAgKiBSZXZva2VzIGFsbCBhY3RpdmUgc2Vzc2lvbnMgZm9yIHRoZSBjdXJyZW50IHVzZXIgYWNyb3NzIGFsbCBkZXZpY2VzLlxuICAgKiBPcHRpb25hbGx5IHJldm9rZXMgYWxsIHRydXN0ZWQgZGV2aWNlcyBpZiBmb3JnZXREZXZpY2VzIGlzIHRydWUuXG4gICAqXG4gICAqIEBwYXJhbSBmb3JnZXREZXZpY2VzIC0gSWYgdHJ1ZSwgYWxzbyByZXZva2VzIGFsbCB0cnVzdGVkIGRldmljZXMgKGRlZmF1bHQ6IGZhbHNlKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggbnVtYmVyIG9mIHNlc3Npb25zIHJldm9rZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgubG9nb3V0QWxsKCk7XG4gICAqIGNvbnNvbGUubG9nKGBSZXZva2VkICR7cmVzdWx0LnJldm9rZWRDb3VudH0gc2Vzc2lvbnNgKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsb2dvdXRBbGwoZm9yZ2V0RGV2aWNlcz86IGJvb2xlYW4pOiBQcm9taXNlPHsgcmV2b2tlZENvdW50OiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmxvZ291dEFsbChmb3JnZXREZXZpY2VzKTtcbiAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBFeHBsaWNpdGx5IHVwZGF0ZSBhdXRoIHN0YXRlIGFmdGVyIGxvZ291dFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogUmVmcmVzaCB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBuZXcgdG9rZW5zXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW5zID0gYXdhaXQgdGhpcy5hdXRoLnJlZnJlc2goKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8VG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZWZyZXNoVG9rZW5zKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFjY291bnQgUmVjb3ZlcnkgKEZvcmdvdCBQYXNzd29yZClcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IGEgcGFzc3dvcmQgcmVzZXQgY29kZSAoZm9yZ290IHBhc3N3b3JkKS5cbiAgICpcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgLSBVc2VyIGVtYWlsLCB1c2VybmFtZSwgb3IgcGhvbmVcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHBhc3N3b3JkIHJlc2V0IHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLmZvcmdvdFBhc3N3b3JkKCd1c2VyQGV4YW1wbGUuY29tJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZm9yZ290UGFzc3dvcmQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxGb3Jnb3RQYXNzd29yZFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmZvcmdvdFBhc3N3b3JkKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gYSBwYXNzd29yZCByZXNldCBjb2RlIGFuZCBzZXQgYSBuZXcgcGFzc3dvcmQuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBlbWFpbCwgdXNlcm5hbWUsIG9yIHBob25lXG4gICAqIEBwYXJhbSBjb2RlIC0gT25lLXRpbWUgcmVzZXQgY29kZVxuICAgKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGNvbmZpcm1hdGlvbiByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jb25maXJtRm9yZ290UGFzc3dvcmQoJ3VzZXJAZXhhbXBsZS5jb20nLCAnMTIzNDU2JywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY29uZmlybUZvcmdvdFBhc3N3b3JkKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgbmV3UGFzc3dvcmQ6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxDb25maXJtRm9yZ290UGFzc3dvcmRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jb25maXJtRm9yZ290UGFzc3dvcmQoaWRlbnRpZmllciwgY29kZSwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHBhc3N3b3JkIHdpdGggY29kZSBvciB0b2tlbiAoZ2VuZXJpYyBtZXRob2QgZm9yIGJvdGggYWRtaW4gYW5kIHVzZXItaW5pdGlhdGVkIHJlc2V0cykuXG4gICAqXG4gICAqIEFjY2VwdHMgZWl0aGVyOlxuICAgKiAtIGNvZGU6IFNob3J0IG51bWVyaWMgY29kZSBmcm9tIGVtYWlsL1NNUyAoNi0xMCBkaWdpdHMpXG4gICAqIC0gdG9rZW46IExvbmcgaGV4IHRva2VuIGZyb20gcmVzZXQgbGluayAoNjQgY2hhcnMpXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIC0gVXNlciBpZGVudGlmaWVyIChlbWFpbCwgdXNlcm5hbWUsIHBob25lKVxuICAgKiBAcGFyYW0gY29kZU9yVG9rZW4gLSBWZXJpZmljYXRpb24gY29kZSBPUiB0b2tlbiBmcm9tIGxpbmtcbiAgICogQHBhcmFtIG5ld1Bhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gV2l0aCBjb2RlIGZyb20gZW1haWxcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICcxMjM0NTYnLCAnTmV3UGFzczEyMyEnKTtcbiAgICpcbiAgICogLy8gV2l0aCB0b2tlbiBmcm9tIGxpbmtcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlc2V0UGFzc3dvcmRXaXRoQ29kZSgndXNlckBleGFtcGxlLmNvbScsICc2NC1jaGFyLXRva2VuJywgJ05ld1Bhc3MxMjMhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzZXRQYXNzd29yZFdpdGhDb2RlKFxuICAgIGlkZW50aWZpZXI6IHN0cmluZyxcbiAgICBjb2RlT3JUb2tlbjogc3RyaW5nLFxuICAgIG5ld1Bhc3N3b3JkOiBzdHJpbmcsXG4gICk6IFByb21pc2U8UmVzZXRQYXNzd29yZFdpdGhDb2RlUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVzZXRQYXNzd29yZFdpdGhDb2RlKGlkZW50aWZpZXIsIGNvZGVPclRva2VuLCBuZXdQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlIHVzZXIgcGFzc3dvcmQgKHJlcXVpcmVzIGN1cnJlbnQgcGFzc3dvcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb2xkUGFzc3dvcmQgLSBDdXJyZW50IHBhc3N3b3JkXG4gICAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIE5ldyBwYXNzd29yZCAobXVzdCBtZWV0IHJlcXVpcmVtZW50cylcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gcGFzc3dvcmQgaXMgY2hhbmdlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jaGFuZ2VQYXNzd29yZCgnb2xkUGFzc3dvcmQxMjMnLCAnbmV3U2VjdXJlUGFzc3dvcmQ0NTYhJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgY2hhbmdlUGFzc3dvcmQob2xkUGFzc3dvcmQ6IHN0cmluZywgbmV3UGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5jaGFuZ2VQYXNzd29yZChvbGRQYXNzd29yZCwgbmV3UGFzc3dvcmQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQcm9maWxlIE1hbmFnZW1lbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB1c2VyIHByb2ZpbGUuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgY3VycmVudCB1c2VyIHByb2ZpbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5hdXRoLmdldFByb2ZpbGUoKTtcbiAgICogY29uc29sZS5sb2coJ1VzZXIgcHJvZmlsZTonLCB1c2VyKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQcm9maWxlKCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UHJvZmlsZSgpO1xuICAgIC8vIFVwZGF0ZSBsb2NhbCBzdGF0ZSB3aGVuIHByb2ZpbGUgaXMgZmV0Y2hlZFxuICAgIHRoaXMuY3VycmVudFVzZXJTdWJqZWN0Lm5leHQodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcHJvZmlsZS5cbiAgICpcbiAgICogQHBhcmFtIHVwZGF0ZXMgLSBQcm9maWxlIGZpZWxkcyB0byB1cGRhdGVcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiB1cGRhdGVkIHVzZXIgcHJvZmlsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGgudXBkYXRlUHJvZmlsZSh7IGZpcnN0TmFtZTogJ0pvaG4nLCBsYXN0TmFtZTogJ0RvZScgfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcm9maWxlIHVwZGF0ZWQ6JywgdXNlcik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlUHJvZmlsZSh1cGRhdGVzOiBVcGRhdGVQcm9maWxlUmVxdWVzdCk6IFByb21pc2U8QXV0aFVzZXI+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5jbGllbnQudXBkYXRlUHJvZmlsZSh1cGRhdGVzKTtcbiAgICAvLyBVcGRhdGUgbG9jYWwgc3RhdGUgd2hlbiBwcm9maWxlIGlzIHVwZGF0ZWRcbiAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDaGFsbGVuZ2UgRmxvdyBNZXRob2RzIChFc3NlbnRpYWwgZm9yIGFueSBhdXRoIGZsb3cpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVzcG9uZCB0byBhIGNoYWxsZW5nZSAoVkVSSUZZX0VNQUlMLCBWRVJJRllfUEhPTkUsIE1GQV9SRVFVSVJFRCwgZXRjLikuXG4gICAqXG4gICAqIEBwYXJhbSByZXNwb25zZSAtIENoYWxsZW5nZSByZXNwb25zZSBkYXRhXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBhdXRoIHJlc3BvbnNlIG9yIG5leHQgY2hhbGxlbmdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hdXRoLnJlc3BvbmRUb0NoYWxsZW5nZSh7XG4gICAqICAgc2Vzc2lvbjogY2hhbGxlbmdlU2Vzc2lvbixcbiAgICogICB0eXBlOiAnVkVSSUZZX0VNQUlMJyxcbiAgICogICBjb2RlOiAnMTIzNDU2JyxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlOiBDaGFsbGVuZ2VSZXNwb25zZSk6IFByb21pc2U8QXV0aFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jbGllbnQucmVzcG9uZFRvQ2hhbGxlbmdlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZCBjaGFsbGVuZ2UgY29kZS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggZGVzdGluYXRpb24gaW5mb3JtYXRpb25cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgucmVzZW5kQ29kZShzZXNzaW9uKTtcbiAgICogY29uc29sZS5sb2coJ0NvZGUgc2VudCB0bzonLCByZXN1bHQuZGVzdGluYXRpb24pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc2VuZENvZGUoc2Vzc2lvbjogc3RyaW5nKTogUHJvbWlzZTx7IGRlc3RpbmF0aW9uOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXNlbmRDb2RlKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc2V0dXAgZGF0YSAoZm9yIE1GQV9TRVRVUF9SRVFVSVJFRCBjaGFsbGVuZ2UpLlxuICAgKlxuICAgKiBSZXR1cm5zIG1ldGhvZC1zcGVjaWZpYyBzZXR1cCBpbmZvcm1hdGlvbjpcbiAgICogLSBUT1RQOiB7IHNlY3JldCwgcXJDb2RlLCBtYW51YWxFbnRyeUtleSB9XG4gICAqIC0gU01TOiB7IG1hc2tlZFBob25lIH1cbiAgICogLSBFbWFpbDogeyBtYXNrZWRFbWFpbCB9XG4gICAqIC0gUGFzc2tleTogV2ViQXV0aG4gcmVnaXN0cmF0aW9uIG9wdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gLSBDaGFsbGVuZ2Ugc2Vzc2lvbiB0b2tlblxuICAgKiBAcGFyYW0gbWV0aG9kIC0gTUZBIG1ldGhvZCB0byBzZXQgdXBcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBzZXR1cCBkYXRhIHJlc3BvbnNlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgc2V0dXBEYXRhID0gYXdhaXQgdGhpcy5hdXRoLmdldFNldHVwRGF0YShzZXNzaW9uLCAndG90cCcpO1xuICAgKiBjb25zb2xlLmxvZygnUVIgQ29kZTonLCBzZXR1cERhdGEuc2V0dXBEYXRhLnFyQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0U2V0dXBEYXRhKHNlc3Npb246IHN0cmluZywgbWV0aG9kOiBzdHJpbmcpOiBQcm9taXNlPEdldFNldHVwRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldFNldHVwRGF0YShzZXNzaW9uLCBtZXRob2QgYXMgUGFyYW1ldGVyczxOQXV0aENsaWVudFsnZ2V0U2V0dXBEYXRhJ10+WzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgTUZBIGNoYWxsZW5nZSBkYXRhIChmb3IgTUZBX1JFUVVJUkVEIGNoYWxsZW5nZSAtIGUuZy4sIHBhc3NrZXkgb3B0aW9ucykuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIC0gQ2hhbGxlbmdlIHNlc3Npb24gdG9rZW5cbiAgICogQHBhcmFtIG1ldGhvZCAtIENoYWxsZW5nZSBtZXRob2RcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBjaGFsbGVuZ2UgZGF0YSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNoYWxsZW5nZURhdGEgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2hhbGxlbmdlRGF0YShzZXNzaW9uLCAncGFzc2tleScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldENoYWxsZW5nZURhdGEoc2Vzc2lvbjogc3RyaW5nLCBtZXRob2Q6IHN0cmluZyk6IFByb21pc2U8R2V0Q2hhbGxlbmdlRGF0YVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldENoYWxsZW5nZURhdGEoc2Vzc2lvbiwgbWV0aG9kIGFzIFBhcmFtZXRlcnM8TkF1dGhDbGllbnRbJ2dldENoYWxsZW5nZURhdGEnXT5bMV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIHN0b3JlZCBjaGFsbGVuZ2UgKHdoZW4gbmF2aWdhdGluZyBhd2F5IGZyb20gY2hhbGxlbmdlIGZsb3cpLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBjaGFsbGVuZ2UgaXMgY2xlYXJlZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5jbGVhckNoYWxsZW5nZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGNsZWFyQ2hhbGxlbmdlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmNsZWFyU3RvcmVkQ2hhbGxlbmdlKCk7XG4gICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgYWNjZXNzIHRva2VuIChKU09OIG1vZGUgb25seSkuXG4gICAqXG4gICAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgY29uc3VtZXJzIHVzaW5nIEFuZ3VsYXIgYEh0dHBDbGllbnRgIGRpcmVjdGx5XG4gICAqIChvdXRzaWRlIG9mIHRoZSBTREsgbWV0aG9kcykgYW5kIHJlbHlpbmcgb24gYW4gaW50ZXJjZXB0b3IgdG8gYXR0YWNoIEJlYXJlciB0b2tlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIEFjY2VzcyB0b2tlbiwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguZ2V0QWNjZXNzVG9rZW4oKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBY2Nlc3NUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuZ2V0QWNjZXNzVG9rZW4oKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gU29jaWFsIEF1dGhlbnRpY2F0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogSW5pdGlhdGUgc29jaWFsIE9BdXRoIGxvZ2luIGZsb3cuXG4gICAqIFJlZGlyZWN0cyB0aGUgYnJvd3NlciB0byBiYWNrZW5kIGAvYXV0aC9zb2NpYWwvOnByb3ZpZGVyL3JlZGlyZWN0YC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyICgnZ29vZ2xlJywgJ2FwcGxlJywgJ2ZhY2Vib29rJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCByZWRpcmVjdCBvcHRpb25zXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHJlZGlyZWN0IHN0YXJ0c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC5sb2dpbldpdGhTb2NpYWwoJ2dvb2dsZScsIHsgcmV0dXJuVG86ICcvYXV0aC9jYWxsYmFjaycgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgbG9naW5XaXRoU29jaWFsKHByb3ZpZGVyOiBTb2NpYWxQcm92aWRlciwgb3B0aW9ucz86IFNvY2lhbExvZ2luT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5sb2dpbldpdGhTb2NpYWwocHJvdmlkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2hhbmdlIGFuIGV4Y2hhbmdlVG9rZW4gKGZyb20gcmVkaXJlY3QgY2FsbGJhY2sgVVJMKSBpbnRvIGFuIEF1dGhSZXNwb25zZS5cbiAgICpcbiAgICogVXNlZCBmb3IgYHRva2VuRGVsaXZlcnk6ICdqc29uJ2Agb3IgaHlicmlkIGZsb3dzIHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0cyBiYWNrXG4gICAqIHdpdGggYGV4Y2hhbmdlVG9rZW5gIGluc3RlYWQgb2Ygc2V0dGluZyBjb29raWVzLlxuICAgKlxuICAgKiBAcGFyYW0gZXhjaGFuZ2VUb2tlbiAtIE9uZS10aW1lIGV4Y2hhbmdlIHRva2VuIGZyb20gdGhlIGNhbGxiYWNrIFVSTFxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIEF1dGhSZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5hdXRoLmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZXhjaGFuZ2VTb2NpYWxSZWRpcmVjdChleGNoYW5nZVRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LmV4Y2hhbmdlU29jaWFsUmVkaXJlY3QoZXhjaGFuZ2VUb2tlbik7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZnkgbmF0aXZlIHNvY2lhbCB0b2tlbiAobW9iaWxlKS5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgLSBTb2NpYWwgdmVyaWZpY2F0aW9uIHJlcXVlc3Qgd2l0aCBwcm92aWRlciBhbmQgdG9rZW5cbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBBdXRoUmVzcG9uc2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TmF0aXZlU29jaWFsKHtcbiAgICogICBwcm92aWRlcjogJ2dvb2dsZScsXG4gICAqICAgaWRUb2tlbjogbmF0aXZlSWRUb2tlbixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5TmF0aXZlU29jaWFsKHJlcXVlc3Q6IFNvY2lhbFZlcmlmeVJlcXVlc3QpOiBQcm9taXNlPEF1dGhSZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuY2xpZW50LnZlcmlmeU5hdGl2ZVNvY2lhbChyZXF1ZXN0KTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVDaGFsbGVuZ2VTdGF0ZShyZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsaW5rZWQgc29jaWFsIGFjY291bnRzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIGxpbmtlZCBhY2NvdW50cyByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGFjY291bnRzID0gYXdhaXQgdGhpcy5hdXRoLmdldExpbmtlZEFjY291bnRzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdMaW5rZWQgcHJvdmlkZXJzOicsIGFjY291bnRzLnByb3ZpZGVycyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TGlua2VkQWNjb3VudHMoKTogUHJvbWlzZTxMaW5rZWRBY2NvdW50c1Jlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldExpbmtlZEFjY291bnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogTGluayBzb2NpYWwgYWNjb3VudC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyIC0gU29jaWFsIHByb3ZpZGVyIHRvIGxpbmtcbiAgICogQHBhcmFtIGNvZGUgLSBPQXV0aCBhdXRob3JpemF0aW9uIGNvZGVcbiAgICogQHBhcmFtIHN0YXRlIC0gT0F1dGggc3RhdGUgcGFyYW1ldGVyXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBzdWNjZXNzIG1lc3NhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCB0aGlzLmF1dGgubGlua1NvY2lhbEFjY291bnQoJ2dvb2dsZScsIGNvZGUsIHN0YXRlKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaW5rU29jaWFsQWNjb3VudChwcm92aWRlcjogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQubGlua1NvY2lhbEFjY291bnQocHJvdmlkZXIsIGNvZGUsIHN0YXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxpbmsgc29jaWFsIGFjY291bnQuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlciAtIFNvY2lhbCBwcm92aWRlciB0byB1bmxpbmtcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IHRoaXMuYXV0aC51bmxpbmtTb2NpYWxBY2NvdW50KCdnb29nbGUnKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1bmxpbmtTb2NpYWxBY2NvdW50KHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPHsgbWVzc2FnZTogc3RyaW5nIH0+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQudW5saW5rU29jaWFsQWNjb3VudChwcm92aWRlcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsYXN0IE9BdXRoIGFwcFN0YXRlIGZyb20gc29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSBhcHBTdGF0ZSB0aGF0IHdhcyBzdG9yZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudCBzb2NpYWxcbiAgICogbG9naW4gcmVkaXJlY3QgY2FsbGJhY2suIFRoaXMgaXMgdXNlZnVsIGZvciByZXN0b3JpbmcgVUkgc3RhdGUsXG4gICAqIGFwcGx5aW5nIGludml0ZSBjb2Rlcywgb3IgdHJhY2tpbmcgcmVmZXJyYWwgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIFRoZSBzdGF0ZSBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgYWZ0ZXIgcmV0cmlldmFsIHRvIHByZXZlbnQgcmV1c2UuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzdG9yZWQgYXBwU3RhdGUsIG9yIG51bGwgaWYgbm9uZSBleGlzdHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMuYXV0aC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICAgKiBpZiAoYXBwU3RhdGUpIHtcbiAgICogICAvLyBBcHBseSBpbnZpdGUgY29kZSBvciByZXN0b3JlIFVJIHN0YXRlXG4gICAqICAgY29uc29sZS5sb2coJ09BdXRoIHN0YXRlOicsIGFwcFN0YXRlKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldExhc3RPYXV0aFN0YXRlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRMYXN0T2F1dGhTdGF0ZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBNRkEgTWFuYWdlbWVudFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgc3RhdHVzIGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIG9mIE1GQSBzdGF0dXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGNvbnNvbGUubG9nKCdNRkEgZW5hYmxlZDonLCBzdGF0dXMuZW5hYmxlZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0TWZhU3RhdHVzKCk6IFByb21pc2U8TUZBU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmdldE1mYVN0YXR1cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBNRkEgZGV2aWNlcyBmb3IgdGhlIGN1cnJlbnQgdXNlci5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSBvZiBNRkEgZGV2aWNlcyBhcnJheVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhRGV2aWNlcygpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldE1mYURldmljZXMoKTogUHJvbWlzZTxNRkFEZXZpY2VbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRNZmFEZXZpY2VzKCkgYXMgUHJvbWlzZTxNRkFEZXZpY2VbXT47XG4gIH1cblxuICAvKipcbiAgICogU2V0dXAgTUZBIGRldmljZSAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2QgdG8gc2V0IHVwXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2Ygc2V0dXAgZGF0YVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHNldHVwRGF0YSA9IGF3YWl0IHRoaXMuYXV0aC5zZXR1cE1mYURldmljZSgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldHVwTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnNldHVwTWZhRGV2aWNlKG1ldGhvZCk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IE1GQSBzZXR1cCAoYXV0aGVudGljYXRlZCB1c2VyKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIE1GQSBtZXRob2RcbiAgICogQHBhcmFtIHNldHVwRGF0YSAtIFNldHVwIGRhdGEgZnJvbSBzZXR1cE1mYURldmljZVxuICAgKiBAcGFyYW0gZGV2aWNlTmFtZSAtIE9wdGlvbmFsIGRldmljZSBuYW1lXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCBkZXZpY2UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGgudmVyaWZ5TWZhU2V0dXAoJ3RvdHAnLCB7IGNvZGU6ICcxMjM0NTYnIH0sICdNeSBQaG9uZScpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHZlcmlmeU1mYVNldHVwKFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHNldHVwRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgZGV2aWNlTmFtZT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGRldmljZUlkOiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC52ZXJpZnlNZmFTZXR1cChtZXRob2QsIHNldHVwRGF0YSwgZGV2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIE1GQSBkZXZpY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgLSBNRkEgbWV0aG9kIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnJlbW92ZU1mYURldmljZSgnc21zJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVtb3ZlTWZhRGV2aWNlKG1ldGhvZDogc3RyaW5nKTogUHJvbWlzZTx7IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlbW92ZU1mYURldmljZShtZXRob2QpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmVmZXJyZWQgTUZBIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCAtIERldmljZSBtZXRob2QgdG8gc2V0IGFzIHByZWZlcnJlZCAoJ3RvdHAnLCAnc21zJywgJ2VtYWlsJywgb3IgJ3Bhc3NrZXknKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdpdGggc3VjY2VzcyBtZXNzYWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgdGhpcy5hdXRoLnNldFByZWZlcnJlZE1mYU1ldGhvZCgndG90cCcpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHNldFByZWZlcnJlZE1mYU1ldGhvZChtZXRob2Q6ICd0b3RwJyB8ICdzbXMnIHwgJ2VtYWlsJyB8ICdwYXNza2V5Jyk6IFByb21pc2U8eyBtZXNzYWdlOiBzdHJpbmcgfT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5zZXRQcmVmZXJyZWRNZmFNZXRob2QobWV0aG9kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBiYWNrdXAgY29kZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYmFja3VwIGNvZGVzIGFycmF5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY29kZXMgPSBhd2FpdCB0aGlzLmF1dGguZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICAgKiBjb25zb2xlLmxvZygnQmFja3VwIGNvZGVzOicsIGNvZGVzKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUJhY2t1cENvZGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2VuZXJhdGVCYWNrdXBDb2RlcygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBEZXZpY2UgVHJ1c3RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBUcnVzdCBjdXJyZW50IGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aXRoIGRldmljZSB0b2tlblxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC50cnVzdERldmljZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRydXN0ZWQ6JywgcmVzdWx0LmRldmljZVRva2VuKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB0cnVzdERldmljZSgpOiBQcm9taXNlPHsgZGV2aWNlVG9rZW46IHN0cmluZyB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRydXN0RGV2aWNlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRydXN0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2Ugd2l0aCB0cnVzdGVkIHN0YXR1c1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aC5pc1RydXN0ZWREZXZpY2UoKTtcbiAgICogaWYgKHJlc3VsdC50cnVzdGVkKSB7XG4gICAqICAgY29uc29sZS5sb2coJ1RoaXMgZGV2aWNlIGlzIHRydXN0ZWQnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGlzVHJ1c3RlZERldmljZSgpOiBQcm9taXNlPHsgdHJ1c3RlZDogYm9vbGVhbiB9PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmlzVHJ1c3RlZERldmljZSgpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdWRpdCBIaXN0b3J5XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogR2V0IHBhZ2luYXRlZCBhdWRpdCBoaXN0b3J5IGZvciB0aGUgY3VycmVudCB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gUXVlcnkgcGFyYW1ldGVycyBmb3IgZmlsdGVyaW5nIGFuZCBwYWdpbmF0aW9uXG4gICAqIEByZXR1cm5zIFByb21pc2Ugb2YgYXVkaXQgaGlzdG9yeSByZXNwb25zZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCB0aGlzLmF1dGguZ2V0QXVkaXRIaXN0b3J5KHtcbiAgICogICBwYWdlOiAxLFxuICAgKiAgIGxpbWl0OiAyMCxcbiAgICogICBldmVudFR5cGVzOiBbJ0xPR0lOX1NVQ0NFU1MnXSxcbiAgICogICBldmVudFN0YXR1czogWydGQUlMVVJFJ10sXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQXVkaXQgaGlzdG9yeTonLCBoaXN0b3J5KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRBdWRpdEhpc3RvcnkoXG4gICAgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IEFycmF5PHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PixcbiAgKTogUHJvbWlzZTxBdWRpdEhpc3RvcnlSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5nZXRBdWRpdEhpc3RvcnkocGFyYW1zKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXNjYXBlIEhhdGNoXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogRXhwb3NlIHVuZGVybHlpbmcgTkF1dGhDbGllbnQgZm9yIGFkdmFuY2VkIHNjZW5hcmlvcy5cbiAgICpcblxuICAgKiBAcmV0dXJucyBUaGUgdW5kZXJseWluZyBOQXV0aENsaWVudCBpbnN0YW5jZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIERlcHJlY2F0ZWQgLSB1c2UgZGlyZWN0IG1ldGhvZHMgaW5zdGVhZFxuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0Q2xpZW50KCkuZ2V0TWZhU3RhdHVzKCk7XG4gICAqXG4gICAqIC8vIFByZWZlcnJlZCAtIHVzZSBkaXJlY3QgbWV0aG9kc1xuICAgKiBjb25zdCBzdGF0dXMgPSBhd2FpdCB0aGlzLmF1dGguZ2V0TWZhU3RhdHVzKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2xpZW50KCk6IE5BdXRoQ2xpZW50IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQ7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFkbWluIE9wZXJhdGlvbnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBBZG1pbiBvcGVyYXRpb25zIChpZiBlbmFibGVkIGluIGNvbmZpZykuXG4gICAqXG4gICAqIFByb3ZpZGVzIGFkbWluLWxldmVsIHVzZXIgbWFuYWdlbWVudCBtZXRob2RzOlxuICAgKiAtIFVzZXIgQ1JVRCBvcGVyYXRpb25zXG4gICAqIC0gUGFzc3dvcmQgbWFuYWdlbWVudFxuICAgKiAtIFNlc3Npb24gbWFuYWdlbWVudFxuICAgKiAtIE1GQSBtYW5hZ2VtZW50XG4gICAqIC0gQXVkaXQgaGlzdG9yeVxuICAgKlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBhZG1pbiB3YXMgbm90IGNvbmZpZ3VyZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEFkbWluT3BlcmF0aW9ucyBpbnN0YW5jZSBvciB1bmRlZmluZWRcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBDaGVjayBpZiBhZG1pbiBpcyBhdmFpbGFibGVcbiAgICogaWYgKHRoaXMuYXV0aC5hZG1pbikge1xuICAgKiAgIGNvbnN0IHVzZXJzID0gYXdhaXQgdGhpcy5hdXRoLmFkbWluLmdldFVzZXJzKHsgcGFnZTogMSB9KTtcbiAgICogfVxuICAgKlxuICAgKiAvLyBXaXRoIG9wdGlvbmFsIGNoYWluaW5nXG4gICAqIGF3YWl0IHRoaXMuYXV0aC5hZG1pbj8uZGVsZXRlVXNlcihzdWIpO1xuICAgKlxuICAgKiAvLyBDcmVhdGUgdXNlclxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmF1dGguYWRtaW4/LmNyZWF0ZVVzZXIoe1xuICAgKiAgIGVtYWlsOiAndXNlckBleGFtcGxlLmNvbScsXG4gICAqICAgcGFzc3dvcmQ6ICdTZWN1cmVQYXNzMTIzIScsXG4gICAqICAgaXNFbWFpbFZlcmlmaWVkOiB0cnVlLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZXQgYWRtaW4oKTogQWRtaW5PcGVyYXRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuYWRtaW47XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVybmFsIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGJ5IGh5ZHJhdGluZyBzdGF0ZSBmcm9tIHN0b3JhZ2UuXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIGNvbnN0cnVjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuO1xuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuaW5pdGlhbGl6ZSgpO1xuXG4gICAgLy8gSHlkcmF0ZSBjaGFsbGVuZ2Ugc3RhdGVcbiAgICBjb25zdCBzdG9yZWRDaGFsbGVuZ2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTdG9yZWRDaGFsbGVuZ2UoKTtcbiAgICBpZiAoc3RvcmVkQ2hhbGxlbmdlKSB7XG4gICAgICB0aGlzLmNoYWxsZW5nZVN1YmplY3QubmV4dChzdG9yZWRDaGFsbGVuZ2UpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzdWJqZWN0cyBmcm9tIGNsaWVudCBzdGF0ZVxuICAgIGNvbnN0IHVzZXIgPSB0aGlzLmNsaWVudC5nZXRDdXJyZW50VXNlcigpO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICB0aGlzLmN1cnJlbnRVc2VyU3ViamVjdC5uZXh0KHVzZXIpO1xuICAgICAgdGhpcy5pc0F1dGhlbnRpY2F0ZWRTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjaGFsbGVuZ2Ugc3RhdGUgYWZ0ZXIgYXV0aCByZXNwb25zZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlQ2hhbGxlbmdlU3RhdGUocmVzcG9uc2U6IEF1dGhSZXNwb25zZSk6IEF1dGhSZXNwb25zZSB7XG4gICAgaWYgKHJlc3BvbnNlLmNoYWxsZW5nZU5hbWUpIHtcbiAgICAgIHRoaXMuY2hhbGxlbmdlU3ViamVjdC5uZXh0KHJlc3BvbnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGFsbGVuZ2VTdWJqZWN0Lm5leHQobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcmVDQVBUQ0hBIEhlbHBlclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdldCByZUNBUFRDSEEgdG9rZW4gLSBhdXRvLWdlbmVyYXRlIGZvciB2MyBvciB1c2UgcHJvdmlkZWQgdG9rZW4uXG4gICAqXG4gICAqIEhhbmRsZXMgcGxhdGZvcm0gZGV0ZWN0aW9uOlxuICAgKiAtIFdlYiBicm93c2VyOiBHZW5lcmF0ZSB0b2tlbiBpZiBlbmFibGVkIGFuZCB2M1xuICAgKiAtIENhcGFjaXRvciBuYXRpdmU6IFNraXAgKHVzZSBkZXZpY2UgYXR0ZXN0YXRpb24gaW5zdGVhZClcbiAgICogLSBTU1I6IFNraXBcbiAgICogLSBNYW51YWwgbW9kZSAodjIgb3IgbWFudWFsQ2hhbGxlbmdlPXRydWUpOiBSZXF1aXJlcyBleHBsaWNpdCB0b2tlblxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZWRUb2tlbiAtIEV4cGxpY2l0bHkgcHJvdmlkZWQgdG9rZW4gKHYyIG1hbnVhbCBtb2RlKVxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljc1xuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgdW5kZWZpbmVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdldFJlY2FwdGNoYVRva2VuKHByb3ZpZGVkVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgYWN0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIElmIHRva2VuIGV4cGxpY2l0bHkgcHJvdmlkZWQsIHVzZSBpdCAodjIgbWFudWFsIG1vZGUpXG4gICAgaWYgKHByb3ZpZGVkVG9rZW4pIHtcbiAgICAgIHJldHVybiBwcm92aWRlZFRva2VuO1xuICAgIH1cblxuICAgIC8vIE5vIHJlQ0FQVENIQSBzZXJ2aWNlIGF2YWlsYWJsZVxuICAgIGlmICghdGhpcy5yZWNhcHRjaGFTZXJ2aWNlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHJlQ0FQVENIQSBpcyBjb25maWd1cmVkXG4gICAgY29uc3QgcmVjYXB0Y2hhQ29uZmlnID0gKFxuICAgICAgdGhpcy5jb25maWcgYXMgeyByZWNhcHRjaGE/OiB7IGVuYWJsZWQ/OiBib29sZWFuOyB2ZXJzaW9uPzogc3RyaW5nOyBtYW51YWxDaGFsbGVuZ2U/OiBib29sZWFuIH0gfVxuICAgICkucmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFyZWNhcHRjaGFDb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEEgKFNTUiwgQ2FwYWNpdG9yIG5hdGl2ZSlcbiAgICBpZiAodGhpcy5yZWNhcHRjaGFTZXJ2aWNlLnNob3VsZFNraXAoKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyB2MiBvciBtYW51YWwgbW9kZSAtIHVzZXIgbXVzdCBwcm92aWRlIHRva2VuIGV4cGxpY2l0bHlcbiAgICBpZiAocmVjYXB0Y2hhQ29uZmlnLnZlcnNpb24gPT09ICd2MicgfHwgcmVjYXB0Y2hhQ29uZmlnLm1hbnVhbENoYWxsZW5nZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBBdXRvLWdlbmVyYXRlIHRva2VuIGZvciB2My9FbnRlcnByaXNlXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlY2FwdGNoYVNlcnZpY2UuZXhlY3V0ZShhY3Rpb24pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBMb2cgZXJyb3IgYnV0IGRvbid0IGJsb2NrIGF1dGhlbnRpY2F0aW9uXG4gICAgICAvLyBTZXJ2ZXIgd2lsbCBlbmZvcmNlIGlmIHJlcXVpcmVkXG4gICAgICBjb25zb2xlLndhcm4oJ1tBdXRoU2VydmljZV0gRmFpbGVkIHRvIGdlbmVyYXRlIHJlQ0FQVENIQSB0b2tlbjonLCBlcnJvcik7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -1,4 +1,4 @@
1
- import { NgModule, inject } from '@angular/core';
1
+ import { NgModule, inject, Optional, APP_INITIALIZER } from '@angular/core';
2
2
  import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
3
3
  import { Router } from '@angular/router';
4
4
  import { NAUTH_CLIENT_CONFIG } from './tokens';
@@ -6,13 +6,14 @@ import { AuthService } from './auth.service';
6
6
  import { AngularHttpAdapter } from './http-adapter';
7
7
  import { AuthInterceptorClass } from './auth.interceptor.class';
8
8
  import { AuthGuard } from '../lib/auth.guard';
9
+ import { RecaptchaService, RECAPTCHA_CONFIG } from '../lib/recaptcha.service';
9
10
  import * as i0 from "@angular/core";
10
11
  /**
11
12
  * NgModule for nauth-toolkit Angular integration.
12
13
  *
13
14
  * Use this for NgModule-based apps (Angular 17+ with NgModule or legacy apps).
14
15
  *
15
- * @example
16
+ * @example Basic Setup
16
17
  * ```typescript
17
18
  * // app.module.ts
18
19
  * import { NAuthModule } from '@nauth-toolkit/client-angular';
@@ -27,35 +28,67 @@ import * as i0 from "@angular/core";
27
28
  * })
28
29
  * export class AppModule {}
29
30
  * ```
31
+ *
32
+ * @example With reCAPTCHA Enterprise
33
+ * ```typescript
34
+ * NAuthModule.forRoot({
35
+ * baseUrl: 'http://localhost:3000/auth',
36
+ * tokenDelivery: 'cookies',
37
+ * recaptcha: {
38
+ * enabled: true,
39
+ * version: 'enterprise',
40
+ * siteKey: environment.recaptchaSiteKey,
41
+ * action: 'login',
42
+ * },
43
+ * })
44
+ * ```
30
45
  */
31
46
  export class NAuthModule {
32
47
  static forRoot(config) {
33
- return {
34
- ngModule: NAuthModule,
35
- providers: [
36
- {
37
- provide: NAUTH_CLIENT_CONFIG,
38
- useValue: config,
39
- },
40
- AngularHttpAdapter,
41
- {
42
- provide: AuthService,
43
- useFactory: (httpAdapter) => {
44
- // Try to inject Router optionally - if not available, pass undefined
45
- // Router will be undefined if not provided (e.g., in apps without routing)
46
- const router = inject(Router, { optional: true });
47
- return new AuthService(config, httpAdapter, router ?? undefined);
48
- },
49
- deps: [AngularHttpAdapter],
48
+ const providers = [
49
+ {
50
+ provide: NAUTH_CLIENT_CONFIG,
51
+ useValue: config,
52
+ },
53
+ AngularHttpAdapter,
54
+ {
55
+ provide: AuthService,
56
+ useFactory: (httpAdapter, recaptchaService) => {
57
+ // Try to inject Router optionally - if not available, pass undefined
58
+ // Router will be undefined if not provided (e.g., in apps without routing)
59
+ const router = inject(Router, { optional: true });
60
+ return new AuthService(config, httpAdapter, router ?? undefined, recaptchaService);
50
61
  },
51
- {
52
- provide: HTTP_INTERCEPTORS,
53
- useClass: AuthInterceptorClass,
54
- multi: true,
62
+ deps: [AngularHttpAdapter, [new Optional(), RecaptchaService]],
63
+ },
64
+ {
65
+ provide: HTTP_INTERCEPTORS,
66
+ useClass: AuthInterceptorClass,
67
+ multi: true,
68
+ },
69
+ // Provide AuthGuard so it has access to NAUTH_CLIENT_CONFIG
70
+ AuthGuard,
71
+ ];
72
+ // Add reCAPTCHA providers if configured
73
+ if (config.recaptcha?.enabled) {
74
+ providers.push({
75
+ provide: RECAPTCHA_CONFIG,
76
+ // Cast because interface extends but they're compatible
77
+ useValue: config.recaptcha,
78
+ }, RecaptchaService, {
79
+ provide: APP_INITIALIZER,
80
+ useFactory: () => {
81
+ // Force RecaptchaService instantiation at app startup so script preloads
82
+ inject(RecaptchaService);
83
+ // No-op - constructor already handles preload
84
+ return () => { };
55
85
  },
56
- // Provide AuthGuard so it has access to NAUTH_CLIENT_CONFIG
57
- AuthGuard,
58
- ],
86
+ multi: true,
87
+ });
88
+ }
89
+ return {
90
+ ngModule: NAuthModule,
91
+ providers,
59
92
  };
60
93
  }
61
94
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
@@ -69,4 +102,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
69
102
  exports: [HttpClientModule],
70
103
  }]
71
104
  }] });
72
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL25hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUc5Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFLSCxNQUFNLE9BQU8sV0FBVztJQUN0QixNQUFNLENBQUMsT0FBTyxDQUFDLE1BQXlCO1FBQ3RDLE9BQU87WUFDTCxRQUFRLEVBQUUsV0FBVztZQUNyQixTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsT0FBTyxFQUFFLG1CQUFtQjtvQkFDNUIsUUFBUSxFQUFFLE1BQU07aUJBQ2pCO2dCQUNELGtCQUFrQjtnQkFDbEI7b0JBQ0UsT0FBTyxFQUFFLFdBQVc7b0JBQ3BCLFVBQVUsRUFBRSxDQUFDLFdBQStCLEVBQUUsRUFBRTt3QkFDOUMscUVBQXFFO3dCQUNyRSwyRUFBMkU7d0JBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQzt3QkFDbEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsQ0FBQztvQkFDbkUsQ0FBQztvQkFDRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztpQkFDM0I7Z0JBQ0Q7b0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsS0FBSyxFQUFFLElBQUk7aUJBQ1o7Z0JBQ0QsNERBQTREO2dCQUM1RCxTQUFTO2FBQ1Y7U0FDRixDQUFDO0lBQ0osQ0FBQzt3R0E3QlUsV0FBVzt5R0FBWCxXQUFXLFlBSFosZ0JBQWdCLGFBQ2hCLGdCQUFnQjt5R0FFZixXQUFXLFlBSFosZ0JBQWdCLEVBQ2hCLGdCQUFnQjs7NEZBRWYsV0FBVztrQkFKdkIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDM0IsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7aUJBQzVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE1vZHVsZVdpdGhQcm92aWRlcnMsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSwgSFRUUF9JTlRFUkNFUFRPUlMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTkFVVEhfQ0xJRU5UX0NPTkZJRyB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ndWxhckh0dHBBZGFwdGVyIH0gZnJvbSAnLi9odHRwLWFkYXB0ZXInO1xuaW1wb3J0IHsgQXV0aEludGVyY2VwdG9yQ2xhc3MgfSBmcm9tICcuL2F1dGguaW50ZXJjZXB0b3IuY2xhc3MnO1xuaW1wb3J0IHsgQXV0aEd1YXJkIH0gZnJvbSAnLi4vbGliL2F1dGguZ3VhcmQnO1xuaW1wb3J0IHsgTkF1dGhDbGllbnRDb25maWcgfSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIE5nTW9kdWxlIGZvciBuYXV0aC10b29sa2l0IEFuZ3VsYXIgaW50ZWdyYXRpb24uXG4gKlxuICogVXNlIHRoaXMgZm9yIE5nTW9kdWxlLWJhc2VkIGFwcHMgKEFuZ3VsYXIgMTcrIHdpdGggTmdNb2R1bGUgb3IgbGVnYWN5IGFwcHMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBhcHAubW9kdWxlLnRzXG4gKiBpbXBvcnQgeyBOQXV0aE1vZHVsZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBpbXBvcnRzOiBbXG4gKiAgICAgTkF1dGhNb2R1bGUuZm9yUm9vdCh7XG4gKiAgICAgICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgnLFxuICogICAgICAgdG9rZW5EZWxpdmVyeTogJ2Nvb2tpZXMnLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgTkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE5BdXRoQ2xpZW50Q29uZmlnKTogTW9kdWxlV2l0aFByb3ZpZGVyczxOQXV0aE1vZHVsZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogTkF1dGhNb2R1bGUsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IE5BVVRIX0NMSUVOVF9DT05GSUcsXG4gICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICAgICAgfSxcbiAgICAgICAgQW5ndWxhckh0dHBBZGFwdGVyLFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQXV0aFNlcnZpY2UsXG4gICAgICAgICAgdXNlRmFjdG9yeTogKGh0dHBBZGFwdGVyOiBBbmd1bGFySHR0cEFkYXB0ZXIpID0+IHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBpbmplY3QgUm91dGVyIG9wdGlvbmFsbHkgLSBpZiBub3QgYXZhaWxhYmxlLCBwYXNzIHVuZGVmaW5lZFxuICAgICAgICAgICAgLy8gUm91dGVyIHdpbGwgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZCAoZS5nLiwgaW4gYXBwcyB3aXRob3V0IHJvdXRpbmcpXG4gICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBpbmplY3QoUm91dGVyLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoU2VydmljZShjb25maWcsIGh0dHBBZGFwdGVyLCByb3V0ZXIgPz8gdW5kZWZpbmVkKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRlcHM6IFtBbmd1bGFySHR0cEFkYXB0ZXJdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgdXNlQ2xhc3M6IEF1dGhJbnRlcmNlcHRvckNsYXNzLFxuICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICAvLyBQcm92aWRlIEF1dGhHdWFyZCBzbyBpdCBoYXMgYWNjZXNzIHRvIE5BVVRIX0NMSUVOVF9DT05GSUdcbiAgICAgICAgQXV0aEd1YXJkLFxuICAgICAgXSxcbiAgICB9O1xuICB9XG59XG4iXX0=
105
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF1dGgubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL25hdXRoLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUF1QixNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLG1CQUFtQixFQUFzQixNQUFNLFVBQVUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDOztBQUU5RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtDRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBQ3RCLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBMEI7UUFDdkMsTUFBTSxTQUFTLEdBQVU7WUFDdkI7Z0JBQ0UsT0FBTyxFQUFFLG1CQUFtQjtnQkFDNUIsUUFBUSxFQUFFLE1BQU07YUFDakI7WUFDRCxrQkFBa0I7WUFDbEI7Z0JBQ0UsT0FBTyxFQUFFLFdBQVc7Z0JBQ3BCLFVBQVUsRUFBRSxDQUFDLFdBQStCLEVBQUUsZ0JBQW1DLEVBQUUsRUFBRTtvQkFDbkYscUVBQXFFO29CQUNyRSwyRUFBMkU7b0JBQzNFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDbEQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sSUFBSSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDckYsQ0FBQztnQkFDRCxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzthQUMvRDtZQUNEO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLEtBQUssRUFBRSxJQUFJO2FBQ1o7WUFDRCw0REFBNEQ7WUFDNUQsU0FBUztTQUNWLENBQUM7UUFFRix3Q0FBd0M7UUFDeEMsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzlCLFNBQVMsQ0FBQyxJQUFJLENBQ1o7Z0JBQ0UsT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsd0RBQXdEO2dCQUN4RCxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVM7YUFDM0IsRUFDRCxnQkFBZ0IsRUFDaEI7Z0JBQ0UsT0FBTyxFQUFFLGVBQWU7Z0JBQ3hCLFVBQVUsRUFBRSxHQUFHLEVBQUU7b0JBQ2YseUVBQXlFO29CQUN6RSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDekIsOENBQThDO29CQUM5QyxPQUFPLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxLQUFLLEVBQUUsSUFBSTthQUNaLENBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLFdBQVc7WUFDckIsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO3dHQXJEVSxXQUFXO3lHQUFYLFdBQVcsWUFIWixnQkFBZ0IsYUFDaEIsZ0JBQWdCO3lHQUVmLFdBQVcsWUFIWixnQkFBZ0IsRUFDaEIsZ0JBQWdCOzs0RkFFZixXQUFXO2tCQUp2QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUMzQixPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDNUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTW9kdWxlV2l0aFByb3ZpZGVycywgaW5qZWN0LCBPcHRpb25hbCwgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlLCBIVFRQX0lOVEVSQ0VQVE9SUyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOQVVUSF9DTElFTlRfQ09ORklHLCBOQXV0aEFuZ3VsYXJDb25maWcgfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IEFuZ3VsYXJIdHRwQWRhcHRlciB9IGZyb20gJy4vaHR0cC1hZGFwdGVyJztcbmltcG9ydCB7IEF1dGhJbnRlcmNlcHRvckNsYXNzIH0gZnJvbSAnLi9hdXRoLmludGVyY2VwdG9yLmNsYXNzJztcbmltcG9ydCB7IEF1dGhHdWFyZCB9IGZyb20gJy4uL2xpYi9hdXRoLmd1YXJkJztcbmltcG9ydCB7IFJlY2FwdGNoYVNlcnZpY2UsIFJFQ0FQVENIQV9DT05GSUcgfSBmcm9tICcuLi9saWIvcmVjYXB0Y2hhLnNlcnZpY2UnO1xuXG4vKipcbiAqIE5nTW9kdWxlIGZvciBuYXV0aC10b29sa2l0IEFuZ3VsYXIgaW50ZWdyYXRpb24uXG4gKlxuICogVXNlIHRoaXMgZm9yIE5nTW9kdWxlLWJhc2VkIGFwcHMgKEFuZ3VsYXIgMTcrIHdpdGggTmdNb2R1bGUgb3IgbGVnYWN5IGFwcHMpLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIFNldHVwXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBhcHAubW9kdWxlLnRzXG4gKiBpbXBvcnQgeyBOQXV0aE1vZHVsZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudC1hbmd1bGFyJztcbiAqXG4gKiBATmdNb2R1bGUoe1xuICogICBpbXBvcnRzOiBbXG4gKiAgICAgTkF1dGhNb2R1bGUuZm9yUm9vdCh7XG4gKiAgICAgICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgnLFxuICogICAgICAgdG9rZW5EZWxpdmVyeTogJ2Nvb2tpZXMnLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHBNb2R1bGUge31cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFdpdGggcmVDQVBUQ0hBIEVudGVycHJpc2VcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIE5BdXRoTW9kdWxlLmZvclJvb3Qoe1xuICogICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdDozMDAwL2F1dGgnLFxuICogICB0b2tlbkRlbGl2ZXJ5OiAnY29va2llcycsXG4gKiAgIHJlY2FwdGNoYToge1xuICogICAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgICAgdmVyc2lvbjogJ2VudGVycHJpc2UnLFxuICogICAgIHNpdGVLZXk6IGVudmlyb25tZW50LnJlY2FwdGNoYVNpdGVLZXksXG4gKiAgICAgYWN0aW9uOiAnbG9naW4nLFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbSHR0cENsaWVudE1vZHVsZV0sXG4gIGV4cG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgTkF1dGhNb2R1bGUge1xuICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE5BdXRoQW5ndWxhckNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8TkF1dGhNb2R1bGU+IHtcbiAgICBjb25zdCBwcm92aWRlcnM6IGFueVtdID0gW1xuICAgICAge1xuICAgICAgICBwcm92aWRlOiBOQVVUSF9DTElFTlRfQ09ORklHLFxuICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgfSxcbiAgICAgIEFuZ3VsYXJIdHRwQWRhcHRlcixcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogQXV0aFNlcnZpY2UsXG4gICAgICAgIHVzZUZhY3Rvcnk6IChodHRwQWRhcHRlcjogQW5ndWxhckh0dHBBZGFwdGVyLCByZWNhcHRjaGFTZXJ2aWNlPzogUmVjYXB0Y2hhU2VydmljZSkgPT4ge1xuICAgICAgICAgIC8vIFRyeSB0byBpbmplY3QgUm91dGVyIG9wdGlvbmFsbHkgLSBpZiBub3QgYXZhaWxhYmxlLCBwYXNzIHVuZGVmaW5lZFxuICAgICAgICAgIC8vIFJvdXRlciB3aWxsIGJlIHVuZGVmaW5lZCBpZiBub3QgcHJvdmlkZWQgKGUuZy4sIGluIGFwcHMgd2l0aG91dCByb3V0aW5nKVxuICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGluamVjdChSb3V0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIG5ldyBBdXRoU2VydmljZShjb25maWcsIGh0dHBBZGFwdGVyLCByb3V0ZXIgPz8gdW5kZWZpbmVkLCByZWNhcHRjaGFTZXJ2aWNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVwczogW0FuZ3VsYXJIdHRwQWRhcHRlciwgW25ldyBPcHRpb25hbCgpLCBSZWNhcHRjaGFTZXJ2aWNlXV0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUyxcbiAgICAgICAgdXNlQ2xhc3M6IEF1dGhJbnRlcmNlcHRvckNsYXNzLFxuICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAvLyBQcm92aWRlIEF1dGhHdWFyZCBzbyBpdCBoYXMgYWNjZXNzIHRvIE5BVVRIX0NMSUVOVF9DT05GSUdcbiAgICAgIEF1dGhHdWFyZCxcbiAgICBdO1xuXG4gICAgLy8gQWRkIHJlQ0FQVENIQSBwcm92aWRlcnMgaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcucmVjYXB0Y2hhPy5lbmFibGVkKSB7XG4gICAgICBwcm92aWRlcnMucHVzaChcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IFJFQ0FQVENIQV9DT05GSUcsXG4gICAgICAgICAgLy8gQ2FzdCBiZWNhdXNlIGludGVyZmFjZSBleHRlbmRzIGJ1dCB0aGV5J3JlIGNvbXBhdGlibGVcbiAgICAgICAgICB1c2VWYWx1ZTogY29uZmlnLnJlY2FwdGNoYSxcbiAgICAgICAgfSxcbiAgICAgICAgUmVjYXB0Y2hhU2VydmljZSxcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcbiAgICAgICAgICB1c2VGYWN0b3J5OiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBGb3JjZSBSZWNhcHRjaGFTZXJ2aWNlIGluc3RhbnRpYXRpb24gYXQgYXBwIHN0YXJ0dXAgc28gc2NyaXB0IHByZWxvYWRzXG4gICAgICAgICAgICBpbmplY3QoUmVjYXB0Y2hhU2VydmljZSk7XG4gICAgICAgICAgICAvLyBOby1vcCAtIGNvbnN0cnVjdG9yIGFscmVhZHkgaGFuZGxlcyBwcmVsb2FkXG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge307XG4gICAgICAgICAgfSxcbiAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBOQXV0aE1vZHVsZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9O1xuICB9XG59XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL3Rva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9DOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxjQUFjLENBQW9CLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkF1dGhDbGllbnRDb25maWcgfSBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vKipcbiAqIEluamVjdGlvbiB0b2tlbiBmb3IgcHJvdmlkaW5nIE5BdXRoQ2xpZW50Q29uZmlnIGluIEFuZ3VsYXIgYXBwcy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5BVVRIX0NMSUVOVF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TkF1dGhDbGllbnRDb25maWc+KCdOQVVUSF9DTElFTlRfQ09ORklHJyk7XG4iXX0=
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25nbW9kdWxlL3Rva2Vucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBNEcvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUFvQixxQkFBcUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50Q29uZmlnIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50JztcblxuLyoqXG4gKiByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBmb3IgQW5ndWxhciBjbGllbnQuXG4gKlxuICogRXh0ZW5kcyBiYXNlIGNsaWVudCBSZWNhcHRjaGFDb25maWcgd2l0aCBBbmd1bGFyLXNwZWNpZmljIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGUgdjMgQXV0b21hdGljIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHtcbiAqICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgdmVyc2lvbjogJ3YzJyxcbiAqICAgc2l0ZUtleTogJzZMY0V4YW1wbGVfU2l0ZV9LZXknLFxuICogICBhY3Rpb246ICdsb2dpbicsXG4gKiAgIGF1dG9Mb2FkU2NyaXB0OiB0cnVlLFxuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgdjIgTWFudWFsIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHtcbiAqICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgdmVyc2lvbjogJ3YyJyxcbiAqICAgc2l0ZUtleTogJzZMY0V4YW1wbGVfU2l0ZV9LZXknLFxuICogICBtYW51YWxDaGFsbGVuZ2U6IHRydWUsXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFBbmd1bGFyQ29uZmlnIHtcbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHJlQ0FQVENIQS5cbiAgICogU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgZXZlbiBpZiBjb25maWd1cmVkICh1c2VmdWwgZm9yIHRlc3RpbmcpLlxuICAgKi9cbiAgZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogcmVDQVBUQ0hBIHZlcnNpb246IHYyIChjaGVja2JveCksIHYzIChpbnZpc2libGUpLCBvciBlbnRlcnByaXNlLlxuICAgKi9cbiAgdmVyc2lvbjogJ3YyJyB8ICd2MycgfCAnZW50ZXJwcmlzZSc7XG5cbiAgLyoqXG4gICAqIFNpdGUga2V5IGZyb20gR29vZ2xlIHJlQ0FQVENIQSBjb25zb2xlLlxuICAgKiBUaGlzIGlzIHNhZmUgdG8gZXhwb3NlIHB1YmxpY2x5IChpdCdzIHRoZSBwdWJsaWMga2V5KS5cbiAgICovXG4gIHNpdGVLZXk6IHN0cmluZztcblxuICAvKipcbiAgICogQWN0aW9uIG5hbWUgZm9yIHYzL0VudGVycHJpc2UgYW5hbHl0aWNzLlxuICAgKiBIZWxwcyB0cmFjayB3aGljaCBhY3Rpb25zIGFyZSBiZWluZyBwcm90ZWN0ZWQuXG4gICAqIENvbW1vbiB2YWx1ZXM6ICdsb2dpbicsICdzaWdudXAnLCAnc3VibWl0J1xuICAgKlxuICAgKiBAZGVmYXVsdCAnc3VibWl0J1xuICAgKi9cbiAgYWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBNYW51YWwgY2hhbGxlbmdlIG1vZGUgKHYyIG9ubHkpLlxuICAgKiBJZiB0cnVlLCB5b3UgbXVzdCBtYW51YWxseSBjYWxsIFJlY2FwdGNoYVNlcnZpY2UucmVuZGVyKCkgYW5kIGdldCB0b2tlbi5cbiAgICogSWYgZmFsc2UsIEF1dGhTZXJ2aWNlIGF1dG8tZ2VuZXJhdGVzIHRva2VuIGJlZm9yZSBsb2dpbi9zaWdudXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtYW51YWxDaGFsbGVuZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGxvYWQgdGhlIEdvb2dsZSByZUNBUFRDSEEgc2NyaXB0LlxuICAgKiBJZiBmYWxzZSwgeW91IG11c3QgbWFudWFsbHkgbG9hZCB0aGUgc2NyaXB0LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBhdXRvTG9hZFNjcmlwdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExhbmd1YWdlIGNvZGUgZm9yIHJlQ0FQVENIQSB3aWRnZXQgKHYyIG9ubHkpLlxuICAgKiBAZXhhbXBsZSAnZW4nLCAnZXMnLCAnZnInLCAnZGUnXG4gICAqIEBkZWZhdWx0IEJyb3dzZXIgbGFuZ3VhZ2VcbiAgICovXG4gIGxhbmd1YWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuZ3VsYXItc3BlY2lmaWMgTkF1dGggY29uZmlndXJhdGlvbi5cbiAqXG4gKiBFeHRlbmRzIGJhc2UgTkF1dGhDbGllbnRDb25maWcgd2l0aCBBbmd1bGFyLXNwZWNpZmljIG9wdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNvbmZpZzogTkF1dGhBbmd1bGFyQ29uZmlnID0ge1xuICogICBiYXNlVXJsOiAnaHR0cHM6Ly9hcGkuZXhhbXBsZS5jb20vYXV0aCcsXG4gKiAgIHRva2VuRGVsaXZlcnk6ICdjb29raWVzJyxcbiAqICAgcmVjYXB0Y2hhOiB7XG4gKiAgICAgZW5hYmxlZDogdHJ1ZSxcbiAqICAgICB2ZXJzaW9uOiAndjMnLFxuICogICAgIHNpdGVLZXk6ICc2TGNFeGFtcGxlX1NpdGVfS2V5JyxcbiAqICAgICBhY3Rpb246ICdsb2dpbicsXG4gKiAgIH0sXG4gKiB9O1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTkF1dGhBbmd1bGFyQ29uZmlnIGV4dGVuZHMgTkF1dGhDbGllbnRDb25maWcge1xuICAvKipcbiAgICogR29vZ2xlIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uIChvcHRpb25hbCkuXG4gICAqIFByb3ZpZGVzIGJvdCBwcm90ZWN0aW9uIGZvciBsb2dpbi9zaWdudXAgZW5kcG9pbnRzLlxuICAgKi9cbiAgcmVjYXB0Y2hhPzogUmVjYXB0Y2hhQW5ndWxhckNvbmZpZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHByb3ZpZGluZyBOQXV0aENsaWVudENvbmZpZyBpbiBBbmd1bGFyIGFwcHMuXG4gKi9cbmV4cG9ydCBjb25zdCBOQVVUSF9DTElFTlRfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE5BdXRoQ2xpZW50Q29uZmlnPignTkFVVEhfQ0xJRU5UX0NPTkZJRycpO1xuIl19
@@ -16,4 +16,6 @@ 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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsNENBQTRDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsb0RBQW9EO0FBQ3BELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxzRUFBc0U7QUFDdEUsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBAbmF1dGgtdG9vbGtpdC9jbGllbnQtYW5ndWxhciAoTmdNb2R1bGUpXG4gKlxuICogVGhpcyBpcyB0aGUgZGVmYXVsdCBlbnRyeSBwb2ludCBmb3IgTmdNb2R1bGUtYmFzZWQgQW5ndWxhciBhcHBzLlxuICogRm9yIHN0YW5kYWxvbmUgY29tcG9uZW50cywgdXNlOiBAbmF1dGgtdG9vbGtpdC9jbGllbnQtYW5ndWxhci9zdGFuZGFsb25lXG4gKi9cblxuLy8gUmUtZXhwb3J0IGNvcmUgY2xpZW50IHR5cGVzIGFuZCB1dGlsaXRpZXNcbmV4cG9ydCAqIGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8vIEV4cG9ydCBOZ01vZHVsZS1zcGVjaWZpYyBjb21wb25lbnRzIChjbGFzcy1iYXNlZClcbmV4cG9ydCAqIGZyb20gJy4vbmdtb2R1bGUvdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbmdtb2R1bGUvaHR0cC1hZGFwdGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbmdtb2R1bGUvYXV0aC5pbnRlcmNlcHRvci5jbGFzcyc7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL25hdXRoLm1vZHVsZSc7XG5cbi8vIEV4cG9ydCBmdW5jdGlvbmFsIGNvbXBvbmVudHMgKGZvciBmbGV4aWJpbGl0eSBpbiBOZ01vZHVsZSBhcHBzIHRvbylcbmV4cG9ydCAqIGZyb20gJy4vbGliL2F1dGguaW50ZXJjZXB0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvYXV0aC5ndWFyZCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQnO1xuIl19
19
+ export * from './lib/recaptcha.service';
20
+ export * from './lib/recaptcha-provider';
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsNENBQTRDO0FBQzVDLGNBQWMsdUJBQXVCLENBQUM7QUFFdEMsb0RBQW9EO0FBQ3BELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx5QkFBeUIsQ0FBQztBQUV4QyxzRUFBc0U7QUFDdEUsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLDBCQUEwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgQG5hdXRoLXRvb2xraXQvY2xpZW50LWFuZ3VsYXIgKE5nTW9kdWxlKVxuICpcbiAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZW50cnkgcG9pbnQgZm9yIE5nTW9kdWxlLWJhc2VkIEFuZ3VsYXIgYXBwcy5cbiAqIEZvciBzdGFuZGFsb25lIGNvbXBvbmVudHMsIHVzZTogQG5hdXRoLXRvb2xraXQvY2xpZW50LWFuZ3VsYXIvc3RhbmRhbG9uZVxuICovXG5cbi8vIFJlLWV4cG9ydCBjb3JlIGNsaWVudCB0eXBlcyBhbmQgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICdAbmF1dGgtdG9vbGtpdC9jbGllbnQnO1xuXG4vLyBFeHBvcnQgTmdNb2R1bGUtc3BlY2lmaWMgY29tcG9uZW50cyAoY2xhc3MtYmFzZWQpXG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL3Rva2Vucyc7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2F1dGguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2h0dHAtYWRhcHRlcic7XG5leHBvcnQgKiBmcm9tICcuL25nbW9kdWxlL2F1dGguaW50ZXJjZXB0b3IuY2xhc3MnO1xuZXhwb3J0ICogZnJvbSAnLi9uZ21vZHVsZS9uYXV0aC5tb2R1bGUnO1xuXG4vLyBFeHBvcnQgZnVuY3Rpb25hbCBjb21wb25lbnRzIChmb3IgZmxleGliaWxpdHkgaW4gTmdNb2R1bGUgYXBwcyB0b28pXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hdXRoLmludGVyY2VwdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2F1dGguZ3VhcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlY2FwdGNoYS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JlY2FwdGNoYS1wcm92aWRlcic7XG4iXX0=