@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.
@@ -0,0 +1,52 @@
1
+ import { inject, makeEnvironmentProviders, APP_INITIALIZER } from '@angular/core';
2
+ import { RecaptchaService, RECAPTCHA_CONFIG } from './recaptcha.service';
3
+ /**
4
+ * Provides reCAPTCHA configuration and automatic script preloading.
5
+ *
6
+ * Sets up `RECAPTCHA_CONFIG` and forces `RecaptchaService` instantiation at app
7
+ * startup so the reCAPTCHA script preloads before the user clicks login/signup.
8
+ *
9
+ * @param config - reCAPTCHA configuration (enabled, version, siteKey, action)
10
+ * @returns Environment providers for reCAPTCHA
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * export const appConfig: ApplicationConfig = {
15
+ * providers: [
16
+ * provideRecaptcha({
17
+ * enabled: true,
18
+ * version: 'enterprise',
19
+ * siteKey: environment.recaptchaSiteKey,
20
+ * action: 'login',
21
+ * }),
22
+ * // ... other providers
23
+ * ],
24
+ * };
25
+ * ```
26
+ */
27
+ export function provideRecaptcha(config) {
28
+ return makeEnvironmentProviders([
29
+ {
30
+ provide: RECAPTCHA_CONFIG,
31
+ useValue: config,
32
+ },
33
+ RecaptchaService,
34
+ {
35
+ provide: APP_INITIALIZER,
36
+ useFactory: () => {
37
+ const recaptcha = inject(RecaptchaService);
38
+ // Return initialization function that ensures script starts loading
39
+ return () => {
40
+ // Trigger script load (fire-and-forget, don't block app startup)
41
+ if (config.enabled && (config.version === 'v3' || config.version === 'enterprise')) {
42
+ recaptcha.loadScript().catch(() => {
43
+ // Silent fail - execute() will retry when called
44
+ });
45
+ }
46
+ };
47
+ },
48
+ multi: true,
49
+ },
50
+ ]);
51
+ }
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9yZWNhcHRjaGEtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBd0Isd0JBQXdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBMEIsTUFBTSxxQkFBcUIsQ0FBQztBQUVqRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsTUFBOEI7SUFDN0QsT0FBTyx3QkFBd0IsQ0FBQztRQUM5QjtZQUNFLE9BQU8sRUFBRSxnQkFBZ0I7WUFDekIsUUFBUSxFQUFFLE1BQU07U0FDakI7UUFDRCxnQkFBZ0I7UUFDaEI7WUFDRSxPQUFPLEVBQUUsZUFBZTtZQUN4QixVQUFVLEVBQUUsR0FBRyxFQUFFO2dCQUNmLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUMzQyxvRUFBb0U7Z0JBQ3BFLE9BQU8sR0FBRyxFQUFFO29CQUNWLGlFQUFpRTtvQkFDakUsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO3dCQUNuRixTQUFTLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTs0QkFDaEMsaURBQWlEO3dCQUNuRCxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQztZQUNKLENBQUM7WUFDRCxLQUFLLEVBQUUsSUFBSTtTQUNaO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgRW52aXJvbm1lbnRQcm92aWRlcnMsIG1ha2VFbnZpcm9ubWVudFByb3ZpZGVycywgQVBQX0lOSVRJQUxJWkVSIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZWNhcHRjaGFTZXJ2aWNlLCBSRUNBUFRDSEFfQ09ORklHLCBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi9yZWNhcHRjaGEuc2VydmljZSc7XG5cbi8qKlxuICogUHJvdmlkZXMgcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gYW5kIGF1dG9tYXRpYyBzY3JpcHQgcHJlbG9hZGluZy5cbiAqXG4gKiBTZXRzIHVwIGBSRUNBUFRDSEFfQ09ORklHYCBhbmQgZm9yY2VzIGBSZWNhcHRjaGFTZXJ2aWNlYCBpbnN0YW50aWF0aW9uIGF0IGFwcFxuICogc3RhcnR1cCBzbyB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBwcmVsb2FkcyBiZWZvcmUgdGhlIHVzZXIgY2xpY2tzIGxvZ2luL3NpZ251cC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gKGVuYWJsZWQsIHZlcnNpb24sIHNpdGVLZXksIGFjdGlvbilcbiAqIEByZXR1cm5zIEVudmlyb25tZW50IHByb3ZpZGVycyBmb3IgcmVDQVBUQ0hBXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cG9ydCBjb25zdCBhcHBDb25maWc6IEFwcGxpY2F0aW9uQ29uZmlnID0ge1xuICogICBwcm92aWRlcnM6IFtcbiAqICAgICBwcm92aWRlUmVjYXB0Y2hhKHtcbiAqICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gKiAgICAgICB2ZXJzaW9uOiAnZW50ZXJwcmlzZScsXG4gKiAgICAgICBzaXRlS2V5OiBlbnZpcm9ubWVudC5yZWNhcHRjaGFTaXRlS2V5LFxuICogICAgICAgYWN0aW9uOiAnbG9naW4nLFxuICogICAgIH0pLFxuICogICAgIC8vIC4uLiBvdGhlciBwcm92aWRlcnNcbiAqICAgXSxcbiAqIH07XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVSZWNhcHRjaGEoY29uZmlnOiBSZWNhcHRjaGFTZXJ2aWNlQ29uZmlnKTogRW52aXJvbm1lbnRQcm92aWRlcnMge1xuICByZXR1cm4gbWFrZUVudmlyb25tZW50UHJvdmlkZXJzKFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBSRUNBUFRDSEFfQ09ORklHLFxuICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICB9LFxuICAgIFJlY2FwdGNoYVNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLFxuICAgICAgdXNlRmFjdG9yeTogKCkgPT4ge1xuICAgICAgICBjb25zdCByZWNhcHRjaGEgPSBpbmplY3QoUmVjYXB0Y2hhU2VydmljZSk7XG4gICAgICAgIC8vIFJldHVybiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IGVuc3VyZXMgc2NyaXB0IHN0YXJ0cyBsb2FkaW5nXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgLy8gVHJpZ2dlciBzY3JpcHQgbG9hZCAoZmlyZS1hbmQtZm9yZ2V0LCBkb24ndCBibG9jayBhcHAgc3RhcnR1cClcbiAgICAgICAgICBpZiAoY29uZmlnLmVuYWJsZWQgJiYgKGNvbmZpZy52ZXJzaW9uID09PSAndjMnIHx8IGNvbmZpZy52ZXJzaW9uID09PSAnZW50ZXJwcmlzZScpKSB7XG4gICAgICAgICAgICByZWNhcHRjaGEubG9hZFNjcmlwdCgpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgLy8gU2lsZW50IGZhaWwgLSBleGVjdXRlKCkgd2lsbCByZXRyeSB3aGVuIGNhbGxlZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0pO1xufVxuIl19
@@ -0,0 +1,371 @@
1
+ import { Injectable, Inject, PLATFORM_ID, Optional, InjectionToken } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Injection token for reCAPTCHA configuration
6
+ */
7
+ export const RECAPTCHA_CONFIG = new InjectionToken('RECAPTCHA_CONFIG', {
8
+ providedIn: 'root',
9
+ factory: () => undefined,
10
+ });
11
+ /**
12
+ * Google reCAPTCHA service for Angular applications.
13
+ *
14
+ * Provides lazy loading of reCAPTCHA script and platform-aware token generation.
15
+ * Automatically detects platform (web, Capacitor WebView, Capacitor native, SSR)
16
+ * and skips reCAPTCHA in environments where it's not supported or needed.
17
+ *
18
+ * Features:
19
+ * - Lazy script loading (only loads when needed)
20
+ * - v2 (checkbox) and v3 (invisible) support
21
+ * - Platform detection (web, Capacitor, SSR)
22
+ * - Automatic skip for Capacitor native mode
23
+ * - Automatic skip for SSR
24
+ *
25
+ * @example v3 Automatic Mode
26
+ * ```typescript
27
+ * constructor(private recaptcha: RecaptchaService) {}
28
+ *
29
+ * async login() {
30
+ * const token = await this.recaptcha.execute('login');
31
+ * await this.auth.login(email, password, token);
32
+ * }
33
+ * ```
34
+ *
35
+ * @example v2 Manual Mode
36
+ * ```typescript
37
+ * ngOnInit() {
38
+ * this.recaptcha.render('recaptcha-container', (token) => {
39
+ * this.recaptchaToken = token;
40
+ * });
41
+ * }
42
+ * ```
43
+ */
44
+ export class RecaptchaService {
45
+ platformId;
46
+ config;
47
+ scriptLoaded = false;
48
+ scriptLoading = null;
49
+ platform;
50
+ widgetId = null;
51
+ constructor(platformId, config) {
52
+ this.platformId = platformId;
53
+ this.config = config;
54
+ this.platform = this.detectPlatform();
55
+ // Auto-preload script for v3/Enterprise so it's ready before first login/signup
56
+ // No-op when disabled, shouldSkip, or v2 (v2 renders on-demand)
57
+ if (this.config?.enabled && (this.config.version === 'v3' || this.config.version === 'enterprise')) {
58
+ if (!this.shouldSkip()) {
59
+ this.loadScript().catch(() => {
60
+ // Silently fail - execute() will handle errors when called
61
+ });
62
+ }
63
+ }
64
+ }
65
+ // ============================================================================
66
+ // Platform Detection
67
+ // ============================================================================
68
+ /**
69
+ * Detect the current platform environment.
70
+ *
71
+ * Detection priority:
72
+ * 1. SSR (not in browser) → 'ssr'
73
+ * 2. Capacitor native (no web view) → 'capacitor-native'
74
+ * 3. Capacitor WebView → 'capacitor-webview'
75
+ * 4. Web browser → 'web'
76
+ *
77
+ * @returns Detected platform type
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * const platform = this.detectPlatform();
82
+ * if (platform === 'capacitor-native') {
83
+ * // Skip reCAPTCHA, use device attestation
84
+ * }
85
+ * ```
86
+ */
87
+ detectPlatform() {
88
+ // SSR detection
89
+ if (!isPlatformBrowser(this.platformId)) {
90
+ return 'ssr';
91
+ }
92
+ // Capacitor detection (window.Capacitor exists)
93
+ const windowRef = window;
94
+ if (windowRef.Capacitor) {
95
+ // Capacitor native (iOS/Android app)
96
+ if (typeof windowRef.Capacitor.isNativePlatform === 'function' && windowRef.Capacitor.isNativePlatform()) {
97
+ return 'capacitor-native';
98
+ }
99
+ // Capacitor WebView
100
+ return 'capacitor-webview';
101
+ }
102
+ return 'web';
103
+ }
104
+ /**
105
+ * Get the current platform.
106
+ *
107
+ * @returns Current platform type
108
+ */
109
+ getPlatform() {
110
+ return this.platform;
111
+ }
112
+ /**
113
+ * Check if reCAPTCHA should be skipped for current platform.
114
+ *
115
+ * Skips for:
116
+ * - SSR (no window object)
117
+ * - Capacitor native (use device attestation instead)
118
+ *
119
+ * @returns True if should skip reCAPTCHA
120
+ */
121
+ shouldSkip() {
122
+ return this.platform === 'ssr' || this.platform === 'capacitor-native';
123
+ }
124
+ // ============================================================================
125
+ // Script Loading
126
+ // ============================================================================
127
+ /**
128
+ * Load Google reCAPTCHA script if not already loaded.
129
+ *
130
+ * Script URL format:
131
+ * - v2: https://www.google.com/recaptcha/api.js
132
+ * - v3: https://www.google.com/recaptcha/api.js?render={siteKey}
133
+ * - Enterprise: https://www.google.com/recaptcha/enterprise.js?render={siteKey}
134
+ *
135
+ * @returns Promise that resolves when script is loaded
136
+ *
137
+ * @throws Error if config is missing or script fails to load
138
+ */
139
+ async loadScript() {
140
+ // Skip in SSR or Capacitor native
141
+ if (this.shouldSkip()) {
142
+ return;
143
+ }
144
+ // Skip if disabled
145
+ if (!this.config?.enabled) {
146
+ return;
147
+ }
148
+ // Already loaded
149
+ if (this.scriptLoaded) {
150
+ return;
151
+ }
152
+ // Already loading (return existing promise)
153
+ if (this.scriptLoading) {
154
+ return this.scriptLoading;
155
+ }
156
+ // Validate config
157
+ if (!this.config.siteKey) {
158
+ throw new Error('[RecaptchaService] Site key is required');
159
+ }
160
+ // Start loading
161
+ this.scriptLoading = this.injectScript();
162
+ try {
163
+ await this.scriptLoading;
164
+ this.scriptLoaded = true;
165
+ }
166
+ finally {
167
+ this.scriptLoading = null;
168
+ }
169
+ }
170
+ /**
171
+ * Inject the reCAPTCHA script into the DOM.
172
+ *
173
+ * @returns Promise that resolves when script loads
174
+ */
175
+ injectScript() {
176
+ return new Promise((resolve, reject) => {
177
+ const script = document.createElement('script');
178
+ script.async = true;
179
+ script.defer = true;
180
+ // Set script URL based on version
181
+ if (this.config.version === 'enterprise') {
182
+ script.src = `https://www.google.com/recaptcha/enterprise.js?render=${this.config.siteKey}`;
183
+ }
184
+ else if (this.config.version === 'v3') {
185
+ script.src = `https://www.google.com/recaptcha/api.js?render=${this.config.siteKey}`;
186
+ }
187
+ else {
188
+ // v2 - load without render parameter
189
+ let url = 'https://www.google.com/recaptcha/api.js';
190
+ if (this.config.language) {
191
+ url += `?hl=${this.config.language}`;
192
+ }
193
+ script.src = url;
194
+ }
195
+ script.onload = () => resolve();
196
+ script.onerror = () => reject(new Error('[RecaptchaService] Failed to load reCAPTCHA script'));
197
+ document.head.appendChild(script);
198
+ });
199
+ }
200
+ // ============================================================================
201
+ // v3/Enterprise Methods (Invisible Challenge)
202
+ // ============================================================================
203
+ /**
204
+ * Execute reCAPTCHA v3/Enterprise challenge (invisible).
205
+ *
206
+ * Automatically loads script if needed and generates a token.
207
+ * Skips automatically for SSR and Capacitor native.
208
+ *
209
+ * @param action - Action name for v3 analytics (e.g., 'login', 'signup')
210
+ * @returns Promise resolving to reCAPTCHA token, or undefined if skipped
211
+ *
212
+ * @throws Error if version is v2, config missing, or execution fails
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * const token = await this.recaptcha.execute('login');
217
+ * if (token) {
218
+ * await this.auth.login(email, password, token);
219
+ * }
220
+ * ```
221
+ */
222
+ async execute(action) {
223
+ // Skip for platforms that don't support reCAPTCHA
224
+ if (this.shouldSkip()) {
225
+ return undefined;
226
+ }
227
+ // Skip if disabled
228
+ if (!this.config?.enabled) {
229
+ return undefined;
230
+ }
231
+ // v2 requires manual render
232
+ if (this.config.version === 'v2') {
233
+ throw new Error('[RecaptchaService] execute() is only for v3/Enterprise. Use render() for v2.');
234
+ }
235
+ // Load script if needed
236
+ await this.loadScript();
237
+ // Get grecaptcha object
238
+ const grecaptcha = window.grecaptcha;
239
+ if (!grecaptcha) {
240
+ throw new Error('[RecaptchaService] grecaptcha is not loaded');
241
+ }
242
+ // Execute reCAPTCHA
243
+ const actionName = action || this.config.action || 'submit';
244
+ try {
245
+ if (this.config.version === 'enterprise' && grecaptcha.enterprise?.execute) {
246
+ return await grecaptcha.enterprise.execute(this.config.siteKey, { action: actionName });
247
+ }
248
+ else if (grecaptcha.execute) {
249
+ return await grecaptcha.execute(this.config.siteKey, { action: actionName });
250
+ }
251
+ else {
252
+ throw new Error('[RecaptchaService] grecaptcha.execute is not available');
253
+ }
254
+ }
255
+ catch (error) {
256
+ throw new Error(`[RecaptchaService] Failed to execute reCAPTCHA: ${error instanceof Error ? error.message : 'unknown error'}`);
257
+ }
258
+ }
259
+ // ============================================================================
260
+ // v2 Methods (Visible Checkbox)
261
+ // ============================================================================
262
+ /**
263
+ * Render reCAPTCHA v2 checkbox widget.
264
+ *
265
+ * @param containerId - DOM element ID or element to render in
266
+ * @param callback - Callback when user completes challenge
267
+ * @returns Promise resolving to widget ID
268
+ *
269
+ * @throws Error if version is not v2, config missing, or render fails
270
+ *
271
+ * @example
272
+ * ```typescript
273
+ * ngAfterViewInit() {
274
+ * this.recaptcha.render('recaptcha-container', (token) => {
275
+ * this.recaptchaToken = token;
276
+ * this.loginForm.patchValue({ recaptchaToken: token });
277
+ * });
278
+ * }
279
+ * ```
280
+ */
281
+ async render(containerId, callback) {
282
+ // Skip for platforms that don't support reCAPTCHA
283
+ if (this.shouldSkip()) {
284
+ throw new Error('[RecaptchaService] reCAPTCHA v2 is not supported in SSR or Capacitor native');
285
+ }
286
+ // Skip if disabled
287
+ if (!this.config?.enabled) {
288
+ throw new Error('[RecaptchaService] reCAPTCHA is not enabled');
289
+ }
290
+ // Only for v2
291
+ if (this.config.version !== 'v2') {
292
+ throw new Error('[RecaptchaService] render() is only for v2. Use execute() for v3/Enterprise.');
293
+ }
294
+ // Load script if needed
295
+ await this.loadScript();
296
+ // Get grecaptcha object
297
+ const grecaptcha = window.grecaptcha;
298
+ if (!grecaptcha?.render) {
299
+ throw new Error('[RecaptchaService] grecaptcha.render is not available');
300
+ }
301
+ // Render widget
302
+ try {
303
+ this.widgetId = grecaptcha.render(containerId, {
304
+ sitekey: this.config.siteKey,
305
+ callback: callback,
306
+ });
307
+ return this.widgetId;
308
+ }
309
+ catch (error) {
310
+ throw new Error(`[RecaptchaService] Failed to render reCAPTCHA: ${error instanceof Error ? error.message : 'unknown error'}`);
311
+ }
312
+ }
313
+ /**
314
+ * Get response token from v2 widget.
315
+ *
316
+ * @param widgetId - Widget ID (optional, uses last rendered widget if not provided)
317
+ * @returns reCAPTCHA token or null if not completed
318
+ *
319
+ * @example
320
+ * ```typescript
321
+ * const token = this.recaptcha.getResponse();
322
+ * if (token) {
323
+ * await this.auth.login(email, password, token);
324
+ * }
325
+ * ```
326
+ */
327
+ getResponse(widgetId) {
328
+ const grecaptcha = window.grecaptcha;
329
+ if (!grecaptcha?.getResponse) {
330
+ return null;
331
+ }
332
+ const id = widgetId !== undefined ? widgetId : this.widgetId ?? undefined;
333
+ return grecaptcha.getResponse(id) || null;
334
+ }
335
+ /**
336
+ * Reset v2 widget (clear response).
337
+ *
338
+ * @param widgetId - Widget ID (optional, uses last rendered widget if not provided)
339
+ *
340
+ * @example
341
+ * ```typescript
342
+ * // After failed login
343
+ * this.recaptcha.reset();
344
+ * ```
345
+ */
346
+ reset(widgetId) {
347
+ const grecaptcha = window.grecaptcha;
348
+ if (!grecaptcha?.reset) {
349
+ return;
350
+ }
351
+ const id = widgetId !== undefined ? widgetId : this.widgetId ?? undefined;
352
+ grecaptcha.reset(id);
353
+ }
354
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, deps: [{ token: PLATFORM_ID }, { token: RECAPTCHA_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
355
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, providedIn: 'root' });
356
+ }
357
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RecaptchaService, decorators: [{
358
+ type: Injectable,
359
+ args: [{
360
+ providedIn: 'root',
361
+ }]
362
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
363
+ type: Inject,
364
+ args: [PLATFORM_ID]
365
+ }] }, { type: undefined, decorators: [{
366
+ type: Optional
367
+ }, {
368
+ type: Inject,
369
+ args: [RECAPTCHA_CONFIG]
370
+ }] }] });
371
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjYXB0Y2hhLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlY2FwdGNoYS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQTJCcEQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLGNBQWMsQ0FBcUMsa0JBQWtCLEVBQUU7SUFDekcsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVM7Q0FDekIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBSUgsTUFBTSxPQUFPLGdCQUFnQjtJQU9JO0lBQ2lCO0lBUHhDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsYUFBYSxHQUF5QixJQUFJLENBQUM7SUFDM0MsUUFBUSxDQUFXO0lBQ25CLFFBQVEsR0FBa0IsSUFBSSxDQUFDO0lBRXZDLFlBQytCLFVBQWtCLEVBQ0QsTUFBK0I7UUFEaEQsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNELFdBQU0sR0FBTixNQUFNLENBQXlCO1FBRTdFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBRXRDLGdGQUFnRjtRQUNoRixnRUFBZ0U7UUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ25HLElBQUksQ0FBQyxJQUFJLENBQUMsVUFB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QUFXLGFBQ0MsZ0JBQWdCOzRHQVIzQixnQkFBZ0IsY0FGZixNQUFNOzs0RkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFRSSxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgUExBVEZPUk1fSUQsIE9wdGlvbmFsLCBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vKipcbiAqIERldGVjdHMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnRcbiAqL1xudHlwZSBQbGF0Zm9ybSA9ICd3ZWInIHwgJ2NhcGFjaXRvci13ZWJ2aWV3JyB8ICdjYXBhY2l0b3ItbmF0aXZlJyB8ICdzc3InO1xuXG4vKipcbiAqIHJlQ0FQVENIQSB2ZXJzaW9uIHR5cGVcbiAqL1xudHlwZSBSZWNhcHRjaGFWZXJzaW9uID0gJ3YyJyB8ICd2MycgfCAnZW50ZXJwcmlzZSc7XG5cbi8qKlxuICogcmVDQVBUQ0hBIGNvbmZpZ3VyYXRpb24gZm9yIFJlY2FwdGNoYVNlcnZpY2VcbiAqIFxuICogSW50ZXJuYWwgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgdXNlZCBieSBSZWNhcHRjaGFTZXJ2aWNlLlxuICogVXNlIFJlY2FwdGNoYUFuZ3VsYXJDb25maWcgZnJvbSB0b2tlbnMudHMgZm9yIGFwcCBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVNlcnZpY2VDb25maWcge1xuICBlbmFibGVkOiBib29sZWFuO1xuICB2ZXJzaW9uOiBSZWNhcHRjaGFWZXJzaW9uO1xuICBzaXRlS2V5OiBzdHJpbmc7XG4gIGFjdGlvbj86IHN0cmluZztcbiAgYXV0b0xvYWRTY3JpcHQ/OiBib29sZWFuO1xuICBsYW5ndWFnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbmplY3Rpb24gdG9rZW4gZm9yIHJlQ0FQVENIQSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBSRUNBUFRDSEFfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFJlY2FwdGNoYVNlcnZpY2VDb25maWcgfCB1bmRlZmluZWQ+KCdSRUNBUFRDSEFfQ09ORklHJywge1xuICBwcm92aWRlZEluOiAncm9vdCcsXG4gIGZhY3Rvcnk6ICgpID0+IHVuZGVmaW5lZCxcbn0pO1xuXG4vKipcbiAqIEdvb2dsZSByZUNBUFRDSEEgc2VydmljZSBmb3IgQW5ndWxhciBhcHBsaWNhdGlvbnMuXG4gKlxuICogUHJvdmlkZXMgbGF6eSBsb2FkaW5nIG9mIHJlQ0FQVENIQSBzY3JpcHQgYW5kIHBsYXRmb3JtLWF3YXJlIHRva2VuIGdlbmVyYXRpb24uXG4gKiBBdXRvbWF0aWNhbGx5IGRldGVjdHMgcGxhdGZvcm0gKHdlYiwgQ2FwYWNpdG9yIFdlYlZpZXcsIENhcGFjaXRvciBuYXRpdmUsIFNTUilcbiAqIGFuZCBza2lwcyByZUNBUFRDSEEgaW4gZW52aXJvbm1lbnRzIHdoZXJlIGl0J3Mgbm90IHN1cHBvcnRlZCBvciBuZWVkZWQuXG4gKlxuICogRmVhdHVyZXM6XG4gKiAtIExhenkgc2NyaXB0IGxvYWRpbmcgKG9ubHkgbG9hZHMgd2hlbiBuZWVkZWQpXG4gKiAtIHYyIChjaGVja2JveCkgYW5kIHYzIChpbnZpc2libGUpIHN1cHBvcnRcbiAqIC0gUGxhdGZvcm0gZGV0ZWN0aW9uICh3ZWIsIENhcGFjaXRvciwgU1NSKVxuICogLSBBdXRvbWF0aWMgc2tpcCBmb3IgQ2FwYWNpdG9yIG5hdGl2ZSBtb2RlXG4gKiAtIEF1dG9tYXRpYyBza2lwIGZvciBTU1JcbiAqXG4gKiBAZXhhbXBsZSB2MyBBdXRvbWF0aWMgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3RydWN0b3IocHJpdmF0ZSByZWNhcHRjaGE6IFJlY2FwdGNoYVNlcnZpY2UpIHt9XG4gKlxuICogYXN5bmMgbG9naW4oKSB7XG4gKiAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5yZWNhcHRjaGEuZXhlY3V0ZSgnbG9naW4nKTtcbiAqICAgYXdhaXQgdGhpcy5hdXRoLmxvZ2luKGVtYWlsLCBwYXNzd29yZCwgdG9rZW4pO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgdjIgTWFudWFsIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIG5nT25Jbml0KCkge1xuICogICB0aGlzLnJlY2FwdGNoYS5yZW5kZXIoJ3JlY2FwdGNoYS1jb250YWluZXInLCAodG9rZW4pID0+IHtcbiAqICAgICB0aGlzLnJlY2FwdGNoYVRva2VuID0gdG9rZW47XG4gKiAgIH0pO1xuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzY3JpcHRMb2FkaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtO1xuICBwcml2YXRlIHdpZGdldElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFQ0FQVENIQV9DT05GSUcpIHByaXZhdGUgY29uZmlnPzogUmVjYXB0Y2hhU2VydmljZUNvbmZpZyxcbiAgKSB7XG4gICAgdGhpcy5wbGF0Zm9ybSA9IHRoaXMuZGV0ZWN0UGxhdGZvcm0oKTtcbiAgICBcbiAgICAvLyBBdXRvLXByZWxvYWQgc2NyaXB0IGZvciB2My9FbnRlcnByaXNlIHNvIGl0J3MgcmVhZHkgYmVmb3JlIGZpcnN0IGxvZ2luL3NpZ251cFxuICAgIC8vIE5vLW9wIHdoZW4gZGlzYWJsZWQsIHNob3VsZFNraXAsIG9yIHYyICh2MiByZW5kZXJzIG9uLWRlbWFuZClcbiAgICBpZiAodGhpcy5jb25maWc/LmVuYWJsZWQgJiYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICd2MycgfHwgdGhpcy5jb25maWcudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZFNraXAoKSkge1xuICAgICAgICB0aGlzLmxvYWRTY3JpcHQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIGV4ZWN1dGUoKSB3aWxsIGhhbmRsZSBlcnJvcnMgd2hlbiBjYWxsZWRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQbGF0Zm9ybSBEZXRlY3Rpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBEZXRlY3QgdGhlIGN1cnJlbnQgcGxhdGZvcm0gZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIERldGVjdGlvbiBwcmlvcml0eTpcbiAgICogMS4gU1NSIChub3QgaW4gYnJvd3Nlcikg4oaSICdzc3InXG4gICAqIDIuIENhcGFjaXRvciBuYXRpdmUgKG5vIHdlYiB2aWV3KSDihpIgJ2NhcGFjaXRvci1uYXRpdmUnXG4gICAqIDMuIENhcGFjaXRvciBXZWJWaWV3IOKGkiAnY2FwYWNpdG9yLXdlYnZpZXcnXG4gICAqIDQuIFdlYiBicm93c2VyIOKGkiAnd2ViJ1xuICAgKlxuICAgKiBAcmV0dXJucyBEZXRlY3RlZCBwbGF0Zm9ybSB0eXBlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGxhdGZvcm0gPSB0aGlzLmRldGVjdFBsYXRmb3JtKCk7XG4gICAqIGlmIChwbGF0Zm9ybSA9PT0gJ2NhcGFjaXRvci1uYXRpdmUnKSB7XG4gICAqICAgLy8gU2tpcCByZUNBUFRDSEEsIHVzZSBkZXZpY2UgYXR0ZXN0YXRpb25cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIC8vIFNTUiBkZXRlY3Rpb25cbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgIHJldHVybiAnc3NyJztcbiAgICB9XG5cbiAgICAvLyBDYXBhY2l0b3IgZGV0ZWN0aW9uICh3aW5kb3cuQ2FwYWNpdG9yIGV4aXN0cylcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgeyBDYXBhY2l0b3I/OiB7IGlzTmF0aXZlUGxhdGZvcm0/OiAoKSA9PiBib29sZWFuIH0gfTtcblxuICAgIGlmICh3aW5kb3dSZWYuQ2FwYWNpdG9yKSB7XG4gICAgICAvLyBDYXBhY2l0b3IgbmF0aXZlIChpT1MvQW5kcm9pZCBhcHApXG4gICAgICBpZiAodHlwZW9mIHdpbmRvd1JlZi5DYXBhY2l0b3IuaXNOYXRpdmVQbGF0Zm9ybSA9PT0gJ2Z1bmN0aW9uJyAmJiB3aW5kb3dSZWYuQ2FwYWNpdG9yLmlzTmF0aXZlUGxhdGZvcm0oKSkge1xuICAgICAgICByZXR1cm4gJ2NhcGFjaXRvci1uYXRpdmUnO1xuICAgICAgfVxuICAgICAgLy8gQ2FwYWNpdG9yIFdlYlZpZXdcbiAgICAgIHJldHVybiAnY2FwYWNpdG9yLXdlYnZpZXcnO1xuICAgIH1cblxuICAgIHJldHVybiAnd2ViJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgcGxhdGZvcm0uXG4gICAqXG4gICAqIEByZXR1cm5zIEN1cnJlbnQgcGxhdGZvcm0gdHlwZVxuICAgKi9cbiAgZ2V0UGxhdGZvcm0oKTogUGxhdGZvcm0ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHJlQ0FQVENIQSBzaG91bGQgYmUgc2tpcHBlZCBmb3IgY3VycmVudCBwbGF0Zm9ybS5cbiAgICpcbiAgICogU2tpcHMgZm9yOlxuICAgKiAtIFNTUiAobm8gd2luZG93IG9iamVjdClcbiAgICogLSBDYXBhY2l0b3IgbmF0aXZlICh1c2UgZGV2aWNlIGF0dGVzdGF0aW9uIGluc3RlYWQpXG4gICAqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgc2hvdWxkIHNraXAgcmVDQVBUQ0hBXG4gICAqL1xuICBzaG91bGRTa2lwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtID09PSAnc3NyJyB8fCB0aGlzLnBsYXRmb3JtID09PSAnY2FwYWNpdG9yLW5hdGl2ZSc7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNjcmlwdCBMb2FkaW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogTG9hZCBHb29nbGUgcmVDQVBUQ0hBIHNjcmlwdCBpZiBub3QgYWxyZWFkeSBsb2FkZWQuXG4gICAqXG4gICAqIFNjcmlwdCBVUkwgZm9ybWF0OlxuICAgKiAtIHYyOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9hcGkuanNcbiAgICogLSB2MzogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICogLSBFbnRlcnByaXNlOiBodHRwczovL3d3dy5nb29nbGUuY29tL3JlY2FwdGNoYS9lbnRlcnByaXNlLmpzP3JlbmRlcj17c2l0ZUtleX1cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NyaXB0IGlzIGxvYWRlZFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIGNvbmZpZyBpcyBtaXNzaW5nIG9yIHNjcmlwdCBmYWlscyB0byBsb2FkXG4gICAqL1xuICBhc3luYyBsb2FkU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNraXAgaW4gU1NSIG9yIENhcGFjaXRvciBuYXRpdmVcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGlmIGRpc2FibGVkXG4gICAgaWYgKCF0aGlzLmNvbmZpZz8uZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEFscmVhZHkgbG9hZGVkXG4gICAgaWYgKHRoaXMuc2NyaXB0TG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWxyZWFkeSBsb2FkaW5nIChyZXR1cm4gZXhpc3RpbmcgcHJvbWlzZSlcbiAgICBpZiAodGhpcy5zY3JpcHRMb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zY3JpcHRMb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGNvbmZpZ1xuICAgIGlmICghdGhpcy5jb25maWcuc2l0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gU2l0ZSBrZXkgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBsb2FkaW5nXG4gICAgdGhpcy5zY3JpcHRMb2FkaW5nID0gdGhpcy5pbmplY3RTY3JpcHQoKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNjcmlwdExvYWRpbmc7XG4gICAgICB0aGlzLnNjcmlwdExvYWRlZCA9IHRydWU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuc2NyaXB0TG9hZGluZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdCB0aGUgcmVDQVBUQ0hBIHNjcmlwdCBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHNjcmlwdCBsb2Fkc1xuICAgKi9cbiAgcHJpdmF0ZSBpbmplY3RTY3JpcHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcbiAgICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XG5cbiAgICAgIC8vIFNldCBzY3JpcHQgVVJMIGJhc2VkIG9uIHZlcnNpb25cbiAgICAgIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ2VudGVycHJpc2UnKSB7XG4gICAgICAgIHNjcmlwdC5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZW50ZXJwcmlzZS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZyEudmVyc2lvbiA9PT0gJ3YzJykge1xuICAgICAgICBzY3JpcHQuc3JjID0gYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcz9yZW5kZXI9JHt0aGlzLmNvbmZpZyEuc2l0ZUtleX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdjIgLSBsb2FkIHdpdGhvdXQgcmVuZGVyIHBhcmFtZXRlclxuICAgICAgICBsZXQgdXJsID0gJ2h0dHBzOi8vd3d3Lmdvb2dsZS5jb20vcmVjYXB0Y2hhL2FwaS5qcyc7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyEubGFuZ3VhZ2UpIHtcbiAgICAgICAgICB1cmwgKz0gYD9obD0ke3RoaXMuY29uZmlnIS5sYW5ndWFnZX1gO1xuICAgICAgICB9XG4gICAgICAgIHNjcmlwdC5zcmMgPSB1cmw7XG4gICAgICB9XG5cbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICBzY3JpcHQub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBGYWlsZWQgdG8gbG9hZCByZUNBUFRDSEEgc2NyaXB0JykpO1xuXG4gICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYzL0VudGVycHJpc2UgTWV0aG9kcyAoSW52aXNpYmxlIENoYWxsZW5nZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHJlQ0FQVENIQSB2My9FbnRlcnByaXNlIGNoYWxsZW5nZSAoaW52aXNpYmxlKS5cbiAgICpcbiAgICogQXV0b21hdGljYWxseSBsb2FkcyBzY3JpcHQgaWYgbmVlZGVkIGFuZCBnZW5lcmF0ZXMgYSB0b2tlbi5cbiAgICogU2tpcHMgYXV0b21hdGljYWxseSBmb3IgU1NSIGFuZCBDYXBhY2l0b3IgbmF0aXZlLlxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIC0gQWN0aW9uIG5hbWUgZm9yIHYzIGFuYWx5dGljcyAoZS5nLiwgJ2xvZ2luJywgJ3NpZ251cCcpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHJlQ0FQVENIQSB0b2tlbiwgb3IgdW5kZWZpbmVkIGlmIHNraXBwZWRcbiAgICpcbiAgICogQHRocm93cyBFcnJvciBpZiB2ZXJzaW9uIGlzIHYyLCBjb25maWcgbWlzc2luZywgb3IgZXhlY3V0aW9uIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLnJlY2FwdGNoYS5leGVjdXRlKCdsb2dpbicpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBleGVjdXRlKGFjdGlvbj86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gU2tpcCBmb3IgcGxhdGZvcm1zIHRoYXQgZG9uJ3Qgc3VwcG9ydCByZUNBUFRDSEFcbiAgICBpZiAodGhpcy5zaG91bGRTa2lwKCkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBkaXNhYmxlZFxuICAgIGlmICghdGhpcy5jb25maWc/LmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gdjIgcmVxdWlyZXMgbWFudWFsIHJlbmRlclxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uID09PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSBleGVjdXRlKCkgaXMgb25seSBmb3IgdjMvRW50ZXJwcmlzZS4gVXNlIHJlbmRlcigpIGZvciB2Mi4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZXhlY3V0ZT86IChzaXRlS2V5OiBzdHJpbmcsIG9wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxzdHJpbmc+OyBlbnRlcnByaXNlPzogeyBleGVjdXRlPzogKHNpdGVLZXk6IHN0cmluZywgb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPHN0cmluZz4gfSB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEgaXMgbm90IGxvYWRlZCcpO1xuICAgIH1cblxuICAgIC8vIEV4ZWN1dGUgcmVDQVBUQ0hBXG4gICAgY29uc3QgYWN0aW9uTmFtZSA9IGFjdGlvbiB8fCB0aGlzLmNvbmZpZy5hY3Rpb24gfHwgJ3N1Ym1pdCc7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLnZlcnNpb24gPT09ICdlbnRlcnByaXNlJyAmJiBncmVjYXB0Y2hhLmVudGVycHJpc2U/LmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZW50ZXJwcmlzZS5leGVjdXRlKHRoaXMuY29uZmlnLnNpdGVLZXksIHsgYWN0aW9uOiBhY3Rpb25OYW1lIH0pO1xuICAgICAgfSBlbHNlIGlmIChncmVjYXB0Y2hhLmV4ZWN1dGUpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdyZWNhcHRjaGEuZXhlY3V0ZSh0aGlzLmNvbmZpZy5zaXRlS2V5LCB7IGFjdGlvbjogYWN0aW9uTmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignW1JlY2FwdGNoYVNlcnZpY2VdIGdyZWNhcHRjaGEuZXhlY3V0ZSBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byBleGVjdXRlIHJlQ0FQVENIQTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHYyIE1ldGhvZHMgKFZpc2libGUgQ2hlY2tib3gpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogUmVuZGVyIHJlQ0FQVENIQSB2MiBjaGVja2JveCB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJJZCAtIERPTSBlbGVtZW50IElEIG9yIGVsZW1lbnQgdG8gcmVuZGVyIGluXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIENhbGxiYWNrIHdoZW4gdXNlciBjb21wbGV0ZXMgY2hhbGxlbmdlXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHdpZGdldCBJRFxuICAgKlxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHZlcnNpb24gaXMgbm90IHYyLCBjb25maWcgbWlzc2luZywgb3IgcmVuZGVyIGZhaWxzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmdBZnRlclZpZXdJbml0KCkge1xuICAgKiAgIHRoaXMucmVjYXB0Y2hhLnJlbmRlcigncmVjYXB0Y2hhLWNvbnRhaW5lcicsICh0b2tlbikgPT4ge1xuICAgKiAgICAgdGhpcy5yZWNhcHRjaGFUb2tlbiA9IHRva2VuO1xuICAgKiAgICAgdGhpcy5sb2dpbkZvcm0ucGF0Y2hWYWx1ZSh7IHJlY2FwdGNoYVRva2VuOiB0b2tlbiB9KTtcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlbmRlcihjb250YWluZXJJZDogc3RyaW5nLCBjYWxsYmFjazogKHRva2VuOiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIC8vIFNraXAgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgcmVDQVBUQ0hBXG4gICAgaWYgKHRoaXMuc2hvdWxkU2tpcCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgdjIgaXMgbm90IHN1cHBvcnRlZCBpbiBTU1Igb3IgQ2FwYWNpdG9yIG5hdGl2ZScpO1xuICAgIH1cblxuICAgIC8vIFNraXAgaWYgZGlzYWJsZWRcbiAgICBpZiAoIXRoaXMuY29uZmlnPy5lbmFibGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZUNBUFRDSEEgaXMgbm90IGVuYWJsZWQnKTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IGZvciB2MlxuICAgIGlmICh0aGlzLmNvbmZpZy52ZXJzaW9uICE9PSAndjInKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tSZWNhcHRjaGFTZXJ2aWNlXSByZW5kZXIoKSBpcyBvbmx5IGZvciB2Mi4gVXNlIGV4ZWN1dGUoKSBmb3IgdjMvRW50ZXJwcmlzZS4nKTtcbiAgICB9XG5cbiAgICAvLyBMb2FkIHNjcmlwdCBpZiBuZWVkZWRcbiAgICBhd2FpdCB0aGlzLmxvYWRTY3JpcHQoKTtcblxuICAgIC8vIEdldCBncmVjYXB0Y2hhIG9iamVjdFxuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVuZGVyPzogKGNvbnRhaW5lcjogc3RyaW5nLCBvcHRpb25zOiB7IHNpdGVrZXk6IHN0cmluZzsgY2FsbGJhY2s6ICh0b2tlbjogc3RyaW5nKSA9PiB2b2lkIH0pID0+IG51bWJlciB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LnJlbmRlcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdbUmVjYXB0Y2hhU2VydmljZV0gZ3JlY2FwdGNoYS5yZW5kZXIgaXMgbm90IGF2YWlsYWJsZScpO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciB3aWRnZXRcbiAgICB0cnkge1xuICAgICAgdGhpcy53aWRnZXRJZCA9IGdyZWNhcHRjaGEucmVuZGVyKGNvbnRhaW5lcklkLCB7XG4gICAgICAgIHNpdGVrZXk6IHRoaXMuY29uZmlnLnNpdGVLZXksXG4gICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjayxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaXMud2lkZ2V0SWQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgW1JlY2FwdGNoYVNlcnZpY2VdIEZhaWxlZCB0byByZW5kZXIgcmVDQVBUQ0hBOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVzcG9uc2UgdG9rZW4gZnJvbSB2MiB3aWRnZXQuXG4gICAqXG4gICAqIEBwYXJhbSB3aWRnZXRJZCAtIFdpZGdldCBJRCAob3B0aW9uYWwsIHVzZXMgbGFzdCByZW5kZXJlZCB3aWRnZXQgaWYgbm90IHByb3ZpZGVkKVxuICAgKiBAcmV0dXJucyByZUNBUFRDSEEgdG9rZW4gb3IgbnVsbCBpZiBub3QgY29tcGxldGVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdG9rZW4gPSB0aGlzLnJlY2FwdGNoYS5nZXRSZXNwb25zZSgpO1xuICAgKiBpZiAodG9rZW4pIHtcbiAgICogICBhd2FpdCB0aGlzLmF1dGgubG9naW4oZW1haWwsIHBhc3N3b3JkLCB0b2tlbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRSZXNwb25zZSh3aWRnZXRJZD86IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgZ2V0UmVzcG9uc2U/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHN0cmluZyB9IH0pLmdyZWNhcHRjaGE7XG5cbiAgICBpZiAoIWdyZWNhcHRjaGE/LmdldFJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBpZCA9IHdpZGdldElkICE9PSB1bmRlZmluZWQgPyB3aWRnZXRJZCA6IHRoaXMud2lkZ2V0SWQgPz8gdW5kZWZpbmVkO1xuICAgIHJldHVybiBncmVjYXB0Y2hhLmdldFJlc3BvbnNlKGlkKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHYyIHdpZGdldCAoY2xlYXIgcmVzcG9uc2UpLlxuICAgKlxuICAgKiBAcGFyYW0gd2lkZ2V0SWQgLSBXaWRnZXQgSUQgKG9wdGlvbmFsLCB1c2VzIGxhc3QgcmVuZGVyZWQgd2lkZ2V0IGlmIG5vdCBwcm92aWRlZClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBZnRlciBmYWlsZWQgbG9naW5cbiAgICogdGhpcy5yZWNhcHRjaGEucmVzZXQoKTtcbiAgICogYGBgXG4gICAqL1xuICByZXNldCh3aWRnZXRJZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGdyZWNhcHRjaGEgPSAod2luZG93IGFzIHsgZ3JlY2FwdGNoYT86IHsgcmVzZXQ/OiAod2lkZ2V0SWQ/OiBudW1iZXIpID0+IHZvaWQgfSB9KS5ncmVjYXB0Y2hhO1xuXG4gICAgaWYgKCFncmVjYXB0Y2hhPy5yZXNldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlkID0gd2lkZ2V0SWQgIT09IHVuZGVmaW5lZCA/IHdpZGdldElkIDogdGhpcy53aWRnZXRJZCA/PyB1bmRlZmluZWQ7XG4gICAgZ3JlY2FwdGNoYS5yZXNldChpZCk7XG4gIH1cbn1cbiJdfQ==
@@ -15,6 +15,7 @@ import { NAuthClientError, NAuthErrorCode } from '@nauth-toolkit/client';
15
15
  * - If `exchangeToken` exists: exchanges it via backend (SDK handles navigation automatically).
