valtech-components 2.0.1022 → 2.0.1024

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.
Files changed (26) hide show
  1. package/esm2022/lib/components/molecules/pill/pill.component.mjs +3 -3
  2. package/esm2022/lib/components/molecules/update-banner/update-banner.component.mjs +3 -3
  3. package/esm2022/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.mjs +290 -0
  4. package/esm2022/lib/components/organisms/api-keys-view/api-keys-view.component.mjs +316 -0
  5. package/esm2022/lib/components/organisms/api-keys-view/api-keys-view.i18n.mjs +59 -0
  6. package/esm2022/lib/components/organisms/api-keys-view/api-keys.routes.mjs +27 -0
  7. package/esm2022/lib/components/organisms/api-keys-view/types.mjs +2 -0
  8. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +3 -3
  9. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +8 -14
  10. package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +3 -3
  11. package/esm2022/lib/components/organisms/organization-view/types.mjs +1 -1
  12. package/esm2022/lib/components/organisms/settings-hub/settings.routes.mjs +4 -1
  13. package/esm2022/lib/version.mjs +2 -2
  14. package/esm2022/public-api.mjs +5 -1
  15. package/fesm2022/valtech-components.mjs +2901 -2252
  16. package/fesm2022/valtech-components.mjs.map +1 -1
  17. package/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.d.ts +56 -0
  18. package/lib/components/organisms/api-keys-view/api-keys-view.component.d.ts +58 -0
  19. package/lib/components/organisms/api-keys-view/api-keys-view.i18n.d.ts +6 -0
  20. package/lib/components/organisms/api-keys-view/api-keys.routes.d.ts +22 -0
  21. package/lib/components/organisms/api-keys-view/types.d.ts +8 -0
  22. package/lib/components/organisms/organization-view/types.d.ts +6 -0
  23. package/lib/components/organisms/settings-hub/settings.routes.d.ts +5 -0
  24. package/lib/version.d.ts +1 -1
  25. package/package.json +1 -1
  26. package/public-api.d.ts +4 -0
