valtech-components 4.0.25 → 4.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -262
- package/esm2022/lib/components/molecules/content-reaction/content-reaction.component.mjs +4 -7
- package/esm2022/lib/components/molecules/modal-shell/modal-shell.component.mjs +3 -3
- package/esm2022/lib/components/organisms/api-key-create-modal/api-key-create-modal.component.mjs +7 -7
- package/esm2022/lib/components/organisms/api-keys-modal/api-keys-modal.component.mjs +13 -13
- package/esm2022/lib/components/organisms/avatar-upload/avatar-upload.component.mjs +3 -3
- package/esm2022/lib/components/organisms/change-password-modal/change-password-modal.component.mjs +5 -5
- package/esm2022/lib/components/organisms/create-org-modal/create-org-modal.component.mjs +5 -5
- package/esm2022/lib/components/organisms/delete-account-modal/delete-account-modal.component.mjs +4 -3
- package/esm2022/lib/components/organisms/edit-org-modal/edit-org-modal.component.mjs +5 -5
- package/esm2022/lib/components/organisms/invite-member-modal/invite-member-modal.component.mjs +7 -5
- package/esm2022/lib/components/organisms/login-attempt-modal/login-attempt-modal.component.mjs +6 -3
- package/esm2022/lib/components/organisms/member-detail-modal/member-detail-modal.component.mjs +6 -5
- package/esm2022/lib/components/organisms/member-import-modal/member-import-modal.component.mjs +9 -9
- package/esm2022/lib/components/organisms/mfa-modal/mfa-modal.component.mjs +3 -3
- package/esm2022/lib/components/organisms/org-info-sheet/org-info-sheet.component.mjs +37 -48
- package/esm2022/lib/components/organisms/organization-view/organization-view.component.mjs +8 -2
- package/esm2022/lib/components/organisms/organization-view/organization-view.i18n.mjs +15 -3
- package/esm2022/lib/components/organisms/session-list-modal/session-list-modal.component.mjs +4 -3
- package/esm2022/lib/components/organisms/switch-org-modal/switch-org-modal.component.mjs +3 -3
- package/esm2022/lib/components/organisms/transfer-ownership-modal/transfer-ownership-modal.component.mjs +7 -7
- package/esm2022/lib/services/firebase/messaging.service.mjs +2 -2
- package/esm2022/lib/services/refreshable-stream/refreshable-stream.mjs +2 -2
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +136 -122
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/org-info-sheet/org-info-sheet.component.d.ts +12 -1
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
- 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
|
-
#
|
|
3
|
+
# Valtech Components
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/valtech-components)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
-
Component library for Angular
|
|
8
|
+
Component library for Angular + Ionic + Capacitor apps. **145 components** and **23+ services** for auth, Firebase, i18n, and more.
|
|
9
9
|
|
|
10
|
-
**[Full
|
|
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
|
|
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
|
|
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
|
-
##
|
|
38
|
+
## Usage
|
|
39
39
|
|
|
40
|
-
### UI only (no backend
|
|
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
|
|
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
|
-
|
|
62
|
+
Add providers in `main.ts`:
|
|
63
63
|
|
|
64
64
|
```typescript
|
|
65
65
|
import {
|
|
66
66
|
provideValtechFirebase,
|
|
67
67
|
provideValtechAuth,
|
|
68
68
|
provideValtechI18n,
|
|
69
|
-
|
|
70
|
-
provideValtechSkeleton,
|
|
71
|
-
provideValtechPresets,
|
|
72
|
-
HandoffService,
|
|
69
|
+
createFirebaseConfig,
|
|
73
70
|
} from 'valtech-components';
|
|
74
|
-
import
|
|
71
|
+
import firebaseConfig from './config/firebase.config.json';
|
|
75
72
|
|
|
76
73
|
bootstrapApplication(AppComponent, {
|
|
77
74
|
providers: [
|
|
78
|
-
provideValtechFirebase(
|
|
79
|
-
|
|
80
|
-
|
|
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 |
|
|
134
|
-
| Molecules |
|
|
135
|
-
| Organisms |
|
|
136
|
-
| Templates |
|
|
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
|
-
|
|
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` · `
|
|
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`
|
|
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
|
-
##
|
|
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
|
-
|
|
116
|
+
Angular 18+ · Ionic 8+ · Capacitor 6+ · Firebase 10+ · RxJS 7.8+
|
|
337
117
|
|
|
338
118
|
---
|
|
339
119
|
|
|
340
|
-
##
|
|
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
|
-
|
|
348
|
-
|
|
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
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { Component, inject, Input, Output, EventEmitter, signal, computed, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule } from '@angular/forms';
|
|
4
|
-
import { IonButton,
|
|
5
|
-
import { addIcons } from 'ionicons';
|
|
6
|
-
import { closeOutline } from 'ionicons/icons';
|
|
4
|
+
import { IonButton, IonSpinner, IonTextarea } from '@ionic/angular/standalone';
|
|
7
5
|
import { FeedbackService } from '../../../services/feedback/feedback.service';
|
|
8
6
|
import { ToastService } from '../../../services/toast.service';
|
|
9
7
|
import { I18nService } from '../../../services/i18n';
|
|
@@ -110,7 +108,6 @@ export class ContentReactionComponent {
|
|
|
110
108
|
return this.resolvedProps().showComment;
|
|
111
109
|
});
|
|
112
110
|
this.canSubmit = computed(() => this.state().selectedValue !== null && !this.state().isLoading);
|
|
113
|
-
addIcons({ closeOutline });
|
|
114
111
|
// Auto-registro de defaults i18n (es/en) si el consumer no proveyó el
|
|
115
112
|
// namespace. Garantiza que `t()` nunca caiga en key faltante. Ver
|
|
116
113
|
// CONTENT_REACTION_I18N. Idempotente: solo la 1ª instancia registra.
|
|
@@ -261,11 +258,11 @@ export class ContentReactionComponent {
|
|
|
261
258
|
return this.i18n.t(key, 'ContentReaction') || translations[key] || key;
|
|
262
259
|
}
|
|
263
260
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
264
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentReactionComponent, isStandalone: true, selector: "val-content-reaction", inputs: { props: "props", _modalRef: "_modalRef" }, outputs: { reactionSubmit: "reactionSubmit", reactionChange: "reactionChange" }, usesOnChanges: true, ngImport: i0, template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\"
|
|
261
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ContentReactionComponent, isStandalone: true, selector: "val-content-reaction", inputs: { props: "props", _modalRef: "_modalRef" }, outputs: { reactionSubmit: "reactionSubmit", reactionChange: "reactionChange" }, usesOnChanges: true, ngImport: i0, template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" class=\"close-button\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n }\n <!-- Loading inicial -->\n @if (state().isLoading && !state().selectedValue) {\n <div class=\"loading-container\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <!-- Pregunta -->\n <p class=\"question\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\n\n <!-- Campo de comentario (solo si hay selecci\u00F3n) -->\n @if (showCommentField()) {\n <div class=\"comment-section\">\n <ion-textarea\n [value]=\"state().comment\"\n [placeholder]=\"resolvedProps().commentPlaceholder\"\n [maxlength]=\"resolvedProps().maxCommentLength\"\n [disabled]=\"resolvedProps().disabled\"\n [rows]=\"3\"\n class=\"comment-textarea\"\n (ionInput)=\"updateComment($event)\"\n ></ion-textarea>\n <span class=\"char-count\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.submitted-message{margin-top:16px;color:var(--ion-color-success);font-weight:500;animation:fadeIn .3s ease-out}.error-message{margin-top:8px;color:var(--ion-color-danger);font-size:.875rem}.loading-container{display:flex;justify-content:center;padding:20px}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { 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: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }] }); }
|
|
265
262
|
}
|
|
266
263
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ContentReactionComponent, decorators: [{
|
|
267
264
|
type: Component,
|
|
268
|
-
args: [{ selector: 'val-content-reaction', standalone: true, imports: [CommonModule, FormsModule, IonButton,
|
|
265
|
+
args: [{ selector: 'val-content-reaction', standalone: true, imports: [CommonModule, FormsModule, IonButton, IonSpinner, IonTextarea], template: "@if (isConfigured()) {\n<div class=\"content-reaction\" [class.disabled]=\"resolvedProps().disabled\" [class.readonly]=\"resolvedProps().readonly\">\n <!-- Bot\u00F3n de cierre (solo en modo modal/sheet) -->\n @if (resolvedProps().showCloseButton) {\n <ion-button fill=\"clear\" color=\"dark\" shape=\"round\" class=\"close-button\" (click)=\"close()\">\n <strong>{{ t('close') }}</strong>\n </ion-button>\n }\n <!-- Loading inicial -->\n @if (state().isLoading && !state().selectedValue) {\n <div class=\"loading-container\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n } @else {\n <!-- Pregunta -->\n <p class=\"question\">\n {{ state().selectedValue === 'negative' ? t('negativeFeedbackTitle') : resolvedProps().question }}\n </p>\n\n <!-- Botones de reacci\u00F3n \u2014 variante emoji (caras, estrellas, thumbs, \u2026) -->\n @if (resolvedProps().variant === 'emoji') {\n <div class=\"reaction-buttons reaction-buttons--emoji\">\n @for (value of activeReactionValues(); track value; let i = $index) {\n <ion-button\n fill=\"clear\"\n shape=\"round\"\n [class.selected]=\"isSelected(value)\"\n [attr.aria-label]=\"resolvedProps().emojiLabels[i]\"\n [attr.aria-pressed]=\"isSelected(value)\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction(value)\"\n >\n <span class=\"emoji-btn\">{{ resolvedProps().emojis[i] }}</span>\n </ion-button>\n }\n </div>\n } @else {\n <!-- Botones de reacci\u00F3n \u2014 variante texto (default) -->\n <div class=\"reaction-buttons\">\n <ion-button\n [fill]=\"isSelected('positive') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('positive')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('positive')\"\n >\n {{ t('positiveLabel') }}\n </ion-button>\n <ion-button\n [fill]=\"isSelected('negative') ? 'solid' : 'outline'\"\n shape=\"round\"\n color=\"dark\"\n [attr.aria-pressed]=\"isSelected('negative')\"\n [disabled]=\"resolvedProps().disabled || resolvedProps().readonly\"\n (click)=\"selectReaction('negative')\"\n >\n {{ t('negativeLabel') }}\n </ion-button>\n </div>\n }\n\n <!-- Campo de comentario (solo si hay selecci\u00F3n) -->\n @if (showCommentField()) {\n <div class=\"comment-section\">\n <ion-textarea\n [value]=\"state().comment\"\n [placeholder]=\"resolvedProps().commentPlaceholder\"\n [maxlength]=\"resolvedProps().maxCommentLength\"\n [disabled]=\"resolvedProps().disabled\"\n [rows]=\"3\"\n class=\"comment-textarea\"\n (ionInput)=\"updateComment($event)\"\n ></ion-textarea>\n <span class=\"char-count\"> {{ state().comment.length }}/{{ resolvedProps().maxCommentLength }} </span>\n </div>\n }\n\n <!-- Bot\u00F3n de env\u00EDo -->\n @if (state().selectedValue && !state().isSubmitted) {\n <ion-button expand=\"block\" shape=\"round\" [disabled]=\"!canSubmit()\" (click)=\"submitReaction()\" class=\"submit-button\">\n @if (state().isLoading) {\n <ion-spinner name=\"crescent\"></ion-spinner>\n } @else { {{ state().hadPreviousReaction ? t('update') : t('submit') }} }\n </ion-button>\n }\n\n <!-- Mensaje de confirmaci\u00F3n -->\n @if (state().isSubmitted) {\n <p class=\"submitted-message\">{{ t('thankYou') }}</p>\n }\n\n <!-- Error -->\n @if (state().error) {\n <p class=\"error-message\">{{ state().error }}</p>\n } }\n</div>\n}\n", styles: [":host{display:block}.content-reaction{position:relative;padding:16px;text-align:center}.content-reaction.disabled{opacity:.6;pointer-events:none}.content-reaction.readonly{pointer-events:none}.close-button{position:absolute;top:0;right:0;margin:0;--padding-start: 6px;--padding-end: 6px;--color: var(--ion-color-medium)}.close-button ion-icon{font-size:1.5rem}.question{font-size:1.0625rem;font-weight:700;color:var(--ion-color-dark);margin:0 0 16px}.reaction-buttons{display:flex;justify-content:center;gap:12px;margin-bottom:20px}.reaction-buttons--emoji{gap:8px}.reaction-buttons--emoji ion-button{--padding-start: 4px;--padding-end: 4px;transition:transform .15s ease}.reaction-buttons--emoji ion-button.selected{transform:scale(1.25)}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]){opacity:.55}.reaction-buttons--emoji ion-button:not(.selected):not([disabled]):hover{opacity:1}.emoji-btn{font-size:2rem;line-height:1;display:block}.comment-section{margin-top:16px;animation:slideIn .3s ease-out}.comment-section .comment-textarea{--background: transparent;--border-radius: 8px;--padding-start: 12px;--padding-end: 12px;width:100%}.comment-section .char-count{display:block;text-align:right;font-size:.75rem;color:var(--ion-color-medium);margin-top:4px}.submit-button{margin-top:16px}.submitted-message{margin-top:16px;color:var(--ion-color-success);font-weight:500;animation:fadeIn .3s ease-out}.error-message{margin-top:8px;color:var(--ion-color-danger);font-size:.875rem}.loading-container{display:flex;justify-content:center;padding:20px}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}\n"] }]
|
|
269
266
|
}], ctorParameters: () => [], propDecorators: { props: [{
|
|
270
267
|
type: Input
|
|
271
268
|
}], _modalRef: [{
|
|
@@ -275,4 +272,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
275
272
|
}], reactionChange: [{
|
|
276
273
|
type: Output
|
|
277
274
|
}] } });
|
|
278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixNQUFNLEVBQ04sUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUU5RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDL0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7QUFHbEU7Ozs7Ozs7R0FPRztBQUNILE1BQU0scUJBQXFCLEdBQUc7SUFDNUIsRUFBRSxFQUFFO1FBQ0YsUUFBUSxFQUFFLGtDQUFrQztRQUM1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b250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBjbG9zZU91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBGZWVkYmFja1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFjay9mZWVkYmFjay5zZXJ2aWNlJztcbmltcG9ydCB7IFJlYWN0aW9uVmFsdWUgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9mZWVkYmFjay90eXBlcyc7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy90b2FzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IENvbnRlbnRSZWFjdGlvbk1ldGFkYXRhLCBDb250ZW50UmVhY3Rpb25TdGF0ZSwgUmVhY3Rpb25TdWJtaXRFdmVudCwgUmVhY3Rpb25DaGFuZ2VFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIERlZmF1bHRzIGkxOG4gZGVsIGNvbXBvbmVudGUgKGVzL2VuKS4gRWwgY29tcG9uZW50ZSBsb3MgYXV0by1yZWdpc3RyYSBlbiBzdVxuICogY29uc3RydWN0b3Igc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWwgbmFtZXNwYWNlIGBDb250ZW50UmVhY3Rpb25gLiBFc3RvXG4gKiBnYXJhbnRpemEgcXVlIE5VTkNBIGhheWEgdW5hIGtleSBmYWx0YW50ZTogdW5hIGtleSBmYWx0YW50ZSBzZSBldmFsw7phIGVuIGVsXG4gKiB0ZW1wbGF0ZSBwb3IgY2FkYSBjaGFuZ2UtZGV0ZWN0aW9uIOKGkiBgY29uc29sZS53YXJuYCBwb3IgQ0Qg4oaSIGNvbiBlbFxuICogYHZhbC1kZWJ1Zy1jb25zb2xlYCBhY3Rpdm8gKGVzcGVqYSBjb25zb2xlLiogYSB1biBzaWduYWwpIHNlIGRpc3BhcmEgdW4gbG9vcFxuICogaW5maW5pdG8gcXVlIGNvbmdlbGEgZWwgbmF2ZWdhZG9yIGVuIGRldi4gQXV0by1yZWdpc3RyYXIgbG8gZWxpbWluYSBkZSByYcOtei5cbiAqL1xuY29uc3QgQ09OVEVOVF9SRUFDVElPTl9JMThOID0ge1xuICBlczoge1xuICAgIHF1ZXN0aW9uOiAnwr9UZSByZXN1bHTDsyDDunRpbCBlc3RlIGNvbnRlbmlkbz8nLFxuICAgIGNvbW1lbnRQbGFjZWhvbGRlcjogJ0N1w6ludGFub3MgbcOhcyAob3BjaW9uYWwpLi4uJyxcbiAgICBzdWJtaXQ6ICdFbnZpYXIgb3BpbmnDs24nLFxuICAgIHVwZGF0ZTogJ0FjdHVhbGl6YXIgb3BpbmnDs24nLFxuICAgIHRoYW5rWW91OiAnwqFHcmFjaWFzIHBvciB0dSBvcGluacOzbiEnLFxuICAgIHN1Ym1pdHRlZDogJ1R1IG9waW5pw7NuIGhhIHNpZG8gcmVnaXN0cmFkYScsXG4gICAgZXJyb3JTdWJtaXR0aW5nOiAnRXJyb3IgYWwgZW52aWFyLiBJbnRlbnRhIGRlIG51ZXZvLicsXG4gICAgcG9zaXRpdmVMYWJlbDogJ1PDrSwgbXVjaG8nLFxuICAgIG5lZ2F0aXZlTGFiZWw6ICdObyB0YW50bycsXG4gICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiAnwr9DdcOpbnRhbm9zIHF1w6kgbm8gdGUgZ3VzdMOzPycsXG4gICAgY2xvc2U6ICdDZXJyYXInLFxuICB9LFxuICBlbjoge1xuICAgIHF1ZXN0aW9uOiAnV2FzIHRoaXMgY29udGVudCBoZWxwZnVsPycsXG4gICAgY29tbWVudFBsYWNlaG9sZGVyOiAnVGVsbCB1cyBtb3JlIChvcHRpb25hbCkuLi4nLFxuICAgIHN1Ym1pdDogJ1NlbmQgZmVlZGJhY2snLFxuICAgIHVwZGF0ZTogJ1VwZGF0ZSBmZWVkYmFjaycsXG4gICAgdGhhbmtZb3U6ICdUaGFua3MgZm9yIHlvdXIgZmVlZGJhY2shJyxcbiAgICBzdWJtaXR0ZWQ6ICdZb3VyIGZlZWRiYWNrIGhhcyBiZWVuIHJlY29yZGVkJyxcbiAgICBlcnJvclN1Ym1pdHRpbmc6ICdGYWlsZWQgdG8gc2VuZC4gUGxlYXNlIHRyeSBhZ2Fpbi4nLFxuICAgIHBvc2l0aXZlTGFiZWw6ICdZZXMsIGEgbG90JyxcbiAgICBuZWdhdGl2ZUxhYmVsOiAnTm90IHJlYWxseScsXG4gICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiBcIlRlbGwgdXMgd2hhdCB5b3UgZGlkbid0IGxpa2U/XCIsXG4gICAgY2xvc2U6ICdDbG9zZScsXG4gIH0sXG59O1xuXG4vKipcbiAqIENvbXBvbmVudGUgcGFyYSByZWFjY2lvbmVzIGRlIGNvbnRlbmlkbyBjb24gZW1vamlzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLWNvbnRlbnQtcmVhY3Rpb25cbiAqICAgW3Byb3BzXT1cIntcbiAqICAgICBlbnRpdHlSZWY6IHsgZW50aXR5VHlwZTogJ2FydGljbGUnLCBlbnRpdHlJZDogJ2FydC0xMjMnIH0sXG4gKiAgICAgcXVlc3Rpb246ICfCv1RlIGZ1ZSDDunRpbCBlc3RlIGFydMOtY3Vsbz8nXG4gKiAgIH1cIlxuICogICAocmVhY3Rpb25TdWJtaXQpPVwib25SZWFjdGlvblN1Ym1pdCgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNvbnRlbnQtcmVhY3Rpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZW50LXJlYWN0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50UmVhY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgZmVlZGJhY2tTZXJ2aWNlID0gaW5qZWN0KEZlZWRiYWNrU2VydmljZSk7XG4gIHByaXZhdGUgdG9hc3QgPSBpbmplY3QoVG9hc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGlzQ29uZmlndXJlZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmlzQ29uZmlndXJlZCgpKTtcblxuICBASW5wdXQoKSBwcm9wczogUGFydGlhbDxDb250ZW50UmVhY3Rpb25NZXRhZGF0YT4gPSB7fTtcblxuICAvKipcbiAgICogUmVmZXJlbmNpYSBhbCBtb2RhbCBpbnllY3RhZGEgcG9yIGBNb2RhbFNlcnZpY2VgIGN1YW5kbyBlbCBjb21wb25lbnRlIHNlXG4gICAqIGFicmUgY29tbyBtb2RhbC9zaGVldCAoYGNvbXBvbmVudFByb3BzLl9tb2RhbFJlZmApLiBQZXJtaXRlIGNlcnJhcnNlIGRlc2RlXG4gICAqIGRlbnRybyAoYm90w7NuIGRlIGNpZXJyZSkuIGB1bmRlZmluZWRgIGVuIHVzbyBpbmxpbmUuXG4gICAqL1xuICBASW5wdXQoKSBfbW9kYWxSZWY/OiB7IGRpc21pc3M6IChkYXRhPzogdW5rbm93biwgcm9sZT86IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPiB9O1xuXG4gIEBPdXRwdXQoKSByZWFjdGlvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVhY3Rpb25TdWJtaXRFdmVudD4oKTtcbiAgQE91dHB1dCgpIHJlYWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxSZWFjdGlvbkNoYW5nZUV2ZW50PigpO1xuXG4gIC8vIEVzdGFkbyByZWFjdGl2b1xuICBzdGF0ZSA9IHNpZ25hbDxDb250ZW50UmVhY3Rpb25TdGF0ZT4oe1xuICAgIHNlbGVjdGVkVmFsdWU6IG51bGwsXG4gICAgY29tbWVudDogJycsXG4gICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICBpc1N1Ym1pdHRlZDogZmFsc2UsXG4gICAgaGFkUHJldmlvdXNSZWFjdGlvbjogZmFsc2UsXG4gICAgZXJyb3I6IG51bGwsXG4gIH0pO1xuXG4gIC8vIFZhbG9yZXMgcG9yIGRlZmVjdG9cbiAgcmVhZG9ubHkgZGVmYXVsdEVtb2ppczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWyfwn5ieJywgJ/CfmJAnLCAn8J+YiiddO1xuICByZWFkb25seSBkZWZhdWx0TGFiZWxzOiBbc3RyaW5nLCBzdHJpbmcsIHN0cmluZ10gPSBbJ05vIG1lIGF5dWTDsycsICdSZWd1bGFyJywgJ011eSDDunRpbCddO1xuXG4gIC8vIENvbXB1dGVkIHByb3BlcnRpZXNcbiAgcmVzb2x2ZWRQcm9wcyA9IGNvbXB1dGVkKCgpID0+ICh7XG4gICAgZW50aXR5UmVmOiB0aGlzLnByb3BzLmVudGl0eVJlZiEsXG4gICAgcXVlc3Rpb246IHRoaXMucHJvcHMucXVlc3Rpb24gfHwgdGhpcy50KCdxdWVzdGlvbicpLFxuICAgIHNob3dDb21tZW50OiB0aGlzLnByb3BzLnNob3dDb21tZW50ID8/IHRydWUsXG4gICAgY29tbWVudE9uVmFsdWVzOiB0aGlzLnByb3BzLmNvbW1lbnRPblZhbHVlcyxcbiAgICBjb21tZW50UGxhY2Vob2xkZXI6IHRoaXMucHJvcHMuY29tbWVudFBsYWNlaG9sZGVyIHx8IHRoaXMudCgnY29tbWVudFBsYWNlaG9sZGVyJyksXG4gICAgbWF4Q29tbWVudExlbmd0aDogdGhpcy5wcm9wcy5tYXhDb21tZW50TGVuZ3RoID8/IDUwMCxcbiAgICBlbW9qaXM6IHRoaXMucHJvcHMuZW1vamlzIHx8IHRoaXMuZGVmYXVsdEVtb2ppcyxcbiAgICBlbW9qaUxhYmVsczogdGhpcy5wcm9wcy5lbW9qaUxhYmVscyB8fCB0aGlzLmRlZmF1bHRMYWJlbHMsXG4gICAgc2hvd1RoYW5rWW91OiB0aGlzLnByb3BzLnNob3dUaGFua1lvdSA/PyB0cnVlLFxuICAgIHRoYW5rWW91TWVzc2FnZTogdGhpcy5wcm9wcy50aGFua1lvdU1lc3NhZ2UgfHwgdGhpcy50KCd0aGFua1lvdScpLFxuICAgIGRpc2FibGVkOiB0aGlzLnByb3BzLmRpc2FibGVkID8/IGZhbHNlLFxuICAgIHJlYWRvbmx5OiB0aGlzLnByb3BzLnJlYWRvbmx5ID8/IGZhbHNlLFxuICAgIC8vIFZhcmlhbnRlOiAnZW1vamknIGN1YW5kbyBzZSBkZWNsYXJhIGV4cGzDrWNpdGFtZW50ZSBvIGN1YW5kbyBzZSBwYXNhbiBlbW9qaXMgY3VzdG9tLlxuICAgIHZhcmlhbnQ6IHRoaXMucHJvcHMudmFyaWFudCA/PyAodGhpcy5wcm9wcy5lbW9qaXMgPyAnZW1vamknIDogJ2J1dHRvbnMnKSxcbiAgICBzaG93Q2xvc2VCdXR0b246IHRoaXMucHJvcHMuc2hvd0Nsb3NlQnV0dG9uID8/IGZhbHNlLFxuICB9KSk7XG5cbiAgcmVhZG9ubHkgYWN0aXZlUmVhY3Rpb25WYWx1ZXMgPSBjb21wdXRlZDxSZWFjdGlvblZhbHVlW10+KCgpID0+XG4gICAgdGhpcy5yZXNvbHZlZFByb3BzKCkuZW1vamlzLmxlbmd0aCA9PT0gMiA/IFsnbmVnYXRpdmUnLCAncG9zaXRpdmUnXSA6IFsnbmVnYXRpdmUnLCAnbmV1dHJhbCcsICdwb3NpdGl2ZSddXG4gICk7XG5cbiAgc2hvd0NvbW1lbnRGaWVsZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzZWwgPSB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZTtcbiAgICBpZiAoIXNlbCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbW1lbnRPbiA9IHRoaXMucmVzb2x2ZWRQcm9wcygpLmNvbW1lbnRPblZhbHVlcztcbiAgICBpZiAoY29tbWVudE9uICE9PSB1bmRlZmluZWQpIHJldHVybiBjb21tZW50T24uaW5jbHVkZXMoc2VsKTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFByb3BzKCkuc2hvd0NvbW1lbnQ7XG4gIH0pO1xuXG4gIGNhblN1Ym1pdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlICE9PSBudWxsICYmICF0aGlzLnN0YXRlKCkuaXNMb2FkaW5nKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGNsb3NlT3V0bGluZSB9KTtcbiAgICAvLyBBdXRvLXJlZ2lzdHJvIGRlIGRlZmF1bHRzIGkxOG4gKGVzL2VuKSBzaSBlbCBjb25zdW1lciBubyBwcm92ZXnDsyBlbFxuICAgIC8vIG5hbWVzcGFjZS4gR2FyYW50aXphIHF1ZSBgdCgpYCBudW5jYSBjYWlnYSBlbiBrZXkgZmFsdGFudGUuIFZlclxuICAgIC8vIENPTlRFTlRfUkVBQ1RJT05fSTE4Ti4gSWRlbXBvdGVudGU6IHNvbG8gbGEgMcKqIGluc3RhbmNpYSByZWdpc3RyYS5cbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoJ0NvbnRlbnRSZWFjdGlvbicpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJDb250ZW50KCdDb250ZW50UmVhY3Rpb24nLCBDT05URU5UX1JFQUNUSU9OX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaWVycmEgZWwgbW9kYWwvc2hlZXQgY29udGVuZWRvciAoc2kgZWwgY29tcG9uZW50ZSBzZSBhYnJpw7MgdsOtYSBNb2RhbFNlcnZpY2UpLiAqL1xuICBjbG9zZSgpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuX21vZGFsUmVmPy5kaXNtaXNzKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmxvYWRQcmV2aW91c1JlYWN0aW9uKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXNbJ3Byb3BzJ10gJiYgIWNoYW5nZXNbJ3Byb3BzJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMubG9hZFByZXZpb3VzUmVhY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRQcmV2aW91c1JlYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghdGhpcy5wcm9wcy5lbnRpdHlSZWYpIHJldHVybjtcblxuICAgIC8vIFNpIGhheSBpbml0aWFsVmFsdWUsIHVzYXJsbyBkaXJlY3RhbWVudGUgc2luIGNvbnN1bHRhclxuICAgIGlmICh0aGlzLnByb3BzLmluaXRpYWxWYWx1ZSkge1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBzZWxlY3RlZFZhbHVlOiB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZSEsXG4gICAgICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IHRydWUsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNpIHNraXBJbml0aWFsQ2hlY2sgZXN0w6EgYWN0aXZvLCBubyBjb25zdWx0YXJcbiAgICBpZiAodGhpcy5wcm9wcy5za2lwSW5pdGlhbENoZWNrKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IHRydWUsIGVycm9yOiBudWxsIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGVjayA9IGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNoZWNrRmVlZGJhY2soXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eVR5cGUsXG4gICAgICAgIHRoaXMucHJvcHMuZW50aXR5UmVmLmVudGl0eUlkXG4gICAgICApO1xuXG4gICAgICBpZiAoY2hlY2suaGFzRmVlZGJhY2sgJiYgY2hlY2sucmVhY3Rpb25WYWx1ZSkge1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgICAgLi4ucyxcbiAgICAgICAgICBzZWxlY3RlZFZhbHVlOiBjaGVjay5yZWFjdGlvblZhbHVlISxcbiAgICAgICAgICBoYWRQcmV2aW91c1JlYWN0aW9uOiB0cnVlLFxuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNTdWJtaXR0ZWQ6IHRydWUsXG4gICAgICAgIH0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiBmYWxzZSB9KSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgcHJldmlvdXMgcmVhY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBpc0xvYWRpbmc6IGZhbHNlIH0pKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RSZWFjdGlvbih2YWx1ZTogUmVhY3Rpb25WYWx1ZSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZCB8fCB0aGlzLnJlc29sdmVkUHJvcHMoKS5yZWFkb25seSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcHJldmlvdXNWYWx1ZSA9IHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlO1xuXG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgLi4ucyxcbiAgICAgIHNlbGVjdGVkVmFsdWU6IHZhbHVlLFxuICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgZXJyb3I6IG51bGwsXG4gICAgfSkpO1xuXG4gICAgdGhpcy5yZWFjdGlvbkNoYW5nZS5lbWl0KHsgdmFsdWUsIHByZXZpb3VzVmFsdWUgfSk7XG4gIH1cblxuICBhc3luYyBzdWJtaXRSZWFjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdGUgPSB0aGlzLnN0YXRlKCk7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnJlc29sdmVkUHJvcHMoKTtcblxuICAgIGlmICghY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUgfHwgcHJvcHMuZGlzYWJsZWQpIHJldHVybjtcblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiB0cnVlLCBlcnJvcjogbnVsbCB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRGV0ZXJtaW5hciBzaSB1c2FyIGVuZHBvaW50IGFuw7NuaW1vIG8gYXV0ZW50aWNhZG9cbiAgICAgIGNvbnN0IGlzQXV0aGVudGljYXRlZCA9IHRoaXMuYXV0aD8uaXNBdXRoZW50aWNhdGVkKCkgPz8gZmFsc2U7XG4gICAgICBjb25zdCB1c2VBbm9ueW1vdXMgPSB0aGlzLnByb3BzLmFsbG93QW5vbnltb3VzICYmICFpc0F1dGhlbnRpY2F0ZWQ7XG5cbiAgICAgIGlmICh1c2VBbm9ueW1vdXMpIHtcbiAgICAgICAgLy8gVXNhciBlbmRwb2ludCBhbsOzbmltbyAocMO6YmxpY28pXG4gICAgICAgIGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZUFub255bW91c1JlYWN0aW9uKFxuICAgICAgICAgIHByb3BzLmVudGl0eVJlZixcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2VsZWN0ZWRWYWx1ZSxcbiAgICAgICAgICBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzYXIgZW5kcG9pbnQgYXV0ZW50aWNhZG9cbiAgICAgICAgYXdhaXQgdGhpcy5mZWVkYmFja1NlcnZpY2UuY3JlYXRlUmVhY3Rpb24oXG4gICAgICAgICAgcHJvcHMuZW50aXR5UmVmLFxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICAgIGN1cnJlbnRTdGF0ZS5jb21tZW50IHx8IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgIC4uLnMsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICBjb21tZW50OiAnJyxcbiAgICAgICAgaGFkUHJldmlvdXNSZWFjdGlvbjogIXVzZUFub255bW91cywgLy8gU29sbyBwYXJhIGF1dGVudGljYWRvc1xuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnJlYWN0aW9uU3VibWl0LmVtaXQoe1xuICAgICAgICB2YWx1ZTogY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUsXG4gICAgICAgIGNvbW1lbnQ6IGN1cnJlbnRTdGF0ZS5jb21tZW50IHx8IHVuZGVmaW5lZCxcbiAgICAgICAgZW50aXR5UmVmOiBwcm9wcy5lbnRpdHlSZWYsXG4gICAgICAgIGlzVXBkYXRlOiBjdXJyZW50U3RhdGUuaGFkUHJldmlvdXNSZWFjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocHJvcHMuc2hvd1RoYW5rWW91KSB7XG4gICAgICAgIHRoaXMudG9hc3Quc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogcHJvcHMudGhhbmtZb3VNZXNzYWdlLFxuICAgICAgICAgIGR1cmF0aW9uOiAyMDAwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3VibWl0dGluZyByZWFjdGlvbjonLCBlcnJvcik7XG4gICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7XG4gICAgICAgIC4uLnMsXG4gICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGVycm9yOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgfSkpO1xuXG4gICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICBtZXNzYWdlOiB0aGlzLnQoJ2Vycm9yU3VibWl0dGluZycpLFxuICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNvbW1lbnQoZXZlbnQ6IEN1c3RvbUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdmFsdWUgPSBldmVudC5kZXRhaWwudmFsdWUgfHwgJyc7XG4gICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoeyAuLi5zLCBjb21tZW50OiB2YWx1ZSB9KSk7XG4gIH1cblxuICBnZXRFbW9qaShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZFByb3BzKCkuZW1vamlzW2luZGV4XTtcbiAgfVxuXG4gIGdldEVtb2ppTGFiZWwoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppTGFiZWxzW2luZGV4XTtcbiAgfVxuXG4gIGlzU2VsZWN0ZWQodmFsdWU6IFJlYWN0aW9uVmFsdWUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWUgPT09IHZhbHVlO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgcXVlc3Rpb246ICfCv1RlIHJlc3VsdMOzIMO6dGlsIGVzdGUgY29udGVuaWRvPycsXG4gICAgICBjb21tZW50UGxhY2Vob2xkZXI6ICdDdcOpbnRhbm9zIG3DoXMgKG9wY2lvbmFsKS4uLicsXG4gICAgICBzdWJtaXQ6ICdFbnZpYXIgb3BpbmnDs24nLFxuICAgICAgdXBkYXRlOiAnQWN0dWFsaXphciBvcGluacOzbicsXG4gICAgICB0aGFua1lvdTogJ8KhR3JhY2lhcyBwb3IgdHUgb3BpbmnDs24hJyxcbiAgICAgIHN1Ym1pdHRlZDogJ1R1IG9waW5pw7NuIGhhIHNpZG8gcmVnaXN0cmFkYScsXG4gICAgICBlcnJvclN1Ym1pdHRpbmc6ICdFcnJvciBhbCBlbnZpYXIuIEludGVudGEgZGUgbnVldm8uJyxcbiAgICAgIHBvc2l0aXZlTGFiZWw6ICdTw60sIG11Y2hvJyxcbiAgICAgIG5lZ2F0aXZlTGFiZWw6ICdObyB0YW50bycsXG4gICAgICBuZWdhdGl2ZUZlZWRiYWNrVGl0bGU6ICfCv0N1w6ludGFub3MgcXXDqSBubyB0ZSBndXN0w7M/JyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdDb250ZW50UmVhY3Rpb24nKSB8fCB0cmFuc2xhdGlvbnNba2V5XSB8fCBrZXk7XG4gIH1cbn1cbiIsIkBpZiAoaXNDb25maWd1cmVkKCkpIHtcbjxkaXYgY2xhc3M9XCJjb250ZW50LXJlYWN0aW9uXCIgW2NsYXNzLmRpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZFwiIFtjbGFzcy5yZWFkb25seV09XCJyZXNvbHZlZFByb3BzKCkucmVhZG9ubHlcIj5cbiAgPCEtLSBCb3TDs24gZGUgY2llcnJlIChzb2xvIGVuIG1vZG8gbW9kYWwvc2hlZXQpIC0tPlxuICBAaWYgKHJlc29sdmVkUHJvcHMoKS5zaG93Q2xvc2VCdXR0b24pIHtcbiAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgY2xhc3M9XCJjbG9zZS1idXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2Nsb3NlJylcIiAoY2xpY2spPVwiY2xvc2UoKVwiPlxuICAgIDxpb24taWNvbiBuYW1lPVwiY2xvc2Utb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICA8L2lvbi1idXR0b24+XG4gIH1cbiAgPCEtLSBMb2FkaW5nIGluaWNpYWwgLS0+XG4gIEBpZiAoc3RhdGUoKS5pc0xvYWRpbmcgJiYgIXN0YXRlKCkuc2VsZWN0ZWRWYWx1ZSkge1xuICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb250YWluZXJcIj5cbiAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICA8IS0tIFByZWd1bnRhIC0tPlxuICA8cCBjbGFzcz1cInF1ZXN0aW9uXCI+XG4gICAge3sgc3RhdGUoKS5zZWxlY3RlZFZhbHVlID09PSAnbmVnYXRpdmUnID8gdCgnbmVnYXRpdmVGZWVkYmFja1RpdGxlJykgOiByZXNvbHZlZFByb3BzKCkucXVlc3Rpb24gfX1cbiAgPC9wPlxuXG4gIDwhLS0gQm90b25lcyBkZSByZWFjY2nDs24g4oCUIHZhcmlhbnRlIGVtb2ppIChjYXJhcywgZXN0cmVsbGFzLCB0aHVtYnMsIOKApikgLS0+XG4gIEBpZiAocmVzb2x2ZWRQcm9wcygpLnZhcmlhbnQgPT09ICdlbW9qaScpIHtcbiAgPGRpdiBjbGFzcz1cInJlYWN0aW9uLWJ1dHRvbnMgcmVhY3Rpb24tYnV0dG9ucy0tZW1vamlcIj5cbiAgICBAZm9yICh2YWx1ZSBvZiBhY3RpdmVSZWFjdGlvblZhbHVlcygpOyB0cmFjayB2YWx1ZTsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICA8aW9uLWJ1dHRvblxuICAgICAgZmlsbD1cImNsZWFyXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgW2NsYXNzLnNlbGVjdGVkXT1cImlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVzb2x2ZWRQcm9wcygpLmVtb2ppTGFiZWxzW2ldXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKHZhbHVlKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZWRQcm9wcygpLmRpc2FibGVkIHx8IHJlc29sdmVkUHJvcHMoKS5yZWFkb25seVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0UmVhY3Rpb24odmFsdWUpXCJcbiAgICA+XG4gICAgICA8c3BhbiBjbGFzcz1cImVtb2ppLWJ0blwiPnt7IHJlc29sdmVkUHJvcHMoKS5lbW9qaXNbaV0gfX08L3NwYW4+XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIH1cbiAgPC9kaXY+XG4gIH0gQGVsc2Uge1xuICA8IS0tIEJvdG9uZXMgZGUgcmVhY2Npw7NuIOKAlCB2YXJpYW50ZSB0ZXh0byAoZGVmYXVsdCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJyZWFjdGlvbi1idXR0b25zXCI+XG4gICAgPGlvbi1idXR0b25cbiAgICAgIFtmaWxsXT1cImlzU2VsZWN0ZWQoJ3Bvc2l0aXZlJykgPyAnc29saWQnIDogJ291dGxpbmUnXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKCdwb3NpdGl2ZScpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbigncG9zaXRpdmUnKVwiXG4gICAgPlxuICAgICAge3sgdCgncG9zaXRpdmVMYWJlbCcpIH19XG4gICAgPC9pb24tYnV0dG9uPlxuICAgIDxpb24tYnV0dG9uXG4gICAgICBbZmlsbF09XCJpc1NlbGVjdGVkKCduZWdhdGl2ZScpID8gJ3NvbGlkJyA6ICdvdXRsaW5lJ1wiXG4gICAgICBzaGFwZT1cInJvdW5kXCJcbiAgICAgIGNvbG9yPVwiZGFya1wiXG4gICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwiaXNTZWxlY3RlZCgnbmVnYXRpdmUnKVwiXG4gICAgICBbZGlzYWJsZWRdPVwicmVzb2x2ZWRQcm9wcygpLmRpc2FibGVkIHx8IHJlc29sdmVkUHJvcHMoKS5yZWFkb25seVwiXG4gICAgICAoY2xpY2spPVwic2VsZWN0UmVhY3Rpb24oJ25lZ2F0aXZlJylcIlxuICAgID5cbiAgICAgIHt7IHQoJ25lZ2F0aXZlTGFiZWwnKSB9fVxuICAgIDwvaW9uLWJ1dHRvbj5cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIENhbXBvIGRlIGNvbWVudGFyaW8gKHNvbG8gc2kgaGF5IHNlbGVjY2nDs24pIC0tPlxuICBAaWYgKHNob3dDb21tZW50RmllbGQoKSkge1xuICA8ZGl2IGNsYXNzPVwiY29tbWVudC1zZWN0aW9uXCI+XG4gICAgPGlvbi10ZXh0YXJlYVxuICAgICAgW3ZhbHVlXT1cInN0YXRlKCkuY29tbWVudFwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicmVzb2x2ZWRQcm9wcygpLmNvbW1lbnRQbGFjZWhvbGRlclwiXG4gICAgICBbbWF4bGVuZ3RoXT1cInJlc29sdmVkUHJvcHMoKS5tYXhDb21tZW50TGVuZ3RoXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWRcIlxuICAgICAgW3Jvd3NdPVwiM1wiXG4gICAgICBjbGFzcz1cImNvbW1lbnQtdGV4dGFyZWFcIlxuICAgICAgKGlvbklucHV0KT1cInVwZGF0ZUNvbW1lbnQoJGV2ZW50KVwiXG4gICAgPjwvaW9uLXRleHRhcmVhPlxuICAgIDxzcGFuIGNsYXNzPVwiY2hhci1jb3VudFwiPiB7eyBzdGF0ZSgpLmNvbW1lbnQubGVuZ3RoIH19L3t7IHJlc29sdmVkUHJvcHMoKS5tYXhDb21tZW50TGVuZ3RoIH19IDwvc3Bhbj5cbiAgPC9kaXY+XG4gIH1cblxuICA8IS0tIEJvdMOzbiBkZSBlbnbDrW8gLS0+XG4gIEBpZiAoc3RhdGUoKS5zZWxlY3RlZFZhbHVlICYmICFzdGF0ZSgpLmlzU3VibWl0dGVkKSB7XG4gIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgc2hhcGU9XCJyb3VuZFwiIFtkaXNhYmxlZF09XCIhY2FuU3VibWl0KClcIiAoY2xpY2spPVwic3VibWl0UmVhY3Rpb24oKVwiIGNsYXNzPVwic3VibWl0LWJ1dHRvblwiPlxuICAgIEBpZiAoc3RhdGUoKS5pc0xvYWRpbmcpIHtcbiAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCI+PC9pb24tc3Bpbm5lcj5cbiAgICB9IEBlbHNlIHsge3sgc3RhdGUoKS5oYWRQcmV2aW91c1JlYWN0aW9uID8gdCgndXBkYXRlJykgOiB0KCdzdWJtaXQnKSB9fSB9XG4gIDwvaW9uLWJ1dHRvbj5cbiAgfVxuXG4gIDwhLS0gTWVuc2FqZSBkZSBjb25maXJtYWNpw7NuIC0tPlxuICBAaWYgKHN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgPHAgY2xhc3M9XCJzdWJtaXR0ZWQtbWVzc2FnZVwiPnt7IHQoJ3RoYW5rWW91JykgfX08L3A+XG4gIH1cblxuICA8IS0tIEVycm9yIC0tPlxuICBAaWYgKHN0YXRlKCkuZXJyb3IpIHtcbiAgPHAgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+e3sgc3RhdGUoKS5lcnJvciB9fTwvcD5cbiAgfSB9XG48L2Rpdj5cbn1cbiJdfQ==
|
|
275
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnRlbnQtcmVhY3Rpb24vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFJWixNQUFNLEVBQ04sUUFBUSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUdsRTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxxQkFBcUIsR0FBRztJQUM1QixFQUFFLEVBQUU7UUFDRixRQUFRLEVBQUUsa0NBQWtDO1FBQzVDLGtCQUFrQixFQUFFLDZCQUE2QjtRQUNqRCxNQUFNLEVBQUUsZ0JBQWdCO1FBQ3hCLE1BQU0sRUFBRSxvQkFBb0I7UUFDNUIsUUFBUSxFQUFFLDBCQUEwQjtRQUNw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QUFDLGFBQWEsS0FBSyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUVELENBQUMsQ0FBQyxHQUFXO1FBQ1gsTUFBTSxZQUFZLEdBQTJCO1lBQzNDLFFBQVEsRUFBRSxrQ0FBa0M7WUFDNUMsa0JBQWtCLEVBQUUsNkJBQTZCO1lBQ2pELE1BQU0sRUFBRSxnQkFBZ0I7WUFDeEIsTUFBTSxFQUFFLG9CQUFvQjtZQUM1QixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLFNBQVMsRUFBRSwrQkFBK0I7WUFDMUMsZUFBZSxFQUFFLG9DQUFvQztZQUNyRCxhQUFhLEVBQUUsV0FBVztZQUMxQixhQUFhLEVBQUUsVUFBVTtZQUN6QixxQkFBcUIsRUFBRSw2QkFBNkI7U0FDckQsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLGlCQUFpQixDQUFDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQztJQUN6RSxDQUFDOytHQXZQVSx3QkFBd0I7bUdBQXhCLHdCQUF3QiwwT0NqRnJDLGloSEFrR0EsdXVERHJCWSxZQUFZLDhCQUFFLFdBQVcsK0JBQUUsU0FBUyxvUEFBRSxVQUFVLHlHQUFFLFdBQVc7OzRGQUk1RCx3QkFBd0I7a0JBUHBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUM7d0RBWS9ELEtBQUs7c0JBQWIsS0FBSztnQkFPRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uSW5pdCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBzaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpc0Rldk1vZGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25TcGlubmVyLCBJb25UZXh0YXJlYSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZSc7XG5pbXBvcnQgeyBSZWFjdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svdHlwZXMnO1xuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvdG9hc3Quc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9hdXRoL2F1dGguc2VydmljZSc7XG5pbXBvcnQgeyBDb250ZW50UmVhY3Rpb25NZXRhZGF0YSwgQ29udGVudFJlYWN0aW9uU3RhdGUsIFJlYWN0aW9uU3VibWl0RXZlbnQsIFJlYWN0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBEZWZhdWx0cyBpMThuIGRlbCBjb21wb25lbnRlIChlcy9lbikuIEVsIGNvbXBvbmVudGUgbG9zIGF1dG8tcmVnaXN0cmEgZW4gc3VcbiAqIGNvbnN0cnVjdG9yIHNpIGVsIGNvbnN1bWVyIG5vIHByb3ZlecOzIGVsIG5hbWVzcGFjZSBgQ29udGVudFJlYWN0aW9uYC4gRXN0b1xuICogZ2FyYW50aXphIHF1ZSBOVU5DQSBoYXlhIHVuYSBrZXkgZmFsdGFudGU6IHVuYSBrZXkgZmFsdGFudGUgc2UgZXZhbMO6YSBlbiBlbFxuICogdGVtcGxhdGUgcG9yIGNhZGEgY2hhbmdlLWRldGVjdGlvbiDihpIgYGNvbnNvbGUud2FybmAgcG9yIENEIOKGkiBjb24gZWxcbiAqIGB2YWwtZGVidWctY29uc29sZWAgYWN0aXZvIChlc3BlamEgY29uc29sZS4qIGEgdW4gc2lnbmFsKSBzZSBkaXNwYXJhIHVuIGxvb3BcbiAqIGluZmluaXRvIHF1ZSBjb25nZWxhIGVsIG5hdmVnYWRvciBlbiBkZXYuIEF1dG8tcmVnaXN0cmFyIGxvIGVsaW1pbmEgZGUgcmHDrXouXG4gKi9cbmNvbnN0IENPTlRFTlRfUkVBQ1RJT05fSTE4TiA9IHtcbiAgZXM6IHtcbiAgICBxdWVzdGlvbjogJ8K/VGUgcmVzdWx0w7Mgw7p0aWwgZXN0ZSBjb250ZW5pZG8/JyxcbiAgICBjb21tZW50UGxhY2Vob2xkZXI6ICdDdcOpbnRhbm9zIG3DoXMgKG9wY2lvbmFsKS4uLicsXG4gICAgc3VibWl0OiAnRW52aWFyIG9waW5pw7NuJyxcbiAgICB1cGRhdGU6ICdBY3R1YWxpemFyIG9waW5pw7NuJyxcbiAgICB0aGFua1lvdTogJ8KhR3JhY2lhcyBwb3IgdHUgb3BpbmnDs24hJyxcbiAgICBzdWJtaXR0ZWQ6ICdUdSBvcGluacOzbiBoYSBzaWRvIHJlZ2lzdHJhZGEnLFxuICAgIGVycm9yU3VibWl0dGluZzogJ0Vycm9yIGFsIGVudmlhci4gSW50ZW50YSBkZSBudWV2by4nLFxuICAgIHBvc2l0aXZlTGFiZWw6ICdTw60sIG11Y2hvJyxcbiAgICBuZWdhdGl2ZUxhYmVsOiAnTm8gdGFudG8nLFxuICAgIG5lZ2F0aXZlRmVlZGJhY2tUaXRsZTogJ8K/Q3XDqW50YW5vcyBxdcOpIG5vIHRlIGd1c3TDsz8nLFxuICAgIGNsb3NlOiAnQ2VycmFyJyxcbiAgfSxcbiAgZW46IHtcbiAgICBxdWVzdGlvbjogJ1dhcyB0aGlzIGNvbnRlbnQgaGVscGZ1bD8nLFxuICAgIGNvbW1lbnRQbGFjZWhvbGRlcjogJ1RlbGwgdXMgbW9yZSAob3B0aW9uYWwpLi4uJyxcbiAgICBzdWJtaXQ6ICdTZW5kIGZlZWRiYWNrJyxcbiAgICB1cGRhdGU6ICdVcGRhdGUgZmVlZGJhY2snLFxuICAgIHRoYW5rWW91OiAnVGhhbmtzIGZvciB5b3VyIGZlZWRiYWNrIScsXG4gICAgc3VibWl0dGVkOiAnWW91ciBmZWVkYmFjayBoYXMgYmVlbiByZWNvcmRlZCcsXG4gICAgZXJyb3JTdWJtaXR0aW5nOiAnRmFpbGVkIHRvIHNlbmQuIFBsZWFzZSB0cnkgYWdhaW4uJyxcbiAgICBwb3NpdGl2ZUxhYmVsOiAnWWVzLCBhIGxvdCcsXG4gICAgbmVnYXRpdmVMYWJlbDogJ05vdCByZWFsbHknLFxuICAgIG5lZ2F0aXZlRmVlZGJhY2tUaXRsZTogXCJUZWxsIHVzIHdoYXQgeW91IGRpZG4ndCBsaWtlP1wiLFxuICAgIGNsb3NlOiAnQ2xvc2UnLFxuICB9LFxufTtcblxuLyoqXG4gKiBDb21wb25lbnRlIHBhcmEgcmVhY2Npb25lcyBkZSBjb250ZW5pZG8gY29uIGVtb2ppcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1jb250ZW50LXJlYWN0aW9uXG4gKiAgIFtwcm9wc109XCJ7XG4gKiAgICAgZW50aXR5UmVmOiB7IGVudGl0eVR5cGU6ICdhcnRpY2xlJywgZW50aXR5SWQ6ICdhcnQtMTIzJyB9LFxuICogICAgIHF1ZXN0aW9uOiAnwr9UZSBmdWUgw7p0aWwgZXN0ZSBhcnTDrWN1bG8/J1xuICogICB9XCJcbiAqICAgKHJlYWN0aW9uU3VibWl0KT1cIm9uUmVhY3Rpb25TdWJtaXQoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1jb250ZW50LXJlYWN0aW9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIElvbkJ1dHRvbiwgSW9uU3Bpbm5lciwgSW9uVGV4dGFyZWFdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGVudC1yZWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbnRlbnQtcmVhY3Rpb24uY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudFJlYWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICBwcml2YXRlIGZlZWRiYWNrU2VydmljZSA9IGluamVjdChGZWVkYmFja1NlcnZpY2UpO1xuICBwcml2YXRlIHRvYXN0ID0gaW5qZWN0KFRvYXN0U2VydmljZSk7XG4gIHByaXZhdGUgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgYXV0aCA9IGluamVjdChBdXRoU2VydmljZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBpc0NvbmZpZ3VyZWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZlZWRiYWNrU2VydmljZS5pc0NvbmZpZ3VyZWQoKSk7XG5cbiAgQElucHV0KCkgcHJvcHM6IFBhcnRpYWw8Q29udGVudFJlYWN0aW9uTWV0YWRhdGE+ID0ge307XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jaWEgYWwgbW9kYWwgaW55ZWN0YWRhIHBvciBgTW9kYWxTZXJ2aWNlYCBjdWFuZG8gZWwgY29tcG9uZW50ZSBzZVxuICAgKiBhYnJlIGNvbW8gbW9kYWwvc2hlZXQgKGBjb21wb25lbnRQcm9wcy5fbW9kYWxSZWZgKS4gUGVybWl0ZSBjZXJyYXJzZSBkZXNkZVxuICAgKiBkZW50cm8gKGJvdMOzbiBkZSBjaWVycmUpLiBgdW5kZWZpbmVkYCBlbiB1c28gaW5saW5lLlxuICAgKi9cbiAgQElucHV0KCkgX21vZGFsUmVmPzogeyBkaXNtaXNzOiAoZGF0YT86IHVua25vd24sIHJvbGU/OiBzdHJpbmcpID0+IFByb21pc2U8Ym9vbGVhbj4gfTtcblxuICBAT3V0cHV0KCkgcmVhY3Rpb25TdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFJlYWN0aW9uU3VibWl0RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSByZWFjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UmVhY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAvLyBFc3RhZG8gcmVhY3Rpdm9cbiAgc3RhdGUgPSBzaWduYWw8Q29udGVudFJlYWN0aW9uU3RhdGU+KHtcbiAgICBzZWxlY3RlZFZhbHVlOiBudWxsLFxuICAgIGNvbW1lbnQ6ICcnLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgIGhhZFByZXZpb3VzUmVhY3Rpb246IGZhbHNlLFxuICAgIGVycm9yOiBudWxsLFxuICB9KTtcblxuICAvLyBWYWxvcmVzIHBvciBkZWZlY3RvXG4gIHJlYWRvbmx5IGRlZmF1bHRFbW9qaXM6IFtzdHJpbmcsIHN0cmluZywgc3RyaW5nXSA9IFsn8J+YnicsICfwn5iQJywgJ/CfmIonXTtcbiAgcmVhZG9ubHkgZGVmYXVsdExhYmVsczogW3N0cmluZywgc3RyaW5nLCBzdHJpbmddID0gWydObyBtZSBheXVkw7MnLCAnUmVndWxhcicsICdNdXkgw7p0aWwnXTtcblxuICAvLyBDb21wdXRlZCBwcm9wZXJ0aWVzXG4gIHJlc29sdmVkUHJvcHMgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgIGVudGl0eVJlZjogdGhpcy5wcm9wcy5lbnRpdHlSZWYhLFxuICAgIHF1ZXN0aW9uOiB0aGlzLnByb3BzLnF1ZXN0aW9uIHx8IHRoaXMudCgncXVlc3Rpb24nKSxcbiAgICBzaG93Q29tbWVudDogdGhpcy5wcm9wcy5zaG93Q29tbWVudCA/PyB0cnVlLFxuICAgIGNvbW1lbnRPblZhbHVlczogdGhpcy5wcm9wcy5jb21tZW50T25WYWx1ZXMsXG4gICAgY29tbWVudFBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLmNvbW1lbnRQbGFjZWhvbGRlciB8fCB0aGlzLnQoJ2NvbW1lbnRQbGFjZWhvbGRlcicpLFxuICAgIG1heENvbW1lbnRMZW5ndGg6IHRoaXMucHJvcHMubWF4Q29tbWVudExlbmd0aCA/PyA1MDAsXG4gICAgZW1vamlzOiB0aGlzLnByb3BzLmVtb2ppcyB8fCB0aGlzLmRlZmF1bHRFbW9qaXMsXG4gICAgZW1vamlMYWJlbHM6IHRoaXMucHJvcHMuZW1vamlMYWJlbHMgfHwgdGhpcy5kZWZhdWx0TGFiZWxzLFxuICAgIHNob3dUaGFua1lvdTogdGhpcy5wcm9wcy5zaG93VGhhbmtZb3UgPz8gdHJ1ZSxcbiAgICB0aGFua1lvdU1lc3NhZ2U6IHRoaXMucHJvcHMudGhhbmtZb3VNZXNzYWdlIHx8IHRoaXMudCgndGhhbmtZb3UnKSxcbiAgICBkaXNhYmxlZDogdGhpcy5wcm9wcy5kaXNhYmxlZCA/PyBmYWxzZSxcbiAgICByZWFkb25seTogdGhpcy5wcm9wcy5yZWFkb25seSA/PyBmYWxzZSxcbiAgICAvLyBWYXJpYW50ZTogJ2Vtb2ppJyBjdWFuZG8gc2UgZGVjbGFyYSBleHBsw61jaXRhbWVudGUgbyBjdWFuZG8gc2UgcGFzYW4gZW1vamlzIGN1c3RvbS5cbiAgICB2YXJpYW50OiB0aGlzLnByb3BzLnZhcmlhbnQgPz8gKHRoaXMucHJvcHMuZW1vamlzID8gJ2Vtb2ppJyA6ICdidXR0b25zJyksXG4gICAgc2hvd0Nsb3NlQnV0dG9uOiB0aGlzLnByb3BzLnNob3dDbG9zZUJ1dHRvbiA/PyBmYWxzZSxcbiAgfSkpO1xuXG4gIHJlYWRvbmx5IGFjdGl2ZVJlYWN0aW9uVmFsdWVzID0gY29tcHV0ZWQ8UmVhY3Rpb25WYWx1ZVtdPigoKSA9PlxuICAgIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppcy5sZW5ndGggPT09IDIgPyBbJ25lZ2F0aXZlJywgJ3Bvc2l0aXZlJ10gOiBbJ25lZ2F0aXZlJywgJ25ldXRyYWwnLCAncG9zaXRpdmUnXVxuICApO1xuXG4gIHNob3dDb21tZW50RmllbGQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy5zdGF0ZSgpLnNlbGVjdGVkVmFsdWU7XG4gICAgaWYgKCFzZWwpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjb21tZW50T24gPSB0aGlzLnJlc29sdmVkUHJvcHMoKS5jb21tZW50T25WYWx1ZXM7XG4gICAgaWYgKGNvbW1lbnRPbiAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY29tbWVudE9uLmluY2x1ZGVzKHNlbCk7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLnNob3dDb21tZW50O1xuICB9KTtcblxuICBjYW5TdWJtaXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiAhdGhpcy5zdGF0ZSgpLmlzTG9hZGluZyk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gQXV0by1yZWdpc3RybyBkZSBkZWZhdWx0cyBpMThuIChlcy9lbikgc2kgZWwgY29uc3VtZXIgbm8gcHJvdmV5w7MgZWxcbiAgICAvLyBuYW1lc3BhY2UuIEdhcmFudGl6YSBxdWUgYHQoKWAgbnVuY2EgY2FpZ2EgZW4ga2V5IGZhbHRhbnRlLiBWZXJcbiAgICAvLyBDT05URU5UX1JFQUNUSU9OX0kxOE4uIElkZW1wb3RlbnRlOiBzb2xvIGxhIDHCqiBpbnN0YW5jaWEgcmVnaXN0cmEuXG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKCdDb250ZW50UmVhY3Rpb24nKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyQ29udGVudCgnQ29udGVudFJlYWN0aW9uJywgQ09OVEVOVF9SRUFDVElPTl9JMThOKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2llcnJhIGVsIG1vZGFsL3NoZWV0IGNvbnRlbmVkb3IgKHNpIGVsIGNvbXBvbmVudGUgc2UgYWJyacOzIHbDrWEgTW9kYWxTZXJ2aWNlKS4gKi9cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLl9tb2RhbFJlZj8uZGlzbWlzcygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2FkUHJldmlvdXNSZWFjdGlvbigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddICYmICFjaGFuZ2VzWydwcm9wcyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmxvYWRQcmV2aW91c1JlYWN0aW9uKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUHJldmlvdXNSZWFjdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMuZW50aXR5UmVmKSByZXR1cm47XG5cbiAgICAvLyBTaSBoYXkgaW5pdGlhbFZhbHVlLCB1c2FybG8gZGlyZWN0YW1lbnRlIHNpbiBjb25zdWx0YXJcbiAgICBpZiAodGhpcy5wcm9wcy5pbml0aWFsVmFsdWUpIHtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHtcbiAgICAgICAgLi4ucyxcbiAgICAgICAgc2VsZWN0ZWRWYWx1ZTogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWUhLFxuICAgICAgICBoYWRQcmV2aW91c1JlYWN0aW9uOiB0cnVlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTaSBza2lwSW5pdGlhbENoZWNrIGVzdMOhIGFjdGl2bywgbm8gY29uc3VsdGFyXG4gICAgaWYgKHRoaXMucHJvcHMuc2tpcEluaXRpYWxDaGVjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiB0cnVlLCBlcnJvcjogbnVsbCB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2sgPSBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jaGVja0ZlZWRiYWNrKFxuICAgICAgICB0aGlzLnByb3BzLmVudGl0eVJlZi5lbnRpdHlUeXBlLFxuICAgICAgICB0aGlzLnByb3BzLmVudGl0eVJlZi5lbnRpdHlJZFxuICAgICAgKTtcblxuICAgICAgaWYgKGNoZWNrLmhhc0ZlZWRiYWNrICYmIGNoZWNrLnJlYWN0aW9uVmFsdWUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAgIC4uLnMsXG4gICAgICAgICAgc2VsZWN0ZWRWYWx1ZTogY2hlY2sucmVhY3Rpb25WYWx1ZSEsXG4gICAgICAgICAgaGFkUHJldmlvdXNSZWFjdGlvbjogdHJ1ZSxcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIGlzTG9hZGluZzogZmFsc2UgfSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHByZXZpb3VzIHJlYWN0aW9uOicsIGVycm9yKTtcbiAgICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgaXNMb2FkaW5nOiBmYWxzZSB9KSk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0UmVhY3Rpb24odmFsdWU6IFJlYWN0aW9uVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgdGhpcy5yZXNvbHZlZFByb3BzKCkucmVhZG9ubHkpIHJldHVybjtcblxuICAgIGNvbnN0IHByZXZpb3VzVmFsdWUgPSB0aGlzLnN0YXRlKCkuc2VsZWN0ZWRWYWx1ZTtcblxuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHtcbiAgICAgIC4uLnMsXG4gICAgICBzZWxlY3RlZFZhbHVlOiB2YWx1ZSxcbiAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgIH0pKTtcblxuICAgIHRoaXMucmVhY3Rpb25DaGFuZ2UuZW1pdCh7IHZhbHVlLCBwcmV2aW91c1ZhbHVlIH0pO1xuICB9XG5cbiAgYXN5bmMgc3VibWl0UmVhY3Rpb24oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5zdGF0ZSgpO1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5yZXNvbHZlZFByb3BzKCk7XG5cbiAgICBpZiAoIWN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlIHx8IHByb3BzLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnN0YXRlLnVwZGF0ZShzID0+ICh7IC4uLnMsIGlzTG9hZGluZzogdHJ1ZSwgZXJyb3I6IG51bGwgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIERldGVybWluYXIgc2kgdXNhciBlbmRwb2ludCBhbsOzbmltbyBvIGF1dGVudGljYWRvXG4gICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSB0aGlzLmF1dGg/LmlzQXV0aGVudGljYXRlZCgpID8/IGZhbHNlO1xuICAgICAgY29uc3QgdXNlQW5vbnltb3VzID0gdGhpcy5wcm9wcy5hbGxvd0Fub255bW91cyAmJiAhaXNBdXRoZW50aWNhdGVkO1xuXG4gICAgICBpZiAodXNlQW5vbnltb3VzKSB7XG4gICAgICAgIC8vIFVzYXIgZW5kcG9pbnQgYW7Ds25pbW8gKHDDumJsaWNvKVxuICAgICAgICBhd2FpdCB0aGlzLmZlZWRiYWNrU2VydmljZS5jcmVhdGVBbm9ueW1vdXNSZWFjdGlvbihcbiAgICAgICAgICBwcm9wcy5lbnRpdHlSZWYsXG4gICAgICAgICAgY3VycmVudFN0YXRlLnNlbGVjdGVkVmFsdWUsXG4gICAgICAgICAgY3VycmVudFN0YXRlLmNvbW1lbnQgfHwgdW5kZWZpbmVkXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2FyIGVuZHBvaW50IGF1dGVudGljYWRvXG4gICAgICAgIGF3YWl0IHRoaXMuZmVlZGJhY2tTZXJ2aWNlLmNyZWF0ZVJlYWN0aW9uKFxuICAgICAgICAgIHByb3BzLmVudGl0eVJlZixcbiAgICAgICAgICBjdXJyZW50U3RhdGUuc2VsZWN0ZWRWYWx1ZSxcbiAgICAgICAgICBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgICAgY29tbWVudDogJycsXG4gICAgICAgIGhhZFByZXZpb3VzUmVhY3Rpb246ICF1c2VBbm9ueW1vdXMsIC8vIFNvbG8gcGFyYSBhdXRlbnRpY2Fkb3NcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5yZWFjdGlvblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgdmFsdWU6IGN1cnJlbnRTdGF0ZS5zZWxlY3RlZFZhbHVlLFxuICAgICAgICBjb21tZW50OiBjdXJyZW50U3RhdGUuY29tbWVudCB8fCB1bmRlZmluZWQsXG4gICAgICAgIGVudGl0eVJlZjogcHJvcHMuZW50aXR5UmVmLFxuICAgICAgICBpc1VwZGF0ZTogY3VycmVudFN0YXRlLmhhZFByZXZpb3VzUmVhY3Rpb24sXG4gICAgICB9KTtcblxuICAgICAgaWYgKHByb3BzLnNob3dUaGFua1lvdSkge1xuICAgICAgICB0aGlzLnRvYXN0LnNob3coe1xuICAgICAgICAgIG1lc3NhZ2U6IHByb3BzLnRoYW5rWW91TWVzc2FnZSxcbiAgICAgICAgICBkdXJhdGlvbjogMjAwMCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHN1Ym1pdHRpbmcgcmVhY3Rpb246JywgZXJyb3IpO1xuICAgICAgdGhpcy5zdGF0ZS51cGRhdGUocyA9PiAoe1xuICAgICAgICAuLi5zLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdGhpcy50KCdlcnJvclN1Ym1pdHRpbmcnKSxcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy50b2FzdC5zaG93KHtcbiAgICAgICAgbWVzc2FnZTogdGhpcy50KCdlcnJvclN1Ym1pdHRpbmcnKSxcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVDb21tZW50KGV2ZW50OiBDdXN0b21FdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gZXZlbnQuZGV0YWlsLnZhbHVlIHx8ICcnO1xuICAgIHRoaXMuc3RhdGUudXBkYXRlKHMgPT4gKHsgLi4ucywgY29tbWVudDogdmFsdWUgfSkpO1xuICB9XG5cbiAgZ2V0RW1vamkoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRQcm9wcygpLmVtb2ppc1tpbmRleF07XG4gIH1cblxuICBnZXRFbW9qaUxhYmVsKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkUHJvcHMoKS5lbW9qaUxhYmVsc1tpbmRleF07XG4gIH1cblxuICBpc1NlbGVjdGVkKHZhbHVlOiBSZWFjdGlvblZhbHVlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUoKS5zZWxlY3RlZFZhbHVlID09PSB2YWx1ZTtcbiAgfVxuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHF1ZXN0aW9uOiAnwr9UZSByZXN1bHTDsyDDunRpbCBlc3RlIGNvbnRlbmlkbz8nLFxuICAgICAgY29tbWVudFBsYWNlaG9sZGVyOiAnQ3XDqW50YW5vcyBtw6FzIChvcGNpb25hbCkuLi4nLFxuICAgICAgc3VibWl0OiAnRW52aWFyIG9waW5pw7NuJyxcbiAgICAgIHVwZGF0ZTogJ0FjdHVhbGl6YXIgb3BpbmnDs24nLFxuICAgICAgdGhhbmtZb3U6ICfCoUdyYWNpYXMgcG9yIHR1IG9waW5pw7NuIScsXG4gICAgICBzdWJtaXR0ZWQ6ICdUdSBvcGluacOzbiBoYSBzaWRvIHJlZ2lzdHJhZGEnLFxuICAgICAgZXJyb3JTdWJtaXR0aW5nOiAnRXJyb3IgYWwgZW52aWFyLiBJbnRlbnRhIGRlIG51ZXZvLicsXG4gICAgICBwb3NpdGl2ZUxhYmVsOiAnU8OtLCBtdWNobycsXG4gICAgICBuZWdhdGl2ZUxhYmVsOiAnTm8gdGFudG8nLFxuICAgICAgbmVnYXRpdmVGZWVkYmFja1RpdGxlOiAnwr9DdcOpbnRhbm9zIHF1w6kgbm8gdGUgZ3VzdMOzPycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ29udGVudFJlYWN0aW9uJykgfHwgdHJhbnNsYXRpb25zW2tleV0gfHwga2V5O1xuICB9XG59XG4iLCJAaWYgKGlzQ29uZmlndXJlZCgpKSB7XG48ZGl2IGNsYXNzPVwiY29udGVudC1yZWFjdGlvblwiIFtjbGFzcy5kaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWRcIiBbY2xhc3MucmVhZG9ubHldPVwicmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCI+XG4gIDwhLS0gQm90w7NuIGRlIGNpZXJyZSAoc29sbyBlbiBtb2RvIG1vZGFsL3NoZWV0KSAtLT5cbiAgQGlmIChyZXNvbHZlZFByb3BzKCkuc2hvd0Nsb3NlQnV0dG9uKSB7XG4gIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIHNoYXBlPVwicm91bmRcIiBjbGFzcz1cImNsb3NlLWJ1dHRvblwiIChjbGljayk9XCJjbG9zZSgpXCI+XG4gICAgPHN0cm9uZz57eyB0KCdjbG9zZScpIH19PC9zdHJvbmc+XG4gIDwvaW9uLWJ1dHRvbj5cbiAgfVxuICA8IS0tIExvYWRpbmcgaW5pY2lhbCAtLT5cbiAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZyAmJiAhc3RhdGUoKS5zZWxlY3RlZFZhbHVlKSB7XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbnRhaW5lclwiPlxuICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gIDwhLS0gUHJlZ3VudGEgLS0+XG4gIDxwIGNsYXNzPVwicXVlc3Rpb25cIj5cbiAgICB7eyBzdGF0ZSgpLnNlbGVjdGVkVmFsdWUgPT09ICduZWdhdGl2ZScgPyB0KCduZWdhdGl2ZUZlZWRiYWNrVGl0bGUnKSA6IHJlc29sdmVkUHJvcHMoKS5xdWVzdGlvbiB9fVxuICA8L3A+XG5cbiAgPCEtLSBCb3RvbmVzIGRlIHJlYWNjacOzbiDigJQgdmFyaWFudGUgZW1vamkgKGNhcmFzLCBlc3RyZWxsYXMsIHRodW1icywg4oCmKSAtLT5cbiAgQGlmIChyZXNvbHZlZFByb3BzKCkudmFyaWFudCA9PT0gJ2Vtb2ppJykge1xuICA8ZGl2IGNsYXNzPVwicmVhY3Rpb24tYnV0dG9ucyByZWFjdGlvbi1idXR0b25zLS1lbW9qaVwiPlxuICAgIEBmb3IgKHZhbHVlIG9mIGFjdGl2ZVJlYWN0aW9uVmFsdWVzKCk7IHRyYWNrIHZhbHVlOyBsZXQgaSA9ICRpbmRleCkge1xuICAgIDxpb24tYnV0dG9uXG4gICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZCh2YWx1ZSlcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJyZXNvbHZlZFByb3BzKCkuZW1vamlMYWJlbHNbaV1cIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImlzU2VsZWN0ZWQodmFsdWUpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbih2YWx1ZSlcIlxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzPVwiZW1vamktYnRuXCI+e3sgcmVzb2x2ZWRQcm9wcygpLmVtb2ppc1tpXSB9fTwvc3Bhbj5cbiAgICA8L2lvbi1idXR0b24+XG4gICAgfVxuICA8L2Rpdj5cbiAgfSBAZWxzZSB7XG4gIDwhLS0gQm90b25lcyBkZSByZWFjY2nDs24g4oCUIHZhcmlhbnRlIHRleHRvIChkZWZhdWx0KSAtLT5cbiAgPGRpdiBjbGFzcz1cInJlYWN0aW9uLWJ1dHRvbnNcIj5cbiAgICA8aW9uLWJ1dHRvblxuICAgICAgW2ZpbGxdPVwiaXNTZWxlY3RlZCgncG9zaXRpdmUnKSA/ICdzb2xpZCcgOiAnb3V0bGluZSdcIlxuICAgICAgc2hhcGU9XCJyb3VuZFwiXG4gICAgICBjb2xvcj1cImRhcmtcIlxuICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImlzU2VsZWN0ZWQoJ3Bvc2l0aXZlJylcIlxuICAgICAgW2Rpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZCB8fCByZXNvbHZlZFByb3BzKCkucmVhZG9ubHlcIlxuICAgICAgKGNsaWNrKT1cInNlbGVjdFJlYWN0aW9uKCdwb3NpdGl2ZScpXCJcbiAgICA+XG4gICAgICB7eyB0KCdwb3NpdGl2ZUxhYmVsJykgfX1cbiAgICA8L2lvbi1idXR0b24+XG4gICAgPGlvbi1idXR0b25cbiAgICAgIFtmaWxsXT1cImlzU2VsZWN0ZWQoJ25lZ2F0aXZlJykgPyAnc29saWQnIDogJ291dGxpbmUnXCJcbiAgICAgIHNoYXBlPVwicm91bmRcIlxuICAgICAgY29sb3I9XCJkYXJrXCJcbiAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJpc1NlbGVjdGVkKCduZWdhdGl2ZScpXCJcbiAgICAgIFtkaXNhYmxlZF09XCJyZXNvbHZlZFByb3BzKCkuZGlzYWJsZWQgfHwgcmVzb2x2ZWRQcm9wcygpLnJlYWRvbmx5XCJcbiAgICAgIChjbGljayk9XCJzZWxlY3RSZWFjdGlvbignbmVnYXRpdmUnKVwiXG4gICAgPlxuICAgICAge3sgdCgnbmVnYXRpdmVMYWJlbCcpIH19XG4gICAgPC9pb24tYnV0dG9uPlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gQ2FtcG8gZGUgY29tZW50YXJpbyAoc29sbyBzaSBoYXkgc2VsZWNjacOzbikgLS0+XG4gIEBpZiAoc2hvd0NvbW1lbnRGaWVsZCgpKSB7XG4gIDxkaXYgY2xhc3M9XCJjb21tZW50LXNlY3Rpb25cIj5cbiAgICA8aW9uLXRleHRhcmVhXG4gICAgICBbdmFsdWVdPVwic3RhdGUoKS5jb21tZW50XCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJyZXNvbHZlZFByb3BzKCkuY29tbWVudFBsYWNlaG9sZGVyXCJcbiAgICAgIFttYXhsZW5ndGhdPVwicmVzb2x2ZWRQcm9wcygpLm1heENvbW1lbnRMZW5ndGhcIlxuICAgICAgW2Rpc2FibGVkXT1cInJlc29sdmVkUHJvcHMoKS5kaXNhYmxlZFwiXG4gICAgICBbcm93c109XCIzXCJcbiAgICAgIGNsYXNzPVwiY29tbWVudC10ZXh0YXJlYVwiXG4gICAgICAoaW9uSW5wdXQpPVwidXBkYXRlQ29tbWVudCgkZXZlbnQpXCJcbiAgICA+PC9pb24tdGV4dGFyZWE+XG4gICAgPHNwYW4gY2xhc3M9XCJjaGFyLWNvdW50XCI+IHt7IHN0YXRlKCkuY29tbWVudC5sZW5ndGggfX0ve3sgcmVzb2x2ZWRQcm9wcygpLm1heENvbW1lbnRMZW5ndGggfX0gPC9zcGFuPlxuICA8L2Rpdj5cbiAgfVxuXG4gIDwhLS0gQm90w7NuIGRlIGVudsOtbyAtLT5cbiAgQGlmIChzdGF0ZSgpLnNlbGVjdGVkVmFsdWUgJiYgIXN0YXRlKCkuaXNTdWJtaXR0ZWQpIHtcbiAgPGlvbi1idXR0b24gZXhwYW5kPVwiYmxvY2tcIiBzaGFwZT1cInJvdW5kXCIgW2Rpc2FibGVkXT1cIiFjYW5TdWJtaXQoKVwiIChjbGljayk9XCJzdWJtaXRSZWFjdGlvbigpXCIgY2xhc3M9XCJzdWJtaXQtYnV0dG9uXCI+XG4gICAgQGlmIChzdGF0ZSgpLmlzTG9hZGluZykge1xuICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIj48L2lvbi1zcGlubmVyPlxuICAgIH0gQGVsc2UgeyB7eyBzdGF0ZSgpLmhhZFByZXZpb3VzUmVhY3Rpb24gPyB0KCd1cGRhdGUnKSA6IHQoJ3N1Ym1pdCcpIH19IH1cbiAgPC9pb24tYnV0dG9uPlxuICB9XG5cbiAgPCEtLSBNZW5zYWplIGRlIGNvbmZpcm1hY2nDs24gLS0+XG4gIEBpZiAoc3RhdGUoKS5pc1N1Ym1pdHRlZCkge1xuICA8cCBjbGFzcz1cInN1Ym1pdHRlZC1tZXNzYWdlXCI+e3sgdCgndGhhbmtZb3UnKSB9fTwvcD5cbiAgfVxuXG4gIDwhLS0gRXJyb3IgLS0+XG4gIEBpZiAoc3RhdGUoKS5lcnJvcikge1xuICA8cCBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj57eyBzdGF0ZSgpLmVycm9yIH19PC9wPlxuICB9IH1cbjwvZGl2PlxufVxuIl19
|