valtech-components 4.0.24 → 4.0.26

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 (25) hide show
  1. package/README.md +31 -262
  2. package/esm2022/lib/components/molecules/modal-shell/modal-shell.component.mjs +3 -3
  3. package/esm2022/lib/components/molecules/select-input/select-input.component.mjs +3 -3
  4. package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +5 -5
  5. package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +5 -5
  6. package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +4 -3
  7. package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +5 -5
  8. package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +7 -5
  9. package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +6 -5
  10. package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +37 -48
  11. package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +8 -2
  12. package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +15 -3
  13. package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +3 -3
  14. package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +7 -7
  15. package/esm2022/lib/services/firebase/messaging.service.mjs +2 -2
  16. package/esm2022/lib/services/refreshable-stream/refreshable-stream.mjs +2 -2
  17. package/esm2022/lib/version.mjs +2 -2
  18. package/fesm2022/valtech-components.mjs +98 -87
  19. package/fesm2022/valtech-components.mjs.map +1 -1
  20. package/lib/components/organisms/article/article.component.d.ts +2 -2
  21. package/lib/components/organisms/landing-steps/landing-steps.component.d.ts +1 -1
  22. package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +12 -1
  23. package/lib/version.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/lib/services/firebase/firebase-messaging-sw.js +0 -145
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  <img style="margin-bottom: 20px;" src="https://myvaltech.s3.us-east-2.amazonaws.com/logo-terminal-rounded.png" width="60px" />
2
2
 