@@ -0,0 +1,316 @@
1
+ import { Component, computed, inject, Input, signal } from '@angular/core';
2
+ import { ActivatedRoute } from '@angular/router';
3
+ import { Firestore, doc, getDoc } from '@angular/fire/firestore';
4
+ import { ButtonComponent } from '../../atoms/button/button.component';
5
+ import { DisplayComponent } from '../../atoms/display/display.component';
6
+ import { TextComponent } from '../../atoms/text/text.component';
7
+ import { TitleComponent } from '../../atoms/title/title.component';
8
+ import { UserAvatarComponent } from '../../atoms/user-avatar/user-avatar.component';
9
+ import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
10
+ import { createErrorStateProps } from '../../molecules/empty-state/factory';
11
+ import { SkeletonLayoutComponent } from '../skeleton-layout/skeleton-layout.component';
12
+ import { ComponentStates } from '../../types';
13
+ import { I18nService } from '../../../services/i18n';
14
+ import { AuthService } from '../../../services/auth/auth.service';
15
+ import { ApiKeyService } from '../../../services/apikeys/api-keys.service';
16
+ import { NavigationService } from '../../../services/navigation/navigation.service';
17
+ import { ModalService } from '../../../services/modal/modal.service';
18
+ import { ToastService } from '../../../services/toast.service';
19
+ import { ConfirmationDialogService } from '../../../services/confirmation-dialog/confirmation-dialog.service';
20
+ import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
21
+ import { interpretError } from '../../../services/errors/interpret-error';
22
+ import { connectPageRefresh } from '../../../services/page-refresh/page-refresh.service';
23
+ import { ApiKeyCreateModalComponent } from '../api-key-create-modal/api-key-create-modal.component';
24
+ import { API_KEYS_VIEW_I18N } from './api-keys-view.i18n';
25
+ import * as i0 from "@angular/core";
26
+ const DEFAULT_NAMESPACE = 'Settings.ApiKeys';
27
+ /**
28
+ * `val-api-keys-view` — vista full-feature de gestión de Client API Keys (ADR-021).
29
+ *
30
+ * Reemplaza al `val-api-keys-modal` como pantalla propia: ofrece **crear** arriba
31
+ * (CTA que abre `val-api-key-create-modal`) y **lista** abajo, con quién la creó
32
+ * (avatar + handle, resuelto de `/profiles`) y la fecha de creación. Revocar con
33
+ * confirmación destructiva. Estados loading / error / empty (Capa 4).
34
+ *
35
+ * NO renderiza ion-content — vive dentro de `val-page-wrapper`. Header vía
36
+ * `NavigationService.setBackHeader`. i18n auto-registrado bajo `i18nNamespace`.
37
+ */
38
+ export class ApiKeysViewComponent {
39
+ get ns() {
40
+ return this.resolvedConfig().i18nNamespace;
41
+ }
42
+ constructor() {
43
+ this.i18n = inject(I18nService);
44
+ this.auth = inject(AuthService);
45
+ this.apiKeys = inject(ApiKeyService);
46
+ this.firestore = inject(Firestore);
47
+ this.nav = inject(NavigationService);
48
+ this.modalService = inject(ModalService);
49
+ this.toast = inject(ToastService);
50
+ this.confirmDialog = inject(ConfirmationDialogService);
51
+ this.errors = inject(ValtechErrorService);
52
+ this.route = inject(ActivatedRoute, { optional: true });
53
+ this.resolvedConfig = computed(() => {
54
+ const fromRoute = (this.route?.snapshot.data['apiKeysConfig'] ?? {});
55
+ const merged = { ...fromRoute, ...(this.config ?? {}) };
56
+ return { i18nNamespace: merged.i18nNamespace ?? DEFAULT_NAMESPACE };
57
+ });
58
+ this.keys = signal([]);
59
+ this.loading = signal(false);
60
+ this.loadError = signal(null);
61
+ this.activeOrgId = computed(() => {
62
+ const u = this.auth.user();
63
+ return u?.activeOrgId ?? u?.activeOrg ?? '';
64
+ });
65
+ this.newKeyButton = computed(() => ({
66
+ text: this.tt('newKey'),
67
+ color: 'dark',
68
+ fill: 'solid',
69
+ shape: 'round',
70
+ size: 'small',
71
+ type: 'button',
72
+ state: ComponentStates.ENABLED,
73
+ }));
74
+ this.errorState = computed(() => {
75
+ this.i18n.lang();
76
+ const err = this.loadError();
77
+ if (!err)
78
+ return null;
79
+ return createErrorStateProps(err, {
80
+ title: { offline: this.tt('offlineTitle'), error: this.tt('errorTitle') },
81
+ description: { offline: this.tt('offlineHint'), error: interpretError(err).message },
82
+ retryLabel: this.tt('retry'),
83
+ onRetry: () => this.load(),
84
+ retrying: this.loading(),
85
+ });
86
+ });
87
+ this.emptyState = computed(() => {
88
+ this.i18n.lang();
89
+ return { variant: 'empty', title: this.tt('empty'), description: this.tt('emptyHint') };
90
+ });
91
+ if (!this.i18n.hasNamespace(this.ns)) {
92
+ this.i18n.registerContent(this.ns, API_KEYS_VIEW_I18N);
93
+ }
94
+ this.nav.setBackHeader('pageTitle', this.ns, { withMenu: true });
95
+ this.load();
96
+ connectPageRefresh(() => this.load());
97
+ }
98
+ revokeButton(k) {
99
+ return {
100
+ text: this.tt('revoke'),
101
+ color: 'danger',
102
+ fill: 'clear',
103
+ size: 'small',
104
+ type: 'button',
105
+ state: ComponentStates.ENABLED,
106
+ token: k.keyId,
107
+ };
108
+ }
109
+ load() {
110
+ if (!this.activeOrgId())
111
+ return;
112
+ this.loading.set(true);
113
+ this.loadError.set(null);
114
+ this.apiKeys.list().subscribe({
115
+ next: async (keys) => {
116
+ this.keys.set(await this.enrichWithCreators(keys));
117
+ this.loading.set(false);
118
+ },
119
+ error: err => {
120
+ this.loadError.set(err);
121
+ this.loading.set(false);
122
+ },
123
+ });
124
+ }
125
+ /** Resuelve handle/avatar/name del creador (`createdBy`) desde `/profiles`. */
126
+ async enrichWithCreators(keys) {
127
+ const ids = Array.from(new Set(keys.map(k => k.createdBy).filter(Boolean)));
128
+ const profiles = new Map();
129
+ await Promise.allSettled(ids.map(async (id) => {
130
+ try {
131
+ const snap = await getDoc(doc(this.firestore, `profiles/${id}`));
132
+ const p = snap.exists() ? snap.data() : {};
133
+ profiles.set(id, {
134
+ name: p['name'],
135
+ handle: p['handle'],
136
+ avatar: (p['avatarUrl'] ?? p['avatar']),
137
+ });
138
+ }
139
+ catch {
140
+ // perfil no accesible → se cae al fallback (unknownUser/createdBy)
141
+ }
142
+ }));
143
+ return keys.map(k => {
144
+ const p = profiles.get(k.createdBy);
145
+ return { ...k, creatorName: p?.name, creatorHandle: p?.handle, creatorAvatar: p?.avatar };
146
+ });
147
+ }
148
+ creatorLabel(k) {
149
+ if (k.creatorHandle)
150
+ return '@' + k.creatorHandle;
151
+ if (k.creatorName)
152
+ return k.creatorName;
153
+ return this.tt('unknownUser');
154
+ }
155
+ formatDate(iso) {
156
+ if (!iso)
157
+ return '';
158
+ const d = new Date(iso);
159
+ if (isNaN(d.getTime()))
160
+ return '';
161
+ return d.toLocaleDateString(this.i18n.lang(), { year: 'numeric', month: 'short', day: 'numeric' });
162
+ }
163
+ openCreate() {
164
+ void this.modalService.open({
165
+ component: ApiKeyCreateModalComponent,
166
+ componentProps: {
167
+ onCreated: () => this.load(),
168
+ },
169
+ breakpoints: { breakpoints: [0, 0.92], initialBreakpoint: 0.92, showHandle: true },
170
+ backdropDismiss: true,
171
+ });
172
+ }
173
+ async revoke(k) {
174
+ const result = await this.confirmDialog.confirmDestructive({
175
+ title: this.tt('revokeConfirmTitle'),
176
+ message: this.tt('revokeConfirmMessage'),
177
+ confirmButton: { text: this.tt('revokeConfirmOk') },
178
+ cancelButton: { text: this.tt('cancel') },
179
+ });
180
+ if (!result.confirmed)
181
+ return;
182
+ this.apiKeys.revoke(k.keyId).subscribe({
183
+ next: () => {
184
+ this.toast.show({ message: this.tt('revokeSuccess'), color: 'dark', duration: 3000 });
185
+ this.load();
186
+ },
187
+ error: err => {
188
+ this.errors.handle(err, { context: 'apiKeys.revoke', fallbackKey: 'errorTitle', i18nNamespace: this.ns });
189
+ },
190
+ });
191
+ }
192
+ tt(key) {
193
+ return this.i18n.t(key, this.ns);
194
+ }
195
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeysViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ApiKeysViewComponent, isStandalone: true, selector: "val-api-keys-view", inputs: { config: "config" }, ngImport: i0, template: `
197
+ <div class="apikeys">
198
+ <header class="apikeys__header">
199
+ <div class="apikeys__text">
200
+ <val-display [props]="{ content: tt('title'), size: 'small', color: 'dark' }" />
201
+ <val-title [props]="{ content: tt('subtitle'), size: 'large', color: 'dark', bold: false }" />
202
+ </div>
203
+ <val-button class="apikeys__cta" [props]="newKeyButton()" (onClick)="openCreate()" />
204
+ </header>
205
+
206
+ @if (loading()) {
207
+ <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
208
+ } @else if (errorState()) {
209
+ <val-empty-state [props]="errorState()!" />
210
+ } @else if (keys().length === 0) {
211
+ <val-empty-state [props]="emptyState()" />
212
+ } @else {
213
+ <div class="apikeys__list">
214
+ @for (k of keys(); track k.keyId) {
215
+ <div class="apikey-row">
216
+ <div class="apikey-row__main">
217
+ <span class="apikey-row__name">{{ k.name }}</span>
218
+ <span class="apikey-row__meta">
219
+ {{ k.permissions.length }} {{ tt('permsCount') }} ·
220
+ {{ k.status === 'revoked' ? tt('statusRevoked') : tt('statusActive') }} · {{ tt('lastUsed') }}:
221
+ {{ formatDate(k.lastUsedAt) || tt('never') }}
222
+ </span>
223
+ <span class="apikey-row__creator">
224
+ <val-user-avatar
225
+ [props]="{
226
+ name: k.creatorName || k.creatorHandle || '',
227
+ avatarUrl: k.creatorAvatar,
228
+ size: 'xsmall',
229
+ }"
230
+ />
231
+ <span class="apikey-row__creator-text">
232
+ {{ tt('createdBy') }}
233
+ {{ creatorLabel(k) }}
234
+ @if (formatDate(k.createdAt); as d) {
235
+ · {{ tt('createdOn') }} {{ d }}
236
+ }
237
+ </span>
238
+ </span>
239
+ </div>
240
+ @if (k.status !== 'revoked') {
241
+ <val-button [props]="revokeButton(k)" (onClick)="revoke(k)" />
242
+ }
243
+ </div>
244
+ }
245
+ </div>
246
+ }
247
+ </div>
248
+ `, isInline: true, styles: [".apikeys{max-width:720px;margin:0 auto;padding:8px 0 24px}.apikeys__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:20px}.apikeys__text{flex:1;min-width:0}.apikeys__text val-display{display:block;margin-bottom:4px}.apikeys__cta{flex-shrink:0}.apikeys__list{display:flex;flex-direction:column;gap:10px}.apikey-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border-radius:12px;border:1px solid var(--val-border-color, rgba(0, 0, 0, .1))}.apikey-row__main{display:flex;flex-direction:column;gap:4px;min-width:0}.apikey-row__name{font-weight:600;color:var(--ion-color-dark)}.apikey-row__meta{font-size:.78rem;color:var(--ion-color-medium)}.apikey-row__creator{display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--ion-color-medium)}.apikey-row__creator-text{min-width:0}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: UserAvatarComponent, selector: "val-user-avatar", inputs: ["props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: SkeletonLayoutComponent, selector: "val-skeleton-layout", inputs: ["props"] }] }); }
249
+ }
250
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ApiKeysViewComponent, decorators: [{
251
+ type: Component,
252
+ args: [{ selector: 'val-api-keys-view', standalone: true, imports: [
253
+ ButtonComponent,
254
+ DisplayComponent,
255
+ TextComponent,
256
+ TitleComponent,
257
+ UserAvatarComponent,
258
+ EmptyStateComponent,
259
+ SkeletonLayoutComponent,
260
+ ], template: `
261
+ <div class="apikeys">
262
+ <header class="apikeys__header">
263
+ <div class="apikeys__text">
264
+ <val-display [props]="{ content: tt('title'), size: 'small', color: 'dark' }" />
265
+ <val-title [props]="{ content: tt('subtitle'), size: 'large', color: 'dark', bold: false }" />
266
+ </div>
267
+ <val-button class="apikeys__cta" [props]="newKeyButton()" (onClick)="openCreate()" />
268
+ </header>
269
+
270
+ @if (loading()) {
271
+ <val-skeleton-layout [props]="{ preset: 'list', rows: 3 }" />
272
+ } @else if (errorState()) {
273
+ <val-empty-state [props]="errorState()!" />
274
+ } @else if (keys().length === 0) {
275
+ <val-empty-state [props]="emptyState()" />
276
+ } @else {
277
+ <div class="apikeys__list">
278
+ @for (k of keys(); track k.keyId) {
279
+ <div class="apikey-row">
280
+ <div class="apikey-row__main">
281
+ <span class="apikey-row__name">{{ k.name }}</span>
282
+ <span class="apikey-row__meta">
283
+ {{ k.permissions.length }} {{ tt('permsCount') }} ·
284
+ {{ k.status === 'revoked' ? tt('statusRevoked') : tt('statusActive') }} · {{ tt('lastUsed') }}:
285
+ {{ formatDate(k.lastUsedAt) || tt('never') }}
286
+ </span>
287
+ <span class="apikey-row__creator">
288
+ <val-user-avatar
289
+ [props]="{
290
+ name: k.creatorName || k.creatorHandle || '',
291
+ avatarUrl: k.creatorAvatar,
292
+ size: 'xsmall',
293
+ }"
294
+ />
295
+ <span class="apikey-row__creator-text">
296
+ {{ tt('createdBy') }}
297
+ {{ creatorLabel(k) }}
298
+ @if (formatDate(k.createdAt); as d) {
299
+ · {{ tt('createdOn') }} {{ d }}
300
+ }
301
+ </span>
302
+ </span>
303
+ </div>
304
+ @if (k.status !== 'revoked') {
305
+ <val-button [props]="revokeButton(k)" (onClick)="revoke(k)" />
306
+ }
307
+ </div>
308
+ }
309
+ </div>
310
+ }
311
+ </div>
312
+ `, styles: [".apikeys{max-width:720px;margin:0 auto;padding:8px 0 24px}.apikeys__header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:20px}.apikeys__text{flex:1;min-width:0}.apikeys__text val-display{display:block;margin-bottom:4px}.apikeys__cta{flex-shrink:0}.apikeys__list{display:flex;flex-direction:column;gap:10px}.apikey-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 14px;border-radius:12px;border:1px solid var(--val-border-color, rgba(0, 0, 0, .1))}.apikey-row__main{display:flex;flex-direction:column;gap:4px;min-width:0}.apikey-row__name{font-weight:600;color:var(--ion-color-dark)}.apikey-row__meta{font-size:.78rem;color:var(--ion-color-medium)}.apikey-row__creator{display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--ion-color-medium)}.apikey-row__creator-text{min-width:0}\n"] }]
313
+ }], ctorParameters: () => [], propDecorators: { config: [{
314
+ type: Input
315
+ }] } });
316
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleXMtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2FwaS1rZXlzLXZpZXcvYXBpLWtleXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBRXhGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRDQUE0QyxD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ZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDWCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDNUcsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxFQUFFLENBQUMsR0FBVztRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQzsrR0F6S1Usb0JBQW9CO21HQUFwQixvQkFBb0IsMkdBdkhyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9EVCx1N0JBNURDLGVBQWUsMEdBQ2YsZ0JBQWdCLDJFQUVoQixjQUFjLHlFQUNkLG1CQUFtQixxR0FDbkIsbUJBQW1CLCtFQUNuQix1QkFBdUI7OzRGQXlIZCxvQkFBb0I7a0JBbkloQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1A7d0JBQ1AsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3FCQUN4QixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0RUO3dEQWdGUSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIElucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZpcmVzdG9yZSwgZG9jLCBnZXREb2MgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5cbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFVzZXJBdmF0YXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy91c2VyLWF2YXRhci91c2VyLWF2YXRhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2VtcHR5LXN0YXRlL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUVycm9yU3RhdGVQcm9wcyB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9mYWN0b3J5JztcbmltcG9ydCB7IFNrZWxldG9uTGF5b3V0Q29tcG9uZW50IH0gZnJvbSAnLi4vc2tlbGV0b24tbGF5b3V0L3NrZWxldG9uLWxheW91dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uTWV0YWRhdGEsIENvbXBvbmVudFN0YXRlcyB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpS2V5U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2FwaWtleXMvYXBpLWtleXMuc2VydmljZSc7XG5pbXBvcnQgeyBDbGllbnRBcGlLZXkgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hcGlrZXlzL3R5cGVzJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvbW9kYWwvbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jb25maXJtYXRpb24tZGlhbG9nL2NvbmZpcm1hdGlvbi1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBWYWx0ZWNoRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL3ZhbHRlY2gtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBpbnRlcnByZXRFcnJvciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy9pbnRlcnByZXQtZXJyb3InO1xuaW1wb3J0IHsgY29ubmVjdFBhZ2VSZWZyZXNoIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcGFnZS1yZWZyZXNoL3BhZ2UtcmVmcmVzaC5zZXJ2aWNlJztcblxuaW1wb3J0IHsgQXBpS2V5Q3JlYXRlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9hcGkta2V5LWNyZWF0ZS1tb2RhbC9hcGkta2V5LWNyZWF0ZS1tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQVBJX0tFWVNfVklFV19JMThOIH0gZnJvbSAnLi9hcGkta2V5cy12aWV3LmkxOG4nO1xuaW1wb3J0IHsgQXBpS2V5c1ZpZXdDb25maWcgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnU2V0dGluZ3MuQXBpS2V5cyc7XG5cbi8qKiBLZXkgZW5yaXF1ZWNpZGEgY29uIGVsIHBlcmZpbCBww7pibGljbyAoaGFuZGxlL2F2YXRhci9uYW1lKSBkZSBzdSBjcmVhZG9yLiAqL1xuaW50ZXJmYWNlIEFwaUtleVJvdyBleHRlbmRzIENsaWVudEFwaUtleSB7XG4gIGNyZWF0b3JOYW1lPzogc3RyaW5nO1xuICBjcmVhdG9ySGFuZGxlPzogc3RyaW5nO1xuICBjcmVhdG9yQXZhdGFyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIGB2YWwtYXBpLWtleXMtdmlld2Ag4oCUIHZpc3RhIGZ1bGwtZmVhdHVyZSBkZSBnZXN0acOzbiBkZSBDbGllbnQgQVBJIEtleXMgKEFEUi0wMjEpLlxuICpcbiAqIFJlZW1wbGF6YSBhbCBgdmFsLWFwaS1rZXlzLW1vZGFsYCBjb21vIHBhbnRhbGxhIHByb3BpYTogb2ZyZWNlICoqY3JlYXIqKiBhcnJpYmFcbiAqIChDVEEgcXVlIGFicmUgYHZhbC1hcGkta2V5LWNyZWF0ZS1tb2RhbGApIHkgKipsaXN0YSoqIGFiYWpvLCBjb24gcXVpw6luIGxhIGNyZcOzXG4gKiAoYXZhdGFyICsgaGFuZGxlLCByZXN1ZWx0byBkZSBgL3Byb2ZpbGVzYCkgeSBsYSBmZWNoYSBkZSBjcmVhY2nDs24uIFJldm9jYXIgY29uXG4gKiBjb25maXJtYWNpw7NuIGRlc3RydWN0aXZhLiBFc3RhZG9zIGxvYWRpbmcgLyBlcnJvciAvIGVtcHR5IChDYXBhIDQpLlxuICpcbiAqIE5PIHJlbmRlcml6YSBpb24tY29udGVudCDigJQgdml2ZSBkZW50cm8gZGUgYHZhbC1wYWdlLXdyYXBwZXJgLiBIZWFkZXIgdsOtYVxuICogYE5hdmlnYXRpb25TZXJ2aWNlLnNldEJhY2tIZWFkZXJgLiBpMThuIGF1dG8tcmVnaXN0cmFkbyBiYWpvIGBpMThuTmFtZXNwYWNlYC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWFwaS1rZXlzLXZpZXcnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgICBVc2VyQXZhdGFyQ29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgU2tlbGV0b25MYXlvdXRDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImFwaWtleXNcIj5cbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJhcGlrZXlzX19oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFwaWtleXNfX3RleHRcIj5cbiAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdHQoJ3RpdGxlJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0dCgnc3VidGl0bGUnKSwgc2l6ZTogJ2xhcmdlJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dmFsLWJ1dHRvbiBjbGFzcz1cImFwaWtleXNfX2N0YVwiIFtwcm9wc109XCJuZXdLZXlCdXR0b24oKVwiIChvbkNsaWNrKT1cIm9wZW5DcmVhdGUoKVwiIC8+XG4gICAgICA8L2hlYWRlcj5cblxuICAgICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgICAgPHZhbC1za2VsZXRvbi1sYXlvdXQgW3Byb3BzXT1cInsgcHJlc2V0OiAnbGlzdCcsIHJvd3M6IDMgfVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChlcnJvclN0YXRlKCkpIHtcbiAgICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwiZXJyb3JTdGF0ZSgpIVwiIC8+XG4gICAgICB9IEBlbHNlIGlmIChrZXlzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cImVtcHR5U3RhdGUoKVwiIC8+XG4gICAgICB9IEBlbHNlIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImFwaWtleXNfX2xpc3RcIj5cbiAgICAgICAgICBAZm9yIChrIG9mIGtleXMoKTsgdHJhY2sgay5rZXlJZCkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwaWtleS1yb3dcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwaWtleS1yb3dfX21haW5cIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwaWtleS1yb3dfX25hbWVcIj57eyBrLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcGlrZXktcm93X19tZXRhXCI+XG4gICAgICAgICAgICAgICAgICB7eyBrLnBlcm1pc3Npb25zLmxlbmd0aCB9fSB7eyB0dCgncGVybXNDb3VudCcpIH19IMK3XG4gICAgICAgICAgICAgICAgICB7eyBrLnN0YXR1cyA9PT0gJ3Jldm9rZWQnID8gdHQoJ3N0YXR1c1Jldm9rZWQnKSA6IHR0KCdzdGF0dXNBY3RpdmUnKSB9fSDCtyB7eyB0dCgnbGFzdFVzZWQnKSB9fTpcbiAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdERhdGUoay5sYXN0VXNlZEF0KSB8fCB0dCgnbmV2ZXInKSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFwaWtleS1yb3dfX2NyZWF0b3JcIj5cbiAgICAgICAgICAgICAgICAgIDx2YWwtdXNlci1hdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBrLmNyZWF0b3JOYW1lIHx8IGsuY3JlYXRvckhhbmRsZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgICBhdmF0YXJVcmw6IGsuY3JlYXRvckF2YXRhcixcbiAgICAgICAgICAgICAgICAgICAgICBzaXplOiAneHNtYWxsJyxcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhcGlrZXktcm93X19jcmVhdG9yLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdHQoJ2NyZWF0ZWRCeScpIH19XG4gICAgICAgICAgICAgICAgICAgIHt7IGNyZWF0b3JMYWJlbChrKSB9fVxuICAgICAgICAgICAgICAgICAgICBAaWYgKGZvcm1hdERhdGUoay5jcmVhdGVkQXQpOyBhcyBkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgwrcge3sgdHQoJ2NyZWF0ZWRPbicpIH19IHt7IGQgfX1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIEBpZiAoay5zdGF0dXMgIT09ICdyZXZva2VkJykge1xuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uIFtwcm9wc109XCJyZXZva2VCdXR0b24oaylcIiAob25DbGljayk9XCJyZXZva2UoaylcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAuYXBpa2V5cyB7XG4gICAgICAgIG1heC13aWR0aDogNzIwcHg7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA4cHggMCAyNHB4O1xuICAgICAgfVxuICAgICAgLmFwaWtleXNfX2hlYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cbiAgICAgIC5hcGlrZXlzX190ZXh0IHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuICAgICAgLmFwaWtleXNfX3RleHQgdmFsLWRpc3BsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgfVxuICAgICAgLmFwaWtleXNfX2N0YSB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuICAgICAgLmFwaWtleXNfX2xpc3Qge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICB9XG4gICAgICAuYXBpa2V5LXJvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXZhbC1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICB9XG4gICAgICAuYXBpa2V5LXJvd19fbWFpbiB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuYXBpa2V5LXJvd19fbmFtZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyayk7XG4gICAgICB9XG4gICAgICAuYXBpa2V5LXJvd19fbWV0YSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43OHJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgfVxuICAgICAgLmFwaWtleS1yb3dfX2NyZWF0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSk7XG4gICAgICB9XG4gICAgICAuYXBpa2V5LXJvd19fY3JlYXRvci10ZXh0IHtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFwaUtleXNWaWV3Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhcGlLZXlzID0gaW5qZWN0KEFwaUtleVNlcnZpY2UpO1xuICBwcml2YXRlIGZpcmVzdG9yZSA9IGluamVjdChGaXJlc3RvcmUpO1xuICBwcml2YXRlIG5hdiA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgbW9kYWxTZXJ2aWNlID0gaW5qZWN0KE1vZGFsU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBjb25maXJtRGlhbG9nID0gaW5qZWN0KENvbmZpcm1hdGlvbkRpYWxvZ1NlcnZpY2UpO1xuICBwcml2YXRlIGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICAvKiogQ29uZmlnIHbDrWEgQElucHV0IChvYmplY3QtZmlyc3QpOyBmYWxsYmFjayBhbCByb3V0ZSBkYXRhIGBhcGlLZXlzQ29uZmlnYC4gKi9cbiAgQElucHV0KCkgY29uZmlnPzogQXBpS2V5c1ZpZXdDb25maWc7XG5cbiAgcmVhZG9ubHkgcmVzb2x2ZWRDb25maWcgPSBjb21wdXRlZDxSZXF1aXJlZDxBcGlLZXlzVmlld0NvbmZpZz4+KCgpID0+IHtcbiAgICBjb25zdCBmcm9tUm91dGUgPSAodGhpcy5yb3V0ZT8uc25hcHNob3QuZGF0YVsnYXBpS2V5c0NvbmZpZyddID8/IHt9KSBhcyBBcGlLZXlzVmlld0NvbmZpZztcbiAgICBjb25zdCBtZXJnZWQ6IEFwaUtleXNWaWV3Q29uZmlnID0geyAuLi5mcm9tUm91dGUsIC4uLih0aGlzLmNvbmZpZyA/PyB7fSkgfTtcbiAgICByZXR1cm4geyBpMThuTmFtZXNwYWNlOiBtZXJnZWQuaTE4bk5hbWVzcGFjZSA/PyBERUZBVUxUX05BTUVTUEFDRSB9O1xuICB9KTtcblxuICBwcml2YXRlIGdldCBucygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkQ29uZmlnKCkuaTE4bk5hbWVzcGFjZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGtleXMgPSBzaWduYWw8QXBpS2V5Um93W10+KFtdKTtcbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGxvYWRFcnJvciA9IHNpZ25hbDx1bmtub3duIHwgbnVsbD4obnVsbCk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlT3JnSWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgdSA9IHRoaXMuYXV0aC51c2VyKCkgYXMgeyBhY3RpdmVPcmdJZD86IHN0cmluZzsgYWN0aXZlT3JnPzogc3RyaW5nIH0gfCBudWxsO1xuICAgIHJldHVybiB1Py5hY3RpdmVPcmdJZCA/PyB1Py5hY3RpdmVPcmcgPz8gJyc7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IG5ld0tleUJ1dHRvbiA9IGNvbXB1dGVkPFBhcnRpYWw8QnV0dG9uTWV0YWRhdGE+PigoKSA9PiAoe1xuICAgIHRleHQ6IHRoaXMudHQoJ25ld0tleScpLFxuICAgIGNvbG9yOiAnZGFyaycsXG4gICAgZmlsbDogJ3NvbGlkJyxcbiAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICBzaXplOiAnc21hbGwnLFxuICAgIHR5cGU6ICdidXR0b24nLFxuICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgfSkpO1xuXG4gIHJlYWRvbmx5IGVycm9yU3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGEgfCBudWxsPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCBlcnIgPSB0aGlzLmxvYWRFcnJvcigpO1xuICAgIGlmICghZXJyKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JTdGF0ZVByb3BzKGVyciwge1xuICAgICAgdGl0bGU6IHsgb2ZmbGluZTogdGhpcy50dCgnb2ZmbGluZVRpdGxlJyksIGVycm9yOiB0aGlzLnR0KCdlcnJvclRpdGxlJykgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiB7IG9mZmxpbmU6IHRoaXMudHQoJ29mZmxpbmVIaW50JyksIGVycm9yOiBpbnRlcnByZXRFcnJvcihlcnIpLm1lc3NhZ2UgfSxcbiAgICAgIHJldHJ5TGFiZWw6IHRoaXMudHQoJ3JldHJ5JyksXG4gICAgICBvblJldHJ5OiAoKSA9PiB0aGlzLmxvYWQoKSxcbiAgICAgIHJldHJ5aW5nOiB0aGlzLmxvYWRpbmcoKSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZW1wdHlTdGF0ZSA9IGNvbXB1dGVkPEVtcHR5U3RhdGVNZXRhZGF0YT4oKCkgPT4ge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHsgdmFyaWFudDogJ2VtcHR5JywgdGl0bGU6IHRoaXMudHQoJ2VtcHR5JyksIGRlc2NyaXB0aW9uOiB0aGlzLnR0KCdlbXB0eUhpbnQnKSB9O1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UodGhpcy5ucykpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckNvbnRlbnQodGhpcy5ucywgQVBJX0tFWVNfVklFV19JMThOKTtcbiAgICB9XG4gICAgdGhpcy5uYXYuc2V0QmFja0hlYWRlcigncGFnZVRpdGxlJywgdGhpcy5ucywgeyB3aXRoTWVudTogdHJ1ZSB9KTtcbiAgICB0aGlzLmxvYWQoKTtcbiAgICBjb25uZWN0UGFnZVJlZnJlc2goKCkgPT4gdGhpcy5sb2FkKCkpO1xuICB9XG5cbiAgcmV2b2tlQnV0dG9uKGs6IEFwaUtleVJvdyk6IFBhcnRpYWw8QnV0dG9uTWV0YWRhdGE+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dDogdGhpcy50dCgncmV2b2tlJyksXG4gICAgICBjb2xvcjogJ2RhbmdlcicsXG4gICAgICBmaWxsOiAnY2xlYXInLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgdG9rZW46IGsua2V5SWQsXG4gICAgfTtcbiAgfVxuXG4gIGxvYWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZU9yZ0lkKCkpIHJldHVybjtcbiAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMubG9hZEVycm9yLnNldChudWxsKTtcbiAgICB0aGlzLmFwaUtleXMubGlzdCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiBhc3luYyBrZXlzID0+IHtcbiAgICAgICAgdGhpcy5rZXlzLnNldChhd2FpdCB0aGlzLmVucmljaFdpdGhDcmVhdG9ycyhrZXlzKSk7XG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiBlcnIgPT4ge1xuICAgICAgICB0aGlzLmxvYWRFcnJvci5zZXQoZXJyKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlc3VlbHZlIGhhbmRsZS9hdmF0YXIvbmFtZSBkZWwgY3JlYWRvciAoYGNyZWF0ZWRCeWApIGRlc2RlIGAvcHJvZmlsZXNgLiAqL1xuICBwcml2YXRlIGFzeW5jIGVucmljaFdpdGhDcmVhdG9ycyhrZXlzOiBDbGllbnRBcGlLZXlbXSk6IFByb21pc2U8QXBpS2V5Um93W10+IHtcbiAgICBjb25zdCBpZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQoa2V5cy5tYXAoayA9PiBrLmNyZWF0ZWRCeSkuZmlsdGVyKEJvb2xlYW4pKSk7XG4gICAgY29uc3QgcHJvZmlsZXMgPSBuZXcgTWFwPHN0cmluZywgeyBuYW1lPzogc3RyaW5nOyBoYW5kbGU/OiBzdHJpbmc7IGF2YXRhcj86IHN0cmluZyB9PigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGlkcy5tYXAoYXN5bmMgaWQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNuYXAgPSBhd2FpdCBnZXREb2MoZG9jKHRoaXMuZmlyZXN0b3JlLCBgcHJvZmlsZXMvJHtpZH1gKSk7XG4gICAgICAgICAgY29uc3QgcCA9IHNuYXAuZXhpc3RzKCkgPyBzbmFwLmRhdGEoKSA6IHt9O1xuICAgICAgICAgIHByb2ZpbGVzLnNldChpZCwge1xuICAgICAgICAgICAgbmFtZTogcFsnbmFtZSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGhhbmRsZTogcFsnaGFuZGxlJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXZhdGFyOiAocFsnYXZhdGFyVXJsJ10gPz8gcFsnYXZhdGFyJ10pIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gcGVyZmlsIG5vIGFjY2VzaWJsZSDihpIgc2UgY2FlIGFsIGZhbGxiYWNrICh1bmtub3duVXNlci9jcmVhdGVkQnkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4ga2V5cy5tYXAoayA9PiB7XG4gICAgICBjb25zdCBwID0gcHJvZmlsZXMuZ2V0KGsuY3JlYXRlZEJ5KTtcbiAgICAgIHJldHVybiB7IC4uLmssIGNyZWF0b3JOYW1lOiBwPy5uYW1lLCBjcmVhdG9ySGFuZGxlOiBwPy5oYW5kbGUsIGNyZWF0b3JBdmF0YXI6IHA/LmF2YXRhciB9O1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRvckxhYmVsKGs6IEFwaUtleVJvdyk6IHN0cmluZyB7XG4gICAgaWYgKGsuY3JlYXRvckhhbmRsZSkgcmV0dXJuICdAJyArIGsuY3JlYXRvckhhbmRsZTtcbiAgICBpZiAoay5jcmVhdG9yTmFtZSkgcmV0dXJuIGsuY3JlYXRvck5hbWU7XG4gICAgcmV0dXJuIHRoaXMudHQoJ3Vua25vd25Vc2VyJyk7XG4gIH1cblxuICBmb3JtYXREYXRlKGlzbz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFpc28pIHJldHVybiAnJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoaXNvKTtcbiAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVEYXRlU3RyaW5nKHRoaXMuaTE4bi5sYW5nKCksIHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycgfSk7XG4gIH1cblxuICBvcGVuQ3JlYXRlKCk6IHZvaWQge1xuICAgIHZvaWQgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih7XG4gICAgICBjb21wb25lbnQ6IEFwaUtleUNyZWF0ZU1vZGFsQ29tcG9uZW50LFxuICAgICAgY29tcG9uZW50UHJvcHM6IHtcbiAgICAgICAgb25DcmVhdGVkOiAoKSA9PiB0aGlzLmxvYWQoKSxcbiAgICAgIH0sXG4gICAgICBicmVha3BvaW50czogeyBicmVha3BvaW50czogWzAsIDAuOTJdLCBpbml0aWFsQnJlYWtwb2ludDogMC45Miwgc2hvd0hhbmRsZTogdHJ1ZSB9LFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlKGs6IEFwaUtleVJvdyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29uZmlybURpYWxvZy5jb25maXJtRGVzdHJ1Y3RpdmUoe1xuICAgICAgdGl0bGU6IHRoaXMudHQoJ3Jldm9rZUNvbmZpcm1UaXRsZScpLFxuICAgICAgbWVzc2FnZTogdGhpcy50dCgncmV2b2tlQ29uZmlybU1lc3NhZ2UnKSxcbiAgICAgIGNvbmZpcm1CdXR0b246IHsgdGV4dDogdGhpcy50dCgncmV2b2tlQ29uZmlybU9rJykgfSxcbiAgICAgIGNhbmNlbEJ1dHRvbjogeyB0ZXh0OiB0aGlzLnR0KCdjYW5jZWwnKSB9LFxuICAgIH0pO1xuICAgIGlmICghcmVzdWx0LmNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIHRoaXMuYXBpS2V5cy5yZXZva2Uoay5rZXlJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgdGhpcy50b2FzdC5zaG93KHsgbWVzc2FnZTogdGhpcy50dCgncmV2b2tlU3VjY2VzcycpLCBjb2xvcjogJ2RhcmsnLCBkdXJhdGlvbjogMzAwMCB9KTtcbiAgICAgICAgdGhpcy5sb2FkKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHsgY29udGV4dDogJ2FwaUtleXMucmV2b2tlJywgZmFsbGJhY2tLZXk6ICdlcnJvclRpdGxlJywgaTE4bk5hbWVzcGFjZTogdGhpcy5ucyB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIHRoaXMubnMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Defaults i18n (es/en) de `val-api-keys-view`. Auto-registrados si el consumer no
3
+ * proveyó el namespace `Settings.ApiKeys`.
4
+ */
5
+ export const API_KEYS_VIEW_I18N = {
6
+ es: {
7
+ pageTitle: 'API Keys',
8
+ title: 'Client API Keys',
9
+ subtitle: 'Llaves M2M org-scopeadas para integraciones (p. ej. importar miembros).',
10
+ newKey: 'Crear API key',
11
+ empty: 'Aún no hay API keys en esta organización.',
12
+ emptyHint: 'Crea la primera para habilitar integraciones máquina-a-máquina.',
13
+ revoke: 'Revocar',
14
+ revokeConfirmTitle: 'Revocar API key',
15
+ revokeConfirmMessage: 'Las integraciones que la usen dejarán de funcionar. Esta acción no se puede deshacer.',
16
+ revokeConfirmOk: 'Revocar',
17
+ cancel: 'Cancelar',
18
+ revokeSuccess: 'API key revocada.',
19
+ permsCount: 'permisos',
20
+ lastUsed: 'Último uso',
21
+ never: 'nunca',
22
+ statusActive: 'Activa',
23
+ statusRevoked: 'Revocada',
24
+ createdBy: 'Creada por',
25
+ createdOn: 'el',
26
+ unknownUser: 'Usuario',
27
+ retry: 'Reintentar',
28
+ errorTitle: 'No se pudieron cargar las API keys',
29
+ offlineTitle: 'Sin conexión',
30
+ offlineHint: 'Revisa tu conexión e intenta de nuevo.',
31
+ },
32
+ en: {
33
+ pageTitle: 'API Keys',
34
+ title: 'Client API Keys',
35
+ subtitle: 'Org-scoped M2M keys for integrations (e.g. member import).',
36
+ newKey: 'Create API key',
37
+ empty: 'No API keys in this organization yet.',
38
+ emptyHint: 'Create the first one to enable machine-to-machine integrations.',
39
+ revoke: 'Revoke',
40
+ revokeConfirmTitle: 'Revoke API key',
41
+ revokeConfirmMessage: 'Integrations using it will stop working. This action cannot be undone.',
42
+ revokeConfirmOk: 'Revoke',
43
+ cancel: 'Cancel',
44
+ revokeSuccess: 'API key revoked.',
45
+ permsCount: 'permissions',
46
+ lastUsed: 'Last used',
47
+ never: 'never',
48
+ statusActive: 'Active',
49
+ statusRevoked: 'Revoked',
50
+ createdBy: 'Created by',
51
+ createdOn: 'on',
52
+ unknownUser: 'User',
53
+ retry: 'Retry',
54
+ errorTitle: "Couldn't load API keys",
55
+ offlineTitle: 'Offline',
56
+ offlineHint: 'Check your connection and try again.',
57
+ },
58
+ };
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleXMtdmlldy5pMThuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9hcGkta2V5cy12aWV3L2FwaS1rZXlzLXZpZXcuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBcUI7SUFDbEQsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLFVBQVU7UUFDckIsS0FBSyxFQUFFLGlCQUFpQjtRQUN4QixRQUFRLEVBQUUseUVBQXlFO1FBQ25GLE1BQU0sRUFBRSxlQUFlO1FBQ3ZCLEtBQUssRUFBRSwyQ0FBMkM7UUFDbEQsU0FBUyxFQUFFLGlFQUFpRTtRQUM1RSxNQUFNLEVBQUUsU0FBUztRQUNqQixrQkFBa0IsRUFBRSxpQkFBaUI7UUFDckMsb0JBQW9CLEVBQ2xCLHVGQUF1RjtRQUN6RixlQUFlLEVBQUUsU0FBUztRQUMxQixNQUFNLEVBQUUsVUFBVTtRQUNsQixhQUFhLEVBQUUsbUJBQW1CO1FBQ2xDLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRSxZQUFZO1FBQ3RCLEtBQUssRUFBRSxPQUFPO1FBQ2QsWUFBWSxFQUFFLFFBQVE7UUFDdEIsYUFBYSxFQUFFLFVBQVU7UUFDekIsU0FBUyxFQUFFLFlBQVk7UUFDdkIsU0FBUyxFQUFFLElBQUk7UUFDZixXQUFXLEVBQUUsU0FBUztRQUN0QixLQUFLLEVBQUUsWUFBWTtRQUNuQixVQUFVLEVBQUUsb0NBQW9DO1FBQ2hELFlBQVksRUFBRSxjQUFjO1FBQzVCLFdBQVcsRUFBRSx3Q0FBd0M7S0FDdEQ7SUFDRCxFQUFFLEVBQUU7UUFDRixTQUFTLEVBQUUsVUFBVTtRQUNyQixLQUFLLEVBQUUsaUJBQWlCO1FBQ3hCLFFBQVEsRUFBRSw0REFBNEQ7UUFDdEUsTUFBTSxFQUFFLGdCQUFnQjtRQUN4QixLQUFLLEVBQUUsdUNBQXVDO1FBQzlDLFNBQVMsRUFBRSxpRUFBaUU7UUFDNUUsTUFBTSxFQUFFLFFBQVE7UUFDaEIsa0JBQWtCLEVBQUUsZ0JBQWdCO1FBQ3BDLG9CQUFvQixFQUFFLHdFQUF3RTtRQUM5RixlQUFlLEVBQUUsUUFBUTtRQUN6QixNQUFNLEVBQUUsUUFBUTtRQUNoQixhQUFhLEVBQUUsa0JBQWtCO1FBQ2pDLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLEtBQUssRUFBRSxPQUFPO1FBQ2QsWUFBWSxFQUFFLFFBQVE7UUFDdEIsYUFBYSxFQUFFLFNBQVM7UUFDeEIsU0FBUyxFQUFFLFlBQVk7UUFDdkIsU0FBUyxFQUFFLElBQUk7UUFDZixXQUFXLEVBQUUsTUFBTTtRQUNuQixLQUFLLEVBQUUsT0FBTztRQUNkLFVBQVUsRUFBRSx3QkFBd0I7UUFDcEMsWUFBWSxFQUFFLFNBQVM7UUFDdkIsV0FBVyxFQUFFLHNDQUFzQztLQUNwRDtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYW5ndWFnZXNDb250ZW50IH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bi90eXBlcyc7XG5cbi8qKlxuICogRGVmYXVsdHMgaTE4biAoZXMvZW4pIGRlIGB2YWwtYXBpLWtleXMtdmlld2AuIEF1dG8tcmVnaXN0cmFkb3Mgc2kgZWwgY29uc3VtZXIgbm9cbiAqIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgU2V0dGluZ3MuQXBpS2V5c2AuXG4gKi9cbmV4cG9ydCBjb25zdCBBUElfS0VZU19WSUVXX0kxOE46IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIGVzOiB7XG4gICAgcGFnZVRpdGxlOiAnQVBJIEtleXMnLFxuICAgIHRpdGxlOiAnQ2xpZW50IEFQSSBLZXlzJyxcbiAgICBzdWJ0aXRsZTogJ0xsYXZlcyBNMk0gb3JnLXNjb3BlYWRhcyBwYXJhIGludGVncmFjaW9uZXMgKHAuIGVqLiBpbXBvcnRhciBtaWVtYnJvcykuJyxcbiAgICBuZXdLZXk6ICdDcmVhciBBUEkga2V5JyxcbiAgICBlbXB0eTogJ0HDum4gbm8gaGF5IEFQSSBrZXlzIGVuIGVzdGEgb3JnYW5pemFjacOzbi4nLFxuICAgIGVtcHR5SGludDogJ0NyZWEgbGEgcHJpbWVyYSBwYXJhIGhhYmlsaXRhciBpbnRlZ3JhY2lvbmVzIG3DoXF1aW5hLWEtbcOhcXVpbmEuJyxcbiAgICByZXZva2U6ICdSZXZvY2FyJyxcbiAgICByZXZva2VDb25maXJtVGl0bGU6ICdSZXZvY2FyIEFQSSBrZXknLFxuICAgIHJldm9rZUNvbmZpcm1NZXNzYWdlOlxuICAgICAgJ0xhcyBpbnRlZ3JhY2lvbmVzIHF1ZSBsYSB1c2VuIGRlamFyw6FuIGRlIGZ1bmNpb25hci4gRXN0YSBhY2Npw7NuIG5vIHNlIHB1ZWRlIGRlc2hhY2VyLicsXG4gICAgcmV2b2tlQ29uZmlybU9rOiAnUmV2b2NhcicsXG4gICAgY2FuY2VsOiAnQ2FuY2VsYXInLFxuICAgIHJldm9rZVN1Y2Nlc3M6ICdBUEkga2V5IHJldm9jYWRhLicsXG4gICAgcGVybXNDb3VudDogJ3Blcm1pc29zJyxcbiAgICBsYXN0VXNlZDogJ8OabHRpbW8gdXNvJyxcbiAgICBuZXZlcjogJ251bmNhJyxcbiAgICBzdGF0dXNBY3RpdmU6ICdBY3RpdmEnLFxuICAgIHN0YXR1c1Jldm9rZWQ6ICdSZXZvY2FkYScsXG4gICAgY3JlYXRlZEJ5OiAnQ3JlYWRhIHBvcicsXG4gICAgY3JlYXRlZE9uOiAnZWwnLFxuICAgIHVua25vd25Vc2VyOiAnVXN1YXJpbycsXG4gICAgcmV0cnk6ICdSZWludGVudGFyJyxcbiAgICBlcnJvclRpdGxlOiAnTm8gc2UgcHVkaWVyb24gY2FyZ2FyIGxhcyBBUEkga2V5cycsXG4gICAgb2ZmbGluZVRpdGxlOiAnU2luIGNvbmV4acOzbicsXG4gICAgb2ZmbGluZUhpbnQ6ICdSZXZpc2EgdHUgY29uZXhpw7NuIGUgaW50ZW50YSBkZSBudWV2by4nLFxuICB9LFxuICBlbjoge1xuICAgIHBhZ2VUaXRsZTogJ0FQSSBLZXlzJyxcbiAgICB0aXRsZTogJ0NsaWVudCBBUEkgS2V5cycsXG4gICAgc3VidGl0bGU6ICdPcmctc2NvcGVkIE0yTSBrZXlzIGZvciBpbnRlZ3JhdGlvbnMgKGUuZy4gbWVtYmVyIGltcG9ydCkuJyxcbiAgICBuZXdLZXk6ICdDcmVhdGUgQVBJIGtleScsXG4gICAgZW1wdHk6ICdObyBBUEkga2V5cyBpbiB0aGlzIG9yZ2FuaXphdGlvbiB5ZXQuJyxcbiAgICBlbXB0eUhpbnQ6ICdDcmVhdGUgdGhlIGZpcnN0IG9uZSB0byBlbmFibGUgbWFjaGluZS10by1tYWNoaW5lIGludGVncmF0aW9ucy4nLFxuICAgIHJldm9rZTogJ1Jldm9rZScsXG4gICAgcmV2b2tlQ29uZmlybVRpdGxlOiAnUmV2b2tlIEFQSSBrZXknLFxuICAgIHJldm9rZUNvbmZpcm1NZXNzYWdlOiAnSW50ZWdyYXRpb25zIHVzaW5nIGl0IHdpbGwgc3RvcCB3b3JraW5nLiBUaGlzIGFjdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsXG4gICAgcmV2b2tlQ29uZmlybU9rOiAnUmV2b2tlJyxcbiAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICAgIHJldm9rZVN1Y2Nlc3M6ICdBUEkga2V5IHJldm9rZWQuJyxcbiAgICBwZXJtc0NvdW50OiAncGVybWlzc2lvbnMnLFxuICAgIGxhc3RVc2VkOiAnTGFzdCB1c2VkJyxcbiAgICBuZXZlcjogJ25ldmVyJyxcbiAgICBzdGF0dXNBY3RpdmU6ICdBY3RpdmUnLFxuICAgIHN0YXR1c1Jldm9rZWQ6ICdSZXZva2VkJyxcbiAgICBjcmVhdGVkQnk6ICdDcmVhdGVkIGJ5JyxcbiAgICBjcmVhdGVkT246ICdvbicsXG4gICAgdW5rbm93blVzZXI6ICdVc2VyJyxcbiAgICByZXRyeTogJ1JldHJ5JyxcbiAgICBlcnJvclRpdGxlOiBcIkNvdWxkbid0IGxvYWQgQVBJIGtleXNcIixcbiAgICBvZmZsaW5lVGl0bGU6ICdPZmZsaW5lJyxcbiAgICBvZmZsaW5lSGludDogJ0NoZWNrIHlvdXIgY29ubmVjdGlvbiBhbmQgdHJ5IGFnYWluLicsXG4gIH0sXG59O1xuIl19
@@ -0,0 +1,27 @@
1
+ import { ApiKeysViewComponent } from './api-keys-view.component';
2
+ /**
3
+ * Helper para montar la vista de Client API Keys (`val-api-keys-view`) como ruta
4
+ * en una app del factory. El `config` se pasa por route `data` (`apiKeysConfig`) y
5
+ * el componente lo lee como fallback de su `@Input() config`.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * // settings.routes.ts
10
+ * import { provideValtechApiKeysRoutes } from 'valtech-components';
11
+ *
12
+ * export const settingsRoutes: Routes = [
13
+ * ...provideValtechApiKeysRoutes(), // → /app/settings/api-keys
14
+ * // ...provideValtechApiKeysRoutes({ path: 'integrations/keys' }),
15
+ * ];
16
+ * ```
17
+ */
18
+ export function provideValtechApiKeysRoutes(opts) {
19
+ return [
20
+ {
21
+ path: opts?.path ?? 'api-keys',
22
+ component: ApiKeysViewComponent,
23
+ data: { apiKeysConfig: opts?.config },
24
+ },
25
+ ];
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleXMucm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9hcGkta2V5cy12aWV3L2FwaS1rZXlzLnJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdqRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsSUFHM0M7SUFDQyxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksSUFBSSxVQUFVO1lBQzlCLFNBQVMsRUFBRSxvQkFBb0I7WUFDL0IsSUFBSSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUU7U0FDdEM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IEFwaUtleXNWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi9hcGkta2V5cy12aWV3LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcGlLZXlzVmlld0NvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEhlbHBlciBwYXJhIG1vbnRhciBsYSB2aXN0YSBkZSBDbGllbnQgQVBJIEtleXMgKGB2YWwtYXBpLWtleXMtdmlld2ApIGNvbW8gcnV0YVxuICogZW4gdW5hIGFwcCBkZWwgZmFjdG9yeS4gRWwgYGNvbmZpZ2Agc2UgcGFzYSBwb3Igcm91dGUgYGRhdGFgIChgYXBpS2V5c0NvbmZpZ2ApIHlcbiAqIGVsIGNvbXBvbmVudGUgbG8gbGVlIGNvbW8gZmFsbGJhY2sgZGUgc3UgYEBJbnB1dCgpIGNvbmZpZ2AuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBzZXR0aW5ncy5yb3V0ZXMudHNcbiAqIGltcG9ydCB7IHByb3ZpZGVWYWx0ZWNoQXBpS2V5c1JvdXRlcyB9IGZyb20gJ3ZhbHRlY2gtY29tcG9uZW50cyc7XG4gKlxuICogZXhwb3J0IGNvbnN0IHNldHRpbmdzUm91dGVzOiBSb3V0ZXMgPSBbXG4gKiAgIC4uLnByb3ZpZGVWYWx0ZWNoQXBpS2V5c1JvdXRlcygpLCAgICAgICAgICAgICAgICAgIC8vIOKGkiAvYXBwL3NldHRpbmdzL2FwaS1rZXlzXG4gKiAgIC8vIC4uLnByb3ZpZGVWYWx0ZWNoQXBpS2V5c1JvdXRlcyh7IHBhdGg6ICdpbnRlZ3JhdGlvbnMva2V5cycgfSksXG4gKiBdO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlVmFsdGVjaEFwaUtleXNSb3V0ZXMob3B0cz86IHtcbiAgcGF0aD86IHN0cmluZztcbiAgY29uZmlnPzogQXBpS2V5c1ZpZXdDb25maWc7XG59KTogUm91dGVzIHtcbiAgcmV0dXJuIFtcbiAgICB7XG4gICAgICBwYXRoOiBvcHRzPy5wYXRoID8/ICdhcGkta2V5cycsXG4gICAgICBjb21wb25lbnQ6IEFwaUtleXNWaWV3Q29tcG9uZW50LFxuICAgICAgZGF0YTogeyBhcGlLZXlzQ29uZmlnOiBvcHRzPy5jb25maWcgfSxcbiAgICB9LFxuICBdO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvb3JnYW5pc21zL2FwaS1rZXlzLXZpZXcvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29uZmlnIGFjb3RhZGEgZGUgYHZhbC1hcGkta2V5cy12aWV3YCAoQURSLTAyMTogdW5hIHZpc3RhIGZ1bGwtZmVhdHVyZSBubyBhYnJlXG4gKiBzbG90cyBhcmJpdHJhcmlvczsgc2kgZmFsdGEgYWxnbywgc2UgcHJvbXVldmUgdW4gbnVldm8gcHVudG8gZGUgZXh0ZW5zacOzbikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpS2V5c1ZpZXdDb25maWcge1xuICAvKiogTmFtZXNwYWNlIGkxOG4gZGUgbG9zIHRleHRvcyBkZSBsYSB2aXN0YS4gRGVmYXVsdCBgU2V0dGluZ3MuQXBpS2V5c2AuICovXG4gIGkxOG5OYW1lc3BhY2U/OiBzdHJpbmc7XG59XG4iXX0=
@@ -127,7 +127,7 @@ export class OrgInfoSheetComponent {
127
127
  <val-button [props]="resolvedCloseProps()" (click)="dismiss()" />
128
128
  </div>
129
129
  </ion-content>
130
- `, isInline: true, styles: ["ion-content{--padding-bottom: 64px}val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
130
+ `, isInline: true, styles: ["ion-content{--padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)) }val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"], dependencies: [{ kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
131
131
  }
132
132
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: OrgInfoSheetComponent, decorators: [{
133
133
  type: Component,
@@ -198,7 +198,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
198
198
  <val-button [props]="resolvedCloseProps()" (click)="dismiss()" />
199
199
  </div>
200
200
  </ion-content>
201
- `, styles: ["ion-content{--padding-bottom: 64px}val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"] }]
201
+ `, styles: ["ion-content{--padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px)) }val-display{margin-bottom:4px;display:block}val-title{margin-bottom:8px;display:block}.info-features{display:flex;flex-direction:column;gap:12px;margin:16px 0}.info-feature{display:flex;align-items:flex-start;gap:14px;padding:12px 14px;border-radius:10px;background:var(--ion-color-light, #f4f5f8)}:host-context(body.dark) .info-feature,:host-context(html.ion-palette-dark) .info-feature,:host-context([data-theme=\"dark\"]) .info-feature{background:#ffffff0d}.info-feature__icon{font-size:22px;color:var(--ion-color-primary);flex-shrink:0;margin-top:2px}.info-feature__title{font-weight:600;font-size:.9rem;color:var(--ion-color-dark)}.info-feature__desc{font-size:.82rem;color:var(--ion-color-medium);margin-top:2px}.sheet-footer{margin-top:20px}\n"] }]
202
202
  }], ctorParameters: () => [], propDecorators: { title: [{
203
203
  type: Input
204
204
  }], subtitle: [{
@@ -214,4 +214,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
214
214
  }], _modalRef: [{
215
215
  type: Input
216
216
  }] } });
