@atlasauth/angular 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @atlasauth/angular changelog
2
2
 
3
+ ## 0.4.0
4
+ - **Safer sign-out.** `AtlasService.signOut(options?: SignOutOptions)` now returns
5
+ `Promise<SignOutResult>` (`{ revoked: boolean; activeSessionId?: string }`; was `Promise<void>` —
6
+ existing `await signOut()` / `.then()` call sites keep working). It runs through the shared
7
+ `SignOutGuard` from `@atlasauth/js`: the session id is recorded as a tombstone (localStorage, per
8
+ Frontend API origin) before the revoke, the revoke is retried once, and a reload, token refresh, a
9
+ sibling tab or a tab opened later never re-adopts a signed-out session — even when the revoke failed
10
+ and the refresh cookie is still valid. A refused session's revoke is retried in the background and
11
+ its tombstone dropped once the server confirms. With no cached token the cookie session is found via
12
+ `GET /v1/client`, so the revoke is never skipped. A parked session the server promoted on revoke
13
+ (`active_session_id`) is adopted. New option `signOut({ strict: true })` rejects with a
14
+ `SignOutError` (`code: 'SIGN_OUT_REVOKE_FAILED'`, `sessionId`, `status`) after the local sign-out
15
+ when the revoke was never confirmed. Another tab signing out of the same session now signs this tab
16
+ out too. `ngOnDestroy()` also stops the cross-tab watch and cancels background re-tries.
17
+ - **Popup OAuth landing.** On startup (browser only), before the redirect-ticket exchange, the service
18
+ calls `completeOAuthPopupLanding()`: on the landing page of a sign-in popup whose opener was severed
19
+ by a Cross-Origin-Opener-Policy (`#atlas_popup_result=…`) it scrubs the fragment, relays the result
20
+ to the opener and closes the window — without redeeming the ticket itself. When no opener takes it,
21
+ it exchanges the ticket like a redirect result (or follows the payload's `continuationUrl`). After a
22
+ successful ticket exchange inside the Atlas popup it calls `closeOAuthPopupAfterSignIn()`, which
23
+ wakes the waiting opener and closes the popup (a no-op in an ordinary tab).
24
+ - **Email delivery in the prebuilt components** (`InstanceSettings.emailDelivery` from
25
+ `GET /v1/appearance`; everything reads as available when the server omits it):
26
+ - `<atlas-sign-up-form>` shows a `signUp.emailUnavailable` notice (`role="alert"`,
27
+ `data-atlas-email-unavailable`) instead of the email + password form when
28
+ `emailDelivery.passwordSignUp` is `false`.
29
+ - `<atlas-sign-in>`'s first-factor step offers `offeredFirstFactors(strategies, emailDelivery)`:
30
+ an "Email me a code" option when `email_code` is offered (hidden while the app cannot send email),
31
+ and the password field unless an emailed code is the only offer.
32
+ - **Added to `AtlasFlowController`:** `firstFactors(): string[]`, `signUpEmailUnavailable(): boolean`,
33
+ `passwordResetAvailable(): boolean`, `prepare(strategy: 'email_code'): Promise<void>` and
34
+ `preparedFactor: WritableSignal<'email_code' | null>`.
35
+ - **Added to `AttemptFlowComponent`:** inputs `firstFactors: string[] | null` and
36
+ `preparedFactor: string | null`, output `chooseFactor: EventEmitter<'email_code'>`; new element class
37
+ `atlas-button-secondary` (`formButtonSecondary`).
38
+ - **Added catalog keys** (en-US): `signUp.emailUnavailable` ("This app can't send email right now. Try
39
+ another sign-in method or contact the app owner." — `EMAIL_UNAVAILABLE_MESSAGE`), `signIn.useEmailCode`.
40
+ - **Added re-exports** from `@atlasauth/js`: `SignOutError` (class) and the types `SignOutResult`,
41
+ `SignOutOptions`, `EmailDelivery`.
42
+ - Requires `@atlasauth/js` 0.8.0.
43
+
3
44
  ## 0.3.0
4
45
  - **`<atlas-sign-up>` now creates accounts.** Its first step is a create-account form (the instance's
5
46
  configured sign-up fields, email, password and the legal-consent row) that posts
@@ -3,7 +3,7 @@ import { isPlatformBrowser } from '@angular/common';
3
3
  import { toSignal } from '@angular/core/rxjs-interop';
4
4
  import { BehaviorSubject, combineLatest } from 'rxjs';
5
5
  import { distinctUntilChanged, map } from 'rxjs/operators';
6
- import { FapiClient, TokenCache, getProviderToken as fetchProviderToken, msUntilRefresh, readExpiry, readRedirectResult, resolveFrontendApi, stripRedirectParams, runFrontChannelLogoutFromResponse, } from '@atlasauth/js';
6
+ import { FapiClient, SignOutGuard, TokenCache, closeOAuthPopupAfterSignIn, completeOAuthPopupLanding, getProviderToken as fetchProviderToken, mapOAuthPopupPayload, msUntilRefresh, readExpiry, readRedirectResult, resolveFrontendApi, stripRedirectParams, } from '@atlasauth/js';
7
7
  import { evaluate } from '@atlasauth/authz';
8
8
  import { ATLAS_OPTIONS } from './atlas.config';
9
9
  import { cssVariables, instanceDesignFrom, renderAppearance, resolveTokens, } from './appearance';
@@ -37,6 +37,14 @@ export class AtlasService {
37
37
  cache = new TokenCache();
38
38
  fapiClient;
39
39
  refreshTimer = null;
40
+ /**
41
+ * The sessions this browser signed out of (tombstones in localStorage, per
42
+ * Frontend API origin), the revoke and its background re-tries. Every reload /
43
+ * refresh asks it before adopting a session, so a sign-out the server never
44
+ * confirmed is not undone by the still-valid refresh cookie.
45
+ */
46
+ guard;
47
+ stopWatchingSignOut = null;
40
48
  catalog;
41
49
  /**
42
50
  * A sign-in attempt handed back by an OAuth redirect that still needs a second
@@ -98,6 +106,10 @@ export class AtlasService {
98
106
  baseUrl: this.baseUrl,
99
107
  fetchImpl: this.doFetch,
100
108
  });
109
+ this.guard = new SignOutGuard({
110
+ request: (path, init) => this.call(path, init),
111
+ frontendApi: this.baseUrl,
112
+ });
101
113
  // Captured synchronously (not in an async init) so it is available before any
102
114
  // flow component reads it: a needs_second_factor redirect carries a status but
103
115
  // no ticket, and that is what the 2FA resume seeds from.
@@ -105,10 +117,19 @@ export class AtlasService {
105
117
  // Boot once, browser only. On the server there is no cookie jar to read a
106
118
  // session from, so we leave the state at `loading` and let hydration boot it.
107
119
  if (this.isBrowser) {
120
+ // Another tab signed out of THIS session (its tombstone reached the shared
121
+ // store): drop the token and re-check, which then refuses the session.
122
+ this.stopWatchingSignOut = this.guard.watch(() => this.cache.peek()?.sessionId ?? this._session.value?.id, () => {
123
+ this.cache.clear();
124
+ void this.reload();
125
+ });
108
126
  void this.boot();
109
127
  }
110
128
  }
111
129
  ngOnDestroy() {
130
+ this.stopWatchingSignOut?.();
131
+ this.stopWatchingSignOut = null;
132
+ this.guard.dispose();
112
133
  this.clearRefreshTimer();
113
134
  this._status.complete();
114
135
  this._user.complete();
@@ -187,25 +208,27 @@ export class AtlasService {
187
208
  has(condition) {
188
209
  return evaluate(this._claims.value, condition).allowed;
189
210
  }
190
- /** Revoke the current session server-side and drop all local auth state. */
191
- async signOut(options) {
192
- const current = this.cache.peek();
193
- if (current) {
194
- const revoked = await this.call(`/v1/client/sessions/${current.sessionId}/revoke`, {
195
- method: 'POST',
196
- }).catch(() => undefined);
197
- // OIDC Front-Channel Logout: let the apps signed in through this session
198
- // clear theirs in this browser (hidden iframes, capped at 5 s). Best-effort.
199
- if (options?.frontchannel !== false)
200
- await runFrontChannelLogoutFromResponse(revoked);
201
- }
202
- this.clearRefreshTimer();
203
- this.cache.clear();
204
- this._status.next('signed_out');
205
- this._user.next(null);
206
- this._session.next(null);
207
- this._claims.next(null);
208
- this._memberships.next([]);
211
+ /**
212
+ * Revoke the current session server-side and drop all local auth state.
213
+ *
214
+ * The session id is remembered before the revoke (a tombstone shared by every
215
+ * tab), so a reload, a token refresh, a sibling tab or a tab opened later never
216
+ * re-adopts it — even when the revoke failed (it is retried once, then again in
217
+ * the background) and the refresh cookie is still valid. Resolves
218
+ * `{ revoked, activeSessionId? }`; with `{ strict: true }` an unconfirmed revoke
219
+ * rejects with a `SignOutError` instead (after the local sign-out). A parked
220
+ * session the server promoted on revoke is adopted. Front-channel logout runs
221
+ * unless `{ frontchannel: false }`.
222
+ */
223
+ async signOut(options = {}) {
224
+ // With no cached token the guard finds the cookie session itself
225
+ // (GET /v1/client), so a missing JWT never skips the revoke.
226
+ const sessionId = this.cache.peek()?.sessionId ?? this._session.value?.id ?? null;
227
+ const attempt = await this.guard.revoke(sessionId, options);
228
+ this.clearLocalState();
229
+ if (this.guard.promoted(attempt))
230
+ await this.reload();
231
+ return this.guard.settle(attempt, options);
209
232
  }
210
233
  /**
211
234
  * Switch the active organization (or `null` for the personal account). The
@@ -233,14 +256,10 @@ export class AtlasService {
233
256
  if (!response.ok)
234
257
  throw new Error('boot failed');
235
258
  const body = (await response.json());
236
- if (!body.session || !body.user) {
237
- this.clearRefreshTimer();
238
- this.cache.clear();
239
- this._status.next('signed_out');
240
- this._user.next(null);
241
- this._session.next(null);
242
- this._claims.next(null);
243
- this._memberships.next([]);
259
+ // A session this browser signed out of is never re-adopted from the
260
+ // refresh cookie; the guard re-tries its revoke in the background.
261
+ if (!body.session || !body.user || this.guard.refuse(body.session.id)) {
262
+ this.clearLocalState();
244
263
  return;
245
264
  }
246
265
  this._user.next(body.user);
@@ -268,17 +287,41 @@ export class AtlasService {
268
287
  * has no ticket, so nothing is exchanged and the app boots signed-out.
269
288
  */
270
289
  async boot() {
271
- const result = readRedirectResult(window.location.search);
290
+ const fromUrl = readRedirectResult(window.location.search);
291
+ let result = fromUrl;
292
+ // §oauth popup mode: this page may be the landing of a sign-in popup whose
293
+ // opener a Cross-Origin-Opener-Policy severed (`#atlas_popup_result=…`).
294
+ // The result is relayed to the opener, which redeems the ticket, and this
295
+ // window closes. If no opener takes it (its tab is gone), finish here like
296
+ // a redirect.
297
+ const landing = await completeOAuthPopupLanding().catch(() => null);
298
+ if (landing && !landing.delivered) {
299
+ const outcome = mapOAuthPopupPayload(landing.payload);
300
+ if (outcome?.ticket && outcome.attemptId) {
301
+ result = { attemptId: outcome.attemptId, ticket: outcome.ticket };
302
+ }
303
+ else if (outcome?.continuationUrl) {
304
+ // A second factor / connect step / provider error: the redirect flow's page.
305
+ window.location.replace(outcome.continuationUrl);
306
+ return;
307
+ }
308
+ }
309
+ let exchanged = false;
272
310
  if (result?.ticket) {
273
- await this.call('/v1/client/tickets/exchange', {
311
+ const response = await this.call('/v1/client/tickets/exchange', {
274
312
  method: 'POST',
275
313
  body: JSON.stringify({ attempt_id: result.attemptId, ticket: result.ticket }),
276
314
  }).catch(() => undefined);
315
+ exchanged = !!response?.ok;
277
316
  }
278
- if (result) {
317
+ if (fromUrl) {
279
318
  window.history.replaceState({}, document.title, stripRedirectParams(window.location.href));
280
319
  }
281
320
  await this.reload();
321
+ // Signed in inside the Atlas popup (the redirect flow ran in it): hand back
322
+ // to the waiting opener and close. A no-op in an ordinary tab.
323
+ if (exchanged)
324
+ void closeOAuthPopupAfterSignIn();
282
325
  }
283
326
  readPendingAttempt() {
284
327
  const result = readRedirectResult(window.location.search);
@@ -300,6 +343,9 @@ export class AtlasService {
300
343
  });
301
344
  }
302
345
  applyToken(jwt, sessionId) {
346
+ // An in-flight refresh must not resurrect a session signed out meanwhile.
347
+ if (this.guard.isSignedOut(sessionId))
348
+ return;
303
349
  const expiresAt = readExpiry(jwt);
304
350
  if (!expiresAt)
305
351
  return;
@@ -325,6 +371,15 @@ export class AtlasService {
325
371
  await this.reload();
326
372
  }
327
373
  }
374
+ clearLocalState() {
375
+ this.clearRefreshTimer();
376
+ this.cache.clear();
377
+ this._status.next('signed_out');
378
+ this._user.next(null);
379
+ this._session.next(null);
380
+ this._claims.next(null);
381
+ this._memberships.next([]);
382
+ }
328
383
  /** §7.4: proactive, jittered refresh scheduled from the token's own expiry. */
329
384
  scheduleRefresh() {
330
385
  this.clearRefreshTimer();
@@ -361,4 +416,4 @@ function decodeClaims(jwt) {
361
416
  return null;
362
417
  }
363
418
  }
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixVQUFVLEVBQ1YsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLGNBQWMsRUFDZCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixtQkFBbUIsRUFFbkIsaUNBQWlDLEdBRWxDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQXlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixhQUFhLEdBSWQsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNqQyxTQUFTLEdBQUcs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QUMsR0FBVztJQUMvQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFFLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3JDLENBQUM7SUFDckIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFBMQVRGT1JNX0lELFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGNvbWJpbmVMYXRlc3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGYXBpQ2xpZW50LFxuICBUb2tlbkNhY2hlLFxuICBnZXRQcm92aWRlclRva2VuIGFzIGZldGNoUHJvdmlkZXJUb2tlbixcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgcmVzb2x2ZUZyb250ZW5kQXBpLFxuICBzdHJpcFJlZGlyZWN0UGFyYW1zLFxuICB0eXBlIFByb3ZpZGVyVG9rZW4sXG4gIHJ1bkZyb250Q2hhbm5lbExvZ291dEZyb21SZXNwb25zZSxcbiAgdHlwZSBTaWduT3V0T3B0aW9ucyxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgdHlwZSBQcm90ZWN0Q29uZGl0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9hdXRoeic7XG5pbXBvcnQgeyBBVExBU19PUFRJT05TIH0gZnJvbSAnLi9hdGxhcy5jb25maWcnO1xuaW1wb3J0IHtcbiAgY3NzVmFyaWFibGVzLFxuICBpbnN0YW5jZURlc2lnbkZyb20sXG4gIHJlbmRlckFwcGVhcmFuY2UsXG4gIHJlc29sdmVUb2tlbnMsXG4gIHR5cGUgQXBwZWFyYW5jZSxcbiAgdHlwZSBBcHBlYXJhbmNlUmVuZGVyLFxuICB0eXBlIEluc3RhbmNlRGVzaWduLFxufSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgRU5fVVMsIHdpdGhGYWxsYmFjaywgdHlwZSBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB0eXBlIHtcbiAgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwLFxuICBBdGxhc1Nlc3Npb24sXG4gIEF0bGFzVXNlcixcbiAgQXV0aFN0YXR1cyxcbiAgU2Vzc2lvbkNsYWltcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYEF0bGFzU2VydmljZWAg4oCUIHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPEF0bGFzUHJvdmlkZXI+YCArIGhvb2tzLlxuICpcbiAqIEl0IGhvbGRzIGV4YWN0bHkgb25lIHRoaW5nIHRoYXQgbWF0dGVycyBpbiBtZW1vcnk6IHRoZSBzaG9ydC1saXZlZCBKV1QsIGluIGFcbiAqIHtAbGluayBUb2tlbkNhY2hlfS4gTm90IGxvY2FsU3RvcmFnZSwgbm90IGEgY29va2llIHRoaXMgY29kZSB3cml0ZXMg4oCUIHRoZVxuICogcmVmcmVzaCB0b2tlbiBpcyBIdHRwT25seSBzbyBicm93c2VyIHNjcmlwdCBuZXZlciB0b3VjaGVzIGl0LCBhbmQgdGhlIEpXVFxuICogbGl2ZXMgb25seSBhcyBsb25nIGFzIHRoZSB0YWIuIEFueXRoaW5nIHBlcnNpc3RlZCB3b3VsZCBzdXJ2aXZlIHRoZSB0YWIgYW5kXG4gKiBiZWNvbWUgdGhlIGZpcnN0IHRoaW5nIGFuIFhTUyByZWFkcy5cbiAqXG4gKiBSZWFjdGl2ZSBhdXRoIHN0YXRlIGlzIGV4cG9zZWQgdHdvIHdheXMgc28gY2FsbGVycyBjYW4gcGljayB0aGVpciBpZGlvbTpcbiAqICAtIFJ4SlMgb2JzZXJ2YWJsZXMgKGB1c2VyJGAsIGBzZXNzaW9uJGAsIGBpc1NpZ25lZEluJGAsIOKApikg4oCUIHRoZSBwcmltYXJ5IEFQSSxcbiAqICAgIHRoZSBhbmFsb2d1ZSBvZiB0aGUgUmVhY3QgaG9va3MnIHJldHVybiB2YWx1ZXMuXG4gKiAgLSBBbmd1bGFyIHNpZ25hbHMgKGB1c2VyYCwgYHNlc3Npb25gLCBgaXNTaWduZWRJbmAsIOKApikg4oCUIHRoZSBzYW1lIHZhbHVlcyBhc1xuICogICAgYFNpZ25hbDxUPmAsIGZvciB0ZW1wbGF0ZXMgYW5kIGBjb21wdXRlZCgpYC5cbiAqXG4gKiBUaGUgaW1wZXJhdGl2ZSBtZXRob2RzIChgc2lnbk91dGAsIGBnZXRUb2tlbmAsIGBnZXRQcm92aWRlclRva2VuYCxcbiAqIGBzZXRBY3RpdmVPcmdhbml6YXRpb25gLCBgcmVsb2FkYCkgbWlycm9yIHRoZSBhY3Rpb25zIHRoZSBob29rcyByZXR1cm4uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXRsYXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KEFUTEFTX09QVElPTlMpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkb0ZldGNoOiB0eXBlb2YgZmV0Y2g7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBUb2tlbkNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFwaUNsaWVudDogRmFwaUNsaWVudDtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nOiBDYXRhbG9nO1xuXG4gIC8qKlxuICAgKiBBIHNpZ24taW4gYXR0ZW1wdCBoYW5kZWQgYmFjayBieSBhbiBPQXV0aCByZWRpcmVjdCB0aGF0IHN0aWxsIG5lZWRzIGEgc2Vjb25kXG4gICAqIGZhY3RvciAobm8gc2Vzc2lvbiB3YXMgaXNzdWVkKS4gTnVsbCBpbiB0aGUgb3JkaW5hcnkgY2FzZTsgdGhlIGA8YXRsYXMtc2lnbi1pbj5gXG4gICAqIGZsb3cgc2VlZHMgaXRzZWxmIGZyb20gdGhpcyBzbyB0aGUgdXNlciByZXN1bWVzIGF0IHRoZSAyRkEgc3RlcC4gQ2FwdHVyZWRcbiAgICogb25jZSwgc3luY2hyb25vdXNseSwgYXQgY29uc3RydWN0aW9uIOKAlCBiZWZvcmUgYW55IGZsb3cgY29tcG9uZW50IHJlYWRzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGVuZGluZ0F0dGVtcHQ6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGw7XG5cbiAgLy8gLS0tIFJlYWN0aXZlIHN0YXRlIChzb3VyY2Ugb2YgdHJ1dGgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3N0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXV0aFN0YXR1cz4oJ2xvYWRpbmcnKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8QXRsYXNVc2VyIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Nlc3Npb24gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzU2Vzc2lvbiB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFpbXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNlc3Npb25DbGFpbXMgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWVtYmVyc2hpcHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPihbXSk7XG5cbiAgLyoqIFRoZSB0aHJlZS1zdGF0ZSBhdXRoIGxpZmVjeWNsZTogYGxvYWRpbmdgIOKGkiBgc2lnbmVkX2luYCB8IGBzaWduZWRfb3V0YC4gKi9cbiAgcmVhZG9ubHkgc3RhdHVzJDogT2JzZXJ2YWJsZTxBdXRoU3RhdHVzPiA9IHRoaXMuX3N0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgdXNlciQ6IE9ic2VydmFibGU8QXRsYXNVc2VyIHwgbnVsbD4gPSB0aGlzLl91c2VyLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBzZXNzaW9uJDogT2JzZXJ2YWJsZTxBdGxhc1Nlc3Npb24gfCBudWxsPiA9IHRoaXMuX3Nlc3Npb24uYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNsYWltcyQ6IE9ic2VydmFibGU8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdGhpcy5fY2xhaW1zLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBtZW1iZXJzaGlwcyQ6IE9ic2VydmFibGU8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+ID1cbiAgICB0aGlzLl9tZW1iZXJzaGlwcy5hc09ic2VydmFibGUoKTtcblxuICAvKipcbiAgICogVHJ1ZSBvbmNlIHRoZSBTREsgaGFzIGZpbmlzaGVkIGl0cyBmaXJzdCBib290LiBEaXN0aW5ndWlzaGluZyBcInN0aWxsIGxvYWRpbmdcIlxuICAgKiBmcm9tIFwic2lnbmVkIG91dFwiIGlzIHdoYXQgbGV0cyBhIHRlbXBsYXRlIGF2b2lkIHRoZSBmbGFzaCBvZiBhIHNpZ24taW4gZm9ybVxuICAgKiBvbiBldmVyeSBwYWdlIGxvYWQuXG4gICAqL1xuICByZWFkb25seSBpc0xvYWRlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBtYXAoKHMpID0+IHMgIT09ICdsb2FkaW5nJyksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgKTtcblxuICByZWFkb25seSBpc1NpZ25lZEluJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIG1hcCgocykgPT4gcyA9PT0gJ3NpZ25lZF9pbicpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgLyoqIFRoZSBhY3RpdmUgb3JnYW5pemF0aW9uIG1lbWJlcnNoaXAsIGRlcml2ZWQgZnJvbSB0aGUgdG9rZW4ncyBgb3JnX2lkYCBjbGFpbS4gKi9cbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uJDogT2JzZXJ2YWJsZTxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3QoW1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLFxuICAgIHRoaXMuX2NsYWltcyxcbiAgXSkucGlwZShcbiAgICBtYXAoXG4gICAgICAoW21lbWJlcnNoaXBzLCBjbGFpbXNdKSA9PlxuICAgICAgICBtZW1iZXJzaGlwcy5maW5kKChtKSA9PiBtLm9yZ2FuaXphdGlvbi5pZCA9PT0gY2xhaW1zPy5vcmdfaWQpID8/IG51bGwsXG4gICAgKSxcbiAgKTtcblxuICAvLyAtLS0gU2lnbmFsIG1pcnJvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgcmVhZG9ubHkgc3RhdHVzOiBTaWduYWw8QXV0aFN0YXR1cz4gPSB0b1NpZ25hbCh0aGlzLnN0YXR1cyQsIHsgaW5pdGlhbFZhbHVlOiAnbG9hZGluZycgfSk7XG4gIHJlYWRvbmx5IHVzZXI6IFNpZ25hbDxBdGxhc1VzZXIgfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMudXNlciQsIHsgaW5pdGlhbFZhbHVlOiBudWxsIH0pO1xuICByZWFkb25seSBzZXNzaW9uOiBTaWduYWw8QXRsYXNTZXNzaW9uIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLnNlc3Npb24kLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgY2xhaW1zOiBTaWduYWw8U2Vzc2lvbkNsYWltcyB8IG51bGw+ID0gdG9TaWduYWwodGhpcy5jbGFpbXMkLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcHM6IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4gPSB0b1NpZ25hbCh0aGlzLm1lbWJlcnNoaXBzJCwge1xuICAgIGluaXRpYWxWYWx1ZTogW10gYXMgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10sXG4gIH0pO1xuICByZWFkb25seSBpc0xvYWRlZDogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSAhPT0gJ2xvYWRpbmcnKTtcbiAgcmVhZG9ubHkgaXNTaWduZWRJbjogU2lnbmFsPGJvb2xlYW4+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdGF0dXMoKSA9PT0gJ3NpZ25lZF9pbicpO1xuICByZWFkb25seSBvcmdhbml6YXRpb246IFNpZ25hbDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXAgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBvcmdJZCA9IHRoaXMuY2xhaW1zKCk/Lm9yZ19pZDtcbiAgICByZXR1cm4gdGhpcy5tZW1iZXJzaGlwcygpLmZpbmQoKG0pID0+IG0ub3JnYW5pemF0aW9uLmlkID09PSBvcmdJZCkgPz8gbnVsbDtcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLnB1Ymxpc2hhYmxlS2V5ID0gb3B0aW9ucy5wdWJsaXNoYWJsZUtleTtcbiAgICAvLyBUaHJvd3MgYW4gYEF0bGFzQ29uZmlnRXJyb3JgIG9uIGEgbWlzc2luZy9pbnZhbGlkIHZhbHVlIHJhdGhlciB0aGFuIHF1aWV0bHlcbiAgICAvLyBzZW5kaW5nIGV2ZXJ5IHJlcXVlc3QgdG8gYSByZWxhdGl2ZSBwYXRoIG9uIHRoZSBhcHAncyBvcmlnaW4uXG4gICAgdGhpcy5iYXNlVXJsID0gcmVzb2x2ZUZyb250ZW5kQXBpKG9wdGlvbnMuZnJvbnRlbmRBcGksIHtcbiAgICAgIGNvbXBvbmVudDogJ3Byb3ZpZGVBdGxhcygpIC8gQXRsYXNNb2R1bGUuZm9yUm9vdCgpJyxcbiAgICB9KTtcbiAgICB0aGlzLmRvRmV0Y2ggPSBvcHRpb25zLmZldGNoSW1wbCA/PyAoKC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGZldGNoPikgPT4gZmV0Y2goLi4uYXJncykpO1xuXG4gICAgdGhpcy5jYXRhbG9nID0gb3B0aW9ucy5sb2NhbGl6YXRpb24gPyB3aXRoRmFsbGJhY2sob3B0aW9ucy5sb2NhbGl6YXRpb24pIDogRU5fVVM7XG5cbiAgICB0aGlzLmZhcGlDbGllbnQgPSBuZXcgRmFwaUNsaWVudCh7XG4gICAgICBwdWJsaXNoYWJsZUtleTogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgIGJhc2VVcmw6IHRoaXMuYmFzZVVybCxcbiAgICAgIGZldGNoSW1wbDogdGhpcy5kb0ZldGNoLFxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZWQgc3luY2hyb25vdXNseSAobm90IGluIGFuIGFzeW5jIGluaXQpIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgYW55XG4gICAgLy8gZmxvdyBjb21wb25lbnQgcmVhZHMgaXQ6IGEgbmVlZHNfc2Vjb25kX2ZhY3RvciByZWRpcmVjdCBjYXJyaWVzIGEgc3RhdHVzIGJ1dFxuICAgIC8vIG5vIHRpY2tldCwgYW5kIHRoYXQgaXMgd2hhdCB0aGUgMkZBIHJlc3VtZSBzZWVkcyBmcm9tLlxuICAgIHRoaXMucGVuZGluZ0F0dGVtcHQgPSB0aGlzLmlzQnJvd3NlciA/IHRoaXMucmVhZFBlbmRpbmdBdHRlbXB0KCkgOiBudWxsO1xuXG4gICAgLy8gQm9vdCBvbmNlLCBicm93c2VyIG9ubHkuIE9uIHRoZSBzZXJ2ZXIgdGhlcmUgaXMgbm8gY29va2llIGphciB0byByZWFkIGFcbiAgICAvLyBzZXNzaW9uIGZyb20sIHNvIHdlIGxlYXZlIHRoZSBzdGF0ZSBhdCBgbG9hZGluZ2AgYW5kIGxldCBoeWRyYXRpb24gYm9vdCBpdC5cbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIHZvaWQgdGhpcy5ib290KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuX3N0YXR1cy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX3VzZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLl9zZXNzaW9uLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fY2xhaW1zLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8vIC0tLSBDb25maWd1cmF0aW9uIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBnZXQgYXBwZWFyYW5jZSgpOiBBcHBlYXJhbmNlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwcGVhcmFuY2U7XG4gIH1cblxuICBnZXQgbG9jYWxpemF0aW9uKCk6IENhdGFsb2cge1xuICAgIHJldHVybiB0aGlzLmNhdGFsb2c7XG4gIH1cblxuICBnZXQgZnJvbnRlbmRBcGkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlVXJsO1xuICB9XG5cbiAgLyoqIFRva2VucyBhcyBDU1MgY3VzdG9tIHByb3BlcnRpZXMsIGZvciBhIGhvc3QgZWxlbWVudCB0byBpbmhlcml0LiAqL1xuICBhcHBlYXJhbmNlVmFyaWFibGVzKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBjc3NWYXJpYWJsZXMocmVzb2x2ZVRva2Vucyh0aGlzLm9wdGlvbnMuYXBwZWFyYW5jZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGFwcGVhcmFuY2UgcmVuZGVyIGZvciBhIHJvb3QgZWxlbWVudDogaW5saW5lIHZhcmlhYmxlcywgdGhlXG4gICAqIGBkYXRhLWF0bGFzLSpgIGF0dHJpYnV0ZXMgYW5kIHRoZSBkZXNpZ24gc3R5bGVzaGVldC4gUGFzcyB0aGUgZGFzaGJvYXJkXG4gICAqIGRlc2lnbiAoZnJvbSB7QGxpbmsgbG9hZEluc3RhbmNlRGVzaWdufSkgdG8gbGF5ZXIgY29kZSBvdmVycmlkZXMgb24gaXQg4oCUXG4gICAqIHRoZSBzYW1lIHNlbWFudGljcyBhcyBgQGF0bGFzYXV0aC9yZWFjdGAuXG4gICAqL1xuICBhcHBlYXJhbmNlUmVuZGVyKGluc3RhbmNlRGVzaWduPzogSW5zdGFuY2VEZXNpZ24gfCBudWxsKTogQXBwZWFyYW5jZVJlbmRlciB7XG4gICAgcmV0dXJuIHJlbmRlckFwcGVhcmFuY2UodGhpcy5vcHRpb25zLmFwcGVhcmFuY2UsIGluc3RhbmNlRGVzaWduID8/IG51bGwsIHtcbiAgICAgIGZyb250ZW5kQXBpOiB0aGlzLmJhc2VVcmwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlc2lnbiBjb25maWd1cmVkIGluIHRoZSBBdGxhcyBkYXNoYm9hcmQgKGBHRVQgL3YxL2FwcGVhcmFuY2VgKSwgb3IgbnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vbmUsIGl0IGNhbm5vdCBiZSByZWFkLCBvciB0aGUgYXBwIG9wdGVkIG91dCB3aXRoXG4gICAqIGBhcHBlYXJhbmNlLmluc3RhbmNlRGVzaWduOiBmYWxzZWAuXG4gICAqL1xuICBhc3luYyBsb2FkSW5zdGFuY2VEZXNpZ24oKTogUHJvbWlzZTxJbnN0YW5jZURlc2lnbiB8IG51bGw+IHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmFwcGVhcmFuY2U/Lmluc3RhbmNlRGVzaWduID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvYXBwZWFyYW5jZScpO1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLm9rID8gaW5zdGFuY2VEZXNpZ25Gcm9tKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIEEgZnJlc2gge0BsaW5rIEZhcGlDbGllbnR9IGZvciBkcml2aW5nIGEgc2lnbi1pbi9zaWduLXVwIGZsb3cuICovXG4gIGNyZWF0ZUZhcGlDbGllbnQoKTogRmFwaUNsaWVudCB7XG4gICAgcmV0dXJuIG5ldyBGYXBpQ2xpZW50KHsgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksIGJhc2VVcmw6IHRoaXMuYmFzZVVybCB9KTtcbiAgfVxuXG4gIC8vIC0tLSBJbXBlcmF0aXZlIEFQSSAobWlycm9ycyB0aGUgUmVhY3QgaG9va3MnIGFjdGlvbnMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc2Vzc2lvbidzIEpXVCwgYWx3YXlzIGZyZXNoOiBpZiB0aGUgY2FjaGVkIHRva2VuIGlzIHdpdGhpbiA1cyBvZlxuICAgKiBleHBpcnkgaXQgaXMgcmVmcmVzaGVkIGZpcnN0IHJhdGhlciB0aGFuIGhhbmRlZCBvdmVyLiBOdWxsIHdoZW4gc2lnbmVkIG91dC5cbiAgICovXG4gIGFzeW5jIGdldFRva2VuKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGNvbnN0IHVzYWJsZSA9IHRoaXMuY2FjaGUuZ2V0KDVfMDAwKTtcbiAgICBpZiAodXNhYmxlKSByZXR1cm4gdXNhYmxlLmp3dDtcblxuICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgIHJldHVybiB0aGlzLmNhY2hlLmdldCg1XzAwMCk/Lmp3dCA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBzaWduZWQtaW4gdXNlcidzIE9XTiBsaXZlIGFjY2VzcyB0b2tlbiBhdCBhIGNvbm5lY3RlZCBwcm92aWRlciAoR29vZ2xlLFxuICAgKiBHaXRIdWIsIOKApiksIHNvIHRoZSBhcHAgY2FuIGNhbGwgdGhhdCBwcm92aWRlcidzIEFQSSBmcm9tIHRoZSBicm93c2VyLiBOdWxsXG4gICAqIHdoZW4gdGhlcmUgaXMgbm8gdXNhYmxlIHRva2VuIOKAlCBubyBsaW5rZWQgYWNjb3VudCwgb3IgdGhlIHByb3ZpZGVyIGdyYW50ZWQgL1xuICAgKiBrZXB0IG5vbmUuIFRoZSBzZXJ2ZXIgcmVmcmVzaGVzIGEgc3RhbGUgdG9rZW4gb24gcmVhZDsgdGhlIHJlZnJlc2ggdG9rZW4gaXNcbiAgICogbmV2ZXIgZXhwb3NlZC5cbiAgICovXG4gIGdldFByb3ZpZGVyVG9rZW4ocHJvdmlkZXI6IHN0cmluZyk6IFByb21pc2U8UHJvdmlkZXJUb2tlbiB8IG51bGw+IHtcbiAgICByZXR1cm4gZmV0Y2hQcm92aWRlclRva2VuKHRoaXMuZmFwaUNsaWVudCwgcHJvdmlkZXIpO1xuICB9XG5cbiAgLyoqIEltcGVyYXRpdmUgYGhhcygpYCDigJQgdGhlIHNhbWUgZXZhbHVhdGlvbiBgKmF0bGFzUHJvdGVjdGAgcmVuZGVycyBvbi4gKi9cbiAgaGFzKGNvbmRpdGlvbjogUHJvdGVjdENvbmRpdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmFsdWF0ZSh0aGlzLl9jbGFpbXMudmFsdWUsIGNvbmRpdGlvbikuYWxsb3dlZDtcbiAgfVxuXG4gIC8qKiBSZXZva2UgdGhlIGN1cnJlbnQgc2Vzc2lvbiBzZXJ2ZXItc2lkZSBhbmQgZHJvcCBhbGwgbG9jYWwgYXV0aCBzdGF0ZS4gKi9cbiAgYXN5bmMgc2lnbk91dChvcHRpb25zPzogU2lnbk91dE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IHJldm9rZWQgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vcmV2b2tlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAvLyBPSURDIEZyb250LUNoYW5uZWwgTG9nb3V0OiBsZXQgdGhlIGFwcHMgc2lnbmVkIGluIHRocm91Z2ggdGhpcyBzZXNzaW9uXG4gICAgICAvLyBjbGVhciB0aGVpcnMgaW4gdGhpcyBicm93c2VyIChoaWRkZW4gaWZyYW1lcywgY2FwcGVkIGF0IDUgcykuIEJlc3QtZWZmb3J0LlxuICAgICAgaWYgKG9wdGlvbnM/LmZyb250Y2hhbm5lbCAhPT0gZmFsc2UpIGF3YWl0IHJ1bkZyb250Q2hhbm5lbExvZ291dEZyb21SZXNwb25zZShyZXZva2VkKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIHRoaXMuX3VzZXIubmV4dChudWxsKTtcbiAgICB0aGlzLl9zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgdGhpcy5fY2xhaW1zLm5leHQobnVsbCk7XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChbXSk7XG4gIH1cblxuICAvKipcbiAgICogU3dpdGNoIHRoZSBhY3RpdmUgb3JnYW5pemF0aW9uIChvciBgbnVsbGAgZm9yIHRoZSBwZXJzb25hbCBhY2NvdW50KS4gVGhlXG4gICAqIG5ldyB0b2tlbiBjYXJyaWVzIHRoZSBuZXcgb3JnIGNsYWltcywgc28gdGhlIGFwcCdzIHBlcm1pc3Npb24gY2hlY2tzIHVwZGF0ZVxuICAgKiB3aXRob3V0IGEgcmUtbG9naW4uXG4gICAqL1xuICBhc3luYyBzZXRBY3RpdmVPcmdhbml6YXRpb24ob3JnYW5pemF0aW9uSWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS90b3VjaGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhY3RpdmVfb3JnYW5pemF0aW9uX2lkOiBvcmdhbml6YXRpb25JZCB9KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm47XG5cbiAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd3Q6IHN0cmluZyB9O1xuICAgIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgY3VycmVudC5zZXNzaW9uSWQpO1xuICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gIH1cblxuICAvKiogUmUtcmVhZCBgL3YxL2NsaWVudGA6IHJlZnJlc2ggdXNlciwgc2Vzc2lvbiwgbWVtYmVyc2hpcHMgYW5kIHN0YXR1cy4gKi9cbiAgYXN5bmMgcmVsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2NsaWVudCcpO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdib290IGZhaWxlZCcpO1xuXG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMge1xuICAgICAgICBzZXNzaW9uOiBBdGxhc1Nlc3Npb24gfCBudWxsO1xuICAgICAgICB1c2VyOiBBdGxhc1VzZXIgfCBudWxsO1xuICAgICAgICBqd3Q/OiBzdHJpbmc7XG4gICAgICAgIG9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcz86IEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFib2R5LnNlc3Npb24gfHwgIWJvZHkudXNlcikge1xuICAgICAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgICAgIHRoaXMuY2FjaGUuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICAgICAgdGhpcy5fdXNlci5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9zZXNzaW9uLm5leHQobnVsbCk7XG4gICAgICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLl9tZW1iZXJzaGlwcy5uZXh0KFtdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91c2VyLm5leHQoYm9keS51c2VyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb24ubmV4dChib2R5LnNlc3Npb24pO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChib2R5Lm9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcyA/PyBbXSk7XG4gICAgICBpZiAoYm9keS5qd3QpIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uLmlkKTtcbiAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfaW4nKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIGZhaWxlZCBib290IGlzIE5PVCBzaWduZWQtb3V0LiBSZW5kZXJpbmcgYSBzaWduLWluIGZvcm0gYmVjYXVzZSB0aGVcbiAgICAgIC8vIG5ldHdvcmsgaGljY3VwZWQgdGhyb3dzIGF3YXkgYSBwZXJmZWN0bHkgZ29vZCBzZXNzaW9uIGFuZCBmb3JjZXMgYVxuICAgICAgLy8gbmVlZGxlc3MgcmUtYXV0aGVudGljYXRpb24uIE9ubHkgcHJvbW90ZSBsb2FkaW5nIOKGkiBzaWduZWRfb3V0LlxuICAgICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSA9PT0gJ2xvYWRpbmcnKSB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogwqc2LjMgc3RlcCAzOiBjb21wbGV0ZSBhIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4sIHRoZW4gYm9vdC4gQW4gT0F1dGggb3JcbiAgICogaG9zdGVkLXBhZ2UgZmxvdyBsYW5kcyBiYWNrIHdpdGggYSBvbmUtdGltZSB0aWNrZXQgaW4gdGhlIFVSTDsgZXhjaGFuZ2UgaXRcbiAgICogZm9yIGNvb2tpZXMsIHNjcnViIHRoZSBVUkwgc28gYSByZWxvYWQgY2Fubm90IHJlcGxheSBpdCwgVEhFTiByZWFkIHRoZVxuICAgKiBzZXNzaW9uLiBBIHJlZGlyZWN0IGNhcnJ5aW5nIG9ubHkgYSBzdGF0dXMgKGEgc2Vjb25kIGZhY3RvciBpcyBzdGlsbCBvd2VkKVxuICAgKiBoYXMgbm8gdGlja2V0LCBzbyBub3RoaW5nIGlzIGV4Y2hhbmdlZCBhbmQgdGhlIGFwcCBib290cyBzaWduZWQtb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRSZWRpcmVjdFJlc3VsdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcblxuICAgIGlmIChyZXN1bHQ/LnRpY2tldCkge1xuICAgICAgYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF0dGVtcHRfaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHRpY2tldDogcmVzdWx0LnRpY2tldCB9KSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgZG9jdW1lbnQudGl0bGUsIHN0cmlwUmVkaXJlY3RQYXJhbXMod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZFBlbmRpbmdBdHRlbXB0KCk6IHsgaWQ6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfSB8IG51bGwge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlYWRSZWRpcmVjdFJlc3VsdCh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICByZXR1cm4gcmVzdWx0Py5zdGF0dXMgJiYgIXJlc3VsdC50aWNrZXRcbiAgICAgID8geyBpZDogcmVzdWx0LmF0dGVtcHRJZCwgc3RhdHVzOiByZXN1bHQuc3RhdHVzIH1cbiAgICAgIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsbChwYXRoOiBzdHJpbmcsIGluaXQ/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5kb0ZldGNoKGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwge1xuICAgICAgLi4uaW5pdCxcbiAgICAgIC8vIENvb2tpZXMgY2FycnkgdGhlIHNlc3Npb247IGEgcmVxdWVzdCB3aXRob3V0IHRoaXMgaXMgaW5kaXN0aW5ndWlzaGFibGVcbiAgICAgIC8vIGZyb20gYmVpbmcgc2lnbmVkIG91dC5cbiAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LXB1Ymxpc2hhYmxlLWtleSc6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICAgIC4uLihpbml0Py5ib2R5ID8geyAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0gOiB7fSksXG4gICAgICAgIC4uLmluaXQ/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVRva2VuKGp3dDogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4cGlyZXNBdCA9IHJlYWRFeHBpcnkoand0KTtcbiAgICBpZiAoIWV4cGlyZXNBdCkgcmV0dXJuO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQoeyBqd3QsIGV4cGlyZXNBdCwgc2Vzc2lvbklkIH0pO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KGRlY29kZUNsYWltcyhqd3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCFjdXJyZW50KSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG9rZW5zYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKCdyZWZyZXNoIGZhaWxlZCcpO1xuXG4gICAgICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgeyBqd3Q6IHN0cmluZzsgc2Vzc2lvbl9pZDogc3RyaW5nIH07XG4gICAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGJvZHkuc2Vzc2lvbl9pZCk7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhlIHNlc3Npb24gbWF5IGdlbnVpbmVseSBiZSBnb25lLiBSZS1ib290IHJhdGhlciB0aGFuIGd1ZXNzLlxuICAgICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICB9XG4gIH1cblxuICAvKiogwqc3LjQ6IHByb2FjdGl2ZSwgaml0dGVyZWQgcmVmcmVzaCBzY2hlZHVsZWQgZnJvbSB0aGUgdG9rZW4ncyBvd24gZXhwaXJ5LiAqL1xuICBwcml2YXRlIHNjaGVkdWxlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyUmVmcmVzaFRpbWVyKCk7XG4gICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSAhPT0gJ3NpZ25lZF9pbicpIHJldHVybjtcblxuICAgIGNvbnN0IHRva2VuID0gdGhpcy5jYWNoZS5wZWVrKCk7XG4gICAgaWYgKCF0b2tlbikgcmV0dXJuO1xuXG4gICAgY29uc3QgZGVsYXkgPSBtc1VudGlsUmVmcmVzaCh7IHRva2VuLCBub3c6IERhdGUubm93KCkgfSk7XG4gICAgdGhpcy5yZWZyZXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5yZWZyZXNoKCksIGRlbGF5KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJSZWZyZXNoVGltZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVmcmVzaFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWZyZXNoVGltZXIpO1xuICAgICAgdGhpcy5yZWZyZXNoVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRGVjb2RlIGEgSldUIHBheWxvYWQgd2l0aG91dCB2ZXJpZnlpbmcgaXQg4oCUIGEgc2NoZWR1bGluZy9VSSBoaW50IG9ubHkuICovXG5mdW5jdGlvbiBkZWNvZGVDbGFpbXMoand0OiBzdHJpbmcpOiBTZXNzaW9uQ2xhaW1zIHwgbnVsbCB7XG4gIGNvbnN0IHBhcnRzID0gand0LnNwbGl0KCcuJyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgYXRvYihwYXJ0c1sxXSEucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKSksXG4gICAgKSBhcyBTZXNzaW9uQ2xhaW1zO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
419
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRsYXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXRsYXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsVUFBVSxFQUVWLFdBQVcsRUFFWCxRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsZ0JBQWdCLElBQUksa0JBQWtCLEVBQ3RDLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsVUFBVSxFQUNWLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEdBS3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQXlCLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGdCQUFnQixFQUNoQixhQUFhLEdBSWQsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQWdCLE1BQU0sUUFBUSxDQUFDOztBQVMzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxNQUFNLE9BQU8sWUFBWTtJQUNOLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEMsVUFBVSxHQUFHLE1BQU0s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SUQsXG4gIFNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEZhcGlDbGllbnQsXG4gIFNpZ25PdXRHdWFyZCxcbiAgVG9rZW5DYWNoZSxcbiAgY2xvc2VPQXV0aFBvcHVwQWZ0ZXJTaWduSW4sXG4gIGNvbXBsZXRlT0F1dGhQb3B1cExhbmRpbmcsXG4gIGdldFByb3ZpZGVyVG9rZW4gYXMgZmV0Y2hQcm92aWRlclRva2VuLFxuICBtYXBPQXV0aFBvcHVwUGF5bG9hZCxcbiAgbXNVbnRpbFJlZnJlc2gsXG4gIHJlYWRFeHBpcnksXG4gIHJlYWRSZWRpcmVjdFJlc3VsdCxcbiAgcmVzb2x2ZUZyb250ZW5kQXBpLFxuICBzdHJpcFJlZGlyZWN0UGFyYW1zLFxuICB0eXBlIFByb3ZpZGVyVG9rZW4sXG4gIHR5cGUgUmVkaXJlY3RSZXN1bHQsXG4gIHR5cGUgU2lnbk91dE9wdGlvbnMsXG4gIHR5cGUgU2lnbk91dFJlc3VsdCxcbn0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBldmFsdWF0ZSwgdHlwZSBQcm90ZWN0Q29uZGl0aW9uIH0gZnJvbSAnQGF0bGFzYXV0aC9hdXRoeic7XG5pbXBvcnQgeyBBVExBU19PUFRJT05TIH0gZnJvbSAnLi9hdGxhcy5jb25maWcnO1xuaW1wb3J0IHtcbiAgY3NzVmFyaWFibGVzLFxuICBpbnN0YW5jZURlc2lnbkZyb20sXG4gIHJlbmRlckFwcGVhcmFuY2UsXG4gIHJlc29sdmVUb2tlbnMsXG4gIHR5cGUgQXBwZWFyYW5jZSxcbiAgdHlwZSBBcHBlYXJhbmNlUmVuZGVyLFxuICB0eXBlIEluc3RhbmNlRGVzaWduLFxufSBmcm9tICcuL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgRU5fVVMsIHdpdGhGYWxsYmFjaywgdHlwZSBDYXRhbG9nIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB0eXBlIHtcbiAgQXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwLFxuICBBdGxhc1Nlc3Npb24sXG4gIEF0bGFzVXNlcixcbiAgQXV0aFN0YXR1cyxcbiAgU2Vzc2lvbkNsYWltcyxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogYEF0bGFzU2VydmljZWAg4oCUIHRoZSBBbmd1bGFyIHBlZXIgb2YgUmVhY3QncyBgPEF0bGFzUHJvdmlkZXI+YCArIGhvb2tzLlxuICpcbiAqIEl0IGhvbGRzIGV4YWN0bHkgb25lIHRoaW5nIHRoYXQgbWF0dGVycyBpbiBtZW1vcnk6IHRoZSBzaG9ydC1saXZlZCBKV1QsIGluIGFcbiAqIHtAbGluayBUb2tlbkNhY2hlfS4gTm90IGxvY2FsU3RvcmFnZSwgbm90IGEgY29va2llIHRoaXMgY29kZSB3cml0ZXMg4oCUIHRoZVxuICogcmVmcmVzaCB0b2tlbiBpcyBIdHRwT25seSBzbyBicm93c2VyIHNjcmlwdCBuZXZlciB0b3VjaGVzIGl0LCBhbmQgdGhlIEpXVFxuICogbGl2ZXMgb25seSBhcyBsb25nIGFzIHRoZSB0YWIuIEFueXRoaW5nIHBlcnNpc3RlZCB3b3VsZCBzdXJ2aXZlIHRoZSB0YWIgYW5kXG4gKiBiZWNvbWUgdGhlIGZpcnN0IHRoaW5nIGFuIFhTUyByZWFkcy5cbiAqXG4gKiBSZWFjdGl2ZSBhdXRoIHN0YXRlIGlzIGV4cG9zZWQgdHdvIHdheXMgc28gY2FsbGVycyBjYW4gcGljayB0aGVpciBpZGlvbTpcbiAqICAtIFJ4SlMgb2JzZXJ2YWJsZXMgKGB1c2VyJGAsIGBzZXNzaW9uJGAsIGBpc1NpZ25lZEluJGAsIOKApikg4oCUIHRoZSBwcmltYXJ5IEFQSSxcbiAqICAgIHRoZSBhbmFsb2d1ZSBvZiB0aGUgUmVhY3QgaG9va3MnIHJldHVybiB2YWx1ZXMuXG4gKiAgLSBBbmd1bGFyIHNpZ25hbHMgKGB1c2VyYCwgYHNlc3Npb25gLCBgaXNTaWduZWRJbmAsIOKApikg4oCUIHRoZSBzYW1lIHZhbHVlcyBhc1xuICogICAgYFNpZ25hbDxUPmAsIGZvciB0ZW1wbGF0ZXMgYW5kIGBjb21wdXRlZCgpYC5cbiAqXG4gKiBUaGUgaW1wZXJhdGl2ZSBtZXRob2RzIChgc2lnbk91dGAsIGBnZXRUb2tlbmAsIGBnZXRQcm92aWRlclRva2VuYCxcbiAqIGBzZXRBY3RpdmVPcmdhbml6YXRpb25gLCBgcmVsb2FkYCkgbWlycm9yIHRoZSBhY3Rpb25zIHRoZSBob29rcyByZXR1cm4uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQXRsYXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zID0gaW5qZWN0KEFUTEFTX09QVElPTlMpO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYXRmb3JtSWQgPSBpbmplY3QoUExBVEZPUk1fSUQpO1xuICBwcml2YXRlIHJlYWRvbmx5IGlzQnJvd3NlciA9IGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHVibGlzaGFibGVLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkb0ZldGNoOiB0eXBlb2YgZmV0Y2g7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjYWNoZSA9IG5ldyBUb2tlbkNhY2hlKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZmFwaUNsaWVudDogRmFwaUNsaWVudDtcbiAgcHJpdmF0ZSByZWZyZXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXNzaW9ucyB0aGlzIGJyb3dzZXIgc2lnbmVkIG91dCBvZiAodG9tYnN0b25lcyBpbiBsb2NhbFN0b3JhZ2UsIHBlclxuICAgKiBGcm9udGVuZCBBUEkgb3JpZ2luKSwgdGhlIHJldm9rZSBhbmQgaXRzIGJhY2tncm91bmQgcmUtdHJpZXMuIEV2ZXJ5IHJlbG9hZCAvXG4gICAqIHJlZnJlc2ggYXNrcyBpdCBiZWZvcmUgYWRvcHRpbmcgYSBzZXNzaW9uLCBzbyBhIHNpZ24tb3V0IHRoZSBzZXJ2ZXIgbmV2ZXJcbiAgICogY29uZmlybWVkIGlzIG5vdCB1bmRvbmUgYnkgdGhlIHN0aWxsLXZhbGlkIHJlZnJlc2ggY29va2llLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBndWFyZDogU2lnbk91dEd1YXJkO1xuICBwcml2YXRlIHN0b3BXYXRjaGluZ1NpZ25PdXQ6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZzogQ2F0YWxvZztcblxuICAvKipcbiAgICogQSBzaWduLWluIGF0dGVtcHQgaGFuZGVkIGJhY2sgYnkgYW4gT0F1dGggcmVkaXJlY3QgdGhhdCBzdGlsbCBuZWVkcyBhIHNlY29uZFxuICAgKiBmYWN0b3IgKG5vIHNlc3Npb24gd2FzIGlzc3VlZCkuIE51bGwgaW4gdGhlIG9yZGluYXJ5IGNhc2U7IHRoZSBgPGF0bGFzLXNpZ24taW4+YFxuICAgKiBmbG93IHNlZWRzIGl0c2VsZiBmcm9tIHRoaXMgc28gdGhlIHVzZXIgcmVzdW1lcyBhdCB0aGUgMkZBIHN0ZXAuIENhcHR1cmVkXG4gICAqIG9uY2UsIHN5bmNocm9ub3VzbHksIGF0IGNvbnN0cnVjdGlvbiDigJQgYmVmb3JlIGFueSBmbG93IGNvbXBvbmVudCByZWFkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHBlbmRpbmdBdHRlbXB0OiB7IGlkOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nIH0gfCBudWxsO1xuXG4gIC8vIC0tLSBSZWFjdGl2ZSBzdGF0ZSAoc291cmNlIG9mIHRydXRoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0dXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF1dGhTdGF0dXM+KCdsb2FkaW5nJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3VzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEF0bGFzVXNlciB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXNzaW9uID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc1Nlc3Npb24gfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfY2xhaW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTZXNzaW9uQ2xhaW1zIHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21lbWJlcnNoaXBzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXT4oW10pO1xuXG4gIC8qKiBUaGUgdGhyZWUtc3RhdGUgYXV0aCBsaWZlY3ljbGU6IGBsb2FkaW5nYCDihpIgYHNpZ25lZF9pbmAgfCBgc2lnbmVkX291dGAuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQ6IE9ic2VydmFibGU8QXV0aFN0YXR1cz4gPSB0aGlzLl9zdGF0dXMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IHVzZXIkOiBPYnNlcnZhYmxlPEF0bGFzVXNlciB8IG51bGw+ID0gdGhpcy5fdXNlci5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgc2Vzc2lvbiQ6IE9ic2VydmFibGU8QXRsYXNTZXNzaW9uIHwgbnVsbD4gPSB0aGlzLl9zZXNzaW9uLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBjbGFpbXMkOiBPYnNlcnZhYmxlPFNlc3Npb25DbGFpbXMgfCBudWxsPiA9IHRoaXMuX2NsYWltcy5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgbWVtYmVyc2hpcHMkOiBPYnNlcnZhYmxlPEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdPiA9XG4gICAgdGhpcy5fbWVtYmVyc2hpcHMuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqXG4gICAqIFRydWUgb25jZSB0aGUgU0RLIGhhcyBmaW5pc2hlZCBpdHMgZmlyc3QgYm9vdC4gRGlzdGluZ3Vpc2hpbmcgXCJzdGlsbCBsb2FkaW5nXCJcbiAgICogZnJvbSBcInNpZ25lZCBvdXRcIiBpcyB3aGF0IGxldHMgYSB0ZW1wbGF0ZSBhdm9pZCB0aGUgZmxhc2ggb2YgYSBzaWduLWluIGZvcm1cbiAgICogb24gZXZlcnkgcGFnZSBsb2FkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNMb2FkZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zdGF0dXMkLnBpcGUoXG4gICAgbWFwKChzKSA9PiBzICE9PSAnbG9hZGluZycpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICk7XG5cbiAgcmVhZG9ubHkgaXNTaWduZWRJbiQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBtYXAoKHMpID0+IHMgPT09ICdzaWduZWRfaW4nKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICApO1xuXG4gIC8qKiBUaGUgYWN0aXZlIG9yZ2FuaXphdGlvbiBtZW1iZXJzaGlwLCBkZXJpdmVkIGZyb20gdGhlIHRva2VuJ3MgYG9yZ19pZGAgY2xhaW0uICovXG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbiQ6IE9ic2VydmFibGU8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwIHwgbnVsbD4gPSBjb21iaW5lTGF0ZXN0KFtcbiAgICB0aGlzLl9tZW1iZXJzaGlwcyxcbiAgICB0aGlzLl9jbGFpbXMsXG4gIF0pLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKFttZW1iZXJzaGlwcywgY2xhaW1zXSkgPT5cbiAgICAgICAgbWVtYmVyc2hpcHMuZmluZCgobSkgPT4gbS5vcmdhbml6YXRpb24uaWQgPT09IGNsYWltcz8ub3JnX2lkKSA/PyBudWxsLFxuICAgICksXG4gICk7XG5cbiAgLy8gLS0tIFNpZ25hbCBtaXJyb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHJlYWRvbmx5IHN0YXR1czogU2lnbmFsPEF1dGhTdGF0dXM+ID0gdG9TaWduYWwodGhpcy5zdGF0dXMkLCB7IGluaXRpYWxWYWx1ZTogJ2xvYWRpbmcnIH0pO1xuICByZWFkb25seSB1c2VyOiBTaWduYWw8QXRsYXNVc2VyIHwgbnVsbD4gPSB0b1NpZ25hbCh0aGlzLnVzZXIkLCB7IGluaXRpYWxWYWx1ZTogbnVsbCB9KTtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogU2lnbmFsPEF0bGFzU2Vzc2lvbiB8IG51bGw+ID0gdG9TaWduYWwodGhpcy5zZXNzaW9uJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IGNsYWltczogU2lnbmFsPFNlc3Npb25DbGFpbXMgfCBudWxsPiA9IHRvU2lnbmFsKHRoaXMuY2xhaW1zJCwgeyBpbml0aWFsVmFsdWU6IG51bGwgfSk7XG4gIHJlYWRvbmx5IG1lbWJlcnNoaXBzOiBTaWduYWw8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwW10+ID0gdG9TaWduYWwodGhpcy5tZW1iZXJzaGlwcyQsIHtcbiAgICBpbml0aWFsVmFsdWU6IFtdIGFzIEF0bGFzT3JnYW5pemF0aW9uTWVtYmVyc2hpcFtdLFxuICB9KTtcbiAgcmVhZG9ubHkgaXNMb2FkZWQ6IFNpZ25hbDxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdHVzKCkgIT09ICdsb2FkaW5nJyk7XG4gIHJlYWRvbmx5IGlzU2lnbmVkSW46IFNpZ25hbDxib29sZWFuPiA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdHVzKCkgPT09ICdzaWduZWRfaW4nKTtcbiAgcmVhZG9ubHkgb3JnYW5pemF0aW9uOiBTaWduYWw8QXRsYXNPcmdhbml6YXRpb25NZW1iZXJzaGlwIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgb3JnSWQgPSB0aGlzLmNsYWltcygpPy5vcmdfaWQ7XG4gICAgcmV0dXJuIHRoaXMubWVtYmVyc2hpcHMoKS5maW5kKChtKSA9PiBtLm9yZ2FuaXphdGlvbi5pZCA9PT0gb3JnSWQpID8/IG51bGw7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy5wdWJsaXNoYWJsZUtleSA9IG9wdGlvbnMucHVibGlzaGFibGVLZXk7XG4gICAgLy8gVGhyb3dzIGFuIGBBdGxhc0NvbmZpZ0Vycm9yYCBvbiBhIG1pc3NpbmcvaW52YWxpZCB2YWx1ZSByYXRoZXIgdGhhbiBxdWlldGx5XG4gICAgLy8gc2VuZGluZyBldmVyeSByZXF1ZXN0IHRvIGEgcmVsYXRpdmUgcGF0aCBvbiB0aGUgYXBwJ3Mgb3JpZ2luLlxuICAgIHRoaXMuYmFzZVVybCA9IHJlc29sdmVGcm9udGVuZEFwaShvcHRpb25zLmZyb250ZW5kQXBpLCB7XG4gICAgICBjb21wb25lbnQ6ICdwcm92aWRlQXRsYXMoKSAvIEF0bGFzTW9kdWxlLmZvclJvb3QoKScsXG4gICAgfSk7XG4gICAgdGhpcy5kb0ZldGNoID0gb3B0aW9ucy5mZXRjaEltcGwgPz8gKCguLi5hcmdzOiBQYXJhbWV0ZXJzPHR5cGVvZiBmZXRjaD4pID0+IGZldGNoKC4uLmFyZ3MpKTtcblxuICAgIHRoaXMuY2F0YWxvZyA9IG9wdGlvbnMubG9jYWxpemF0aW9uID8gd2l0aEZhbGxiYWNrKG9wdGlvbnMubG9jYWxpemF0aW9uKSA6IEVOX1VTO1xuXG4gICAgdGhpcy5mYXBpQ2xpZW50ID0gbmV3IEZhcGlDbGllbnQoe1xuICAgICAgcHVibGlzaGFibGVLZXk6IHRoaXMucHVibGlzaGFibGVLZXksXG4gICAgICBiYXNlVXJsOiB0aGlzLmJhc2VVcmwsXG4gICAgICBmZXRjaEltcGw6IHRoaXMuZG9GZXRjaCxcbiAgICB9KTtcblxuICAgIHRoaXMuZ3VhcmQgPSBuZXcgU2lnbk91dEd1YXJkKHtcbiAgICAgIHJlcXVlc3Q6IChwYXRoLCBpbml0KSA9PiB0aGlzLmNhbGwocGF0aCwgaW5pdCksXG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuXG4gICAgLy8gQ2FwdHVyZWQgc3luY2hyb25vdXNseSAobm90IGluIGFuIGFzeW5jIGluaXQpIHNvIGl0IGlzIGF2YWlsYWJsZSBiZWZvcmUgYW55XG4gICAgLy8gZmxvdyBjb21wb25lbnQgcmVhZHMgaXQ6IGEgbmVlZHNfc2Vjb25kX2ZhY3RvciByZWRpcmVjdCBjYXJyaWVzIGEgc3RhdHVzIGJ1dFxuICAgIC8vIG5vIHRpY2tldCwgYW5kIHRoYXQgaXMgd2hhdCB0aGUgMkZBIHJlc3VtZSBzZWVkcyBmcm9tLlxuICAgIHRoaXMucGVuZGluZ0F0dGVtcHQgPSB0aGlzLmlzQnJvd3NlciA/IHRoaXMucmVhZFBlbmRpbmdBdHRlbXB0KCkgOiBudWxsO1xuXG4gICAgLy8gQm9vdCBvbmNlLCBicm93c2VyIG9ubHkuIE9uIHRoZSBzZXJ2ZXIgdGhlcmUgaXMgbm8gY29va2llIGphciB0byByZWFkIGFcbiAgICAvLyBzZXNzaW9uIGZyb20sIHNvIHdlIGxlYXZlIHRoZSBzdGF0ZSBhdCBgbG9hZGluZ2AgYW5kIGxldCBoeWRyYXRpb24gYm9vdCBpdC5cbiAgICBpZiAodGhpcy5pc0Jyb3dzZXIpIHtcbiAgICAgIC8vIEFub3RoZXIgdGFiIHNpZ25lZCBvdXQgb2YgVEhJUyBzZXNzaW9uIChpdHMgdG9tYnN0b25lIHJlYWNoZWQgdGhlIHNoYXJlZFxuICAgICAgLy8gc3RvcmUpOiBkcm9wIHRoZSB0b2tlbiBhbmQgcmUtY2hlY2ssIHdoaWNoIHRoZW4gcmVmdXNlcyB0aGUgc2Vzc2lvbi5cbiAgICAgIHRoaXMuc3RvcFdhdGNoaW5nU2lnbk91dCA9IHRoaXMuZ3VhcmQud2F0Y2goXG4gICAgICAgICgpID0+IHRoaXMuY2FjaGUucGVlaygpPy5zZXNzaW9uSWQgPz8gdGhpcy5fc2Vzc2lvbi52YWx1ZT8uaWQsXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgdm9pZCB0aGlzLnJlbG9hZCgpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHZvaWQgdGhpcy5ib290KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wV2F0Y2hpbmdTaWduT3V0Py4oKTtcbiAgICB0aGlzLnN0b3BXYXRjaGluZ1NpZ25PdXQgPSBudWxsO1xuICAgIHRoaXMuZ3VhcmQuZGlzcG9zZSgpO1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLl9zdGF0dXMuY29tcGxldGUoKTtcbiAgICB0aGlzLl91c2VyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2NsYWltcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvLyAtLS0gQ29uZmlndXJhdGlvbiBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgZ2V0IGFwcGVhcmFuY2UoKTogQXBwZWFyYW5jZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlO1xuICB9XG5cbiAgZ2V0IGxvY2FsaXphdGlvbigpOiBDYXRhbG9nIHtcbiAgICByZXR1cm4gdGhpcy5jYXRhbG9nO1xuICB9XG5cbiAgZ2V0IGZyb250ZW5kQXBpKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZVVybDtcbiAgfVxuXG4gIC8qKiBUb2tlbnMgYXMgQ1NTIGN1c3RvbSBwcm9wZXJ0aWVzLCBmb3IgYSBob3N0IGVsZW1lbnQgdG8gaW5oZXJpdC4gKi9cbiAgYXBwZWFyYW5jZVZhcmlhYmxlcygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gY3NzVmFyaWFibGVzKHJlc29sdmVUb2tlbnModGhpcy5vcHRpb25zLmFwcGVhcmFuY2UpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBhcHBlYXJhbmNlIHJlbmRlciBmb3IgYSByb290IGVsZW1lbnQ6IGlubGluZSB2YXJpYWJsZXMsIHRoZVxuICAgKiBgZGF0YS1hdGxhcy0qYCBhdHRyaWJ1dGVzIGFuZCB0aGUgZGVzaWduIHN0eWxlc2hlZXQuIFBhc3MgdGhlIGRhc2hib2FyZFxuICAgKiBkZXNpZ24gKGZyb20ge0BsaW5rIGxvYWRJbnN0YW5jZURlc2lnbn0pIHRvIGxheWVyIGNvZGUgb3ZlcnJpZGVzIG9uIGl0IOKAlFxuICAgKiB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgYEBhdGxhc2F1dGgvcmVhY3RgLlxuICAgKi9cbiAgYXBwZWFyYW5jZVJlbmRlcihpbnN0YW5jZURlc2lnbj86IEluc3RhbmNlRGVzaWduIHwgbnVsbCk6IEFwcGVhcmFuY2VSZW5kZXIge1xuICAgIHJldHVybiByZW5kZXJBcHBlYXJhbmNlKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlLCBpbnN0YW5jZURlc2lnbiA/PyBudWxsLCB7XG4gICAgICBmcm9udGVuZEFwaTogdGhpcy5iYXNlVXJsLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkZXNpZ24gY29uZmlndXJlZCBpbiB0aGUgQXRsYXMgZGFzaGJvYXJkIChgR0VUIC92MS9hcHBlYXJhbmNlYCksIG9yIG51bGxcbiAgICogd2hlbiB0aGVyZSBpcyBub25lLCBpdCBjYW5ub3QgYmUgcmVhZCwgb3IgdGhlIGFwcCBvcHRlZCBvdXQgd2l0aFxuICAgKiBgYXBwZWFyYW5jZS5pbnN0YW5jZURlc2lnbjogZmFsc2VgLlxuICAgKi9cbiAgYXN5bmMgbG9hZEluc3RhbmNlRGVzaWduKCk6IFByb21pc2U8SW5zdGFuY2VEZXNpZ24gfCBudWxsPiB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5hcHBlYXJhbmNlPy5pbnN0YW5jZURlc2lnbiA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbCgnL3YxL2FwcGVhcmFuY2UnKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5vayA/IGluc3RhbmNlRGVzaWduRnJvbShhd2FpdCByZXNwb25zZS5qc29uKCkpIDogbnVsbDtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBIGZyZXNoIHtAbGluayBGYXBpQ2xpZW50fSBmb3IgZHJpdmluZyBhIHNpZ24taW4vc2lnbi11cCBmbG93LiAqL1xuICBjcmVhdGVGYXBpQ2xpZW50KCk6IEZhcGlDbGllbnQge1xuICAgIHJldHVybiBuZXcgRmFwaUNsaWVudCh7IHB1Ymxpc2hhYmxlS2V5OiB0aGlzLnB1Ymxpc2hhYmxlS2V5LCBiYXNlVXJsOiB0aGlzLmJhc2VVcmwgfSk7XG4gIH1cblxuICAvLyAtLS0gSW1wZXJhdGl2ZSBBUEkgKG1pcnJvcnMgdGhlIFJlYWN0IGhvb2tzJyBhY3Rpb25zKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHNlc3Npb24ncyBKV1QsIGFsd2F5cyBmcmVzaDogaWYgdGhlIGNhY2hlZCB0b2tlbiBpcyB3aXRoaW4gNXMgb2ZcbiAgICogZXhwaXJ5IGl0IGlzIHJlZnJlc2hlZCBmaXJzdCByYXRoZXIgdGhhbiBoYW5kZWQgb3Zlci4gTnVsbCB3aGVuIHNpZ25lZCBvdXQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBjb25zdCB1c2FibGUgPSB0aGlzLmNhY2hlLmdldCg1XzAwMCk7XG4gICAgaWYgKHVzYWJsZSkgcmV0dXJuIHVzYWJsZS5qd3Q7XG5cbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoNV8wMDApPy5qd3QgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2lnbmVkLWluIHVzZXIncyBPV04gbGl2ZSBhY2Nlc3MgdG9rZW4gYXQgYSBjb25uZWN0ZWQgcHJvdmlkZXIgKEdvb2dsZSxcbiAgICogR2l0SHViLCDigKYpLCBzbyB0aGUgYXBwIGNhbiBjYWxsIHRoYXQgcHJvdmlkZXIncyBBUEkgZnJvbSB0aGUgYnJvd3Nlci4gTnVsbFxuICAgKiB3aGVuIHRoZXJlIGlzIG5vIHVzYWJsZSB0b2tlbiDigJQgbm8gbGlua2VkIGFjY291bnQsIG9yIHRoZSBwcm92aWRlciBncmFudGVkIC9cbiAgICoga2VwdCBub25lLiBUaGUgc2VydmVyIHJlZnJlc2hlcyBhIHN0YWxlIHRva2VuIG9uIHJlYWQ7IHRoZSByZWZyZXNoIHRva2VuIGlzXG4gICAqIG5ldmVyIGV4cG9zZWQuXG4gICAqL1xuICBnZXRQcm92aWRlclRva2VuKHByb3ZpZGVyOiBzdHJpbmcpOiBQcm9taXNlPFByb3ZpZGVyVG9rZW4gfCBudWxsPiB7XG4gICAgcmV0dXJuIGZldGNoUHJvdmlkZXJUb2tlbih0aGlzLmZhcGlDbGllbnQsIHByb3ZpZGVyKTtcbiAgfVxuXG4gIC8qKiBJbXBlcmF0aXZlIGBoYXMoKWAg4oCUIHRoZSBzYW1lIGV2YWx1YXRpb24gYCphdGxhc1Byb3RlY3RgIHJlbmRlcnMgb24uICovXG4gIGhhcyhjb25kaXRpb246IFByb3RlY3RDb25kaXRpb24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZhbHVhdGUodGhpcy5fY2xhaW1zLnZhbHVlLCBjb25kaXRpb24pLmFsbG93ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV2b2tlIHRoZSBjdXJyZW50IHNlc3Npb24gc2VydmVyLXNpZGUgYW5kIGRyb3AgYWxsIGxvY2FsIGF1dGggc3RhdGUuXG4gICAqXG4gICAqIFRoZSBzZXNzaW9uIGlkIGlzIHJlbWVtYmVyZWQgYmVmb3JlIHRoZSByZXZva2UgKGEgdG9tYnN0b25lIHNoYXJlZCBieSBldmVyeVxuICAgKiB0YWIpLCBzbyBhIHJlbG9hZCwgYSB0b2tlbiByZWZyZXNoLCBhIHNpYmxpbmcgdGFiIG9yIGEgdGFiIG9wZW5lZCBsYXRlciBuZXZlclxuICAgKiByZS1hZG9wdHMgaXQg4oCUIGV2ZW4gd2hlbiB0aGUgcmV2b2tlIGZhaWxlZCAoaXQgaXMgcmV0cmllZCBvbmNlLCB0aGVuIGFnYWluIGluXG4gICAqIHRoZSBiYWNrZ3JvdW5kKSBhbmQgdGhlIHJlZnJlc2ggY29va2llIGlzIHN0aWxsIHZhbGlkLiBSZXNvbHZlc1xuICAgKiBgeyByZXZva2VkLCBhY3RpdmVTZXNzaW9uSWQ/IH1gOyB3aXRoIGB7IHN0cmljdDogdHJ1ZSB9YCBhbiB1bmNvbmZpcm1lZCByZXZva2VcbiAgICogcmVqZWN0cyB3aXRoIGEgYFNpZ25PdXRFcnJvcmAgaW5zdGVhZCAoYWZ0ZXIgdGhlIGxvY2FsIHNpZ24tb3V0KS4gQSBwYXJrZWRcbiAgICogc2Vzc2lvbiB0aGUgc2VydmVyIHByb21vdGVkIG9uIHJldm9rZSBpcyBhZG9wdGVkLiBGcm9udC1jaGFubmVsIGxvZ291dCBydW5zXG4gICAqIHVubGVzcyBgeyBmcm9udGNoYW5uZWw6IGZhbHNlIH1gLlxuICAgKi9cbiAgYXN5bmMgc2lnbk91dChvcHRpb25zOiBTaWduT3V0T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxTaWduT3V0UmVzdWx0PiB7XG4gICAgLy8gV2l0aCBubyBjYWNoZWQgdG9rZW4gdGhlIGd1YXJkIGZpbmRzIHRoZSBjb29raWUgc2Vzc2lvbiBpdHNlbGZcbiAgICAvLyAoR0VUIC92MS9jbGllbnQpLCBzbyBhIG1pc3NpbmcgSldUIG5ldmVyIHNraXBzIHRoZSByZXZva2UuXG4gICAgY29uc3Qgc2Vzc2lvbklkID0gdGhpcy5jYWNoZS5wZWVrKCk/LnNlc3Npb25JZCA/PyB0aGlzLl9zZXNzaW9uLnZhbHVlPy5pZCA/PyBudWxsO1xuICAgIGNvbnN0IGF0dGVtcHQgPSBhd2FpdCB0aGlzLmd1YXJkLnJldm9rZShzZXNzaW9uSWQsIG9wdGlvbnMpO1xuICAgIHRoaXMuY2xlYXJMb2NhbFN0YXRlKCk7XG4gICAgaWYgKHRoaXMuZ3VhcmQucHJvbW90ZWQoYXR0ZW1wdCkpIGF3YWl0IHRoaXMucmVsb2FkKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3VhcmQuc2V0dGxlKGF0dGVtcHQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN3aXRjaCB0aGUgYWN0aXZlIG9yZ2FuaXphdGlvbiAob3IgYG51bGxgIGZvciB0aGUgcGVyc29uYWwgYWNjb3VudCkuIFRoZVxuICAgKiBuZXcgdG9rZW4gY2FycmllcyB0aGUgbmV3IG9yZyBjbGFpbXMsIHNvIHRoZSBhcHAncyBwZXJtaXNzaW9uIGNoZWNrcyB1cGRhdGVcbiAgICogd2l0aG91dCBhIHJlLWxvZ2luLlxuICAgKi9cbiAgYXN5bmMgc2V0QWN0aXZlT3JnYW5pemF0aW9uKG9yZ2FuaXphdGlvbklkOiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghY3VycmVudCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoYC92MS9jbGllbnQvc2Vzc2lvbnMvJHtjdXJyZW50LnNlc3Npb25JZH0vdG91Y2hgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYWN0aXZlX29yZ2FuaXphdGlvbl9pZDogb3JnYW5pemF0aW9uSWQgfSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuO1xuXG4gICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHsgand0OiBzdHJpbmcgfTtcbiAgICB0aGlzLmFwcGx5VG9rZW4oYm9keS5qd3QsIGN1cnJlbnQuc2Vzc2lvbklkKTtcbiAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICB9XG5cbiAgLyoqIFJlLXJlYWQgYC92MS9jbGllbnRgOiByZWZyZXNoIHVzZXIsIHNlc3Npb24sIG1lbWJlcnNoaXBzIGFuZCBzdGF0dXMuICovXG4gIGFzeW5jIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNhbGwoJy92MS9jbGllbnQnKTtcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcignYm9vdCBmYWlsZWQnKTtcblxuICAgICAgY29uc3QgYm9keSA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpIGFzIHtcbiAgICAgICAgc2Vzc2lvbjogQXRsYXNTZXNzaW9uIHwgbnVsbDtcbiAgICAgICAgdXNlcjogQXRsYXNVc2VyIHwgbnVsbDtcbiAgICAgICAgand0Pzogc3RyaW5nO1xuICAgICAgICBvcmdhbml6YXRpb25fbWVtYmVyc2hpcHM/OiBBdGxhc09yZ2FuaXphdGlvbk1lbWJlcnNoaXBbXTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEEgc2Vzc2lvbiB0aGlzIGJyb3dzZXIgc2lnbmVkIG91dCBvZiBpcyBuZXZlciByZS1hZG9wdGVkIGZyb20gdGhlXG4gICAgICAvLyByZWZyZXNoIGNvb2tpZTsgdGhlIGd1YXJkIHJlLXRyaWVzIGl0cyByZXZva2UgaW4gdGhlIGJhY2tncm91bmQuXG4gICAgICBpZiAoIWJvZHkuc2Vzc2lvbiB8fCAhYm9keS51c2VyIHx8IHRoaXMuZ3VhcmQucmVmdXNlKGJvZHkuc2Vzc2lvbi5pZCkpIHtcbiAgICAgICAgdGhpcy5jbGVhckxvY2FsU3RhdGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl91c2VyLm5leHQoYm9keS51c2VyKTtcbiAgICAgIHRoaXMuX3Nlc3Npb24ubmV4dChib2R5LnNlc3Npb24pO1xuICAgICAgdGhpcy5fbWVtYmVyc2hpcHMubmV4dChib2R5Lm9yZ2FuaXphdGlvbl9tZW1iZXJzaGlwcyA/PyBbXSk7XG4gICAgICBpZiAoYm9keS5qd3QpIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uLmlkKTtcbiAgICAgIHRoaXMuX3N0YXR1cy5uZXh0KCdzaWduZWRfaW4nKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBBIGZhaWxlZCBib290IGlzIE5PVCBzaWduZWQtb3V0LiBSZW5kZXJpbmcgYSBzaWduLWluIGZvcm0gYmVjYXVzZSB0aGVcbiAgICAgIC8vIG5ldHdvcmsgaGljY3VwZWQgdGhyb3dzIGF3YXkgYSBwZXJmZWN0bHkgZ29vZCBzZXNzaW9uIGFuZCBmb3JjZXMgYVxuICAgICAgLy8gbmVlZGxlc3MgcmUtYXV0aGVudGljYXRpb24uIE9ubHkgcHJvbW90ZSBsb2FkaW5nIOKGkiBzaWduZWRfb3V0LlxuICAgICAgaWYgKHRoaXMuX3N0YXR1cy52YWx1ZSA9PT0gJ2xvYWRpbmcnKSB0aGlzLl9zdGF0dXMubmV4dCgnc2lnbmVkX291dCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogwqc2LjMgc3RlcCAzOiBjb21wbGV0ZSBhIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4sIHRoZW4gYm9vdC4gQW4gT0F1dGggb3JcbiAgICogaG9zdGVkLXBhZ2UgZmxvdyBsYW5kcyBiYWNrIHdpdGggYSBvbmUtdGltZSB0aWNrZXQgaW4gdGhlIFVSTDsgZXhjaGFuZ2UgaXRcbiAgICogZm9yIGNvb2tpZXMsIHNjcnViIHRoZSBVUkwgc28gYSByZWxvYWQgY2Fubm90IHJlcGxheSBpdCwgVEhFTiByZWFkIHRoZVxuICAgKiBzZXNzaW9uLiBBIHJlZGlyZWN0IGNhcnJ5aW5nIG9ubHkgYSBzdGF0dXMgKGEgc2Vjb25kIGZhY3RvciBpcyBzdGlsbCBvd2VkKVxuICAgKiBoYXMgbm8gdGlja2V0LCBzbyBub3RoaW5nIGlzIGV4Y2hhbmdlZCBhbmQgdGhlIGFwcCBib290cyBzaWduZWQtb3V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBib290KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZyb21VcmwgPSByZWFkUmVkaXJlY3RSZXN1bHQod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgbGV0IHJlc3VsdDogUmVkaXJlY3RSZXN1bHQgfCBudWxsID0gZnJvbVVybDtcblxuICAgIC8vIMKnb2F1dGggcG9wdXAgbW9kZTogdGhpcyBwYWdlIG1heSBiZSB0aGUgbGFuZGluZyBvZiBhIHNpZ24taW4gcG9wdXAgd2hvc2VcbiAgICAvLyBvcGVuZXIgYSBDcm9zcy1PcmlnaW4tT3BlbmVyLVBvbGljeSBzZXZlcmVkIChgI2F0bGFzX3BvcHVwX3Jlc3VsdD3igKZgKS5cbiAgICAvLyBUaGUgcmVzdWx0IGlzIHJlbGF5ZWQgdG8gdGhlIG9wZW5lciwgd2hpY2ggcmVkZWVtcyB0aGUgdGlja2V0LCBhbmQgdGhpc1xuICAgIC8vIHdpbmRvdyBjbG9zZXMuIElmIG5vIG9wZW5lciB0YWtlcyBpdCAoaXRzIHRhYiBpcyBnb25lKSwgZmluaXNoIGhlcmUgbGlrZVxuICAgIC8vIGEgcmVkaXJlY3QuXG4gICAgY29uc3QgbGFuZGluZyA9IGF3YWl0IGNvbXBsZXRlT0F1dGhQb3B1cExhbmRpbmcoKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICBpZiAobGFuZGluZyAmJiAhbGFuZGluZy5kZWxpdmVyZWQpIHtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBtYXBPQXV0aFBvcHVwUGF5bG9hZChsYW5kaW5nLnBheWxvYWQpO1xuICAgICAgaWYgKG91dGNvbWU/LnRpY2tldCAmJiBvdXRjb21lLmF0dGVtcHRJZCkge1xuICAgICAgICByZXN1bHQgPSB7IGF0dGVtcHRJZDogb3V0Y29tZS5hdHRlbXB0SWQsIHRpY2tldDogb3V0Y29tZS50aWNrZXQgfTtcbiAgICAgIH0gZWxzZSBpZiAob3V0Y29tZT8uY29udGludWF0aW9uVXJsKSB7XG4gICAgICAgIC8vIEEgc2Vjb25kIGZhY3RvciAvIGNvbm5lY3Qgc3RlcCAvIHByb3ZpZGVyIGVycm9yOiB0aGUgcmVkaXJlY3QgZmxvdydzIHBhZ2UuXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKG91dGNvbWUuY29udGludWF0aW9uVXJsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBleGNoYW5nZWQgPSBmYWxzZTtcbiAgICBpZiAocmVzdWx0Py50aWNrZXQpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jYWxsKCcvdjEvY2xpZW50L3RpY2tldHMvZXhjaGFuZ2UnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGF0dGVtcHRfaWQ6IHJlc3VsdC5hdHRlbXB0SWQsIHRpY2tldDogcmVzdWx0LnRpY2tldCB9KSxcbiAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICBleGNoYW5nZWQgPSAhIXJlc3BvbnNlPy5vaztcbiAgICB9XG4gICAgaWYgKGZyb21VcmwpIHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7fSwgZG9jdW1lbnQudGl0bGUsIHN0cmlwUmVkaXJlY3RQYXJhbXMod2luZG93LmxvY2F0aW9uLmhyZWYpKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5yZWxvYWQoKTtcbiAgICAvLyBTaWduZWQgaW4gaW5zaWRlIHRoZSBBdGxhcyBwb3B1cCAodGhlIHJlZGlyZWN0IGZsb3cgcmFuIGluIGl0KTogaGFuZCBiYWNrXG4gICAgLy8gdG8gdGhlIHdhaXRpbmcgb3BlbmVyIGFuZCBjbG9zZS4gQSBuby1vcCBpbiBhbiBvcmRpbmFyeSB0YWIuXG4gICAgaWYgKGV4Y2hhbmdlZCkgdm9pZCBjbG9zZU9BdXRoUG9wdXBBZnRlclNpZ25JbigpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWFkUGVuZGluZ0F0dGVtcHQoKTogeyBpZDogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9IHwgbnVsbCB7XG4gICAgY29uc3QgcmVzdWx0ID0gcmVhZFJlZGlyZWN0UmVzdWx0KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICAgIHJldHVybiByZXN1bHQ/LnN0YXR1cyAmJiAhcmVzdWx0LnRpY2tldFxuICAgICAgPyB7IGlkOiByZXN1bHQuYXR0ZW1wdElkLCBzdGF0dXM6IHJlc3VsdC5zdGF0dXMgfVxuICAgICAgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxsKHBhdGg6IHN0cmluZywgaW5pdD86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmRvRmV0Y2goYCR7dGhpcy5iYXNlVXJsfSR7cGF0aH1gLCB7XG4gICAgICAuLi5pbml0LFxuICAgICAgLy8gQ29va2llcyBjYXJyeSB0aGUgc2Vzc2lvbjsgYSByZXF1ZXN0IHdpdGhvdXQgdGhpcyBpcyBpbmRpc3Rpbmd1aXNoYWJsZVxuICAgICAgLy8gZnJvbSBiZWluZyBzaWduZWQgb3V0LlxuICAgICAgY3JlZGVudGlhbHM6ICdpbmNsdWRlJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ3gtcHVibGlzaGFibGUta2V5JzogdGhpcy5wdWJsaXNoYWJsZUtleSxcbiAgICAgICAgLi4uKGluaXQ/LmJvZHkgPyB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSA6IHt9KSxcbiAgICAgICAgLi4uaW5pdD8uaGVhZGVycyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5VG9rZW4oand0OiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQW4gaW4tZmxpZ2h0IHJlZnJlc2ggbXVzdCBub3QgcmVzdXJyZWN0IGEgc2Vzc2lvbiBzaWduZWQgb3V0IG1lYW53aGlsZS5cbiAgICBpZiAodGhpcy5ndWFyZC5pc1NpZ25lZE91dChzZXNzaW9uSWQpKSByZXR1cm47XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gcmVhZEV4cGlyeShqd3QpO1xuICAgIGlmICghZXhwaXJlc0F0KSByZXR1cm47XG5cbiAgICB0aGlzLmNhY2hlLnNldCh7IGp3dCwgZXhwaXJlc0F0LCBzZXNzaW9uSWQgfSk7XG4gICAgdGhpcy5fY2xhaW1zLm5leHQoZGVjb2RlQ2xhaW1zKGp3dCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmNhY2hlLnBlZWsoKTtcbiAgICBpZiAoIWN1cnJlbnQpIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2FsbChgL3YxL2NsaWVudC9zZXNzaW9ucy8ke2N1cnJlbnQuc2Vzc2lvbklkfS90b2tlbnNgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ3JlZnJlc2ggZmFpbGVkJyk7XG5cbiAgICAgIGNvbnN0IGJvZHkgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKSBhcyB7IGp3dDogc3RyaW5nOyBzZXNzaW9uX2lkOiBzdHJpbmcgfTtcbiAgICAgIHRoaXMuYXBwbHlUb2tlbihib2R5Lmp3dCwgYm9keS5zZXNzaW9uX2lkKTtcbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBUaGUgc2Vzc2lvbiBtYXkgZ2VudWluZWx5IGJlIGdvbmUuIFJlLWJvb3QgcmF0aGVyIHRoYW4gZ3Vlc3MuXG4gICAgICBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJMb2NhbFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJSZWZyZXNoVGltZXIoKTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fc3RhdHVzLm5leHQoJ3NpZ25lZF9vdXQnKTtcbiAgICB0aGlzLl91c2VyLm5leHQobnVsbCk7XG4gICAgdGhpcy5fc2Vzc2lvbi5uZXh0KG51bGwpO1xuICAgIHRoaXMuX2NsYWltcy5uZXh0KG51bGwpO1xuICAgIHRoaXMuX21lbWJlcnNoaXBzLm5leHQoW10pO1xuICB9XG5cbiAgLyoqIMKnNy40OiBwcm9hY3RpdmUsIGppdHRlcmVkIHJlZnJlc2ggc2NoZWR1bGVkIGZyb20gdGhlIHRva2VuJ3Mgb3duIGV4cGlyeS4gKi9cbiAgcHJpdmF0ZSBzY2hlZHVsZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhclJlZnJlc2hUaW1lcigpO1xuICAgIGlmICh0aGlzLl9zdGF0dXMudmFsdWUgIT09ICdzaWduZWRfaW4nKSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlbiA9IHRoaXMuY2FjaGUucGVlaygpO1xuICAgIGlmICghdG9rZW4pIHJldHVybjtcblxuICAgIGNvbnN0IGRlbGF5ID0gbXNVbnRpbFJlZnJlc2goeyB0b2tlbiwgbm93OiBEYXRlLm5vdygpIH0pO1xuICAgIHRoaXMucmVmcmVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucmVmcmVzaCgpLCBkZWxheSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVmcmVzaFRpbWVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlZnJlc2hUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVmcmVzaFRpbWVyKTtcbiAgICAgIHRoaXMucmVmcmVzaFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlY29kZSBhIEpXVCBwYXlsb2FkIHdpdGhvdXQgdmVyaWZ5aW5nIGl0IOKAlCBhIHNjaGVkdWxpbmcvVUkgaGludCBvbmx5LiAqL1xuZnVuY3Rpb24gZGVjb2RlQ2xhaW1zKGp3dDogc3RyaW5nKTogU2Vzc2lvbkNsYWltcyB8IG51bGwge1xuICBjb25zdCBwYXJ0cyA9IGp3dC5zcGxpdCgnLicpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gbnVsbDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgIGF0b2IocGFydHNbMV0hLnJlcGxhY2UoLy0vZywgJysnKS5yZXBsYWNlKC9fL2csICcvJykpLFxuICAgICkgYXMgU2Vzc2lvbkNsYWltcztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiJdfQ==
@@ -27,8 +27,18 @@ export class AttemptFlowComponent {
27
27
  * with `needs_captcha`. Null when the flow draws none.
28
28
  */
29
29
  captcha = null;
30
+ /**
31
+ * The first factors to offer on the `needs_first_factor` step — pass
32
+ * `AtlasFlowController.firstFactors()`, which drops email code / link while the
33
+ * app cannot deliver email. Null uses the server's list as-is.
34
+ */
35
+ firstFactors = null;
36
+ /** The first factor already sent (`AtlasFlowController.preparedFactor()`): its code is collected. */
37
+ preparedFactor = null;
30
38
  /** Emits the collected field values when the form is submitted. */
31
39
  submitFlow = new EventEmitter();
40
+ /** Emits when the user picks a first factor the server must send first (an emailed code). */
41
+ chooseFactor = new EventEmitter();
32
42
  values = {};
33
43
  t(key, vars) {
34
44
  return translate(this.atlas.localization, key, vars);
@@ -56,8 +66,22 @@ export class AttemptFlowComponent {
56
66
  const kind = this.step().kind;
57
67
  return !!this.captcha && (kind === 'collect_identifier' || kind === 'collect_captcha');
58
68
  }
69
+ /** The first factors on offer at a `needs_first_factor` step (empty on any other). */
70
+ offered() {
71
+ const step = this.step();
72
+ if (step.kind !== 'collect_first_factor')
73
+ return [];
74
+ return this.firstFactors ?? step.strategies;
75
+ }
76
+ showEmailCodeOption() {
77
+ return this.preparedFactor !== 'email_code' && this.offered().includes('email_code');
78
+ }
59
79
  showSubmit() {
60
80
  const kind = this.step().kind;
81
+ // Nothing to submit on a first-factor step that only offers an emailed code
82
+ // until that code is sent.
83
+ if (kind === 'collect_first_factor')
84
+ return this.fields().length > 0;
61
85
  return kind !== 'done' && kind !== 'await_oauth';
62
86
  }
63
87
  fields() {
@@ -65,8 +89,17 @@ export class AttemptFlowComponent {
65
89
  switch (step.kind) {
66
90
  case 'collect_identifier':
67
91
  return [{ kind: 'input', name: 'identifier', labelKey: 'signIn.identifierLabel', type: 'email' }];
68
- case 'collect_first_factor':
69
- return [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];
92
+ case 'collect_first_factor': {
93
+ if (this.preparedFactor === 'email_code') {
94
+ return [{ kind: 'input', name: 'code', labelKey: 'signIn.emailCodeLabel', type: 'text' }];
95
+ }
96
+ // The password field unless the only offer is an emailed code (chosen
97
+ // with the button below the form).
98
+ const offered = this.offered();
99
+ return offered.includes('email_code') && !offered.includes('password')
100
+ ? []
101
+ : [{ kind: 'input', name: 'password', labelKey: 'signIn.passwordLabel', type: 'password' }];
102
+ }
70
103
  case 'collect_second_factor':
71
104
  return [{ kind: 'input', name: 'code', labelKey: 'mfa.codeLabel', type: 'text' }];
72
105
  case 'enroll_second_factor':
@@ -97,7 +130,7 @@ export class AttemptFlowComponent {
97
130
  }
98
131
  }
99
132
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttemptFlowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
100
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", titleKey: "titleKey", captcha: "captcha" }, outputs: { submitFlow: "submitFlow" }, ngImport: i0, template: `
133
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AttemptFlowComponent, isStandalone: true, selector: "atlas-attempt-flow", inputs: { attempt: "attempt", busy: "busy", errors: "errors", titleKey: "titleKey", captcha: "captcha", firstFactors: "firstFactors", preparedFactor: "preparedFactor" }, outputs: { submitFlow: "submitFlow", chooseFactor: "chooseFactor" }, ngImport: i0, template: `
101
134
  <div [class]="cls('card', 'atlas-card')">
102
135
  <h1 [class]="cls('headerTitle', 'atlas-title')">{{ t(titleKey) }}</h1>
103
136
 
@@ -135,6 +168,17 @@ export class AttemptFlowComponent {
135
168
  {{ t('signIn.submit') }}
136
169
  </button>
137
170
  }
171
+
172
+ @if (showEmailCodeOption()) {
173
+ <button
174
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
175
+ [disabled]="busy"
176
+ type="button"
177
+ (click)="chooseFactor.emit('email_code')"
178
+ >
179
+ {{ t('signIn.useEmailCode') }}
180
+ </button>
181
+ }
138
182
  </form>
139
183
  </div>
140
184
  `, isInline: true, dependencies: [{ kind: "directive", type: AtlasCaptchaSlotDirective, selector: "[atlasCaptchaSlot]", inputs: ["atlasCaptchaSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -184,6 +228,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
184
228
  {{ t('signIn.submit') }}
185
229
  </button>
186
230
  }
231
+
232
+ @if (showEmailCodeOption()) {
233
+ <button
234
+ [class]="cls('formButtonSecondary', 'atlas-button-secondary')"
235
+ [disabled]="busy"
236
+ type="button"
237
+ (click)="chooseFactor.emit('email_code')"
238
+ >
239
+ {{ t('signIn.useEmailCode') }}
240
+ </button>
241
+ }
187
242
  </form>
188
243
  </div>
189
244
  `,
@@ -198,11 +253,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
198
253
  type: Input
199
254
  }], captcha: [{
200
255
  type: Input
256
+ }], firstFactors: [{
257
+ type: Input
258
+ }], preparedFactor: [{
259
+ type: Input
201
260
  }], submitFlow: [{
202
261
  type: Output
262
+ }], chooseFactor: [{
263
+ type: Output
203
264
  }] } });
204
265
  /** A read-only message row: `labelKey` holds the i18n key of the text to show. */
205
266
  function msg(labelKey) {
206
267
  return { kind: 'message', name: '', labelKey, type: 'text' };
207
268
  }
208
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUE2RCxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFlcEM7Ozs7Ozs7OztHQVNHO0FBZ0RILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLE9BQU8sR0FBdUIsSUFBSSxDQUFDO0lBQ25DLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQUcsY0FBYyxDQUFDO0lBQ25DOzs7O09BSUc7SUFDTSxPQUFPLEdBQTZCLElBQUksQ0FBQztJQUVsRCxtRUFBbUU7SUFDekQsVUFBVSxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO0lBRXhELE1BQU0sR0FBMkIsRUFBRSxDQUFDO0lBRXBDLENBQUMsQ0FBQyxHQUFXLEVBQUUsSUFBNkI7UUFDcEQsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFUyxHQUFHLENB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdDVDtpQkFDRjs4QkFJVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQU1HLE9BQU87c0JBQWYsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNOztBQWlGVCxrRkFBa0Y7QUFDbEYsU0FBUyxHQUFHLENBQUMsUUFBZ0I7SUFDM0IsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBuZXh0U3RlcCwgdHlwZSBBdHRlbXB0VmlldywgdHlwZSBDYXB0Y2hhQ29udHJvbGxlciwgdHlwZSBGaWVsZEVycm9yIH0gZnJvbSAnQGF0bGFzYXV0aC9qcyc7XG5pbXBvcnQgeyBBdGxhc1NlcnZpY2UgfSBmcm9tICcuLi9hdGxhcy5zZXJ2aWNlJztcbmltcG9ydCB7IEF0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL2NhcHRjaGEtc2xvdC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgY2xhc3NGb3IsIHR5cGUgRWxlbWVudEtleSB9IGZyb20gJy4uL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgdHJhbnNsYXRlIH0gZnJvbSAnLi4vaTE4bic7XG5cbi8qKlxuICogT25lIHJlbmRlcmVkIHJvdyBvZiB0aGUgZmxvdy4gQSB1bmlmb3JtIHNoYXBlIChyYXRoZXIgdGhhbiBhIGRpc2NyaW1pbmF0ZWRcbiAqIHVuaW9uKSBzbyB0aGUgdGVtcGxhdGUgYWNjZXNzZXMgb25seSBmaWVsZHMgdGhhdCBhbHdheXMgZXhpc3Qg4oCUIG5vIHJlbGlhbmNlIG9uXG4gKiB0ZW1wbGF0ZSBjb250cm9sLWZsb3cgbmFycm93aW5nIG9mIGEgbG9vcCB2YXJpYWJsZSwgd2hpY2ggdmFyaWVzIGJ5IEFuZ3VsYXJcbiAqIG1pbm9yLiBGb3IgYSBgbWVzc2FnZWAgcm93LCBgbGFiZWxLZXlgIGNhcnJpZXMgdGhlIG1lc3NhZ2UncyBpMThuIGtleS5cbiAqL1xuaW50ZXJmYWNlIFN0ZXBGaWVsZCB7XG4gIGtpbmQ6ICdpbnB1dCcgfCAnbWVzc2FnZSc7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWxLZXk6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZXItZHJpdmVuIGZsb3cgc2hlbGwsIHNoYXJlZCBieSBgPGF0bGFzLXNpZ24taW4+YCBhbmRcbiAqIGA8YXRsYXMtc2lnbi11cD5gLiBUaGUgQW5ndWxhciBwZWVyIG9mIFJlYWN0J3MgaW50ZXJuYWwgYEF0dGVtcHRGbG93YC5cbiAqXG4gKiBJdCBjb250YWlucyBOTyBkZWNpc2lvbiBhYm91dCB3aGF0IGNvbWVzIG5leHQ6IGl0IHJlbmRlcnMgd2hhdGV2ZXIgYHN0YXR1c2BcbiAqIHRoZSBzZXJ2ZXIgcmV0dXJuZWQsIG1hcHBlZCB0aHJvdWdoIGBuZXh0U3RlcGAgZnJvbSBgQGF0bGFzYXV0aC9qc2AgKHRoZSBzYW1lXG4gKiBleGhhdXN0aXZlIG1hcHBpbmcgdGhlIFJlYWN0IFNESyB1c2VzKSwgc28gYWRkaW5nIGEgc3RlcCBpcyBhIHNlcnZlciBjaGFuZ2VcbiAqIGFuZCBhbiBvdXQtb2YtZGF0ZSBjbGllbnQgZGVncmFkZXMgdG8gYSB2aXNpYmxlIFwicGxlYXNlIHVwZGF0ZVwiIG1lc3NhZ2UgcmF0aGVyXG4gKiB0aGFuIGEgYmxhbmsgc2NyZWVuLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhdGxhcy1hdHRlbXB0LWZsb3cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0F0bGFzQ2FwdGNoYVNsb3REaXJlY3RpdmVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNscygnY2FyZCcsICdhdGxhcy1jYXJkJylcIj5cbiAgICAgIDxoMSBbY2xhc3NdPVwiY2xzKCdoZWFkZXJUaXRsZScsICdhdGxhcy10aXRsZScpXCI+e3sgdCh0aXRsZUtleSkgfX08L2gxPlxuXG4gICAgICBAZm9yIChlcnJvciBvZiBmb3JtRXJyb3JzKCk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgPHAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiIHJvbGU9XCJhbGVydFwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3A+XG4gICAgICB9XG5cbiAgICAgIDxmb3JtIChzdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAZm9yIChmIG9mIGZpZWxkcygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICBAaWYgKGYua2luZCA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYXRsYXMtZmllbGRcIj5cbiAgICAgICAgICAgICAgPHNwYW4+e3sgdChmLmxhYmVsS2V5KSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUZpZWxkSW5wdXQnLCAnYXRsYXMtaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgW3R5cGVdPVwiZi50eXBlXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5uYW1lXT1cImYubmFtZVwiXG4gICAgICAgICAgICAgICAgW3ZhbHVlXT1cInZhbHVlc1tmLm5hbWVdID8/ICcnXCJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwic2V0VmFsdWUoZi5uYW1lLCAkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIEBmb3IgKGVycm9yIG9mIGZpZWxkRXJyb3JzRm9yKGYubmFtZSk7IHRyYWNrIGVycm9yLmNvZGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY2xzKCdmb3JtRmllbGRFcnJvcicsICdhdGxhcy1lcnJvcicpXCI+e3sgZXJyb3IubWVzc2FnZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxwPnt7IHQoZi5sYWJlbEtleSkgfX08L3A+XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93Q2FwdGNoYSgpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImF0bGFzLWNhcHRjaGFcIiBkYXRhLWF0bGFzLWNhcHRjaGE9XCJcIiBbYXRsYXNDYXB0Y2hhU2xvdF09XCJjYXB0Y2hhXCI+PC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dTdWJtaXQoKSkge1xuICAgICAgICAgIDxidXR0b24gW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblByaW1hcnknLCAnYXRsYXMtYnV0dG9uJylcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIHR5cGU9XCJzdWJtaXRcIj5cbiAgICAgICAgICAgIHt7IHQoJ3NpZ25Jbi5zdWJtaXQnKSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9XG4gICAgICA8L2Zvcm0+XG4gICAgPC9kaXY+XG4gIGAsXG59KVxuZXhwb3J0IGNsYXNzIEF0dGVtcHRGbG93Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhdGxhcyA9IGluamVjdChBdGxhc1NlcnZpY2UpO1xuXG4gIEBJbnB1dCgpIGF0dGVtcHQ6IEF0dGVtcHRWaWV3IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGJ1c3kgPSBmYWxzZTtcbiAgQElucHV0KCkgZXJyb3JzOiBGaWVsZEVycm9yW10gPSBbXTtcbiAgQElucHV0KCkgdGl0bGVLZXkgPSAnc2lnbkluLnRpdGxlJztcbiAgLyoqXG4gICAqIFRoZSBzaWduLWluIGNhcHRjaGEsIGRyYXduIGFib3ZlIHRoZSBzdWJtaXQgYnV0dG9uIG9uIHRoZSBpZGVudGlmaWVyIHN0ZXBcbiAgICogKGFuIGFsd2F5cy1vbiBzaWduLWluIGNhcHRjaGEpIGFuZCBvbiB0aGUgY2hhbGxlbmdlIHN0ZXAgdGhlIHNlcnZlciBkZW1hbmRzXG4gICAqIHdpdGggYG5lZWRzX2NhcHRjaGFgLiBOdWxsIHdoZW4gdGhlIGZsb3cgZHJhd3Mgbm9uZS5cbiAgICovXG4gIEBJbnB1dCgpIGNhcHRjaGE6IENhcHRjaGFDb250cm9sbGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHRoZSBjb2xsZWN0ZWQgZmllbGQgdmFsdWVzIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLiAqL1xuICBAT3V0cHV0KCkgc3VibWl0RmxvdyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc3VibWl0Rmxvdy5lbWl0KHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtRXJyb3JzKCk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+ICFlcnJvci5wYXJhbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRFcnJvcnNGb3IobmFtZTogc3RyaW5nKTogRmllbGRFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGFyYW0gPT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLmF0dGVtcHQgPyBuZXh0U3RlcCh0aGlzLmF0dGVtcHQpIDogKHsga2luZDogJ2NvbGxlY3RfaWRlbnRpZmllcicgfSBhcyBjb25zdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcHRjaGEoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgcmV0dXJuICEhdGhpcy5jYXB0Y2hhICYmIChraW5kID09PSAnY29sbGVjdF9pZGVudGlmaWVyJyB8fCBraW5kID09PSAnY29sbGVjdF9jYXB0Y2hhJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd1N1Ym1pdCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBraW5kID0gdGhpcy5zdGVwKCkua2luZDtcbiAgICByZXR1cm4ga2luZCAhPT0gJ2RvbmUnICYmIGtpbmQgIT09ICdhd2FpdF9vYXV0aCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFN0ZXBGaWVsZFtdIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwKCk7XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfaWRlbnRpZmllcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnaWRlbnRpZmllcicsIGxhYmVsS2V5OiAnc2lnbkluLmlkZW50aWZpZXJMYWJlbCcsIHR5cGU6ICdlbWFpbCcgfV07XG4gICAgICBjYXNlICdjb2xsZWN0X2ZpcnN0X2ZhY3Rvcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3NpZ25Jbi5wYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9XTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rfc2Vjb25kX2ZhY3Rvcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnbWZhLmNvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9XTtcbiAgICAgIGNhc2UgJ2Vucm9sbF9zZWNvbmRfZmFjdG9yJzpcbiAgICAgICAgLy8gVHdvIGNvbnNlY3V0aXZlIGNvZGVzICjCpzUuNik6IGEgcGhvbmUgd2l0aCBhIGZhc3QgY2xvY2sgZmFpbHMgaGVyZVxuICAgICAgICAvLyByYXRoZXIgdGhhbiBvbiBldmVyeSBzaWduLWluIGFmdGVyd2FyZHMuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnbWZhLmVucm9sbEZpcnN0Q29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH0sXG4gICAgICAgICAgeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnc2Vjb25kQ29kZScsIGxhYmVsS2V5OiAnbWZhLmVucm9sbFNlY29uZENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICBdO1xuICAgICAgY2FzZSAnY29sbGVjdF9lbWFpbF9jb2RlJzpcbiAgICAgICAgcmV0dXJuIFt7IGtpbmQ6ICdpbnB1dCcsIG5hbWU6ICdjb2RlJywgbGFiZWxLZXk6ICdzaWduSW4uZW1haWxDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICBjYXNlICdjb2xsZWN0X25ld19wYXNzd29yZCc6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAncGFzc3dvcmQnLCBsYWJlbEtleTogJ3Jlc2V0Lm5ld1Bhc3N3b3JkTGFiZWwnLCB0eXBlOiAncGFzc3dvcmQnIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9jYXB0Y2hhJzpcbiAgICAgICAgLy8gwqc1IHRoZSBzZXJ2ZXIgd2l0aGhlbGQgdGhlIGF0dGVtcHQgdW50aWwgYSBjYXB0Y2hhIGNsZWFycy4gU29sdmluZyB0aGVcbiAgICAgICAgLy8gd2lkZ2V0IHJlc3VibWl0cyB0aGUgaWRlbnRpZmllciBvbiBpdHMgb3duOyB0aGUgYnV0dG9uIHJldHJpZXMuXG4gICAgICAgIHJldHVybiBbbXNnKCdjYXB0Y2hhLnByb21wdCcpXTtcbiAgICAgIGNhc2UgJ2F3YWl0X29hdXRoJzpcbiAgICAgICAgcmV0dXJuIFttc2coJ3NpZ25Jbi5tYWdpY0xpbmtTZW50JyldO1xuICAgICAgY2FzZSAnZG9uZSc6XG4gICAgICAgIHJldHVybiBbbXNnKCdzaWduSW4uY2hlY2tPdGhlclRhYicpXTtcbiAgICAgIGNhc2UgJ3Jlc3RhcnQnOlxuICAgICAgICByZXR1cm4gW21zZygnZXJyb3IuZ2VuZXJpYycpXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEEgc3RhdHVzIHRoaXMgU0RLIHZlcnNpb24gZG9lcyBub3Qga25vdy4gQW4gaG9uZXN0IG1lc3NhZ2UgYmVhdHMgYVxuICAgICAgICAvLyBibGFuayBsb2dpbiBib3ggdGhlIHVzZXIgY2Fubm90IGFjdCBvbi5cbiAgICAgICAgcmV0dXJuIFttc2coJ2Vycm9yLmdlbmVyaWMnKV07XG4gICAgfVxuICB9XG59XG5cbi8qKiBBIHJlYWQtb25seSBtZXNzYWdlIHJvdzogYGxhYmVsS2V5YCBob2xkcyB0aGUgaTE4biBrZXkgb2YgdGhlIHRleHQgdG8gc2hvdy4gKi9cbmZ1bmN0aW9uIG1zZyhsYWJlbEtleTogc3RyaW5nKTogU3RlcEZpZWxkIHtcbiAgcmV0dXJuIHsga2luZDogJ21lc3NhZ2UnLCBuYW1lOiAnJywgbGFiZWxLZXksIHR5cGU6ICd0ZXh0JyB9O1xufVxuIl19
269
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0ZW1wdC1mbG93LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9hdHRlbXB0LWZsb3cuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUE2RCxNQUFNLGVBQWUsQ0FBQztBQUNwRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBbUIsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFlcEM7Ozs7Ozs7OztHQVNHO0FBMkRILE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxLQUFLLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBRXJDLE9BQU8sR0FBdUIsSUFBSSxDQUFDO0lBQ25DLElBQUksR0FBRyxLQUFLLENBQUM7SUFDYixNQUFNLEdBQWlCLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQUcsY0FBYyxDQUFDO0lBQ25DOzs7O09BSUc7SUFDTSxPQUFPLEdBQTZCLElBQUksQ0FBQztJQUNsRDs7OztPQUlHO0lBQ00sWUFBWSxHQUFvQixJQUFJLENBQUM7SUFDOUMscUdBQXFHO0lBQzVGLGNBQWMsR0FBa0IsSUFBSSxDQUFDO0lBRTlDLG1FQUFtRTtJQUN6RCxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7SUFDbEUsNkZBQTZGO0lBQ25GLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBZ0IsQ0FBQztJQUVoRCxNQUFNLEdBQTJCLEVBQUUsQ0FBQztJ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Qyx5QkFBeUIsQ0FBQztvQkFDcEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRFQ7aUJBQ0Y7OEJBSVUsT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxPQUFPO3NCQUFmLEtBQUs7Z0JBTUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUdJLFVBQVU7c0JBQW5CLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTs7QUF3R1Qsa0ZBQWtGO0FBQ2xGLFNBQVMsR0FBRyxDQUFDLFFBQWdCO0lBQzNCLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgbmV4dFN0ZXAsIHR5cGUgQXR0ZW1wdFZpZXcsIHR5cGUgQ2FwdGNoYUNvbnRyb2xsZXIsIHR5cGUgRmllbGRFcnJvciB9IGZyb20gJ0BhdGxhc2F1dGgvanMnO1xuaW1wb3J0IHsgQXRsYXNTZXJ2aWNlIH0gZnJvbSAnLi4vYXRsYXMuc2VydmljZSc7XG5pbXBvcnQgeyBBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9jYXB0Y2hhLXNsb3QuZGlyZWN0aXZlJztcbmltcG9ydCB7IGNsYXNzRm9yLCB0eXBlIEVsZW1lbnRLZXkgfSBmcm9tICcuLi9hcHBlYXJhbmNlJztcbmltcG9ydCB7IHRyYW5zbGF0ZSB9IGZyb20gJy4uL2kxOG4nO1xuXG4vKipcbiAqIE9uZSByZW5kZXJlZCByb3cgb2YgdGhlIGZsb3cuIEEgdW5pZm9ybSBzaGFwZSAocmF0aGVyIHRoYW4gYSBkaXNjcmltaW5hdGVkXG4gKiB1bmlvbikgc28gdGhlIHRlbXBsYXRlIGFjY2Vzc2VzIG9ubHkgZmllbGRzIHRoYXQgYWx3YXlzIGV4aXN0IOKAlCBubyByZWxpYW5jZSBvblxuICogdGVtcGxhdGUgY29udHJvbC1mbG93IG5hcnJvd2luZyBvZiBhIGxvb3AgdmFyaWFibGUsIHdoaWNoIHZhcmllcyBieSBBbmd1bGFyXG4gKiBtaW5vci4gRm9yIGEgYG1lc3NhZ2VgIHJvdywgYGxhYmVsS2V5YCBjYXJyaWVzIHRoZSBtZXNzYWdlJ3MgaTE4biBrZXkuXG4gKi9cbmludGVyZmFjZSBTdGVwRmllbGQge1xuICBraW5kOiAnaW5wdXQnIHwgJ21lc3NhZ2UnO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxhYmVsS2V5OiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVyLWRyaXZlbiBmbG93IHNoZWxsLCBzaGFyZWQgYnkgYDxhdGxhcy1zaWduLWluPmAgYW5kXG4gKiBgPGF0bGFzLXNpZ24tdXA+YC4gVGhlIEFuZ3VsYXIgcGVlciBvZiBSZWFjdCdzIGludGVybmFsIGBBdHRlbXB0Rmxvd2AuXG4gKlxuICogSXQgY29udGFpbnMgTk8gZGVjaXNpb24gYWJvdXQgd2hhdCBjb21lcyBuZXh0OiBpdCByZW5kZXJzIHdoYXRldmVyIGBzdGF0dXNgXG4gKiB0aGUgc2VydmVyIHJldHVybmVkLCBtYXBwZWQgdGhyb3VnaCBgbmV4dFN0ZXBgIGZyb20gYEBhdGxhc2F1dGgvanNgICh0aGUgc2FtZVxuICogZXhoYXVzdGl2ZSBtYXBwaW5nIHRoZSBSZWFjdCBTREsgdXNlcyksIHNvIGFkZGluZyBhIHN0ZXAgaXMgYSBzZXJ2ZXIgY2hhbmdlXG4gKiBhbmQgYW4gb3V0LW9mLWRhdGUgY2xpZW50IGRlZ3JhZGVzIHRvIGEgdmlzaWJsZSBcInBsZWFzZSB1cGRhdGVcIiBtZXNzYWdlIHJhdGhlclxuICogdGhhbiBhIGJsYW5rIHNjcmVlbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXRsYXMtYXR0ZW1wdC1mbG93JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtBdGxhc0NhcHRjaGFTbG90RGlyZWN0aXZlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzc109XCJjbHMoJ2NhcmQnLCAnYXRsYXMtY2FyZCcpXCI+XG4gICAgICA8aDEgW2NsYXNzXT1cImNscygnaGVhZGVyVGl0bGUnLCAnYXRsYXMtdGl0bGUnKVwiPnt7IHQodGl0bGVLZXkpIH19PC9oMT5cblxuICAgICAgQGZvciAoZXJyb3Igb2YgZm9ybUVycm9ycygpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgIDxwIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZEVycm9yJywgJ2F0bGFzLWVycm9yJylcIiByb2xlPVwiYWxlcnRcIj57eyBlcnJvci5tZXNzYWdlIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8Zm9ybSAoc3VibWl0KT1cIm9uU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGZvciAoZiBvZiBmaWVsZHMoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgQGlmIChmLmtpbmQgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImF0bGFzLWZpZWxkXCI+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHQoZi5sYWJlbEtleSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjbHMoJ2Zvcm1GaWVsZElucHV0JywgJ2F0bGFzLWlucHV0JylcIlxuICAgICAgICAgICAgICAgIFt0eXBlXT1cImYudHlwZVwiXG4gICAgICAgICAgICAgICAgW2F0dHIubmFtZV09XCJmLm5hbWVcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZXNbZi5uYW1lXSA/PyAnJ1wiXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cInNldFZhbHVlKGYubmFtZSwgJGFueSgkZXZlbnQudGFyZ2V0KS52YWx1ZSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICBAZm9yIChlcnJvciBvZiBmaWVsZEVycm9yc0ZvcihmLm5hbWUpOyB0cmFjayBlcnJvci5jb2RlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImNscygnZm9ybUZpZWxkRXJyb3InLCAnYXRsYXMtZXJyb3InKVwiPnt7IGVycm9yLm1lc3NhZ2UgfX08L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8cD57eyB0KGYubGFiZWxLZXkpIH19PC9wPlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0NhcHRjaGEoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhdGxhcy1jYXB0Y2hhXCIgZGF0YS1hdGxhcy1jYXB0Y2hhPVwiXCIgW2F0bGFzQ2FwdGNoYVNsb3RdPVwiY2FwdGNoYVwiPjwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93U3VibWl0KCkpIHtcbiAgICAgICAgICA8YnV0dG9uIFtjbGFzc109XCJjbHMoJ2Zvcm1CdXR0b25QcmltYXJ5JywgJ2F0bGFzLWJ1dHRvbicpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIiB0eXBlPVwic3VibWl0XCI+XG4gICAgICAgICAgICB7eyB0KCdzaWduSW4uc3VibWl0JykgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoc2hvd0VtYWlsQ29kZU9wdGlvbigpKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW2NsYXNzXT1cImNscygnZm9ybUJ1dHRvblNlY29uZGFyeScsICdhdGxhcy1idXR0b24tc2Vjb25kYXJ5JylcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3lcIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2hvb3NlRmFjdG9yLmVtaXQoJ2VtYWlsX2NvZGUnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgdCgnc2lnbkluLnVzZUVtYWlsQ29kZScpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQXR0ZW1wdEZsb3dDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGF0bGFzID0gaW5qZWN0KEF0bGFzU2VydmljZSk7XG5cbiAgQElucHV0KCkgYXR0ZW1wdDogQXR0ZW1wdFZpZXcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgYnVzeSA9IGZhbHNlO1xuICBASW5wdXQoKSBlcnJvcnM6IEZpZWxkRXJyb3JbXSA9IFtdO1xuICBASW5wdXQoKSB0aXRsZUtleSA9ICdzaWduSW4udGl0bGUnO1xuICAvKipcbiAgICogVGhlIHNpZ24taW4gY2FwdGNoYSwgZHJhd24gYWJvdmUgdGhlIHN1Ym1pdCBidXR0b24gb24gdGhlIGlkZW50aWZpZXIgc3RlcFxuICAgKiAoYW4gYWx3YXlzLW9uIHNpZ24taW4gY2FwdGNoYSkgYW5kIG9uIHRoZSBjaGFsbGVuZ2Ugc3RlcCB0aGUgc2VydmVyIGRlbWFuZHNcbiAgICogd2l0aCBgbmVlZHNfY2FwdGNoYWAuIE51bGwgd2hlbiB0aGUgZmxvdyBkcmF3cyBub25lLlxuICAgKi9cbiAgQElucHV0KCkgY2FwdGNoYTogQ2FwdGNoYUNvbnRyb2xsZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBmYWN0b3JzIHRvIG9mZmVyIG9uIHRoZSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIOKAlCBwYXNzXG4gICAqIGBBdGxhc0Zsb3dDb250cm9sbGVyLmZpcnN0RmFjdG9ycygpYCwgd2hpY2ggZHJvcHMgZW1haWwgY29kZSAvIGxpbmsgd2hpbGUgdGhlXG4gICAqIGFwcCBjYW5ub3QgZGVsaXZlciBlbWFpbC4gTnVsbCB1c2VzIHRoZSBzZXJ2ZXIncyBsaXN0IGFzLWlzLlxuICAgKi9cbiAgQElucHV0KCkgZmlyc3RGYWN0b3JzOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGZpcnN0IGZhY3RvciBhbHJlYWR5IHNlbnQgKGBBdGxhc0Zsb3dDb250cm9sbGVyLnByZXBhcmVkRmFjdG9yKClgKTogaXRzIGNvZGUgaXMgY29sbGVjdGVkLiAqL1xuICBASW5wdXQoKSBwcmVwYXJlZEZhY3Rvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEVtaXRzIHRoZSBjb2xsZWN0ZWQgZmllbGQgdmFsdWVzIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLiAqL1xuICBAT3V0cHV0KCkgc3VibWl0RmxvdyA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4oKTtcbiAgLyoqIEVtaXRzIHdoZW4gdGhlIHVzZXIgcGlja3MgYSBmaXJzdCBmYWN0b3IgdGhlIHNlcnZlciBtdXN0IHNlbmQgZmlyc3QgKGFuIGVtYWlsZWQgY29kZSkuICovXG4gIEBPdXRwdXQoKSBjaG9vc2VGYWN0b3IgPSBuZXcgRXZlbnRFbWl0dGVyPCdlbWFpbF9jb2RlJz4oKTtcblxuICBwcm90ZWN0ZWQgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcsIHZhcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHJhbnNsYXRlKHRoaXMuYXRsYXMubG9jYWxpemF0aW9uLCBrZXksIHZhcnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNscyhrZXk6IEVsZW1lbnRLZXksIGJhc2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNsYXNzRm9yKGtleSwgdGhpcy5hdGxhcy5hcHBlYXJhbmNlLCBiYXNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlcyA9IHsgLi4udGhpcy52YWx1ZXMsIFtuYW1lXTogdmFsdWUgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblN1Ym1pdChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuc3VibWl0Rmxvdy5lbWl0KHRoaXMudmFsdWVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmb3JtRXJyb3JzKCk6IEZpZWxkRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JzLmZpbHRlcigoZXJyb3IpID0+ICFlcnJvci5wYXJhbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRFcnJvcnNGb3IobmFtZTogc3RyaW5nKTogRmllbGRFcnJvcltdIHtcbiAgICByZXR1cm4gdGhpcy5lcnJvcnMuZmlsdGVyKChlcnJvcikgPT4gZXJyb3IucGFyYW0gPT09IG5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGVwKCkge1xuICAgIHJldHVybiB0aGlzLmF0dGVtcHQgPyBuZXh0U3RlcCh0aGlzLmF0dGVtcHQpIDogKHsga2luZDogJ2NvbGxlY3RfaWRlbnRpZmllcicgfSBhcyBjb25zdCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvd0NhcHRjaGEoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qga2luZCA9IHRoaXMuc3RlcCgpLmtpbmQ7XG4gICAgcmV0dXJuICEhdGhpcy5jYXB0Y2hhICYmIChraW5kID09PSAnY29sbGVjdF9pZGVudGlmaWVyJyB8fCBraW5kID09PSAnY29sbGVjdF9jYXB0Y2hhJyk7XG4gIH1cblxuICAvKiogVGhlIGZpcnN0IGZhY3RvcnMgb24gb2ZmZXIgYXQgYSBgbmVlZHNfZmlyc3RfZmFjdG9yYCBzdGVwIChlbXB0eSBvbiBhbnkgb3RoZXIpLiAqL1xuICBwcml2YXRlIG9mZmVyZWQoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLnN0ZXAoKTtcbiAgICBpZiAoc3RlcC5raW5kICE9PSAnY29sbGVjdF9maXJzdF9mYWN0b3InKSByZXR1cm4gW107XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RGYWN0b3JzID8/IHN0ZXAuc3RyYXRlZ2llcztcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93RW1haWxDb2RlT3B0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByZXBhcmVkRmFjdG9yICE9PSAnZW1haWxfY29kZScgJiYgdGhpcy5vZmZlcmVkKCkuaW5jbHVkZXMoJ2VtYWlsX2NvZGUnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93U3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGtpbmQgPSB0aGlzLnN0ZXAoKS5raW5kO1xuICAgIC8vIE5vdGhpbmcgdG8gc3VibWl0IG9uIGEgZmlyc3QtZmFjdG9yIHN0ZXAgdGhhdCBvbmx5IG9mZmVycyBhbiBlbWFpbGVkIGNvZGVcbiAgICAvLyB1bnRpbCB0aGF0IGNvZGUgaXMgc2VudC5cbiAgICBpZiAoa2luZCA9PT0gJ2NvbGxlY3RfZmlyc3RfZmFjdG9yJykgcmV0dXJuIHRoaXMuZmllbGRzKCkubGVuZ3RoID4gMDtcbiAgICByZXR1cm4ga2luZCAhPT0gJ2RvbmUnICYmIGtpbmQgIT09ICdhd2FpdF9vYXV0aCc7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmllbGRzKCk6IFN0ZXBGaWVsZFtdIHtcbiAgICBjb25zdCBzdGVwID0gdGhpcy5zdGVwKCk7XG4gICAgc3dpdGNoIChzdGVwLmtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfaWRlbnRpZmllcic6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnaWRlbnRpZmllcicsIGxhYmVsS2V5OiAnc2lnbkluLmlkZW50aWZpZXJMYWJlbCcsIHR5cGU6ICdlbWFpbCcgfV07XG4gICAgICBjYXNlICdjb2xsZWN0X2ZpcnN0X2ZhY3Rvcic6IHtcbiAgICAgICAgaWYgKHRoaXMucHJlcGFyZWRGYWN0b3IgPT09ICdlbWFpbF9jb2RlJykge1xuICAgICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnc2lnbkluLmVtYWlsQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBwYXNzd29yZCBmaWVsZCB1bmxlc3MgdGhlIG9ubHkgb2ZmZXIgaXMgYW4gZW1haWxlZCBjb2RlIChjaG9zZW5cbiAgICAgICAgLy8gd2l0aCB0aGUgYnV0dG9uIGJlbG93IHRoZSBmb3JtKS5cbiAgICAgICAgY29uc3Qgb2ZmZXJlZCA9IHRoaXMub2ZmZXJlZCgpO1xuICAgICAgICByZXR1cm4gb2ZmZXJlZC5pbmNsdWRlcygnZW1haWxfY29kZScpICYmICFvZmZlcmVkLmluY2x1ZGVzKCdwYXNzd29yZCcpXG4gICAgICAgICAgPyBbXVxuICAgICAgICAgIDogW3sga2luZDogJ2lucHV0JywgbmFtZTogJ3Bhc3N3b3JkJywgbGFiZWxLZXk6ICdzaWduSW4ucGFzc3dvcmRMYWJlbCcsIHR5cGU6ICdwYXNzd29yZCcgfV07XG4gICAgICB9XG4gICAgICBjYXNlICdjb2xsZWN0X3NlY29uZF9mYWN0b3InOlxuICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ21mYS5jb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfV07XG4gICAgICBjYXNlICdlbnJvbGxfc2Vjb25kX2ZhY3Rvcic6XG4gICAgICAgIC8vIFR3byBjb25zZWN1dGl2ZSBjb2RlcyAowqc1LjYpOiBhIHBob25lIHdpdGggYSBmYXN0IGNsb2NrIGZhaWxzIGhlcmVcbiAgICAgICAgLy8gcmF0aGVyIHRoYW4gb24gZXZlcnkgc2lnbi1pbiBhZnRlcndhcmRzLlxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ2NvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxGaXJzdENvZGVMYWJlbCcsIHR5cGU6ICd0ZXh0JyB9LFxuICAgICAgICAgIHsga2luZDogJ2lucHV0JywgbmFtZTogJ3NlY29uZENvZGUnLCBsYWJlbEtleTogJ21mYS5lbnJvbGxTZWNvbmRDb2RlTGFiZWwnLCB0eXBlOiAndGV4dCcgfSxcbiAgICAgICAgXTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfZW1haWxfY29kZSc6XG4gICAgICAgIHJldHVybiBbeyBraW5kOiAnaW5wdXQnLCBuYW1lOiAnY29kZScsIGxhYmVsS2V5OiAnc2lnbkluLmVtYWlsQ29kZUxhYmVsJywgdHlwZTogJ3RleHQnIH1dO1xuICAgICAgY2FzZSAnY29sbGVjdF9uZXdfcGFzc3dvcmQnOlxuICAgICAgICByZXR1cm4gW3sga2luZDogJ2lucHV0JywgbmFtZTogJ3Bhc3N3b3JkJywgbGFiZWxLZXk6ICdyZXNldC5uZXdQYXNzd29yZExhYmVsJywgdHlwZTogJ3Bhc3N3b3JkJyB9XTtcbiAgICAgIGNhc2UgJ2NvbGxlY3RfY2FwdGNoYSc6XG4gICAgICAgIC8vIMKnNSB0aGUgc2VydmVyIHdpdGhoZWxkIHRoZSBhdHRlbXB0IHVudGlsIGEgY2FwdGNoYSBjbGVhcnMuIFNvbHZpbmcgdGhlXG4gICAgICAgIC8vIHdpZGdldCByZXN1Ym1pdHMgdGhlIGlkZW50aWZpZXIgb24gaXRzIG93bjsgdGhlIGJ1dHRvbiByZXRyaWVzLlxuICAgICAgICByZXR1cm4gW21zZygnY2FwdGNoYS5wcm9tcHQnKV07XG4gICAgICBjYXNlICdhd2FpdF9vYXV0aCc6XG4gICAgICAgIHJldHVybiBbbXNnKCdzaWduSW4ubWFnaWNMaW5rU2VudCcpXTtcbiAgICAgIGNhc2UgJ2RvbmUnOlxuICAgICAgICByZXR1cm4gW21zZygnc2lnbkluLmNoZWNrT3RoZXJUYWInKV07XG4gICAgICBjYXNlICdyZXN0YXJ0JzpcbiAgICAgICAgcmV0dXJuIFttc2coJ2Vycm9yLmdlbmVyaWMnKV07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBBIHN0YXR1cyB0aGlzIFNESyB2ZXJzaW9uIGRvZXMgbm90IGtub3cuIEFuIGhvbmVzdCBtZXNzYWdlIGJlYXRzIGFcbiAgICAgICAgLy8gYmxhbmsgbG9naW4gYm94IHRoZSB1c2VyIGNhbm5vdCBhY3Qgb24uXG4gICAgICAgIHJldHVybiBbbXNnKCdlcnJvci5nZW5lcmljJyldO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQSByZWFkLW9ubHkgbWVzc2FnZSByb3c6IGBsYWJlbEtleWAgaG9sZHMgdGhlIGkxOG4ga2V5IG9mIHRoZSB0ZXh0IHRvIHNob3cuICovXG5mdW5jdGlvbiBtc2cobGFiZWxLZXk6IHN0cmluZyk6IFN0ZXBGaWVsZCB7XG4gIHJldHVybiB7IGtpbmQ6ICdtZXNzYWdlJywgbmFtZTogJycsIGxhYmVsS2V5LCB0eXBlOiAndGV4dCcgfTtcbn1cbiJdfQ==