3
- # valtech-components
3
+ # Valtech Components
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/valtech-components.svg)](https://www.npmjs.com/package/valtech-components)
6
6
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
7
7
 
8
- Component library for Angular 18 + Ionic 8 apps. 145+ components and 23+ services covering auth, Firebase, i18n, theming, and more.
8
+ Component library for Angular + Ionic + Capacitor apps. **145 components** and **23+ services** for auth, Firebase, i18n, and more.
9
9
 
10
- **[Full docs → ui.myvaltech.com](https://ui.myvaltech.com)**
10
+ **[Full documentation → ui.myvaltech.com](https://ui.myvaltech.com)**
11
11
 
12
12
  ---
13
13
 
@@ -23,11 +23,11 @@ npm install valtech-components
23
23
  npm install @angular/common @angular/core @ionic/angular ionicons rxjs
24
24
  ```
25
25
 
26
- **Optional — only install if you use these features:**
26
+ **Optional — only if you use these features:**
27
27
 
28
28
  ```bash
29
29
  npm install @angular/fire firebase # Firebase services
30
- npm install @capacitor/app @capacitor/clipboard # Native (Capacitor) features
30
+ npm install @capacitor/app @capacitor/clipboard # Native features
31
31
  npm install qr-code-styling # QR code component
32
32
  npm install prismjs # Code highlighting
33
33
  npm install swiper # Carousel component
@@ -35,11 +35,11 @@ npm install swiper # Carousel component
35
35
 
36
36
  ---
37
37
 
38
- ## Quick start
38
+ ## Usage
39
39
 
40
- ### UI only (no backend required)
40
+ ### UI only (no backend needed)
41
41
 
42
- 144 of 145 components work standalone:
42
+ 144 of 145 components work standalone — no Firebase, no backend:
43
43
 
44
44
  ```typescript
45
45
  import { ButtonComponent, CardComponent, TextComponent } from 'valtech-components';
@@ -50,7 +50,7 @@ import { ButtonComponent, CardComponent, TextComponent } from 'valtech-component
50
50
  template: `
51
51
  <val-card [props]="{ title: 'My Card' }">
52
52
  <val-text [props]="{ content: 'Hello World' }" />
53
- <val-button preset="primary-round" [props]="{ text: 'Click me' }" />
53
+ <val-button [props]="{ text: 'Click me', color: 'primary' }" />
54
54
  </val-card>
55
55
  `
56
56
  })
@@ -59,156 +59,49 @@ export class MyComponent {}
59
59
 
60
60
  ### Full integration (auth + Firebase + i18n)
61
61
 
62
- Wire providers in `main.ts`:
62
+ Add providers in `main.ts`:
63
63
 
64
64
  ```typescript
65
65
  import {
66
66
  provideValtechFirebase,
67
67
  provideValtechAuth,
68
68
  provideValtechI18n,
69
- provideValtechErrorHandling,
70
- provideValtechSkeleton,
71
- provideValtechPresets,
72
- HandoffService,
69
+ createFirebaseConfig,
73
70
  } from 'valtech-components';
74
- import { APP_INITIALIZER } from '@angular/core';
71
+ import firebaseConfig from './config/firebase.config.json';
75
72
 
76
73
  bootstrapApplication(AppComponent, {
77
74
  providers: [
78
- provideValtechFirebase(environment.valtechFirebase),
79
-
80
- // Auth must come before provideValtechErrorHandling
81
- provideValtechAuth({
82
- apiUrl: environment.apiUrl,
83
- appId: 'my-app',
84
- loginRoute: '/login',
85
- homeRoute: '/app',
86
- enableFirebaseIntegration: true,
87
- enableTabSync: true,
88
- }),
89
-
90
- // HTTP error observability — always after provideValtechAuth
91
- provideValtechErrorHandling(),
92
-
93
- // Cross-app session handoff — always after provideValtechAuth
94
- {
95
- provide: APP_INITIALIZER,
96
- multi: true,
97
- deps: [HandoffService],
98
- useFactory: (h: HandoffService) => () => h.detectAndExchangeHandoff(),
99
- },
100
-
101
- provideValtechI18n({
102
- defaultLanguage: 'es',
103
- supportedLanguages: ['es', 'en'],
104
- content: APP_I18N_CONTENT,
105
- }),
106
-
107
- provideValtechPresets(APP_PRESETS),
108
- provideValtechSkeleton({ animated: true }),
75
+ provideValtechFirebase(createFirebaseConfig(firebaseConfig)),
76
+ provideValtechAuth({ apiUrl: 'https://api.yourapp.com' }),
77
+ provideValtechI18n({ defaultLang: 'en', supportedLangs: ['en', 'es', 'pt'] }),
109
78
  ],
110
79
  });
111
80
  ```
112
81
 
113
- **Provider order matters:**
114
-
115
- ```
116
- provideHttpClient
117
-
118
- provideValtechFirebase (initializes Firebase app)
119
-
120
- provideValtechAuth (registers auth HTTP interceptor)
121
-
122
- provideValtechErrorHandling (registers error interceptor — composes with auth)
123
-
124
- APP_INITIALIZER handoff (depends on AuthService being configured)
125
- ```
126
-
127
82
  ---
128
83
 
129
84
  ## Components
130
85
 
131
86
  | Category | Count | Includes |
132
87
  |----------|------:|---------|
133
- | Atoms | ~24 | `val-button`, `val-text`, `val-icon`, `val-avatar`, `val-image`, `val-badge`, `val-skeleton`, `val-progress-bar`, `val-qr-code`, `val-page-waves` |
134
- | Molecules | ~81 | `val-card`, `val-input`, `val-select`, `val-date-picker`, `val-tabs`, `val-accordion`, `val-searchbar`, `val-empty-state`, `val-ticket-card`, `val-field-list`, `val-stats-bar`, `val-article-card` |
135
- | Organisms | ~31 | `val-form`, `val-data-table`, `val-bottom-nav`, `val-toolbar`, `val-menu`, `val-login`, `val-comment-section`, `val-qr-scanner`, `val-search-header`, `val-share-profile-modal`, `val-fun-modal` |
136
- | Templates | ~9 | `val-page-wrapper`, `val-page-content`, `val-auth-background`, `val-maintenance-page`, `val-docs-shell` |
137
-
138
- Components requiring a backend API: `val-login`, `val-content-reaction`.
139
-
140
- ### Buttons — presets, not factories
141
-
142
- ```html
143
- <!-- Declarative (preferred) -->
144
- <val-button preset="primary-round" [props]="{ text: 'Save' }" />
145
- <val-button preset="secondary" [props]="{ text: 'Cancel' }" />
146
- <val-button preset="danger-round" [props]="{ text: 'Delete' }" />
147
- ```
148
-
149
- Built-in presets: `primary`, `primary-round`, `primary-block`, `primary-full`, `secondary`, `secondary-round`, `solid`, `solid-round`, `solid-block`, `outline`, `outline-round`, `clear`, `clear-round`, `danger`, `danger-round`.
150
-
151
- ### Date picker
152
-
153
- Use `val-date-picker` instead of `val-date-input` or `ion-datetime` (ion-datetime has a known bug with empty day grids in modals):
154
-
155
- ```html
156
- <val-date-picker
157
- [props]="{
158
- control: myControl,
159
- label: 'Date',
160
- placeholder: 'Select date',
161
- locale: 'es-CL',
162
- firstWeekday: 1
163
- }"
164
- (valueChange)="onDate($event)"
165
- />
166
- ```
167
-
168
- Value format: `YYYY-MM-DD` (local date string, no timezone shift). If the backend returns ISO timestamps, slice to 10 chars: `value.slice(0, 10)`.
169
-
170
- ### Field list (editable repeating items)
171
-
172
- ```html
173
- <val-field-list
174
- [props]="{
175
- fields: [
176
- { name: 'name', label: 'Prize name', maxlength: 200 },
177
- { name: 'description', label: 'Description', maxlength: 300 }
178
- ],
179
- items: seedSignal(),
180
- itemLabel: 'Prize {n}',
181
- addLabel: 'Add prize'
182
- }"
183
- (itemsChange)="onItemsChange($event)"
184
- />
185
- ```
186
-
187
- Pass a **separate seed signal** for `items` — do not bind the editing signal directly (it re-seeds on every change).
188
-
189
- ### Empty / error state
88
+ | Atoms | 24 | avatar, button, icon, text, image, skeleton, progress-bar, qr-code |
89
+ | Molecules | 81 | inputs (text, email, phone, pin, date), cards, tabs, accordion, pagination… |
90
+ | Organisms | 31 | forms, data-table, menu, toolbar, login, comment-section, infinite-list… |
91
+ | Templates | 9 | page-wrapper, page-content, docs-shell, auth-background, maintenance-page |
92
+ | **Total** | **145** | |
190
93
 
191
- ```html
192
- @if (page.loading()) {
193
- <val-skeleton-layout [props]="{ preset: 'list', rows: 4 }" />
194
- } @else if (page.errorState(); as e) {
195
- <val-empty-state [props]="e" />
196
- } @else if (items().length === 0) {
197
- <val-empty-state [props]="{ variant: 'empty', title: t('emptyTitle') }" />
198
- } @else {
199
- <!-- content -->
200
- }
201
- ```
94
+ Components requiring a backend API: `LoginComponent`, `ContentReactionComponent`.
202
95
 
203
96
  ---
204
97
 
205
98
  ## Services
206
99
 
207
100
  **No setup required:**
208
- `ThemeService` · `ToastService` · `NavigationService` · `DownloadService` · `IconService` · `LocaleService` · `LocalStorageService` · `ModalService` · `ConfirmationDialogService` · `QrGeneratorService` · `PaginationService` · `SkeletonService`
101
+ `ThemeService` · `ToastService` · `NavigationService` · `DownloadService` · `IconsService` · `LocaleService` · `LocalStorageService` · `ModalService` · `ConfirmationDialogService` · `QrGeneratorService` · `PaginationService` · `SkeletonService`
209
102
 
210
103
  **Requires `provideValtechAuth`:**
211
- `AuthService` · `OAuthService` · `SessionService` · `TokenService` · `AuthStateService` · `DeviceService` · `HandoffService` · `OrgSwitchService`
104
+ `AuthService` · `OAuthService` · `SessionService` · `TokenService` · `AuthStateService` · `DeviceService`
212
105
 
213
106
  **Requires `provideValtechFirebase`:**
214
107
  `FirebaseService` · `AnalyticsService` · `FirestoreService` · `MessagingService` · `NotificationsService` · `FirebaseStorageService`
@@ -216,147 +109,23 @@ Pass a **separate seed signal** for `items` — do not bind the editing signal d
216
109
  **Requires `provideValtechI18n`:**
217
110
  `I18nService`
218
111
 
219
- **Requires `provideValtechErrorHandling`:**
220
- `ValtechErrorService`
221
-
222
112
  ---
223
113
 
224
- ## Common patterns
225
-
226
- ### Page loading state — `createPageState`
227
-
228
- Replaces ~15 lines of boilerplate (loading signal + error signal + try/catch + computed error state):
229
-
230
- ```typescript
231
- import { createPageState, connectPageRefresh } from 'valtech-components';
232
-
233
- export class MyPage {
234
- private svc = inject(MyService);
235
- private i18n = inject(I18nService);
236
- readonly items = signal<Item[]>([]);
237
-
238
- readonly page = createPageState(this.i18n, async () => {
239
- const res = await firstValueFrom(this.svc.getItems());
240
- this.items.set(res.items);
241
- });
242
-
243
- constructor() {
244
- connectPageRefresh(() => this.page.reload());
245
- }
246
- }
247
- ```
248
-
249
- `page.loading()` · `page.errorState()` · `page.reload()` — all signals/promises, ready to bind.
250
-
251
- ### Pull-to-refresh
252
-
253
- Every page that displays remote data must register a refresh handler. Use `connectPageRefresh` in the constructor — it registers and auto-cleans via `DestroyRef`:
254
-
255
- ```typescript
256
- import { connectPageRefresh, createRefreshableStream } from 'valtech-components';
257
-
258
- export class MyPage {
259
- private data = createRefreshableStream(() => this.svc.getItems());
260
- readonly items = this.data.data;
261
- readonly loading = this.data.loading;
262
-
263
- constructor() {
264
- connectPageRefresh(() => this.data.reload());
265
- }
266
- }
267
- ```
268
-
269
- ### Error handling in catch blocks
270
-
271
- ```typescript
272
- import { ValtechErrorService } from 'valtech-components';
273
-
274
- export class MyPage {
275
- private errors = inject(ValtechErrorService);
276
-
277
- async save() {
278
- try {
279
- await firstValueFrom(this.api.updateX(...));
280
- } catch (err) {
281
- this.errors.handle(err, {
282
- context: 'mypage.save',
283
- i18nMap: { BACKEND_CODE: 'i18nKey' },
284
- fallbackKey: 'saveError',
285
- i18nNamespace: 'MyNamespace',
286
- });
287
- }
288
- }
289
- }
290
- ```
291
-
292
- ### Cross-app session handoff
293
-
294
- Seamlessly transfer a logged-in session from one factory app to another:
295
-
296
- ```typescript
297
- // App A — create handoff and redirect
298
- const { url } = await handoff.createHandoff({ app: 'sigify', route: '/docs/123' });
299
- window.location.href = url;
300
-
301
- // App B — auto-handled in bootstrap via APP_INITIALIZER (see Full integration above)
302
- ```
303
-
304
- ### OAuth callback route
305
-
306
- Add this route to `app.routes.ts` if your app uses social login:
307
-
308
- ```typescript
309
- import { OAuthCallbackComponent } from 'valtech-components';
310
-
311
- { path: 'auth/oauth/callback', component: OAuthCallbackComponent }
312
- ```
313
-
314
- Without this route, post-login redirects to a 404.
315
-
316
- ### Toasts — always `color: 'dark'`
317
-
318
- ```typescript
319
- // All toasts use color: 'dark' regardless of message type
320
- this.toast.show({ message: 'Saved', color: 'dark', duration: 2000 });
321
- this.toast.show({ message: 'Error: ...', color: 'dark', duration: 3000 });
322
- ```
323
-
324
- ### Content reactions (feedback widget)
325
-
326
- ```html
327
- <val-content-reaction [props]="{
328
- entityRef: { entityType: 'blog', entityId: post.slug },
329
- question: 'Was this article helpful?',
330
- emojis: ['👎', '👍'],
331
- commentOnValues: ['negative'],
332
- allowAnonymous: true
333
- }" />
334
- ```
114
+ ## Technologies
335
115
 
336
- Requires `provideValtechFeedback({ apiUrl, appId })` in `main.ts`.
116
+ Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
337
117
 
338
118
  ---
339
119
 
340
- ## Styles
341
-
342
- Import fonts and base styles in your app's `variables.scss`:
343
-
344
- ```scss
345
- @import "valtech-components/styles/fonts.scss"; // Nunito Sans (default) + Khula (Bingo brand)
120
+ ## Development
346
121
 
347
- :root {
348
- --ion-font-family: "Nunito Sans", Arial, sans-serif;
349
- }
122
+ ```bash
123
+ npm install
124
+ npm run storybook # http://localhost:6006
125
+ npm run build # build library
126
+ npm run test # unit tests
350
127
  ```
351
128
 
352
- All `font-size` values in the lib use `rem` to respect the user's font size preference (`FontSizeService` scales the root `html` element).
353
-
354
- ---
355
-
356
- ## Technologies
357
-
358
- Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
359
-
360
129
  ---