217
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWluZm8tc2hlZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9vcmctaW5mby1zaGVldC9vcmctaW5mby1zaGVldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUU1RCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQStISCxNQUFNLE9BQU8scUJBQXFCO0lBZ0NoQztRQS9CUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLGlGQUFpRjtRQUN4RSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLDBFQUEwRTtRQUNqRSxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHdGQUF3RjtRQUMvRSxTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ25CLHVGQUF1RjtRQUM5RSxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXpCOzs7O1dBSUc7UUFDTSxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUU3QiwwRUFBMEU7UUFDakUsZUFBVSxHQUE0QjtZQUM3QyxJQUFJLEVBQUUsUUFBUTtZQUNkLElBQUksRUFBRSxTQUFTO1lBQ2YsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDO1FBWU8sa0JBQWEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QscUJBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV6RSxlQUFVLEdBQUcsUUFBUSxDQUFXLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRS9FLHVCQUFrQixHQUFHLFFBQVEsQ0FBMEIsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNyRSxHQUFHLElBQUksQ0FBQyxVQUFVO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7U0FDeEQsQ0FBQyxDQUFDLENBQUM7UUFmRixRQUFRLENBQUMsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFhRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFUyxFQUFFLENBQUMsR0FBVztRQUN0QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7K0dBeERVLHFCQUFxQjttR0FBckIscUJBQXFCLHdQQS9HdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0RULDIxQkFuRUMsU0FBUyxvR0FDVCxVQUFVLG1GQUNWLFVBQVUsOEVBQ1YsU0FBUyxvUEFDVCxVQUFVLHdLQUNWLE9BQU8sMkpBQ1AsZUFBZSwwR0FDZixnQkFBZ0IsMkVBQ2hCLGFBQWEsd0VBQ2IsY0FBYzs7NEZBaUhMLHFCQUFxQjtrQkE5SGpDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxTQUFTO3dCQUNULFVBQVU7d0JBQ1YsVUFBVTt3QkFDVixTQUFTO3dCQUNULFVBQVU7d0JBQ1YsT0FBTzt3QkFDUCxlQUFlO3dCQUNmLGdCQUFnQjt3QkFDaEIsYUFBYTt3QkFDYixjQUFjO3FCQUNmLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0RUO3dEQTJEUSxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBVUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkJ1dHRvbiwgSW9uQnV0dG9ucywgSW9uQ29udGVudCwgSW9uSGVhZGVyLCBJb25JY29uLCBJb25Ub29sYmFyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IG1haWxPdXRsaW5lLCBwZW9wbGVPdXRsaW5lLCBzd2FwSG9yaXpvbnRhbE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuXG5pbXBvcnQgeyBPUkdfSU5GT19TSEVFVF9JMThOIH0gZnJvbSAnLi9vcmctaW5mby1zaGVldC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnT3JnSW5mb1NoZWV0JztcblxuLyoqXG4gKiBgdmFsLW9yZy1pbmZvLXNoZWV0YCDigJQgc2hlZXQgaW5mb3JtYXRpdm8gXCLCv1F1w6kgc29uIGxhcyBvcmdhbml6YWNpb25lcz9cIi5cbiAqIEV4dHJhw61kbyBkZWwgYE9yZ0luZm9TaGVldENvbXBvbmVudGAgaW5saW5lIGRlIGBBY2NvdW50UGFnZWAgYmFqbyBlbCBwcm9jZXNvIGRlXG4gKiBBRFItMDIxLlxuICpcbiAqIEVsIGNvbnN1bWVyIHBhc2EgYHRpdGxlYC9gc3VidGl0bGVgL2Bib2R5YC9gY2xvc2VMYWJlbGAgeWEgcmVzdWVsdG9zIHBvciBwcm9wc1xuICogKHBhdHLDs24gZGVsIHJlc3RvIGRlIG1vZGFsZXMgZGVsIGZhY3RvcnkpLiBMb3MgdGV4dG9zIGRlIGxvcyAzIGZlYXR1cmVzXG4gKiAoQ29sYWJvcmFjacOzbiAvIENhbWJpbyByw6FwaWRvIC8gSW52aXRhY2lvbmVzKSwgcXVlIGVuIGxhIHZlcnNpw7NuIGlubGluZSBlc3RhYmFuXG4gKiBoYXJkY29kZWQsIGFob3JhIHNlIGF1dG8tcmVzdWVsdmVuIGRlc2RlIGVsIG5hbWVzcGFjZSBgT3JnSW5mb1NoZWV0YFxuICogKGF1dG8tcmVnaXN0cmFkbyBlbiBlbCBjb25zdHJ1Y3RvcikuXG4gKlxuICogQWJpZXJ0byB2w61hIGBNb2RhbFNlcnZpY2VgIOKAlCByZWNpYmUgYF9tb2RhbFJlZmAgcG9yIGBjb21wb25lbnRQcm9wc2AuIEhlYWRlclxuICogY2Fuw7NuaWNvIChSZWdsYSAjNSk6IHNpbiBgaW9uLXRpdGxlYCwgYm90w7NuIENlcnJhciB0ZXh0byBlbiBgc2xvdD1lbmRgLFxuICogdMOtdHVsby9zdWJ0w610dWxvIGVuIGVsIGJvZHkgY29uIGB2YWwtZGlzcGxheWAvYHZhbC10aXRsZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1vcmctaW5mby1zaGVldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uVG9vbGJhcixcbiAgICBJb25CdXR0b25zLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25Db250ZW50LFxuICAgIElvbkljb24sXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiZGlzbWlzcygpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHJlc29sdmVkQ2xvc2VMYWJlbCgpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHJlc29sdmVkVGl0bGUoKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cbiAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogcmVzb2x2ZWRTdWJ0aXRsZSgpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuXG4gICAgICBAaWYgKHNob3dGZWF0dXJlcykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlLW91dGxpbmVcIiBjbGFzcz1cImluZm8tZmVhdHVyZV9faWNvblwiIC8+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX190aXRsZVwiPnt7IHR0KCdmZWF0dXJlQ29sbGFiVGl0bGUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX19kZXNjXCI+e3sgdHQoJ2ZlYXR1cmVDb2xsYWJEZXNjJykgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3dhcC1ob3Jpem9udGFsLW91dGxpbmVcIiBjbGFzcz1cImluZm8tZmVhdHVyZV9faWNvblwiIC8+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX190aXRsZVwiPnt7IHR0KCdmZWF0dXJlU3dpdGNoVGl0bGUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX19kZXNjXCI+e3sgdHQoJ2ZlYXR1cmVTd2l0Y2hEZXNjJykgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibWFpbC1vdXRsaW5lXCIgY2xhc3M9XCJpbmZvLWZlYXR1cmVfX2ljb25cIiAvPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tZmVhdHVyZV9fdGl0bGVcIj57eyB0dCgnZmVhdHVyZUludml0ZVRpdGxlJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tZmVhdHVyZV9fZGVzY1wiPnt7IHR0KCdmZWF0dXJlSW52aXRlRGVzYycpIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBmb3IgKHBhcmEgb2YgcGFyYWdyYXBocygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudDogcGFyYSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgLz5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cInNoZWV0LWZvb3RlclwiPlxuICAgICAgICA8dmFsLWJ1dHRvbiBbcHJvcHNdPVwicmVzb2x2ZWRDbG9zZVByb3BzKClcIiAoY2xpY2spPVwiZGlzbWlzcygpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIGlvbi1jb250ZW50IHtcbiAgICAgICAgLS1wYWRkaW5nLWJvdHRvbTogNjRweDtcbiAgICAgIH1cbiAgICAgIHZhbC1kaXNwbGF5IHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogNHB4O1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIHZhbC10aXRsZSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuaW5mby1mZWF0dXJlcyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgICAgbWFyZ2luOiAxNnB4IDA7XG4gICAgICB9XG4gICAgICAuaW5mby1mZWF0dXJlIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG4gICAgICAgIGdhcDogMTRweDtcbiAgICAgICAgcGFkZGluZzogMTJweCAxNHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQsICNmNGY1ZjgpO1xuICAgICAgfVxuICAgICAgOmhvc3QtY29udGV4dChib2R5LmRhcmspIC5pbmZvLWZlYXR1cmUsXG4gICAgICA6aG9zdC1jb250ZXh0KGh0bWwuaW9uLXBhbGV0dGUtZGFyaykgLmluZm8tZmVhdHVyZSxcbiAgICAgIDpob3N0LWNvbnRleHQoW2RhdGEtdGhlbWU9J2RhcmsnXSkgLmluZm8tZmVhdHVyZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wNSk7XG4gICAgICB9XG4gICAgICAuaW5mby1mZWF0dXJlX19pY29uIHtcbiAgICAgICAgZm9udC1zaXplOiAyMnB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuICAgICAgLmluZm8tZmVhdHVyZV9fdGl0bGUge1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBmb250LXNpemU6IDAuOXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYXJrKTtcbiAgICAgIH1cbiAgICAgIC5pbmZvLWZlYXR1cmVfX2Rlc2Mge1xuICAgICAgICBmb250LXNpemU6IDAuODJyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtKTtcbiAgICAgICAgbWFyZ2luLXRvcDogMnB4O1xuICAgICAgfVxuICAgICAgLnNoZWV0LWZvb3RlciB7XG4gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgT3JnSW5mb1NoZWV0Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICAvKiogVMOtdHVsbyBwcmluY2lwYWwgKHJlc3VlbHRvIHBvciBlbCBjb25zdW1lcikuIEZhbGxiYWNrIGFsIG5hbWVzcGFjZSBwcm9waW8uICovXG4gIEBJbnB1dCgpIHRpdGxlID0gJyc7XG4gIC8qKiBTdWJ0w610dWxvIChyZXN1ZWx0byBwb3IgZWwgY29uc3VtZXIpLiBGYWxsYmFjayBhbCBuYW1lc3BhY2UgcHJvcGlvLiAqL1xuICBASW5wdXQoKSBzdWJ0aXRsZSA9ICcnO1xuICAvKiogQ3VlcnBvIGVuIHDDoXJyYWZvcyBzZXBhcmFkb3MgcG9yIGRvYmxlIHNhbHRvIGRlIGzDrW5lYSAocmVzdWVsdG8gcG9yIGVsIGNvbnN1bWVyKS4gKi9cbiAgQElucHV0KCkgYm9keSA9ICcnO1xuICAvKiogTGFiZWwgZGVsIGJvdMOzbiBjZXJyYXIgKHJlc3VlbHRvIHBvciBlbCBjb25zdW1lcikuIEZhbGxiYWNrIGFsIG5hbWVzcGFjZSBwcm9waW8uICovXG4gIEBJbnB1dCgpIGNsb3NlTGFiZWwgPSAnJztcblxuICAvKipcbiAgICogTXVlc3RyYSBsYXMgMyBmZWF0dXJlLWNhcmRzIGRlIG9yZ2FuaXphY2lvbmVzIChjb2xhYm9yYWNpw7NuIC8gY2FtYmlvIHLDoXBpZG8gL1xuICAgKiBpbnZpdGFjaW9uZXMpLiBgZmFsc2VgIOKGkiBzaGVldCBhcnRpY2xlLXN0eWxlIChzb2xvIHTDrXR1bG8gKyBzdWJ0w610dWxvICsgY3VlcnBvKSxcbiAgICogcmV1c2FibGUgY29tbyBleHBsYWluZXIgZ2Vuw6lyaWNvIChlai4gaW50ZWdyYWNpb25lcyAvIEFQSSBrZXlzKS4gRGVmYXVsdCBgdHJ1ZWAuXG4gICAqL1xuICBASW5wdXQoKSBzaG93RmVhdHVyZXMgPSB0cnVlO1xuXG4gIC8qKiBQcm9wcyBkZWwgYm90w7NuIGNlcnJhciBkZWwgZm9vdGVyIChlbCBjb25zdW1lciBwdWVkZSBwYXNhciBjdXN0b20pLiAqL1xuICBASW5wdXQoKSBjbG9zZVByb3BzOiBQYXJ0aWFsPEJ1dHRvbk1ldGFkYXRhPiA9IHtcbiAgICB0ZXh0OiAnQ2VycmFyJyxcbiAgICBmaWxsOiAnb3V0bGluZScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgZXhwYW5kOiAnYmxvY2snLFxuICAgIHR5cGU6ICdidXR0b24nLFxuICB9O1xuXG4gIC8qKiBJbnllY3RhZG8gcG9yIGBNb2RhbFNlcnZpY2Uub3BlbmAg4oCUIHJlZmVyZW5jaWEgcGFyYSBjZXJyYXIgZGVzZGUgZGVudHJvLiAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gdm9pZCB9O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGFkZEljb25zKHsgcGVvcGxlT3V0bGluZSwgc3dhcEhvcml6b250YWxPdXRsaW5lLCBtYWlsT3V0bGluZSB9KTtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoREVGQVVMVF9OQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KERFRkFVTFRfTkFNRVNQQUNFLCBPUkdfSU5GT19TSEVFVF9JMThOKTtcbiAgICB9XG4gIH1cblxuICByZWFkb25seSByZXNvbHZlZFRpdGxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy50aXRsZSB8fCB0aGlzLnR0KCd0aXRsZScpKTtcbiAgcmVhZG9ubHkgcmVzb2x2ZWRTdWJ0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3VidGl0bGUgfHwgdGhpcy50dCgnc3VidGl0bGUnKSk7XG4gIHJlYWRvbmx5IHJlc29sdmVkQ2xvc2VMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY2xvc2VMYWJlbCB8fCB0aGlzLnR0KCdjbG9zZScpKTtcblxuICByZWFkb25seSBwYXJhZ3JhcGhzID0gY29tcHV0ZWQ8c3RyaW5nW10+KCgpID0+IHRoaXMuYm9keS5zcGxpdCgnXFxuXFxuJykuZmlsdGVyKEJvb2xlYW4pKTtcblxuICByZWFkb25seSByZXNvbHZlZENsb3NlUHJvcHMgPSBjb21wdXRlZDxQYXJ0aWFsPEJ1dHRvbk1ldGFkYXRhPj4oKCkgPT4gKHtcbiAgICAuLi50aGlzLmNsb3NlUHJvcHMsXG4gICAgdGV4dDogdGhpcy5jbG9zZVByb3BzLnRleHQgfHwgdGhpcy5yZXNvbHZlZENsb3NlTGFiZWwoKSxcbiAgfSkpO1xuXG4gIGRpc21pc3MoKTogdm9pZCB7XG4gICAgdGhpcy5fbW9kYWxSZWY/LmRpc21pc3MobnVsbCwgJ2NhbmNlbCcpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCBERUZBVUxUX05BTUVTUEFDRSk7XG4gIH1cbn1cbiJdfQ==
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnLWluZm8tc2hlZXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9vcmctaW5mby1zaGVldC9vcmctaW5mby1zaGVldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFHbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUU1RCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUV6Qzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQWtJSCxNQUFNLE9BQU8scUJBQXFCO0lBZ0NoQztRQS9CUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLGlGQUFpRjtRQUN4RSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BC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RyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFPRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBVUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkJ1dHRvbiwgSW9uQnV0dG9ucywgSW9uQ29udGVudCwgSW9uSGVhZGVyLCBJb25JY29uLCBJb25Ub29sYmFyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IG1haWxPdXRsaW5lLCBwZW9wbGVPdXRsaW5lLCBzd2FwSG9yaXpvbnRhbE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuXG5pbXBvcnQgeyBPUkdfSU5GT19TSEVFVF9JMThOIH0gZnJvbSAnLi9vcmctaW5mby1zaGVldC5pMThuJztcblxuY29uc3QgREVGQVVMVF9OQU1FU1BBQ0UgPSAnT3JnSW5mb1NoZWV0JztcblxuLyoqXG4gKiBgdmFsLW9yZy1pbmZvLXNoZWV0YCDigJQgc2hlZXQgaW5mb3JtYXRpdm8gXCLCv1F1w6kgc29uIGxhcyBvcmdhbml6YWNpb25lcz9cIi5cbiAqIEV4dHJhw61kbyBkZWwgYE9yZ0luZm9TaGVldENvbXBvbmVudGAgaW5saW5lIGRlIGBBY2NvdW50UGFnZWAgYmFqbyBlbCBwcm9jZXNvIGRlXG4gKiBBRFItMDIxLlxuICpcbiAqIEVsIGNvbnN1bWVyIHBhc2EgYHRpdGxlYC9gc3VidGl0bGVgL2Bib2R5YC9gY2xvc2VMYWJlbGAgeWEgcmVzdWVsdG9zIHBvciBwcm9wc1xuICogKHBhdHLDs24gZGVsIHJlc3RvIGRlIG1vZGFsZXMgZGVsIGZhY3RvcnkpLiBMb3MgdGV4dG9zIGRlIGxvcyAzIGZlYXR1cmVzXG4gKiAoQ29sYWJvcmFjacOzbiAvIENhbWJpbyByw6FwaWRvIC8gSW52aXRhY2lvbmVzKSwgcXVlIGVuIGxhIHZlcnNpw7NuIGlubGluZSBlc3RhYmFuXG4gKiBoYXJkY29kZWQsIGFob3JhIHNlIGF1dG8tcmVzdWVsdmVuIGRlc2RlIGVsIG5hbWVzcGFjZSBgT3JnSW5mb1NoZWV0YFxuICogKGF1dG8tcmVnaXN0cmFkbyBlbiBlbCBjb25zdHJ1Y3RvcikuXG4gKlxuICogQWJpZXJ0byB2w61hIGBNb2RhbFNlcnZpY2VgIOKAlCByZWNpYmUgYF9tb2RhbFJlZmAgcG9yIGBjb21wb25lbnRQcm9wc2AuIEhlYWRlclxuICogY2Fuw7NuaWNvIChSZWdsYSAjNSk6IHNpbiBgaW9uLXRpdGxlYCwgYm90w7NuIENlcnJhciB0ZXh0byBlbiBgc2xvdD1lbmRgLFxuICogdMOtdHVsby9zdWJ0w610dWxvIGVuIGVsIGJvZHkgY29uIGB2YWwtZGlzcGxheWAvYHZhbC10aXRsZWAuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1vcmctaW5mby1zaGVldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBJb25IZWFkZXIsXG4gICAgSW9uVG9vbGJhcixcbiAgICBJb25CdXR0b25zLFxuICAgIElvbkJ1dHRvbixcbiAgICBJb25Db250ZW50LFxuICAgIElvbkljb24sXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGV4dENvbXBvbmVudCxcbiAgICBUaXRsZUNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLWhlYWRlcj5cbiAgICAgIDxpb24tdG9vbGJhcj5cbiAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBmaWxsPVwiY2xlYXJcIiBjb2xvcj1cImRhcmtcIiAoY2xpY2spPVwiZGlzbWlzcygpXCI+XG4gICAgICAgICAgICA8c3Ryb25nPnt7IHJlc29sdmVkQ2xvc2VMYWJlbCgpIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG5cbiAgICA8aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHJlc29sdmVkVGl0bGUoKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cbiAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogcmVzb2x2ZWRTdWJ0aXRsZSgpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuXG4gICAgICBAaWYgKHNob3dGZWF0dXJlcykge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGVvcGxlLW91dGxpbmVcIiBjbGFzcz1cImluZm8tZmVhdHVyZV9faWNvblwiIC8+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX190aXRsZVwiPnt7IHR0KCdmZWF0dXJlQ29sbGFiVGl0bGUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX19kZXNjXCI+e3sgdHQoJ2ZlYXR1cmVDb2xsYWJEZXNjJykgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3dhcC1ob3Jpem9udGFsLW91dGxpbmVcIiBjbGFzcz1cImluZm8tZmVhdHVyZV9faWNvblwiIC8+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX190aXRsZVwiPnt7IHR0KCdmZWF0dXJlU3dpdGNoVGl0bGUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5mby1mZWF0dXJlX19kZXNjXCI+e3sgdHQoJ2ZlYXR1cmVTd2l0Y2hEZXNjJykgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmZvLWZlYXR1cmVcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibWFpbC1vdXRsaW5lXCIgY2xhc3M9XCJpbmZvLWZlYXR1cmVfX2ljb25cIiAvPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tZmVhdHVyZV9fdGl0bGVcIj57eyB0dCgnZmVhdHVyZUludml0ZVRpdGxlJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm8tZmVhdHVyZV9fZGVzY1wiPnt7IHR0KCdmZWF0dXJlSW52aXRlRGVzYycpIH19PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBmb3IgKHBhcmEgb2YgcGFyYWdyYXBocygpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudDogcGFyYSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgLz5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cInNoZWV0LWZvb3RlclwiPlxuICAgICAgICA8dmFsLWJ1dHRvbiBbcHJvcHNdPVwicmVzb2x2ZWRDbG9zZVByb3BzKClcIiAoY2xpY2spPVwiZGlzbWlzcygpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIGlvbi1jb250ZW50IHtcbiAgICAgICAgLyogUGFkZGluZyBnZW5lcm9zbyBwYXJhIGxsZWdhciBhbCBmb25kbzogZWwgc2hlZXQgc2Nyb2xsZWEgZW4gc3VcbiAgICAgICAgICAgYnJlYWtwb2ludCBtw6F4aW1vLCB5IGVsIGJvdMOzbiBkZSBjaWVycmUgZGVsIGZvb3RlciBkZWJlIHF1ZWRhciBwb3JcbiAgICAgICAgICAgZW5jaW1hIGRlbCBzYWZlLWFyZWEgLyBjdWFscXVpZXIgb3ZlcmxheSBmbG90YW50ZS4gKi9cbiAgICAgICAgLS1wYWRkaW5nLWJvdHRvbTogY2FsYyg5NnB4ICsgZW52KHNhZmUtYXJlYS1pbnNldC1ib3R0b20sIDBweCkpO1xuICAgICAgfVxuICAgICAgdmFsLWRpc3BsYXkge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgdmFsLXRpdGxlIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5pbmZvLWZlYXR1cmVzIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBtYXJnaW46IDE2cHggMDtcbiAgICAgIH1cbiAgICAgIC5pbmZvLWZlYXR1cmUge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZ2FwOiAxNHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICB9XG4gICAgICA6aG9zdC1jb250ZXh0KGJvZHkuZGFyaykgLmluZm8tZmVhdHVyZSxcbiAgICAgIDpob3N0LWNvbnRleHQoaHRtbC5pb24tcGFsZXR0ZS1kYXJrKSAuaW5mby1mZWF0dXJlLFxuICAgICAgOmhvc3QtY29udGV4dChbZGF0YS10aGVtZT0nZGFyayddKSAuaW5mby1mZWF0dXJlIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTtcbiAgICAgIH1cbiAgICAgIC5pbmZvLWZlYXR1cmVfX2ljb24ge1xuICAgICAgICBmb250LXNpemU6IDIycHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG4gICAgICAuaW5mby1mZWF0dXJlX190aXRsZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmspO1xuICAgICAgfVxuICAgICAgLmluZm8tZmVhdHVyZV9fZGVzYyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MnJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0pO1xuICAgICAgICBtYXJnaW4tdG9wOiAycHg7XG4gICAgICB9XG4gICAgICAuc2hlZXQtZm9vdGVyIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBPcmdJbmZvU2hlZXRDb21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIC8qKiBUw610dWxvIHByaW5jaXBhbCAocmVzdWVsdG8gcG9yIGVsIGNvbnN1bWVyKS4gRmFsbGJhY2sgYWwgbmFtZXNwYWNlIHByb3Bpby4gKi9cbiAgQElucHV0KCkgdGl0bGUgPSAnJztcbiAgLyoqIFN1YnTDrXR1bG8gKHJlc3VlbHRvIHBvciBlbCBjb25zdW1lcikuIEZhbGxiYWNrIGFsIG5hbWVzcGFjZSBwcm9waW8uICovXG4gIEBJbnB1dCgpIHN1YnRpdGxlID0gJyc7XG4gIC8qKiBDdWVycG8gZW4gcMOhcnJhZm9zIHNlcGFyYWRvcyBwb3IgZG9ibGUgc2FsdG8gZGUgbMOtbmVhIChyZXN1ZWx0byBwb3IgZWwgY29uc3VtZXIpLiAqL1xuICBASW5wdXQoKSBib2R5ID0gJyc7XG4gIC8qKiBMYWJlbCBkZWwgYm90w7NuIGNlcnJhciAocmVzdWVsdG8gcG9yIGVsIGNvbnN1bWVyKS4gRmFsbGJhY2sgYWwgbmFtZXNwYWNlIHByb3Bpby4gKi9cbiAgQElucHV0KCkgY2xvc2VMYWJlbCA9ICcnO1xuXG4gIC8qKlxuICAgKiBNdWVzdHJhIGxhcyAzIGZlYXR1cmUtY2FyZHMgZGUgb3JnYW5pemFjaW9uZXMgKGNvbGFib3JhY2nDs24gLyBjYW1iaW8gcsOhcGlkbyAvXG4gICAqIGludml0YWNpb25lcykuIGBmYWxzZWAg4oaSIHNoZWV0IGFydGljbGUtc3R5bGUgKHNvbG8gdMOtdHVsbyArIHN1YnTDrXR1bG8gKyBjdWVycG8pLFxuICAgKiByZXVzYWJsZSBjb21vIGV4cGxhaW5lciBnZW7DqXJpY28gKGVqLiBpbnRlZ3JhY2lvbmVzIC8gQVBJIGtleXMpLiBEZWZhdWx0IGB0cnVlYC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dGZWF0dXJlcyA9IHRydWU7XG5cbiAgLyoqIFByb3BzIGRlbCBib3TDs24gY2VycmFyIGRlbCBmb290ZXIgKGVsIGNvbnN1bWVyIHB1ZWRlIHBhc2FyIGN1c3RvbSkuICovXG4gIEBJbnB1dCgpIGNsb3NlUHJvcHM6IFBhcnRpYWw8QnV0dG9uTWV0YWRhdGE+ID0ge1xuICAgIHRleHQ6ICdDZXJyYXInLFxuICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgdHlwZTogJ2J1dHRvbicsXG4gIH07XG5cbiAgLyoqIElueWVjdGFkbyBwb3IgYE1vZGFsU2VydmljZS5vcGVuYCDigJQgcmVmZXJlbmNpYSBwYXJhIGNlcnJhciBkZXNkZSBkZW50cm8uICovXG4gIEBJbnB1dCgpIF9tb2RhbFJlZj86IHsgZGlzbWlzczogKGRhdGE/OiB1bmtub3duLCByb2xlPzogc3RyaW5nKSA9PiB2b2lkIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYWRkSWNvbnMoeyBwZW9wbGVPdXRsaW5lLCBzd2FwSG9yaXpvbnRhbE91dGxpbmUsIG1haWxPdXRsaW5lIH0pO1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShERUZBVUxUX05BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckNvbnRlbnQoREVGQVVMVF9OQU1FU1BBQ0UsIE9SR19JTkZPX1NIRUVUX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRvbmx5IHJlc29sdmVkVGl0bGUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRpdGxlIHx8IHRoaXMudHQoJ3RpdGxlJykpO1xuICByZWFkb25seSByZXNvbHZlZFN1YnRpdGxlID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zdWJ0aXRsZSB8fCB0aGlzLnR0KCdzdWJ0aXRsZScpKTtcbiAgcmVhZG9ubHkgcmVzb2x2ZWRDbG9zZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jbG9zZUxhYmVsIHx8IHRoaXMudHQoJ2Nsb3NlJykpO1xuXG4gIHJlYWRvbmx5IHBhcmFncmFwaHMgPSBjb21wdXRlZDxzdHJpbmdbXT4oKCkgPT4gdGhpcy5ib2R5LnNwbGl0KCdcXG5cXG4nKS5maWx0ZXIoQm9vbGVhbikpO1xuXG4gIHJlYWRvbmx5IHJlc29sdmVkQ2xvc2VQcm9wcyA9IGNvbXB1dGVkPFBhcnRpYWw8QnV0dG9uTWV0YWRhdGE+PigoKSA9PiAoe1xuICAgIC4uLnRoaXMuY2xvc2VQcm9wcyxcbiAgICB0ZXh0OiB0aGlzLmNsb3NlUHJvcHMudGV4dCB8fCB0aGlzLnJlc29sdmVkQ2xvc2VMYWJlbCgpLFxuICB9KSk7XG5cbiAgZGlzbWlzcygpOiB2b2lkIHtcbiAgICB0aGlzLl9tb2RhbFJlZj8uZGlzbWlzcyhudWxsLCAnY2FuY2VsJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIERFRkFVTFRfTkFNRVNQQUNFKTtcbiAgfVxufVxuIl19