16
16
  * - If no `exchangeToken`: treat as cookie-success path (SDK handles navigation automatically).
17
17
  * - If `error` exists: redirects to oauthError route.
18
+ * - If auto-redirect is disabled (redirectUrls set to null): returns true to activate the route.
18
19
  *
19
20
  * @example
20
21
  * ```typescript
@@ -45,14 +46,16 @@ export const socialRedirectCallbackGuard = async () => {
45
46
  if (appState) {
46
47
  await auth.getClient().storeOauthState(appState);
47
48
  }
48
- // Provider error: redirect to oauthError
49
+ // Provider error: redirect to oauthError (or activate route if auto-redirect disabled)
49
50
  if (error) {
50
51
  await router.navigateToError('oauth');
51
- return false;
52
+ // Return true to activate route if oauthError redirect is disabled
53
+ return router.isErrorRedirectDisabled('oauth');
52
54
  }
53
55
  // No exchangeToken: cookie success path; hydrate then navigate to success.
54
56
  //
55
- // Note: we do not "activate" the callback route to avoid consumers needing to render a page.
57
+ // Note: When auto-redirect is enabled, we do not "activate" the callback route to avoid
58
+ // consumers needing to render a page. When disabled, we activate the route.
56
59
  if (!exchangeToken) {
57
60
  // ============================================================================
58
61
  // Cookies mode: hydrate user state before redirecting
@@ -94,31 +97,35 @@ export const socialRedirectCallbackGuard = async () => {
94
97
  appState: appState ?? undefined,
95
98
  });
96
99
  }
97
- catch (err) {
100
+ catch (error) {
98
101
  // Only treat auth failures (401/403) as OAuth errors
99
102
  // Network errors or other issues might be temporary - still try success route
100
- const isAuthError = err instanceof NAuthClientError &&
101
- (err.statusCode === 401 ||
102
- err.statusCode === 403 ||
103
- err.code === NAuthErrorCode.AUTH_TOKEN_INVALID ||
104
- err.code === NAuthErrorCode.AUTH_SESSION_EXPIRED ||
105
- err.code === NAuthErrorCode.AUTH_SESSION_NOT_FOUND);
106
- if (isAuthError) {
107
- // Cookies weren't set properly - OAuth failed
108
- await router.navigateToError('oauth');
109
- }
110
- else {
111
- // For network errors or other issues, proceed to success route
112
- // The auth guard will handle authentication state on the next route
113
- await router.navigateToSuccess(appState ? { appState } : undefined);
103
+ // Type guard: check if error is NAuthClientError
104
+ if (error instanceof NAuthClientError) {
105
+ const isAuthError = error.statusCode === 401 ||
106
+ error.statusCode === 403 ||
107
+ error.code === NAuthErrorCode.AUTH_TOKEN_INVALID ||
108
+ error.code === NAuthErrorCode.AUTH_SESSION_EXPIRED ||
109
+ error.code === NAuthErrorCode.AUTH_SESSION_NOT_FOUND;
110
+ if (isAuthError) {
111
+ // Cookies weren't set properly - OAuth failed
112
+ await router.navigateToError('oauth');
113
+ return router.isErrorRedirectDisabled('oauth');
114
+ }
114
115
  }
116
+ // For network errors or other non-auth issues, proceed to success route
117
+ // The auth guard will handle authentication state on the next route
118
+ await router.navigateToSuccess(appState ? { appState } : undefined);
115
119
  }
116
- return false;
120
+ // Return true if success redirect is disabled, allowing the callback component to render
121
+ return router.isSuccessRedirectDisabled({ source: 'social', appState: appState ?? undefined });
117
122
  }
118
123
  // Exchange token - SDK handles navigation automatically
119
124
  // Note: appState will be passed via query params when navigateToSuccess is called
120
125
  // by the challenge router after successful exchange
121
126
  await auth.exchangeSocialRedirect(exchangeToken);
122
- return false;
127
+ // Return true if success redirect is disabled, allowing the callback component to render
128
+ // We use 'social' as source since this is the social OAuth callback flow
129
+ return router.isSuccessRedirectDisabled({ source: 'social', appState: appState ?? undefined });
123
130
  };
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBa0IsS0FBSyxJQUFzQixFQUFFO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFaEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBRyxJQUFJ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b0RBQW9EO0lBQ3BELE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdHlwZSBDYW5BY3RpdmF0ZUZuIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50RXJyb3IsIE5BdXRoRXJyb3JDb2RlLCB0eXBlIEF1dGhSZXNwb25zZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogU29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrIHJvdXRlIGd1YXJkLlxuICpcbiAqIFRoaXMgZ3VhcmQgc3VwcG9ydHMgdGhlIHJlZGlyZWN0LWZpcnN0IHNvY2lhbCBmbG93IHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0c1xuICogYmFjayB0byB0aGUgZnJvbnRlbmQgd2l0aDpcbiAqIC0gYGFwcFN0YXRlYCAoYWx3YXlzIG9wdGlvbmFsKVxuICogLSBgZXhjaGFuZ2VUb2tlbmAgKHByZXNlbnQgZm9yIGpzb24vaHlicmlkIGZsb3dzLCBhbmQgZm9yIGNvb2tpZSBmbG93cyB0aGF0IHJldHVybiBhIGNoYWxsZW5nZSlcbiAqIC0gYGVycm9yYCAvIGBlcnJvcl9kZXNjcmlwdGlvbmAgKHByb3ZpZGVyIGVycm9ycylcbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gSWYgYGV4Y2hhbmdlVG9rZW5gIGV4aXN0czogZXhjaGFuZ2VzIGl0IHZpYSBiYWNrZW5kIChTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogLSBJZiBubyBgZXhjaGFuZ2VUb2tlbmA6IHRyZWF0IGFzIGNvb2tpZS1zdWNjZXNzIHBhdGggKFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseSkuXG4gKiAtIElmIGBlcnJvcmAgZXhpc3RzOiByZWRpcmVjdHMgdG8gb2F1dGhFcnJvciByb3V0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50L2FuZ3VsYXInO1xuICpcbiAqIGV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAqICAgeyBwYXRoOiAnYXV0aC9jYWxsYmFjaycsIGNhbkFjdGl2YXRlOiBbc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkXSwgY29tcG9uZW50OiBDYWxsYmFja0NvbXBvbmVudCB9LFxuICogXTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkOiBDYW5BY3RpdmF0ZUZuID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIGNvbnN0IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuXG4gIGlmICghaXNCcm93c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgY29uc3QgZXJyb3IgPSBwYXJhbXMuZ2V0KCdlcnJvcicpO1xuICBjb25zdCBleGNoYW5nZVRva2VuID0gcGFyYW1zLmdldCgnZXhjaGFuZ2VUb2tlbicpO1xuICBjb25zdCBhcHBTdGF0ZSA9IHBhcmFtcy5nZXQoJ2FwcFN0YXRlJyk7XG5cbiAgY29uc3Qgcm91dGVyID0gYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGFwcFN0YXRlIGlmIHByZXNlbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXSFk6IGFwcFN0YXRlIGlzIHJvdW5kLXRyaXBwZWQgZnJvbSB0aGUgT0F1dGggZmxvdyBhbmQgc2hvdWxkIGJlIHN0b3JlZFxuICAvLyBmb3IgcmV0cmlldmFsIHZpYSBnZXRMYXN0T2F1dGhTdGF0ZSgpIGFuZCBwYXNzZWQgdG8gdGhlIHN1Y2Nlc3Mgcm91dGUuXG4gIGlmIChhcHBTdGF0ZSkge1xuICAgIGF3YWl0IGF1dGguZ2V0Q2xpZW50KCkuc3RvcmVPYXV0aFN0YXRlKGFwcFN0YXRlKTtcbiAgfVxuXG4gIC8vIFByb3ZpZGVyIGVycm9yOiByZWRpcmVjdCB0byBvYXV0aEVycm9yXG4gIGlmIChlcnJvcikge1xuICAgIGF3YWl0IHJvdXRlci5uYXZpZ2F0ZVRvRXJyb3IoJ29hdXRoJyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gTm8gZXhjaGFuZ2VUb2tlbjogY29va2llIHN1Y2Nlc3MgcGF0aDsgaHlkcmF0ZSB0aGVuIG5hdmlnYXRlIHRvIHN1Y2Nlc3MuXG4gIC8vXG4gIC8vIE5vdGU6IHdlIGRvIG5vdCBcImFjdGl2YXRlXCIgdGhlIGNhbGxiYWNrIHJvdXRlIHRvIGF2b2lkIGNvbnN1bWVycyBuZWVkaW5nIHRvIHJlbmRlciBhIHBhZ2UuXG4gIGlmICghZXhjaGFuZ2VUb2tlbikge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb29raWVzIG1vZGU6IGh5ZHJhdGUgdXNlciBzdGF0ZSBiZWZvcmUgcmVkaXJlY3RpbmdcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBJbiBjb29raWUgZGVsaXZlcnksIHRoZSBPQXV0aCBjYWxsYmFjayBjb21wbGV0ZXMgdmlhIGJyb3dzZXIgcmVkaXJlY3RzLCBzbyB0aGUgZnJvbnRlbmRcbiAgICAvLyBkb2VzIG5vdCByZWNlaXZlIGEgSlNPTiBBdXRoUmVzcG9uc2UgdG8gcG9wdWxhdGUgdGhlIFNESydzIGNhY2hlZCBgY3VycmVudFVzZXJgLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzeW5jIGd1YXJkcyAoYGF1dGhHdWFyZGApIGNhbiBpbW1lZGlhdGVseSByZWRpcmVjdCB0byAvbG9naW4gYmVjYXVzZVxuICAgIC8vIGBjdXJyZW50VXNlcmAgaXMgc3RpbGwgbnVsbCBldmVuIHRob3VnaCBjb29raWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGF1dGguZ2V0UHJvZmlsZSgpO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGhhbmRsZUF1dGhSZXNwb25zZSB0byBlbnN1cmUgb25BdXRoUmVzcG9uc2UgaXMgY2FsbGVkXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBXSFk6IG9uQXV0aFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgY29uc2lzdGVudGx5IGZvciBhbGwgYXV0aCBjb21wbGV0aW9ucyxcbiAgICAgIC8vIHdoZXRoZXIgdmlhIGV4Y2hhbmdlIHRva2VuIG9yIGNvb2tpZSBzdWNjZXNzIHBhdGguIFRoaXMgYWxsb3dzIGFwcHMgdG8gaGF2ZVxuICAgICAgLy8gYSBzaW5nbGUgaGFuZGxlciBmb3IgYWxsIGF1dGhlbnRpY2F0aW9uIG91dGNvbWVzIChsb2dpbiwgc2lnbnVwLCBzb2NpYWwpLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIHN5bnRoZXRpYyBBdXRoUmVzcG9uc2Ugd2l0aCB0aGUgdXNlciBkYXRhLiBUb2tlbnMgYXJlIG9taXR0ZWRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBpbiBodHRwT25seSBjb29raWVzLCBub3QgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50LlxuICAgICAgY29uc3Qgc3ludGhldGljUmVzcG9uc2U6IEF1dGhSZXNwb25zZSA9IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIHN1YjogdXNlci5zdWIsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBwaG9uZTogdXNlci5waG9uZSxcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQ6IHVzZXIuaXNFbWFpbFZlcmlmaWVkLFxuICAgICAgICAgIGlzUGhvbmVWZXJpZmllZDogdXNlci5pc1Bob25lVmVyaWZpZWQsXG4gICAgICAgICAgc29jaWFsUHJvdmlkZXJzOiB1c2VyLnNvY2lhbFByb3ZpZGVycyxcbiAgICAgICAgICBoYXNQYXNzd29yZEhhc2g6IHVzZXIuaGFzUGFzc3dvcmRIYXNoLFxuICAgICAgICB9LFxuICAgICAgICBhdXRoTWV0aG9kOiB1c2VyLnNlc3Npb25BdXRoTWV0aG9kID8/IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgaGFuZGxlQXV0aFJlc3BvbnNlIHdoaWNoIHJlc3BlY3RzIG9uQXV0aFJlc3BvbnNlIGNhbGxiYWNrXG4gICAgICAvLyBQYXNzIGFwcFN0YXRlIGluIGNvbnRleHQgc28gb25BdXRoUmVzcG9uc2UgY2FuIGFjY2VzcyBpdFxuICAgICAgYXdhaXQgcm91dGVyLmhhbmRsZUF1dGhSZXNwb25zZShzeW50aGV0aWNSZXNwb25zZSwge1xuICAgICAgICBzb3VyY2U6ICdzb2NpYWwnLFxuICAgICAgICBhcHBTdGF0ZTogYXBwU3RhdGUgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBPbmx5IHRyZWF0IGF1dGggZmFpbHVyZXMgKDQwMS80MDMpIGFzIE9BdXRoIGVycm9yc1xuICAgICAgLy8gTmV0d29yayBlcnJvcnMgb3Igb3RoZXIgaXNzdWVzIG1pZ2h0IGJlIHRlbXBvcmFyeSAtIHN0aWxsIHRyeSBzdWNjZXNzIHJvdXRlXG4gICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgIGVyciBpbnN0YW5jZW9mIE5BdXRoQ2xpZW50RXJyb3IgJiZcbiAgICAgICAgKGVyci5zdGF0dXNDb2RlID09PSA0MDEgfHxcbiAgICAgICAgICBlcnIuc3RhdHVzQ29kZSA9PT0gNDAzIHx8XG4gICAgICAgICAgZXJyLmNvZGUgPT09IE5BdXRoRXJyb3JDb2RlLkFVVEhfVE9LRU5fSU5WQUxJRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fRVhQSVJFRCB8fFxuICAgICAgICAgIGVyci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fTk9UX0ZPVU5EKTtcblxuICAgICAgaWYgKGlzQXV0aEVycm9yKSB7XG4gICAgICAgIC8vIENvb2tpZXMgd2VyZW4ndCBzZXQgcHJvcGVybHkgLSBPQXV0aCBmYWlsZWRcbiAgICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9FcnJvcignb2F1dGgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBuZXR3b3JrIGVycm9ycyBvciBvdGhlciBpc3N1ZXMsIHByb2NlZWQgdG8gc3VjY2VzcyByb3V0ZVxuICAgICAgICAvLyBUaGUgYXV0aCBndWFyZCB3aWxsIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvbiB0aGUgbmV4dCByb3V0ZVxuICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb1N1Y2Nlc3MoYXBwU3RhdGUgPyB7IGFwcFN0YXRlIH0gOiB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBFeGNoYW5nZSB0b2tlbiAtIFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseVxuICAvLyBOb3RlOiBhcHBTdGF0ZSB3aWxsIGJlIHBhc3NlZCB2aWEgcXVlcnkgcGFyYW1zIHdoZW4gbmF2aWdhdGVUb1N1Y2Nlc3MgaXMgY2FsbGVkXG4gIC8vIGJ5IHRoZSBjaGFsbGVuZ2Ugcm91dGVyIGFmdGVyIHN1Y2Nlc3NmdWwgZXhjaGFuZ2VcbiAgYXdhaXQgYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuICByZXR1cm4gZmFsc2U7XG59O1xuIl19
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29jaWFsLXJlZGlyZWN0LWNhbGxiYWNrLmd1YXJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9zb2NpYWwtcmVkaXJlY3QtY2FsbGJhY2suZ3VhcmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFNUY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWtCLEtBQUssSUFBc0IsRUFBRTtJQUNyRixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFeEMsTUFBTSxNQUFNLEdBQUcsSUFB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QUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsQ0FBQztRQUVELHlGQUF5RjtRQUN6RixPQUFPLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsa0ZBQWtGO0lBQ2xGLG9EQUFvRDtJQUNwRCxNQUFNLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUVqRCx5RkFBeUY7SUFDekYseUVBQXlFO0lBQ3pFLE9BQU8sTUFBTSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDakcsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdHlwZSBDYW5BY3RpdmF0ZUZuIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vbmdtb2R1bGUvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IE5BdXRoQ2xpZW50RXJyb3IsIE5BdXRoRXJyb3JDb2RlLCB0eXBlIEF1dGhSZXNwb25zZSB9IGZyb20gJ0BuYXV0aC10b29sa2l0L2NsaWVudCc7XG5cbi8qKlxuICogU29jaWFsIHJlZGlyZWN0IGNhbGxiYWNrIHJvdXRlIGd1YXJkLlxuICpcbiAqIFRoaXMgZ3VhcmQgc3VwcG9ydHMgdGhlIHJlZGlyZWN0LWZpcnN0IHNvY2lhbCBmbG93IHdoZXJlIHRoZSBiYWNrZW5kIHJlZGlyZWN0c1xuICogYmFjayB0byB0aGUgZnJvbnRlbmQgd2l0aDpcbiAqIC0gYGFwcFN0YXRlYCAoYWx3YXlzIG9wdGlvbmFsKVxuICogLSBgZXhjaGFuZ2VUb2tlbmAgKHByZXNlbnQgZm9yIGpzb24vaHlicmlkIGZsb3dzLCBhbmQgZm9yIGNvb2tpZSBmbG93cyB0aGF0IHJldHVybiBhIGNoYWxsZW5nZSlcbiAqIC0gYGVycm9yYCAvIGBlcnJvcl9kZXNjcmlwdGlvbmAgKHByb3ZpZGVyIGVycm9ycylcbiAqXG4gKiBCZWhhdmlvcjpcbiAqIC0gSWYgYGV4Y2hhbmdlVG9rZW5gIGV4aXN0czogZXhjaGFuZ2VzIGl0IHZpYSBiYWNrZW5kIChTREsgaGFuZGxlcyBuYXZpZ2F0aW9uIGF1dG9tYXRpY2FsbHkpLlxuICogLSBJZiBubyBgZXhjaGFuZ2VUb2tlbmA6IHRyZWF0IGFzIGNvb2tpZS1zdWNjZXNzIHBhdGggKFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseSkuXG4gKiAtIElmIGBlcnJvcmAgZXhpc3RzOiByZWRpcmVjdHMgdG8gb2F1dGhFcnJvciByb3V0ZS5cbiAqIC0gSWYgYXV0by1yZWRpcmVjdCBpcyBkaXNhYmxlZCAocmVkaXJlY3RVcmxzIHNldCB0byBudWxsKTogcmV0dXJucyB0cnVlIHRvIGFjdGl2YXRlIHRoZSByb3V0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkIH0gZnJvbSAnQG5hdXRoLXRvb2xraXQvY2xpZW50L2FuZ3VsYXInO1xuICpcbiAqIGV4cG9ydCBjb25zdCByb3V0ZXM6IFJvdXRlcyA9IFtcbiAqICAgeyBwYXRoOiAnYXV0aC9jYWxsYmFjaycsIGNhbkFjdGl2YXRlOiBbc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkXSwgY29tcG9uZW50OiBDYWxsYmFja0NvbXBvbmVudCB9LFxuICogXTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc29jaWFsUmVkaXJlY3RDYWxsYmFja0d1YXJkOiBDYW5BY3RpdmF0ZUZuID0gYXN5bmMgKCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgY29uc3QgcGxhdGZvcm1JZCA9IGluamVjdChQTEFURk9STV9JRCk7XG4gIGNvbnN0IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpO1xuXG4gIGlmICghaXNCcm93c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgY29uc3QgZXJyb3IgPSBwYXJhbXMuZ2V0KCdlcnJvcicpO1xuICBjb25zdCBleGNoYW5nZVRva2VuID0gcGFyYW1zLmdldCgnZXhjaGFuZ2VUb2tlbicpO1xuICBjb25zdCBhcHBTdGF0ZSA9IHBhcmFtcy5nZXQoJ2FwcFN0YXRlJyk7XG5cbiAgY29uc3Qgcm91dGVyID0gYXV0aC5nZXRDaGFsbGVuZ2VSb3V0ZXIoKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dHJhY3QgYW5kIHN0b3JlIGFwcFN0YXRlIGlmIHByZXNlbnRcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBXSFk6IGFwcFN0YXRlIGlzIHJvdW5kLXRyaXBwZWQgZnJvbSB0aGUgT0F1dGggZmxvdyBhbmQgc2hvdWxkIGJlIHN0b3JlZFxuICAvLyBmb3IgcmV0cmlldmFsIHZpYSBnZXRMYXN0T2F1dGhTdGF0ZSgpIGFuZCBwYXNzZWQgdG8gdGhlIHN1Y2Nlc3Mgcm91dGUuXG4gIGlmIChhcHBTdGF0ZSkge1xuICAgIGF3YWl0IGF1dGguZ2V0Q2xpZW50KCkuc3RvcmVPYXV0aFN0YXRlKGFwcFN0YXRlKTtcbiAgfVxuXG4gIC8vIFByb3ZpZGVyIGVycm9yOiByZWRpcmVjdCB0byBvYXV0aEVycm9yIChvciBhY3RpdmF0ZSByb3V0ZSBpZiBhdXRvLXJlZGlyZWN0IGRpc2FibGVkKVxuICBpZiAoZXJyb3IpIHtcbiAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgIC8vIFJldHVybiB0cnVlIHRvIGFjdGl2YXRlIHJvdXRlIGlmIG9hdXRoRXJyb3IgcmVkaXJlY3QgaXMgZGlzYWJsZWRcbiAgICByZXR1cm4gcm91dGVyLmlzRXJyb3JSZWRpcmVjdERpc2FibGVkKCdvYXV0aCcpO1xuICB9XG5cbiAgLy8gTm8gZXhjaGFuZ2VUb2tlbjogY29va2llIHN1Y2Nlc3MgcGF0aDsgaHlkcmF0ZSB0aGVuIG5hdmlnYXRlIHRvIHN1Y2Nlc3MuXG4gIC8vXG4gIC8vIE5vdGU6IFdoZW4gYXV0by1yZWRpcmVjdCBpcyBlbmFibGVkLCB3ZSBkbyBub3QgXCJhY3RpdmF0ZVwiIHRoZSBjYWxsYmFjayByb3V0ZSB0byBhdm9pZFxuICAvLyBjb25zdW1lcnMgbmVlZGluZyB0byByZW5kZXIgYSBwYWdlLiBXaGVuIGRpc2FibGVkLCB3ZSBhY3RpdmF0ZSB0aGUgcm91dGUuXG4gIGlmICghZXhjaGFuZ2VUb2tlbikge1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBDb29raWVzIG1vZGU6IGh5ZHJhdGUgdXNlciBzdGF0ZSBiZWZvcmUgcmVkaXJlY3RpbmdcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gV0hZOiBJbiBjb29raWUgZGVsaXZlcnksIHRoZSBPQXV0aCBjYWxsYmFjayBjb21wbGV0ZXMgdmlhIGJyb3dzZXIgcmVkaXJlY3RzLCBzbyB0aGUgZnJvbnRlbmRcbiAgICAvLyBkb2VzIG5vdCByZWNlaXZlIGEgSlNPTiBBdXRoUmVzcG9uc2UgdG8gcG9wdWxhdGUgdGhlIFNESydzIGNhY2hlZCBgY3VycmVudFVzZXJgLlxuICAgIC8vXG4gICAgLy8gV2l0aG91dCB0aGlzLCBzeW5jIGd1YXJkcyAoYGF1dGhHdWFyZGApIGNhbiBpbW1lZGlhdGVseSByZWRpcmVjdCB0byAvbG9naW4gYmVjYXVzZVxuICAgIC8vIGBjdXJyZW50VXNlcmAgaXMgc3RpbGwgbnVsbCBldmVuIHRob3VnaCBjb29raWVzIHdlcmUgc2V0IHN1Y2Nlc3NmdWxseS5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlciA9IGF3YWl0IGF1dGguZ2V0UHJvZmlsZSgpO1xuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBSb3V0ZSB0aHJvdWdoIGhhbmRsZUF1dGhSZXNwb25zZSB0byBlbnN1cmUgb25BdXRoUmVzcG9uc2UgaXMgY2FsbGVkXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBXSFk6IG9uQXV0aFJlc3BvbnNlIHNob3VsZCBiZSBjYWxsZWQgY29uc2lzdGVudGx5IGZvciBhbGwgYXV0aCBjb21wbGV0aW9ucyxcbiAgICAgIC8vIHdoZXRoZXIgdmlhIGV4Y2hhbmdlIHRva2VuIG9yIGNvb2tpZSBzdWNjZXNzIHBhdGguIFRoaXMgYWxsb3dzIGFwcHMgdG8gaGF2ZVxuICAgICAgLy8gYSBzaW5nbGUgaGFuZGxlciBmb3IgYWxsIGF1dGhlbnRpY2F0aW9uIG91dGNvbWVzIChsb2dpbiwgc2lnbnVwLCBzb2NpYWwpLlxuICAgICAgLy9cbiAgICAgIC8vIFdlIGNvbnN0cnVjdCBhIHN5bnRoZXRpYyBBdXRoUmVzcG9uc2Ugd2l0aCB0aGUgdXNlciBkYXRhLiBUb2tlbnMgYXJlIG9taXR0ZWRcbiAgICAgIC8vIGJlY2F1c2UgdGhleSdyZSBpbiBodHRwT25seSBjb29raWVzLCBub3QgYWNjZXNzaWJsZSB0byB0aGUgY2xpZW50LlxuICAgICAgY29uc3Qgc3ludGhldGljUmVzcG9uc2U6IEF1dGhSZXNwb25zZSA9IHtcbiAgICAgICAgdXNlcjoge1xuICAgICAgICAgIHN1YjogdXNlci5zdWIsXG4gICAgICAgICAgZW1haWw6IHVzZXIuZW1haWwsXG4gICAgICAgICAgZmlyc3ROYW1lOiB1c2VyLmZpcnN0TmFtZSxcbiAgICAgICAgICBsYXN0TmFtZTogdXNlci5sYXN0TmFtZSxcbiAgICAgICAgICBwaG9uZTogdXNlci5waG9uZSxcbiAgICAgICAgICBpc0VtYWlsVmVyaWZpZWQ6IHVzZXIuaXNFbWFpbFZlcmlmaWVkLFxuICAgICAgICAgIGlzUGhvbmVWZXJpZmllZDogdXNlci5pc1Bob25lVmVyaWZpZWQsXG4gICAgICAgICAgc29jaWFsUHJvdmlkZXJzOiB1c2VyLnNvY2lhbFByb3ZpZGVycyxcbiAgICAgICAgICBoYXNQYXNzd29yZEhhc2g6IHVzZXIuaGFzUGFzc3dvcmRIYXNoLFxuICAgICAgICB9LFxuICAgICAgICBhdXRoTWV0aG9kOiB1c2VyLnNlc3Npb25BdXRoTWV0aG9kID8/IHVuZGVmaW5lZCxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgaGFuZGxlQXV0aFJlc3BvbnNlIHdoaWNoIHJlc3BlY3RzIG9uQXV0aFJlc3BvbnNlIGNhbGxiYWNrXG4gICAgICAvLyBQYXNzIGFwcFN0YXRlIGluIGNvbnRleHQgc28gb25BdXRoUmVzcG9uc2UgY2FuIGFjY2VzcyBpdFxuICAgICAgYXdhaXQgcm91dGVyLmhhbmRsZUF1dGhSZXNwb25zZShzeW50aGV0aWNSZXNwb25zZSwge1xuICAgICAgICBzb3VyY2U6ICdzb2NpYWwnLFxuICAgICAgICBhcHBTdGF0ZTogYXBwU3RhdGUgPz8gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIE9ubHkgdHJlYXQgYXV0aCBmYWlsdXJlcyAoNDAxLzQwMykgYXMgT0F1dGggZXJyb3JzXG4gICAgICAvLyBOZXR3b3JrIGVycm9ycyBvciBvdGhlciBpc3N1ZXMgbWlnaHQgYmUgdGVtcG9yYXJ5IC0gc3RpbGwgdHJ5IHN1Y2Nlc3Mgcm91dGVcblxuICAgICAgLy8gVHlwZSBndWFyZDogY2hlY2sgaWYgZXJyb3IgaXMgTkF1dGhDbGllbnRFcnJvclxuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgTkF1dGhDbGllbnRFcnJvcikge1xuICAgICAgICBjb25zdCBpc0F1dGhFcnJvciA9XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAxIHx8XG4gICAgICAgICAgZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDAzIHx8XG4gICAgICAgICAgZXJyb3IuY29kZSA9PT0gTkF1dGhFcnJvckNvZGUuQVVUSF9UT0tFTl9JTlZBTElEIHx8XG4gICAgICAgICAgZXJyb3IuY29kZSA9PT0gTkF1dGhFcnJvckNvZGUuQVVUSF9TRVNTSU9OX0VYUElSRUQgfHxcbiAgICAgICAgICBlcnJvci5jb2RlID09PSBOQXV0aEVycm9yQ29kZS5BVVRIX1NFU1NJT05fTk9UX0ZPVU5EO1xuXG4gICAgICAgIGlmIChpc0F1dGhFcnJvcikge1xuICAgICAgICAgIC8vIENvb2tpZXMgd2VyZW4ndCBzZXQgcHJvcGVybHkgLSBPQXV0aCBmYWlsZWRcbiAgICAgICAgICBhd2FpdCByb3V0ZXIubmF2aWdhdGVUb0Vycm9yKCdvYXV0aCcpO1xuICAgICAgICAgIHJldHVybiByb3V0ZXIuaXNFcnJvclJlZGlyZWN0RGlzYWJsZWQoJ29hdXRoJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRm9yIG5ldHdvcmsgZXJyb3JzIG9yIG90aGVyIG5vbi1hdXRoIGlzc3VlcywgcHJvY2VlZCB0byBzdWNjZXNzIHJvdXRlXG4gICAgICAvLyBUaGUgYXV0aCBndWFyZCB3aWxsIGhhbmRsZSBhdXRoZW50aWNhdGlvbiBzdGF0ZSBvbiB0aGUgbmV4dCByb3V0ZVxuICAgICAgYXdhaXQgcm91dGVyLm5hdmlnYXRlVG9TdWNjZXNzKGFwcFN0YXRlID8geyBhcHBTdGF0ZSB9IDogdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzIHJlZGlyZWN0IGlzIGRpc2FibGVkLCBhbGxvd2luZyB0aGUgY2FsbGJhY2sgY29tcG9uZW50IHRvIHJlbmRlclxuICAgIHJldHVybiByb3V0ZXIuaXNTdWNjZXNzUmVkaXJlY3REaXNhYmxlZCh7IHNvdXJjZTogJ3NvY2lhbCcsIGFwcFN0YXRlOiBhcHBTdGF0ZSA/PyB1bmRlZmluZWQgfSk7XG4gIH1cblxuICAvLyBFeGNoYW5nZSB0b2tlbiAtIFNESyBoYW5kbGVzIG5hdmlnYXRpb24gYXV0b21hdGljYWxseVxuICAvLyBOb3RlOiBhcHBTdGF0ZSB3aWxsIGJlIHBhc3NlZCB2aWEgcXVlcnkgcGFyYW1zIHdoZW4gbmF2aWdhdGVUb1N1Y2Nlc3MgaXMgY2FsbGVkXG4gIC8vIGJ5IHRoZSBjaGFsbGVuZ2Ugcm91dGVyIGFmdGVyIHN1Y2Nlc3NmdWwgZXhjaGFuZ2VcbiAgYXdhaXQgYXV0aC5leGNoYW5nZVNvY2lhbFJlZGlyZWN0KGV4Y2hhbmdlVG9rZW4pO1xuXG4gIC8vIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3MgcmVkaXJlY3QgaXMgZGlzYWJsZWQsIGFsbG93aW5nIHRoZSBjYWxsYmFjayBjb21wb25lbnQgdG8gcmVuZGVyXG4gIC8vIFdlIHVzZSAnc29jaWFsJyBhcyBzb3VyY2Ugc2luY2UgdGhpcyBpcyB0aGUgc29jaWFsIE9BdXRoIGNhbGxiYWNrIGZsb3dcbiAgcmV0dXJuIHJvdXRlci5pc1N1Y2Nlc3NSZWRpcmVjdERpc2FibGVkKHsgc291cmNlOiAnc29jaWFsJywgYXBwU3RhdGU6IGFwcFN0YXRlID8/IHVuZGVmaW5lZCB9KTtcbn07XG4iXX0=