361
130
 
362
131
  ## License
@@ -68,7 +68,7 @@ export class ModalShellComponent {
68
68
  <ion-toolbar>
69
69
  @if (showClose()) {
70
70
  <ion-buttons slot="end">
71
- <ion-button fill="clear" color="dark" (click)="onClose()">
71
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
72
72
  <strong>{{ resolvedCloseLabel() }}</strong>
73
73
  </ion-button>
74
74
  </ion-buttons>
@@ -93,7 +93,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
93
93
  <ion-toolbar>
94
94
  @if (showClose()) {
95
95
  <ion-buttons slot="end">
96
- <ion-button fill="clear" color="dark" (click)="onClose()">
96
+ <ion-button fill="clear" color="dark" shape="round" (click)="onClose()">
97
97
  <strong>{{ resolvedCloseLabel() }}</strong>
98
98
  </ion-button>
99
99
  </ion-buttons>
@@ -111,4 +111,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
111
111
  </ion-content>
112
112
  `, styles: [":host{display:contents}\n"] }]
113
113
  }] });
114
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc2hlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tb2RhbC1zaGVsbC9tb2RhbC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFtQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQWxDaEM7UUFtQ1UsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxpRkFBaUY7UUFDeEUsVUFBSyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUVuQyx1RUFBdUU7UUFDOUQsYUFBUSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXhDOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRTFDLCtEQUErRDtRQUN0RCxVQUFLLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEMsb0ZBQW9GO1FBQzNFLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztLQUtKO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzsrR0FsQ1UsbUJBQW1CO21HQUFuQixtQkFBbUIsd25CQTlCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCxtR0F0QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGdCQUFnQiwyRUFBRSxjQUFjOzs0RkErQnpGLG1CQUFtQjtrQkFsQy9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsWUFDM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25CdXR0b25zLCBJb25Db250ZW50LCBJb25IZWFkZXIsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcblxuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuLyoqXG4gKiBgdmFsLW1vZGFsLXNoZWxsYCDigJQgd3JhcHBlciBjYW7Ds25pY28gcGFyYSBtb2RhbGVzIGRlbCBmYWN0b3J5LlxuICpcbiAqIEltcGxlbWVudGEgZWwgcGF0csOzbiBvYmxpZ2F0b3JpbyBkZSBsYSBSZWdsYSAjNSAoYGZyb250ZW5kL0NMQVVERS5tZGApOlxuICogIC0gSGVhZGVyIHNpbiBgPGlvbi10aXRsZT5gLCBzb2xvIGJvdMOzbiBkZSBjaWVycmUgY29uIHRleHRvIGBDZXJyYXJgIGVuXG4gKiAgICBgc2xvdD1cImVuZFwiYC5cbiAqICAtIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCBlbiBlbCBCT0RZIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYFxuICogICAgKDMyLzI0IHB4KS5cbiAqICAtIFN1YnTDrXR1bG8gb3BjaW9uYWwgY29tbyBgdmFsLXRpdGxlIHNpemU9XCJsYXJnZVwiYCAoMjQvMTggcHgpLlxuICpcbiAqIEVsIGNvbnRlbmlkbyBkZWwgbW9kYWwgc2UgcHJveWVjdGEgdsOtYSBgPG5nLWNvbnRlbnQ+YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tb2RhbC1zaGVsbCBbdGl0bGVdPVwidGl0bGVcIiBbc3VidGl0bGVdPVwic3VidGl0bGVcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIDwhLS0gYm9keSBkZWwgbW9kYWwgLS0+XG4gKiAgIDxwPkNvbnRlbmlkby4uLjwvcD5cbiAqIDwvdmFsLW1vZGFsLXNoZWxsPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2luIHN1YnRpdGxlLCBjb24gbGFiZWwgZGUgY2llcnJlIGN1c3RvbTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtbW9kYWwtc2hlbGwgW3RpdGxlXT1cInRpdGxlXCIgW2Nsb3NlTGFiZWxdPVwiJ0ZlY2hhcidcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIC4uLlxuICogPC92YWwtbW9kYWwtc2hlbGw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1vZGFsLXNoZWxsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvbkhlYWRlciwgSW9uVG9vbGJhciwgSW9uQnV0dG9ucywgSW9uQnV0dG9uLCBJb25Db250ZW50LCBEaXNwbGF5Q29tcG9uZW50LCBUaXRsZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIEBpZiAoc2hvd0Nsb3NlKCkpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cIm9uQ2xvc2UoKVwiPlxuICAgICAgICAgICAgICA8c3Ryb25nPnt7IHJlc29sdmVkQ2xvc2VMYWJlbCgpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICAgICAgfVxuICAgICAgPC9pb24tdG9vbGJhcj5cbiAgICA8L2lvbi1oZWFkZXI+XG4gICAgPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICAgIEBpZiAodGl0bGUoKSkge1xuICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogdGl0bGUoKSwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoc3VidGl0bGUoKSkge1xuICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJ7IGNvbnRlbnQ6IHN1YnRpdGxlKCksIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICB9XG4gICAgICA8bmctY29udGVudCAvPlxuICAgIDwvaW9uLWNvbnRlbnQ+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogY29udGVudHM7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTaGVsbENvbXBvbmVudCB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG5cbiAgLyoqIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCDigJQgc2UgcmVuZGVyaXphIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYC4gKi9cbiAgcmVhZG9ubHkgdGl0bGUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcblxuICAvKiogU3VidMOtdHVsbyBvcGNpb25hbCDigJQgc2UgcmVuZGVyaXphIGNvbW8gYHZhbC10aXRsZSBzaXplPVwibGFyZ2VcImAuICovXG4gIHJlYWRvbmx5IHN1YnRpdGxlID0gaW5wdXQ8c3RyaW5nPignJyk7XG5cbiAgLyoqXG4gICAqIExhYmVsIGRlbCBib3TDs24gZGUgY2llcnJlLiBTaSBubyBzZSBwcm92ZWUsIHNlIHJlc3VlbHZlIHbDrWEgaTE4biBjb24gbGFcbiAgICogY2xhdmUgYGNsb3NlYCBkZWwgbmFtZXNwYWNlIGBfZ2xvYmFsYCAoXCJDZXJyYXJcIiAvIFwiQ2xvc2VcIiAvIFwiRmVjaGFyXCIpLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xvc2VMYWJlbCA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIC8qKlxuICAgKiBNdWVzdHJhIGVsIGJvdMOzbiBkZSBjaWVycmUgZGVsIGhlYWRlci4gYHRydWVgIHBvciBkZWZlY3RvIChlc3TDoW5kYXJcbiAgICogY2Fuw7NuaWNvKS4gU29sbyBzZSBkZXNhY3RpdmEgZW4gbW9kYWxlcyBuby1kaXNtaXNzYWJsZSAoZWouIGNvbmZpcm1hY2lvbmVzXG4gICAqIGJsb3F1ZWFudGVzIHF1ZSByZXF1aWVyZW4gcmVzcHVlc3RhIGV4cGzDrWNpdGEpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd0Nsb3NlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgLyoqIEVtaXRlIGN1YW5kbyBlbCB1c2VyIHRvY2EgZWwgYm90w7NuIGRlIGNpZXJyZSBkZWwgaGVhZGVyLiAqL1xuICByZWFkb25seSBjbG9zZSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIC8qKiBMYWJlbCBlZmVjdGl2byDigJQgdXNhIGBjbG9zZUxhYmVsYCBzaSB2aWVuZSwgc2lubyBjYWUgYWwgaTE4biBgX2dsb2JhbC5jbG9zZWAuICovXG4gIHJlYWRvbmx5IHJlc29sdmVkQ2xvc2VMYWJlbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBsYWJlbCA9IHRoaXMuY2xvc2VMYWJlbCgpO1xuICAgIGlmIChsYWJlbCkgcmV0dXJuIGxhYmVsO1xuICAgIHJldHVybiB0aGlzLmkxOG4udCgnY2xvc2UnLCAnX2dsb2JhbCcpO1xuICB9KTtcblxuICBvbkNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG59XG4iXX0=
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtc2hlbGwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL21vbGVjdWxlcy9tb2RhbC1zaGVsbC9tb2RhbC1zaGVsbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUVyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFtQ0gsTUFBTSxPQUFPLG1CQUFtQjtJQWxDaEM7UUFtQ1UsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxpRkFBaUY7UUFDeEUsVUFBSyxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUVuQyx1RUFBdUU7UUFDOUQsYUFBUSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztRQUV0Qzs7O1dBR0c7UUFDTSxlQUFVLEdBQUcsS0FBSyxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBRXhDOzs7O1dBSUc7UUFDTSxjQUFTLEdBQUcsS0FBSyxDQUFVLElBQUksQ0FBQyxDQUFDO1FBRTFDLCtEQUErRDtRQUN0RCxVQUFLLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFFaEMsb0ZBQW9GO1FBQzNFLHVCQUFrQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hDLElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUMsQ0FBQztLQUtKO0lBSEMsT0FBTztRQUNMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzsrR0FsQ1UsbUJBQW1CO21HQUFuQixtQkFBbUIsd25CQTlCcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCxtR0F0QlMsU0FBUyxvR0FBRSxVQUFVLG1GQUFFLFVBQVUsOEVBQUUsU0FBUyxvUEFBRSxVQUFVLHdLQUFFLGdCQUFnQiwyRUFBRSxjQUFjOzs0RkErQnpGLG1CQUFtQjtrQkFsQy9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsWUFDM0Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25CdXR0b25zLCBJb25Db250ZW50LCBJb25IZWFkZXIsIElvblRvb2xiYXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcblxuaW1wb3J0IHsgRGlzcGxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Rpc3BsYXkvZGlzcGxheS5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuLyoqXG4gKiBgdmFsLW1vZGFsLXNoZWxsYCDigJQgd3JhcHBlciBjYW7Ds25pY28gcGFyYSBtb2RhbGVzIGRlbCBmYWN0b3J5LlxuICpcbiAqIEltcGxlbWVudGEgZWwgcGF0csOzbiBvYmxpZ2F0b3JpbyBkZSBsYSBSZWdsYSAjNSAoYGZyb250ZW5kL0NMQVVERS5tZGApOlxuICogIC0gSGVhZGVyIHNpbiBgPGlvbi10aXRsZT5gLCBzb2xvIGJvdMOzbiBkZSBjaWVycmUgY29uIHRleHRvIGBDZXJyYXJgIGVuXG4gKiAgICBgc2xvdD1cImVuZFwiYC5cbiAqICAtIFTDrXR1bG8gcHJpbmNpcGFsIGRlbCBtb2RhbCBlbiBlbCBCT0RZIGNvbW8gYHZhbC1kaXNwbGF5IHNpemU9XCJzbWFsbFwiYFxuICogICAgKDMyLzI0IHB4KS5cbiAqICAtIFN1YnTDrXR1bG8gb3BjaW9uYWwgY29tbyBgdmFsLXRpdGxlIHNpemU9XCJsYXJnZVwiYCAoMjQvMTggcHgpLlxuICpcbiAqIEVsIGNvbnRlbmlkbyBkZWwgbW9kYWwgc2UgcHJveWVjdGEgdsOtYSBgPG5nLWNvbnRlbnQ+YC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1tb2RhbC1zaGVsbCBbdGl0bGVdPVwidGl0bGVcIiBbc3VidGl0bGVdPVwic3VidGl0bGVcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIDwhLS0gYm9keSBkZWwgbW9kYWwgLS0+XG4gKiAgIDxwPkNvbnRlbmlkby4uLjwvcD5cbiAqIDwvdmFsLW1vZGFsLXNoZWxsPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgU2luIHN1YnRpdGxlLCBjb24gbGFiZWwgZGUgY2llcnJlIGN1c3RvbTpcbiAqIGBgYGh0bWxcbiAqIDx2YWwtbW9kYWwtc2hlbGwgW3RpdGxlXT1cInRpdGxlXCIgW2Nsb3NlTGFiZWxdPVwiJ0ZlY2hhcidcIiAoY2xvc2UpPVwiZGlzbWlzcygpXCI+XG4gKiAgIC4uLlxuICogPC92YWwtbW9kYWwtc2hlbGw+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLW1vZGFsLXNoZWxsJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0lvbkhlYWRlciwgSW9uVG9vbGJhciwgSW9uQnV0dG9ucywgSW9uQnV0dG9uLCBJb25Db250ZW50LCBEaXNwbGF5Q29tcG9uZW50LCBUaXRsZUNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1oZWFkZXI+XG4gICAgICA8aW9uLXRvb2xiYXI+XG4gICAgICAgIEBpZiAoc2hvd0Nsb3NlKCkpIHtcbiAgICAgICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz57eyByZXNvbHZlZENsb3NlTGFiZWwoKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDwvaW9uLWJ1dHRvbnM+XG4gICAgICAgIH1cbiAgICAgIDwvaW9uLXRvb2xiYXI+XG4gICAgPC9pb24taGVhZGVyPlxuICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XG4gICAgICBAaWYgKHRpdGxlKCkpIHtcbiAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHRpdGxlKCksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICB9XG4gICAgICBAaWYgKHN1YnRpdGxlKCkpIHtcbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiBzdWJ0aXRsZSgpLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgfVxuICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICA8L2lvbi1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIE1vZGFsU2hlbGxDb21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIC8qKiBUw610dWxvIHByaW5jaXBhbCBkZWwgbW9kYWwg4oCUIHNlIHJlbmRlcml6YSBjb21vIGB2YWwtZGlzcGxheSBzaXplPVwic21hbGxcImAuICovXG4gIHJlYWRvbmx5IHRpdGxlID0gaW5wdXQ8c3RyaW5nPignJyk7XG5cbiAgLyoqIFN1YnTDrXR1bG8gb3BjaW9uYWwg4oCUIHNlIHJlbmRlcml6YSBjb21vIGB2YWwtdGl0bGUgc2l6ZT1cImxhcmdlXCJgLiAqL1xuICByZWFkb25seSBzdWJ0aXRsZSA9IGlucHV0PHN0cmluZz4oJycpO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBkZWwgYm90w7NuIGRlIGNpZXJyZS4gU2kgbm8gc2UgcHJvdmVlLCBzZSByZXN1ZWx2ZSB2w61hIGkxOG4gY29uIGxhXG4gICAqIGNsYXZlIGBjbG9zZWAgZGVsIG5hbWVzcGFjZSBgX2dsb2JhbGAgKFwiQ2VycmFyXCIgLyBcIkNsb3NlXCIgLyBcIkZlY2hhclwiKS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3NlTGFiZWwgPSBpbnB1dDxzdHJpbmc+KCcnKTtcblxuICAvKipcbiAgICogTXVlc3RyYSBlbCBib3TDs24gZGUgY2llcnJlIGRlbCBoZWFkZXIuIGB0cnVlYCBwb3IgZGVmZWN0byAoZXN0w6FuZGFyXG4gICAqIGNhbsOzbmljbykuIFNvbG8gc2UgZGVzYWN0aXZhIGVuIG1vZGFsZXMgbm8tZGlzbWlzc2FibGUgKGVqLiBjb25maXJtYWNpb25lc1xuICAgKiBibG9xdWVhbnRlcyBxdWUgcmVxdWllcmVuIHJlc3B1ZXN0YSBleHBsw61jaXRhKS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3dDbG9zZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuXG4gIC8qKiBFbWl0ZSBjdWFuZG8gZWwgdXNlciB0b2NhIGVsIGJvdMOzbiBkZSBjaWVycmUgZGVsIGhlYWRlci4gKi9cbiAgcmVhZG9ubHkgY2xvc2UgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICAvKiogTGFiZWwgZWZlY3Rpdm8g4oCUIHVzYSBgY2xvc2VMYWJlbGAgc2kgdmllbmUsIHNpbm8gY2FlIGFsIGkxOG4gYF9nbG9iYWwuY2xvc2VgLiAqL1xuICByZWFkb25seSByZXNvbHZlZENsb3NlTGFiZWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmNsb3NlTGFiZWwoKTtcbiAgICBpZiAobGFiZWwpIHJldHVybiBsYWJlbDtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoJ2Nsb3NlJywgJ19nbG9iYWwnKTtcbiAgfSk7XG5cbiAgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxufVxuIl19
@@ -121,7 +121,7 @@ export class SearchSelectorComponent {
121
121
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
122
122
  }
123
123
  </ion-select>
124
- `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:.625rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
124
+ `, isInline: true, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:1.5rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: IonSelect, selector: "ion-select", inputs: ["cancelText", "color", "compareWith", "disabled", "errorText", "expandedIcon", "fill", "helperText", "interface", "interfaceOptions", "justify", "label", "labelPlacement", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "shape", "toggleIcon", "value"] }, { kind: "component", type: IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }] }); }
125
125
  }
126
126
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SearchSelectorComponent, decorators: [{
127
127
  type: Component,
@@ -139,10 +139,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
139
139
  <ion-select-option [value]="o.id">{{ o.name }}</ion-select-option>
140
140
  }
141
141
  </ion-select>
142
- `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:.625rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"] }]
142
+ `, styles: ["@charset \"UTF-8\";:root{--val-container-sm: 540px;--val-container-md: 720px;--val-container-lg: 880px;--val-container-xl: 1100px;--val-container-padding: 16px;--ion-color-primary: #7026df;--ion-color-primary-rgb: 112, 38, 223;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #6321c4;--ion-color-primary-tint: #7e3ce2;--ion-color-secondary: #e2ccff;--ion-color-secondary-rgb: 226, 204, 255;--ion-color-secondary-contrast: #000000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #c7b4e0;--ion-color-secondary-tint: #e5d1ff;--ion-color-texti: #354c69;--ion-color-texti-rgb: 53, 76, 105;--ion-color-texti-contrast: #ffffff;--ion-color-texti-contrast-rgb: 255, 255, 255;--ion-color-texti-shade: #2f435c;--ion-color-texti-tint: #495e78;--ion-color-darki: #090f1b;--ion-color-darki-rgb: 9, 15, 27;--ion-color-darki-contrast: #ffffff;--ion-color-darki-contrast-rgb: 255, 255, 255;--ion-color-darki-shade: #080d18;--ion-color-darki-tint: #222732;--ion-color-medium: #9e9e9e;--ion-color-medium-rgb: 158, 158, 158;--ion-color-medium-contrast: #000000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #8b8b8b;--ion-color-medium-tint: #a8a8a8;--swiper-pagination-color: var(--ion-color-primary);--swiper-navigation-color: var(--ion-color-primary);--swiper-pagination-bullet-inactive-color: var(--ion-color-medium)}body.dark,html.ion-palette-dark,body[data-theme=dark]{--ion-color-texti: #8fc1ff;--ion-color-texti-rgb: 143, 193, 255;--ion-color-texti-contrast: #000000;--ion-color-texti-contrast-rgb: 0, 0, 0;--ion-color-texti-shade: #7eaae0;--ion-color-texti-tint: #9ac7ff;--ion-color-darki: #ffffff;--ion-color-darki-rgb: 255, 255, 255;--ion-color-darki-contrast: #000000;--ion-color-darki-contrast-rgb: 0, 0, 0;--ion-color-darki-shade: #e0e0e0;--ion-color-darki-tint: #ffffff;--ion-color-primary: #8f49f8;--ion-color-primary-rgb: 143, 73, 248;--ion-color-primary-contrast: #ffffff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #7e40da;--ion-color-primary-tint: #9a5bf9}.ion-color-texti{--ion-color-base: var(--ion-color-texti);--ion-color-base-rgb: var(--ion-color-texti-rgb);--ion-color-contrast: var(--ion-color-texti-contrast);--ion-color-contrast-rgb: var(--ion-color-texti-contrast-rgb);--ion-color-shade: var(--ion-color-texti-shade);--ion-color-tint: var(--ion-color-texti-tint)}.ion-color-darki{--ion-color-base: var(--ion-color-darki);--ion-color-base-rgb: var(--ion-color-darki-rgb);--ion-color-contrast: var(--ion-color-darki-contrast);--ion-color-contrast-rgb: var(--ion-color-darki-contrast-rgb);--ion-color-shade: var(--ion-color-darki-shade);--ion-color-tint: var(--ion-color-darki-tint)}ion-select{--padding-top: 0;--padding-bottom: 0;--padding-start: 0;--padding-end: 0;min-height:auto;border:.0625rem solid var(--ion-color-medium);border-radius:1.5rem;margin-top:.375rem;padding-top:.5rem!important;padding-bottom:.5rem!important;padding-inline-start:1rem!important;padding-inline-end:.625rem!important}\n"] }]
143
143
  }], propDecorators: { preset: [{
144
144
  type: Input
145
145
  }], props: [{
146
146
  type: Input
147
147
  }] } });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvc2VsZWN0LWlucHV0L3NlbGVjdC1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQXdCMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUE5Q3BDO1FBK0NVLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsWUFBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQVd4Qzs7Ozs7Ozs7OztXQVVHO1FBQ00sVUFBSyxHQUEyQixFQUFFLENBQUM7UUFFNUM7O1dBRUc7UUFDSCxrQkFBYSxHQUFrQixFQUFtQixDQUFDO0tBbUVwRDtJQTVEQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFaEgsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixHQUFHLFdBQVc7WUFDZCxHQUFHLElBQUksQ0FBQyxLQUFLO1NBQ0csQ0FBQztJQUNyQixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDakUsMEJBQTBCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFN0csSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDckIsaUJBQWlCLEVBQUUsR0FBRztTQUN2QixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFFL0Qsb0RBQW9EO1FBQ3BELHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsOERBQThEO1FBQzlELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFdBQVcsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzsrR0EvRlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsK0lBMUN4Qjs7Ozs7Ozs7Ozs7Ozs7R0FjVCxtakdBZlMsbUJBQW1CLDBUQUFFLFNBQVMsa1ZBQUUsZUFBZTs7NEZBMkM5Qyx1QkFBdUI7a0JBOUNuQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLFlBQ2hEOzs7Ozs7Ozs7Ozs7OztHQWNUOzhCQXVDUSxNQUFNO3NCQUFkLEtBQUs7Z0JBYUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGFwcGx5RGVmYXVsdFZhbHVlVG9Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2Zvcm0tZGVmYXVsdHMnO1xuaW1wb3J0IHsgSW9uU2VsZWN0LCBJb25TZWxlY3RPcHRpb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcHJlc2V0cyc7XG5pbXBvcnQgeyBJbnB1dE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc2VsZWN0LWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIElvblNlbGVjdCwgSW9uU2VsZWN0T3B0aW9uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLXNlbGVjdFxuICAgICAgW2Zvcm1Db250cm9sXT1cInJlc29sdmVkUHJvcHMuY29udHJvbFwiXG4gICAgICBbbGFiZWxdPVwicmVzb2x2ZWRQcm9wcy5sYWJlbFwiXG4gICAgICBbaW50ZXJmYWNlT3B0aW9uc109XCJjdXN0b21Qb3BvdmVyT3B0aW9uc1wiXG4gICAgICBbaW50ZXJmYWNlXT1cInJlc29sdmVkUHJvcHMuc2VsZWN0SW50ZXJmYWNlIHx8ICdwb3BvdmVyJ1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicmVzb2x2ZWRQcm9wcy5wbGFjZWhvbGRlclwiXG4gICAgICBbY2FuY2VsVGV4dF09XCJjYW5jZWxUZXh0XCJcbiAgICAgIFtva1RleHRdPVwib2tUZXh0XCJcbiAgICA+XG4gICAgICBAZm9yIChvIG9mIHJlc29sdmVkUHJvcHMub3B0aW9uczsgdHJhY2sgby5pZCkge1xuICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIm8uaWRcIj57eyBvLm5hbWUgfX08L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvaW9uLXNlbGVjdD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuLyoqXG4gKiB2YWwtc2VsZWN0LWlucHV0XG4gKlxuICogQSBzZWxlY3QvZHJvcGRvd24gaW5wdXQgaW50ZWdyYXRlZCB3aXRoIEFuZ3VsYXIgZm9ybXMsIHVzaW5nIElvbmljJ3Mgc2VsZWN0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIHByZXNldHMgZm9yIHJldXNhYmxlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlIFdpdGggcHJlc2V0IChyZWNvbW1lbmRlZCk6XG4gKiA8dmFsLXNlbGVjdC1pbnB1dCBwcmVzZXQ9XCJmb3JtLWZpZWxkXCIgW3Byb3BzXT1cIntcbiAqICAgY29udHJvbDogbXlDb250cm9sLFxuICogICBsYWJlbDogJ1NlbGVjY2lvbmFyJyxcbiAqICAgb3B0aW9uczogW3sgaWQ6ICcxJywgbmFtZTogJ09wY2nDs24gMScgfV1cbiAqIH1cIj48L3ZhbC1zZWxlY3QtaW5wdXQ+XG4gKlxuICogQGV4YW1wbGUgU3RhdGljIChiYWNrd2FyZHMgY29tcGF0aWJsZSk6XG4gKiA8dmFsLXNlbGVjdC1pbnB1dCBbcHJvcHNdPVwie1xuICogICBjb250cm9sOiBteUNvbnRyb2wsXG4gKiAgIGxhYmVsOiAnU2VsZWNjaW9uYXInLFxuICogICBvcHRpb25zOiBbeyBpZDogJzEnLCBuYW1lOiAnT3BjacOzbiAxJyB9XSxcbiAqICAgY2FuY2VsVGV4dDogJ0NhbmNlbGFyJyxcbiAqICAgb2tUZXh0OiAnQWNlcHRhcidcbiAqIH1cIj48L3ZhbC1zZWxlY3QtaW5wdXQ+XG4gKlxuICogQGlucHV0IHByZXNldDogc3RyaW5nIC0gTmFtZSBvZiBwcmVzZXQgdG8gYXBwbHkgKGUuZy4sICdmb3JtLWZpZWxkJylcbiAqIEBpbnB1dCBwcm9wczogSW5wdXRNZXRhZGF0YSAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZWxlY3QgaW5wdXQgKG92ZXJyaWRlcyBwcmVzZXQgdmFsdWVzKVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoU2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcHJlc2V0cyA9IGluamVjdChQcmVzZXRTZXJ2aWNlKTtcblxuICAvKipcbiAgICogUHJlc2V0IG5hbWUgdG8gYXBwbHkuIFByZXNldHMgZGVmaW5lIHJldXNhYmxlIGlucHV0IGNvbmZpZ3VyYXRpb25zXG4gICAqIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYXBwIGxldmVsIHZpYSBwcm92aWRlVmFsdGVjaFByZXNldHMoKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogPHZhbC1zZWxlY3QtaW5wdXQgcHJlc2V0PVwiZm9ybS1maWVsZFwiIFtwcm9wc109XCJ7IGNvbnRyb2w6IGN0cmwsIG9wdGlvbnM6IG9wdHMgfVwiPjwvdmFsLXNlbGVjdC1pbnB1dD5cbiAgICovXG4gIEBJbnB1dCgpIHByZXNldD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5wdXQgY29uZmlndXJhdGlvbiBvYmplY3QuIFZhbHVlcyBoZXJlIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuXG4gICAqIEB0eXBlIHtJbnB1dE1ldGFkYXRhfVxuICAgKiBAcHJvcGVydHkgY29udHJvbCAtIFRoZSBBbmd1bGFyIEZvcm1Db250cm9sIGZvciB0aGUgc2VsZWN0IGlucHV0LlxuICAgKiBAcHJvcGVydHkgbGFiZWwgLSBUaGUgbGFiZWwgZm9yIHRoZSBzZWxlY3QuXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGUgc2VsZWN0LlxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXIgLSBUaGUgcGxhY2Vob2xkZXIgdGV4dC5cbiAgICogQHByb3BlcnR5IG1vZGFsSGVhZGVyIC0gQ3VzdG9tIGhlYWRlciB0ZXh0IGZvciB0aGUgbW9kYWwgKG9wdGlvbmFsLCB1c2VzIGxhYmVsIGlmIG5vdCBwcm92aWRlZCkuXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxUZXh0IC0gQ3VzdG9tIGNhbmNlbCBidXR0b24gdGV4dCAoZGVmYXVsdDogJ0NhbmNlbGFyJykuXG4gICAqIEBwcm9wZXJ0eSBva1RleHQgLSBDdXN0b20gT0sgYnV0dG9uIHRleHQgKGRlZmF1bHQ6ICdBY2VwdGFyJykuXG4gICAqL1xuICBASW5wdXQoKSBwcm9wczogUGFydGlhbDxJbnB1dE1ldGFkYXRhPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlZCBwcm9wcyBhZnRlciBtZXJnaW5nIHByZXNldCArIGV4cGxpY2l0IHByb3BzLlxuICAgKi9cbiAgcmVzb2x2ZWRQcm9wczogSW5wdXRNZXRhZGF0YSA9IHt9IGFzIElucHV0TWV0YWRhdGE7XG5cbiAgY3VzdG9tTW9kYWxPcHRpb25zOiB7IGhlYWRlcjogc3RyaW5nOyBicmVha3BvaW50czogbnVtYmVyW107IGluaXRpYWxCcmVha3BvaW50OiBudW1iZXIgfTtcbiAgY3VzdG9tUG9wb3Zlck9wdGlvbnM6IHsgY3NzQ2xhc3M6IHN0cmluZyB9O1xuICBjYW5jZWxUZXh0OiBzdHJpbmc7XG4gIG9rVGV4dDogc3RyaW5nO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVzb2x2ZVByb3BzKCk7XG4gICAgdGhpcy5zZXR1cENvbXBvbmVudCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwcmVzZXQnXSB8fCBjaGFuZ2VzWydwcm9wcyddKSB7XG4gICAgICB0aGlzLnJlc29sdmVQcm9wcygpO1xuICAgICAgdGhpcy5zZXR1cENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBwcmVzZXQgY29uZmlndXJhdGlvbiB3aXRoIGV4cGxpY2l0IHByb3BzLlxuICAgKiBFeHBsaWNpdCBwcm9wcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBwcmVzZXQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUHJvcHMoKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc2V0UHJvcHMgPSB0aGlzLnByZXNldCA/ICh0aGlzLnByZXNldHMuZ2V0KCdzZWxlY3RJbnB1dCcsIHRoaXMucHJlc2V0KSBhcyBQYXJ0aWFsPElucHV0TWV0YWRhdGE+KSA6IHt9O1xuXG4gICAgdGhpcy5yZXNvbHZlZFByb3BzID0ge1xuICAgICAgLi4ucHJlc2V0UHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgIH0gYXMgSW5wdXRNZXRhZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWRQcm9wcz8ud2l0aERlZmF1bHQgfHwgdGhpcy5yZXNvbHZlZFByb3BzPy52YWx1ZSkge1xuICAgICAgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wodGhpcy5yZXNvbHZlZFByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbW9kYWwgaGVhZGVyIGZyb20gcHJvcHMgb3IgdXNlIGxhYmVsIGFzIGZhbGxiYWNrLCB0aGVuIGkxOG4gZGVmYXVsdFxuICAgIGNvbnN0IGhlYWRlclRleHQgPSB0aGlzLnJlc29sdmVkUHJvcHMubW9kYWxIZWFkZXIgfHwgdGhpcy5yZXNvbHZlZFByb3BzLmxhYmVsIHx8IHRoaXMuaTE4bi50KCdzZWxlY3RPcHRpb24nKTtcblxuICAgIHRoaXMuY3VzdG9tTW9kYWxPcHRpb25zID0ge1xuICAgICAgaGVhZGVyOiBoZWFkZXJUZXh0LFxuICAgICAgYnJlYWtwb2ludHM6IFswLCAwLjZdLFxuICAgICAgaW5pdGlhbEJyZWFrcG9pbnQ6IDAuNixcbiAgICB9O1xuICAgIHRoaXMuY3VzdG9tUG9wb3Zlck9wdGlvbnMgPSB7IGNzc0NsYXNzOiAndmFsLXNlbGVjdC1wb3BvdmVyJyB9O1xuXG4gICAgLy8gU2V0IGJ1dHRvbiB0ZXh0cyBmcm9tIHByb3BzIG9yIHVzZSBpMThuIGRlZmF1bHRzLlxuICAgIC8vIEZhbGxiYWNrIGNoYWluOiBuYW1lc3BhY2UtbGVzcyBpMThuIOKGkiAnQ29tbW9uJyBuYW1lc3BhY2Ug4oaSIGhhcmRjb2RlZC5cbiAgICAvLyBFbCBuYW1lc3BhY2UtbGVzcyBidXNjYSBlbiBfZ2xvYmFsOyBzaSBubyBleGlzdGUgKGNhc28gdHlwaWNhbCBhcHApLFxuICAgIC8vIHByb2JhbW9zIGVuICdDb21tb24nIHF1ZSBsYSBtYXlvcsOtYSBkZSBhcHBzIHRpZW5lbiBwb2JsYWRvLlxuICAgIHRoaXMuY2FuY2VsVGV4dCA9IHRoaXMucmVzb2x2ZWRQcm9wcy5jYW5jZWxUZXh0IHx8IHRoaXMucmVzb2x2ZUkxOG4oJ2NhbmNlbCcsICdDYW5jZWxhcicpO1xuICAgIHRoaXMub2tUZXh0ID0gdGhpcy5yZXNvbHZlZFByb3BzLm9rVGV4dCB8fCB0aGlzLnJlc29sdmVJMThuKCdvaycsICdPSycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1c2NhIHVuIGtleSBlbiBgX2dsb2JhbGAgcHJpbWVybywgbHVlZ28gZW4gYENvbW1vbmAsIGZpbmFsbWVudGUgY2FlIGFsXG4gICAqIGRlZmF1bHQgaGFyZGNvZGVkLiDDmnRpbCBwYXJhIHRleHRvcyBjcm9zcy1jdXR0aW5nIChjYW5jZWwvb2svY2xvc2UvZXRjLilcbiAgICogc2luIG9ibGlnYXIgYSBjYWRhIGFwcCBhIGR1cGxpY2FybG9zIGVuIGNhZGEgbmFtZXNwYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlSTE4bihrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJ5R2xvYmFsID0gdGhpcy5pMThuLnQoa2V5KTtcbiAgICBpZiAodHJ5R2xvYmFsICYmICF0cnlHbG9iYWwuc3RhcnRzV2l0aCgnWycpKSByZXR1cm4gdHJ5R2xvYmFsO1xuICAgIGNvbnN0IHRyeUNvbW1vbiA9IHRoaXMuaTE4bi50KGtleSwgJ0NvbW1vbicpO1xuICAgIGlmICh0cnlDb21tb24gJiYgIXRyeUNvbW1vbi5zdGFydHNXaXRoKCdbJykpIHJldHVybiB0cnlDb21tb247XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG59XG4iXX0=
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvc2VsZWN0LWlucHV0L3NlbGVjdC1pbnB1dC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFvQyxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQXdCMUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUE5Q3BDO1FBK0NVLFNBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDM0IsWUFBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQVd4Qzs7Ozs7Ozs7OztXQVVHO1FBQ00sVUFBSyxHQUEyQixFQUFFLENBQUM7UUFFNUM7O1dBRUc7UUFDSCxrQkFBYSxHQUFrQixFQUFtQixDQUFDO0tBbUVwRDtJQTVEQyxRQUFRO1FBQ04sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxZQUFZO1FBQ2xCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFaEgsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixHQUFHLFdBQVc7WUFDZCxHQUFHLElBQUksQ0FBQyxLQUFLO1NBQ0csQ0FBQztJQUNyQixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsV0FBVyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDakUsMEJBQTBCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFFRCwwRUFBMEU7UUFDMUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFN0csSUFBSSxDQUFDLGtCQUFrQixHQUFHO1lBQ3hCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUM7WUFDckIsaUJBQWlCLEVBQUUsR0FBRztTQUN2QixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFFLENBQUM7UUFFL0Qsb0RBQW9EO1FBQ3BELHdFQUF3RTtRQUN4RSx1RUFBdUU7UUFDdkUsOERBQThEO1FBQzlELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFdBQVcsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDL0MsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDOUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzsrR0EvRlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsK0lBMUN4Qjs7Ozs7Ozs7Ozs7Ozs7R0FjVCxrakdBZlMsbUJBQW1CLDBUQUFFLFNBQVMsa1ZBQUUsZUFBZTs7NEZBMkM5Qyx1QkFBdUI7a0JBOUNuQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1AsQ0FBQyxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxDQUFDLFlBQ2hEOzs7Ozs7Ozs7Ozs7OztHQWNUOzhCQXVDUSxNQUFNO3NCQUFkLEtBQUs7Z0JBYUcsS0FBSztzQkFBYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGFwcGx5RGVmYXVsdFZhbHVlVG9Db250cm9sIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2Zvcm0tZGVmYXVsdHMnO1xuaW1wb3J0IHsgSW9uU2VsZWN0LCBJb25TZWxlY3RPcHRpb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBQcmVzZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcHJlc2V0cyc7XG5pbXBvcnQgeyBJbnB1dE1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc2VsZWN0LWlucHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIElvblNlbGVjdCwgSW9uU2VsZWN0T3B0aW9uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW9uLXNlbGVjdFxuICAgICAgW2Zvcm1Db250cm9sXT1cInJlc29sdmVkUHJvcHMuY29udHJvbFwiXG4gICAgICBbbGFiZWxdPVwicmVzb2x2ZWRQcm9wcy5sYWJlbFwiXG4gICAgICBbaW50ZXJmYWNlT3B0aW9uc109XCJjdXN0b21Qb3BvdmVyT3B0aW9uc1wiXG4gICAgICBbaW50ZXJmYWNlXT1cInJlc29sdmVkUHJvcHMuc2VsZWN0SW50ZXJmYWNlIHx8ICdwb3BvdmVyJ1wiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicmVzb2x2ZWRQcm9wcy5wbGFjZWhvbGRlclwiXG4gICAgICBbY2FuY2VsVGV4dF09XCJjYW5jZWxUZXh0XCJcbiAgICAgIFtva1RleHRdPVwib2tUZXh0XCJcbiAgICA+XG4gICAgICBAZm9yIChvIG9mIHJlc29sdmVkUHJvcHMub3B0aW9uczsgdHJhY2sgby5pZCkge1xuICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gW3ZhbHVlXT1cIm8uaWRcIj57eyBvLm5hbWUgfX08L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgfVxuICAgIDwvaW9uLXNlbGVjdD5cbiAgYCxcbiAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0LWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuLyoqXG4gKiB2YWwtc2VsZWN0LWlucHV0XG4gKlxuICogQSBzZWxlY3QvZHJvcGRvd24gaW5wdXQgaW50ZWdyYXRlZCB3aXRoIEFuZ3VsYXIgZm9ybXMsIHVzaW5nIElvbmljJ3Mgc2VsZWN0IGNvbXBvbmVudC5cbiAqIFN1cHBvcnRzIHByZXNldHMgZm9yIHJldXNhYmxlIGNvbmZpZ3VyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlIFdpdGggcHJlc2V0IChyZWNvbW1lbmRlZCk6XG4gKiA8dmFsLXNlbGVjdC1pbnB1dCBwcmVzZXQ9XCJmb3JtLWZpZWxkXCIgW3Byb3BzXT1cIntcbiAqICAgY29udHJvbDogbXlDb250cm9sLFxuICogICBsYWJlbDogJ1NlbGVjY2lvbmFyJyxcbiAqICAgb3B0aW9uczogW3sgaWQ6ICcxJywgbmFtZTogJ09wY2nDs24gMScgfV1cbiAqIH1cIj48L3ZhbC1zZWxlY3QtaW5wdXQ+XG4gKlxuICogQGV4YW1wbGUgU3RhdGljIChiYWNrd2FyZHMgY29tcGF0aWJsZSk6XG4gKiA8dmFsLXNlbGVjdC1pbnB1dCBbcHJvcHNdPVwie1xuICogICBjb250cm9sOiBteUNvbnRyb2wsXG4gKiAgIGxhYmVsOiAnU2VsZWNjaW9uYXInLFxuICogICBvcHRpb25zOiBbeyBpZDogJzEnLCBuYW1lOiAnT3BjacOzbiAxJyB9XSxcbiAqICAgY2FuY2VsVGV4dDogJ0NhbmNlbGFyJyxcbiAqICAgb2tUZXh0OiAnQWNlcHRhcidcbiAqIH1cIj48L3ZhbC1zZWxlY3QtaW5wdXQ+XG4gKlxuICogQGlucHV0IHByZXNldDogc3RyaW5nIC0gTmFtZSBvZiBwcmVzZXQgdG8gYXBwbHkgKGUuZy4sICdmb3JtLWZpZWxkJylcbiAqIEBpbnB1dCBwcm9wczogSW5wdXRNZXRhZGF0YSAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzZWxlY3QgaW5wdXQgKG92ZXJyaWRlcyBwcmVzZXQgdmFsdWVzKVxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoU2VsZWN0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcHJlc2V0cyA9IGluamVjdChQcmVzZXRTZXJ2aWNlKTtcblxuICAvKipcbiAgICogUHJlc2V0IG5hbWUgdG8gYXBwbHkuIFByZXNldHMgZGVmaW5lIHJldXNhYmxlIGlucHV0IGNvbmZpZ3VyYXRpb25zXG4gICAqIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgYXQgYXBwIGxldmVsIHZpYSBwcm92aWRlVmFsdGVjaFByZXNldHMoKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogPHZhbC1zZWxlY3QtaW5wdXQgcHJlc2V0PVwiZm9ybS1maWVsZFwiIFtwcm9wc109XCJ7IGNvbnRyb2w6IGN0cmwsIG9wdGlvbnM6IG9wdHMgfVwiPjwvdmFsLXNlbGVjdC1pbnB1dD5cbiAgICovXG4gIEBJbnB1dCgpIHByZXNldD86IHN0cmluZztcblxuICAvKipcbiAgICogSW5wdXQgY29uZmlndXJhdGlvbiBvYmplY3QuIFZhbHVlcyBoZXJlIG92ZXJyaWRlIHByZXNldCB2YWx1ZXMuXG4gICAqIEB0eXBlIHtJbnB1dE1ldGFkYXRhfVxuICAgKiBAcHJvcGVydHkgY29udHJvbCAtIFRoZSBBbmd1bGFyIEZvcm1Db250cm9sIGZvciB0aGUgc2VsZWN0IGlucHV0LlxuICAgKiBAcHJvcGVydHkgbGFiZWwgLSBUaGUgbGFiZWwgZm9yIHRoZSBzZWxlY3QuXG4gICAqIEBwcm9wZXJ0eSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zIGZvciB0aGUgc2VsZWN0LlxuICAgKiBAcHJvcGVydHkgcGxhY2Vob2xkZXIgLSBUaGUgcGxhY2Vob2xkZXIgdGV4dC5cbiAgICogQHByb3BlcnR5IG1vZGFsSGVhZGVyIC0gQ3VzdG9tIGhlYWRlciB0ZXh0IGZvciB0aGUgbW9kYWwgKG9wdGlvbmFsLCB1c2VzIGxhYmVsIGlmIG5vdCBwcm92aWRlZCkuXG4gICAqIEBwcm9wZXJ0eSBjYW5jZWxUZXh0IC0gQ3VzdG9tIGNhbmNlbCBidXR0b24gdGV4dCAoZGVmYXVsdDogJ0NhbmNlbGFyJykuXG4gICAqIEBwcm9wZXJ0eSBva1RleHQgLSBDdXN0b20gT0sgYnV0dG9uIHRleHQgKGRlZmF1bHQ6ICdBY2VwdGFyJykuXG4gICAqL1xuICBASW5wdXQoKSBwcm9wczogUGFydGlhbDxJbnB1dE1ldGFkYXRhPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlZCBwcm9wcyBhZnRlciBtZXJnaW5nIHByZXNldCArIGV4cGxpY2l0IHByb3BzLlxuICAgKi9cbiAgcmVzb2x2ZWRQcm9wczogSW5wdXRNZXRhZGF0YSA9IHt9IGFzIElucHV0TWV0YWRhdGE7XG5cbiAgY3VzdG9tTW9kYWxPcHRpb25zOiB7IGhlYWRlcjogc3RyaW5nOyBicmVha3BvaW50czogbnVtYmVyW107IGluaXRpYWxCcmVha3BvaW50OiBudW1iZXIgfTtcbiAgY3VzdG9tUG9wb3Zlck9wdGlvbnM6IHsgY3NzQ2xhc3M6IHN0cmluZyB9O1xuICBjYW5jZWxUZXh0OiBzdHJpbmc7XG4gIG9rVGV4dDogc3RyaW5nO1xuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVzb2x2ZVByb3BzKCk7XG4gICAgdGhpcy5zZXR1cENvbXBvbmVudCgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwcmVzZXQnXSB8fCBjaGFuZ2VzWydwcm9wcyddKSB7XG4gICAgICB0aGlzLnJlc29sdmVQcm9wcygpO1xuICAgICAgdGhpcy5zZXR1cENvbXBvbmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXJnZSBwcmVzZXQgY29uZmlndXJhdGlvbiB3aXRoIGV4cGxpY2l0IHByb3BzLlxuICAgKiBFeHBsaWNpdCBwcm9wcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBwcmVzZXQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlUHJvcHMoKTogdm9pZCB7XG4gICAgY29uc3QgcHJlc2V0UHJvcHMgPSB0aGlzLnByZXNldCA/ICh0aGlzLnByZXNldHMuZ2V0KCdzZWxlY3RJbnB1dCcsIHRoaXMucHJlc2V0KSBhcyBQYXJ0aWFsPElucHV0TWV0YWRhdGE+KSA6IHt9O1xuXG4gICAgdGhpcy5yZXNvbHZlZFByb3BzID0ge1xuICAgICAgLi4ucHJlc2V0UHJvcHMsXG4gICAgICAuLi50aGlzLnByb3BzLFxuICAgIH0gYXMgSW5wdXRNZXRhZGF0YTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb21wb25lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2ZWRQcm9wcz8ud2l0aERlZmF1bHQgfHwgdGhpcy5yZXNvbHZlZFByb3BzPy52YWx1ZSkge1xuICAgICAgYXBwbHlEZWZhdWx0VmFsdWVUb0NvbnRyb2wodGhpcy5yZXNvbHZlZFByb3BzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgbW9kYWwgaGVhZGVyIGZyb20gcHJvcHMgb3IgdXNlIGxhYmVsIGFzIGZhbGxiYWNrLCB0aGVuIGkxOG4gZGVmYXVsdFxuICAgIGNvbnN0IGhlYWRlclRleHQgPSB0aGlzLnJlc29sdmVkUHJvcHMubW9kYWxIZWFkZXIgfHwgdGhpcy5yZXNvbHZlZFByb3BzLmxhYmVsIHx8IHRoaXMuaTE4bi50KCdzZWxlY3RPcHRpb24nKTtcblxuICAgIHRoaXMuY3VzdG9tTW9kYWxPcHRpb25zID0ge1xuICAgICAgaGVhZGVyOiBoZWFkZXJUZXh0LFxuICAgICAgYnJlYWtwb2ludHM6IFswLCAwLjZdLFxuICAgICAgaW5pdGlhbEJyZWFrcG9pbnQ6IDAuNixcbiAgICB9O1xuICAgIHRoaXMuY3VzdG9tUG9wb3Zlck9wdGlvbnMgPSB7IGNzc0NsYXNzOiAndmFsLXNlbGVjdC1wb3BvdmVyJyB9O1xuXG4gICAgLy8gU2V0IGJ1dHRvbiB0ZXh0cyBmcm9tIHByb3BzIG9yIHVzZSBpMThuIGRlZmF1bHRzLlxuICAgIC8vIEZhbGxiYWNrIGNoYWluOiBuYW1lc3BhY2UtbGVzcyBpMThuIOKGkiAnQ29tbW9uJyBuYW1lc3BhY2Ug4oaSIGhhcmRjb2RlZC5cbiAgICAvLyBFbCBuYW1lc3BhY2UtbGVzcyBidXNjYSBlbiBfZ2xvYmFsOyBzaSBubyBleGlzdGUgKGNhc28gdHlwaWNhbCBhcHApLFxuICAgIC8vIHByb2JhbW9zIGVuICdDb21tb24nIHF1ZSBsYSBtYXlvcsOtYSBkZSBhcHBzIHRpZW5lbiBwb2JsYWRvLlxuICAgIHRoaXMuY2FuY2VsVGV4dCA9IHRoaXMucmVzb2x2ZWRQcm9wcy5jYW5jZWxUZXh0IHx8IHRoaXMucmVzb2x2ZUkxOG4oJ2NhbmNlbCcsICdDYW5jZWxhcicpO1xuICAgIHRoaXMub2tUZXh0ID0gdGhpcy5yZXNvbHZlZFByb3BzLm9rVGV4dCB8fCB0aGlzLnJlc29sdmVJMThuKCdvaycsICdPSycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1c2NhIHVuIGtleSBlbiBgX2dsb2JhbGAgcHJpbWVybywgbHVlZ28gZW4gYENvbW1vbmAsIGZpbmFsbWVudGUgY2FlIGFsXG4gICAqIGRlZmF1bHQgaGFyZGNvZGVkLiDDmnRpbCBwYXJhIHRleHRvcyBjcm9zcy1jdXR0aW5nIChjYW5jZWwvb2svY2xvc2UvZXRjLilcbiAgICogc2luIG9ibGlnYXIgYSBjYWRhIGFwcCBhIGR1cGxpY2FybG9zIGVuIGNhZGEgbmFtZXNwYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlSTE4bihrZXk6IHN0cmluZywgZmFsbGJhY2s6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJ5R2xvYmFsID0gdGhpcy5pMThuLnQoa2V5KTtcbiAgICBpZiAodHJ5R2xvYmFsICYmICF0cnlHbG9iYWwuc3RhcnRzV2l0aCgnWycpKSByZXR1cm4gdHJ5R2xvYmFsO1xuICAgIGNvbnN0IHRyeUNvbW1vbiA9IHRoaXMuaTE4bi50KGtleSwgJ0NvbW1vbicpO1xuICAgIGlmICh0cnlDb21tb24gJiYgIXRyeUNvbW1vbi5zdGFydHNXaXRoKCdbJykpIHJldHVybiB0cnlDb21tb247XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG59XG4iXX0=