valtech-components 2.0.286 → 2.0.289

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 (30) hide show
  1. package/README.md +61 -21
  2. package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
  3. package/esm2022/lib/components/atoms/text/types.mjs +1 -1
  4. package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
  5. package/esm2022/lib/examples/link-processing-example.component.mjs +189 -0
  6. package/esm2022/lib/services/lang-provider/content.mjs +1 -13
  7. package/esm2022/lib/services/link-processor.service.mjs +192 -0
  8. package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
  9. package/esm2022/public-api.mjs +5 -4
  10. package/fesm2022/valtech-components.mjs +473 -919
  11. package/fesm2022/valtech-components.mjs.map +1 -1
  12. package/lib/components/atoms/text/text.component.d.ts +5 -1
  13. package/lib/components/atoms/text/types.d.ts +5 -0
  14. package/lib/examples/link-processing-example.component.d.ts +24 -0
  15. package/lib/services/link-processor.service.d.ts +98 -0
  16. package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
  17. package/package.json +1 -1
  18. package/public-api.d.ts +4 -3
  19. package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -291
  20. package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
  21. package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
  22. package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
  23. package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
  24. package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
  25. package/lib/components/_examples/global-content-example-content.d.ts +0 -9
  26. package/lib/components/_examples/global-content-example.component.d.ts +0 -73
  27. package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
  28. package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
  29. package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
  30. /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
@@ -1,347 +0,0 @@
1
- import { AsyncPipe, NgIf } from '@angular/common';
2
- import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
3
- import { IonButton, IonCard, IonCardContent, IonCardHeader, IonCardTitle } from '@ionic/angular/standalone';
4
- import { ContentService } from '../../services/content.service';
5
- import { LangOption } from '../../services/lang-provider/types';
6
- import { TextComponent } from '../atoms/text/text.component';
7
- import * as i0 from "@angular/core";
8
- /**
9
- * Reactive Content Example Component
10
- *
11
- * This component demonstrates various ways to use the new reactive content system with ContentService:
12
- * 1. Direct reactive content binding with val-text
13
- * 2. Content with interpolation (dynamic values)
14
- * 3. Multiple content keys retrieved at once
15
- * 4. Using the scoped content helper (forComponent)
16
- * 5. Language switching functionality
17
- *
18
- * The component automatically updates all text when the language changes,
19
- * using the simplified ContentService API that eliminates the need for manual
20
- * LangService injection and utility function imports.
21
- *
22
- * @example Usage patterns:
23
- * ```typescript
24
- * // Simple injection
25
- * content = inject(ContentService);
26
- *
27
- * // Scoped helper for this component
28
- * componentContent = this.content.forComponent('MyComponent');
29
- *
30
- * // Get reactive content
31
- * title$ = this.componentContent.get('title');
32
- * multipleTexts$ = this.componentContent.getMultiple(['title', 'subtitle']);
33
- * ```
34
- * without requiring manual subscriptions or change detection triggers.
35
- */
36
- export class ReactiveContentExampleComponent {
37
- constructor() {
38
- // Use the new ContentService with inject
39
- this.content = inject(ContentService);
40
- // Create a scoped content helper for this component
41
- this.componentContent = this.content.forComponent('ReactiveContentExample');
42
- // State for confirmation dialog
43
- this.showConfirmation = false;
44
- // Example 1: Simple reactive content props for val-text
45
- this.titleProps = {
46
- contentKey: 'title',
47
- contentClass: 'ReactiveContentExample',
48
- contentFallback: 'Default Title',
49
- color: 'primary',
50
- size: 'xlarge',
51
- bold: true,
52
- };
53
- // Example 2: Reactive content with interpolation
54
- this.greetingProps = {
55
- contentKey: 'greeting',
56
- contentClass: 'ReactiveContentExample',
57
- contentInterpolation: { name: 'Developer', count: 3 },
58
- contentFallback: 'Hello Developer',
59
- color: 'secondary',
60
- size: 'large',
61
- bold: false,
62
- };
63
- }
64
- ngOnInit() {
65
- // Set up reactive observables using ContentService
66
- this.currentLanguage$ = this.content.currentLang$;
67
- // Example 3: Get multiple content keys reactively - using the new API
68
- this.multipleContent$ = this.componentContent.getMultiple(['description', 'dynamicText']);
69
- // Button text reactive - using the new simplified API with options
70
- this.buttonText$ = this.componentContent.get('buttonText');
71
- // Global content observables using unified fromContent method
72
- this.saveButton$ = this.content.fromContent({ key: 'save' });
73
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
74
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
75
- this.okButton$ = this.content.fromContent({ key: 'ok' });
76
- this.loadingText$ = this.content.fromContent({ key: 'loading' });
77
- // Global content with interpolation using unified method
78
- this.deleteConfirmationText$ = this.content.fromContent({
79
- key: 'deleteConfirmation',
80
- interpolation: { itemName: 'este elemento' },
81
- });
82
- // Example of synchronous global content access
83
- console.log('Global save text:', this.content.getText('save'));
84
- console.log('Global cancel text:', this.content.getGlobalText('cancel'));
85
- // Example of using new scoped helper with interpolation
86
- const greetingWithNewAPI$ = this.componentContent.get('greeting', {
87
- interpolation: { name: 'Developer', count: 3 },
88
- fallback: 'Hello!',
89
- });
90
- console.log('New unified API works!', greetingWithNewAPI$);
91
- }
92
- /**
93
- * Toggle between Spanish and English
94
- */
95
- toggleLanguage() {
96
- const currentLang = this.content.currentLang;
97
- const newLang = currentLang === LangOption.ES ? LangOption.EN : LangOption.ES;
98
- this.content.setLang(newLang);
99
- }
100
- /**
101
- * Show delete confirmation dialog
102
- */
103
- showDeleteConfirmation() {
104
- this.showConfirmation = true;
105
- }
106
- /**
107
- * Hide delete confirmation dialog
108
- */
109
- hideDeleteConfirmation() {
110
- this.showConfirmation = false;
111
- }
112
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
113
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactiveContentExampleComponent, isStandalone: true, selector: "val-reactive-content-example", ngImport: i0, template: `
114
- <ion-card>
115
- <ion-card-header>
116
- <ion-card-title>
117
- <!-- Example 1: Direct reactive content using val-text -->
118
- <val-text [props]="titleProps"></val-text>
119
- </ion-card-title>
120
- </ion-card-header>
121
-
122
- <ion-card-content>
123
- <!-- Example 2: Reactive content with interpolation -->
124
- <val-text [props]="greetingProps"></val-text>
125
-
126
- <div class="example-divider"></div>
127
-
128
- <!-- Example 3: Multiple content keys -->
129
- <div *ngIf="multipleContent$ | async as content">
130
- <val-text
131
- [props]="{
132
- content: content['description'],
133
- color: 'medium',
134
- size: 'medium',
135
- bold: false,
136
- }"
137
- ></val-text>
138
-
139
- <br /><br />
140
-
141
- <val-text
142
- [props]="{
143
- content: content['dynamicText'],
144
- color: 'primary',
145
- size: 'small',
146
- bold: true,
147
- }"
148
- ></val-text>
149
- </div>
150
-
151
- <div class="example-divider"></div>
152
-
153
- <!-- Example 4: Using content helper -->
154
- <val-text
155
- [props]="{
156
- content: componentContent.getText('welcomeMessage'),
157
- color: 'success',
158
- size: 'large',
159
- bold: true,
160
- }"
161
- ></val-text>
162
-
163
- <div class="example-divider"></div>
164
-
165
- <!-- Example 5: Global content - buttons using global text -->
166
- <div class="button-group">
167
- <ion-button [fill]="'solid'" [color]="'primary'">
168
- {{ saveButton$ | async }}
169
- </ion-button>
170
- <ion-button [fill]="'outline'" [color]="'secondary'">
171
- {{ cancelButton$ | async }}
172
- </ion-button>
173
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
174
- {{ deleteButton$ | async }}
175
- </ion-button>
176
- </div>
177
-
178
- <div class="example-divider"></div>
179
-
180
- <!-- Example 6: Global content with interpolation -->
181
- <div *ngIf="showConfirmation" class="confirmation-message">
182
- <val-text
183
- [props]="{
184
- content: deleteConfirmationText$ | async,
185
- color: 'warning',
186
- size: 'medium',
187
- bold: true,
188
- }"
189
- ></val-text>
190
- <br /><br />
191
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
192
- {{ okButton$ | async }}
193
- </ion-button>
194
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
195
- {{ cancelButton$ | async }}
196
- </ion-button>
197
- </div>
198
-
199
- <div class="example-divider"></div>
200
-
201
- <!-- Example 7: Language switching button -->
202
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
203
- {{ buttonText$ | async }}
204
- </ion-button>
205
-
206
- <!-- Example 8: Current language display -->
207
- <div class="language-info">
208
- <p>
209
- Current language:
210
- <strong>{{ currentLanguage$ | async }}</strong>
211
- </p>
212
-
213
- <!-- Example of mixed global and component content -->
214
- <p>
215
- <val-text
216
- [props]="{
217
- content: loadingText$ | async,
218
- color: 'medium',
219
- size: 'small',
220
- bold: false,
221
- }"
222
- ></val-text>
223
- </p>
224
- </div>
225
- </ion-card-content>
226
- </ion-card>
227
- `, isInline: true, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { 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: TextComponent, selector: "val-text", inputs: ["props"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
228
- }
229
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactiveContentExampleComponent, decorators: [{
230
- type: Component,
231
- args: [{ selector: 'val-reactive-content-example', standalone: true, imports: [AsyncPipe, NgIf, IonCard, IonCardContent, IonCardHeader, IonCardTitle, IonButton, TextComponent], template: `
232
- <ion-card>
233
- <ion-card-header>
234
- <ion-card-title>
235
- <!-- Example 1: Direct reactive content using val-text -->
236
- <val-text [props]="titleProps"></val-text>
237
- </ion-card-title>
238
- </ion-card-header>
239
-
240
- <ion-card-content>
241
- <!-- Example 2: Reactive content with interpolation -->
242
- <val-text [props]="greetingProps"></val-text>
243
-
244
- <div class="example-divider"></div>
245
-
246
- <!-- Example 3: Multiple content keys -->
247
- <div *ngIf="multipleContent$ | async as content">
248
- <val-text
249
- [props]="{
250
- content: content['description'],
251
- color: 'medium',
252
- size: 'medium',
253
- bold: false,
254
- }"
255
- ></val-text>
256
-
257
- <br /><br />
258
-
259
- <val-text
260
- [props]="{
261
- content: content['dynamicText'],
262
- color: 'primary',
263
- size: 'small',
264
- bold: true,
265
- }"
266
- ></val-text>
267
- </div>
268
-
269
- <div class="example-divider"></div>
270
-
271
- <!-- Example 4: Using content helper -->
272
- <val-text
273
- [props]="{
274
- content: componentContent.getText('welcomeMessage'),
275
- color: 'success',
276
- size: 'large',
277
- bold: true,
278
- }"
279
- ></val-text>
280
-
281
- <div class="example-divider"></div>
282
-
283
- <!-- Example 5: Global content - buttons using global text -->
284
- <div class="button-group">
285
- <ion-button [fill]="'solid'" [color]="'primary'">
286
- {{ saveButton$ | async }}
287
- </ion-button>
288
- <ion-button [fill]="'outline'" [color]="'secondary'">
289
- {{ cancelButton$ | async }}
290
- </ion-button>
291
- <ion-button [fill]="'outline'" [color]="'danger'" (click)="showDeleteConfirmation()">
292
- {{ deleteButton$ | async }}
293
- </ion-button>
294
- </div>
295
-
296
- <div class="example-divider"></div>
297
-
298
- <!-- Example 6: Global content with interpolation -->
299
- <div *ngIf="showConfirmation" class="confirmation-message">
300
- <val-text
301
- [props]="{
302
- content: deleteConfirmationText$ | async,
303
- color: 'warning',
304
- size: 'medium',
305
- bold: true,
306
- }"
307
- ></val-text>
308
- <br /><br />
309
- <ion-button [fill]="'solid'" [color]="'danger'" size="small" (click)="hideDeleteConfirmation()">
310
- {{ okButton$ | async }}
311
- </ion-button>
312
- <ion-button [fill]="'clear'" [color]="'medium'" size="small" (click)="hideDeleteConfirmation()">
313
- {{ cancelButton$ | async }}
314
- </ion-button>
315
- </div>
316
-
317
- <div class="example-divider"></div>
318
-
319
- <!-- Example 7: Language switching button -->
320
- <ion-button expand="block" fill="outline" color="tertiary" (click)="toggleLanguage()">
321
- {{ buttonText$ | async }}
322
- </ion-button>
323
-
324
- <!-- Example 8: Current language display -->
325
- <div class="language-info">
326
- <p>
327
- Current language:
328
- <strong>{{ currentLanguage$ | async }}</strong>
329
- </p>
330
-
331
- <!-- Example of mixed global and component content -->
332
- <p>
333
- <val-text
334
- [props]="{
335
- content: loadingText$ | async,
336
- color: 'medium',
337
- size: 'small',
338
- bold: false,
339
- }"
340
- ></val-text>
341
- </p>
342
- </div>
343
- </ion-card-content>
344
- </ion-card>
345
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;margin:16px}.example-divider{margin:24px 0;border-bottom:1px solid var(--ion-color-light);padding-bottom:16px}.language-info{margin-top:24px;padding:16px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.language-info p{margin:0;color:var(--ion-color-dark)}.language-info strong{color:var(--ion-color-primary);text-transform:uppercase}ion-card{margin:0;border-radius:12px;box-shadow:0 4px 16px #0000001a}ion-card-header{padding-bottom:8px}ion-card-title{font-size:1.5rem;font-weight:600}ion-card-content{padding-top:16px}ion-button{margin:16px 0;--border-radius: 8px}ion-card-content{padding:20px}.language-info{margin-top:16px;padding:12px;background-color:var(--ion-color-light);border-radius:8px;text-align:center}.content-section{margin:16px 0;padding:12px;border:1px solid var(--ion-color-light);border-radius:8px}.content-section h3{margin-top:0;color:var(--ion-color-primary)}.example-divider{margin:24px 0;height:1px;background-color:var(--ion-color-light)}\n"] }]
346
- }], ctorParameters: () => [] });
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtY29udGVudC1leGFtcGxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvX2V4YW1wbGVzL3JlYWN0aXZlLWNvbnRlbnQtZXhhbXBsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzVHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQTZIN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sT0FBTywrQkFBK0I7SUFnRDFDO1FBL0NBLHlDQUF5QztRQUN6QyxZQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpDLG9EQUFvRDtRQUNwRCxxQkFBZ0IsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBZ0J2RSxnQ0FBZ0M7UUFDaEMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBRXpCLHdEQUF3RDtRQUN4RCxlQUFVLEdBQWlCO1lBQ3pCLFVBQVUsRUFBRSxPQUFPO1lBQ25CLFlBQVksRUFBRSx3QkFBd0I7WUFDdEMsZUFBZSxFQUFFLGVBQWU7WUFDaEMsS0FB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RUFBRSxDQUFDO1FBQzlFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILHNCQUFzQjtRQUNwQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7K0dBMUdVLCtCQUErQjttR0FBL0IsK0JBQStCLHdGQWxKaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtIVCwyakNBbkhTLFNBQVMsOENBQUUsSUFBSSw2RkFBRSxPQUFPLHlMQUFFLGNBQWMsK0VBQUUsYUFBYSxzR0FBRSxZQUFZLHNGQUFFLFNBQVMsb1BBQUUsYUFBYTs7NEZBbUo5RiwrQkFBK0I7a0JBdEozQyxTQUFTOytCQUNFLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLFlBQ2hHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrSFQsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY1BpcGUsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgT25Jbml0LCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbkJ1dHRvbiwgSW9uQ2FyZCwgSW9uQ2FyZENvbnRlbnQsIElvbkNhcmRIZWFkZXIsIElvbkNhcmRUaXRsZSB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBMYW5nT3B0aW9uIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbGFuZy1wcm92aWRlci90eXBlcyc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vYXRvbXMvdGV4dC90ZXh0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0TWV0YWRhdGEgfSBmcm9tICcuLi9hdG9tcy90ZXh0L3R5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJlYWN0aXZlLWNvbnRlbnQtZXhhbXBsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtBc3luY1BpcGUsIE5nSWYsIElvbkNhcmQsIElvbkNhcmRDb250ZW50LCBJb25DYXJkSGVhZGVyLCBJb25DYXJkVGl0bGUsIElvbkJ1dHRvbiwgVGV4dENvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGlvbi1jYXJkPlxuICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLXRpdGxlPlxuICAgICAgICAgIDwhLS0gRXhhbXBsZSAxOiBEaXJlY3QgcmVhY3RpdmUgY29udGVudCB1c2luZyB2YWwtdGV4dCAtLT5cbiAgICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cInRpdGxlUHJvcHNcIj48L3ZhbC10ZXh0PlxuICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG5cbiAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICA8IS0tIEV4YW1wbGUgMjogUmVhY3RpdmUgY29udGVudCB3aXRoIGludGVycG9sYXRpb24gLS0+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiZ3JlZXRpbmdQcm9wc1wiPjwvdmFsLXRleHQ+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZGl2aWRlclwiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gRXhhbXBsZSAzOiBNdWx0aXBsZSBjb250ZW50IGtleXMgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtdWx0aXBsZUNvbnRlbnQkIHwgYXN5bmMgYXMgY29udGVudFwiPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogY29udGVudFsnZGVzY3JpcHRpb24nXSxcbiAgICAgICAgICAgICAgY29sb3I6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBzaXplOiAnbWVkaXVtJyxcbiAgICAgICAgICAgICAgYm9sZDogZmFsc2UsXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+PC92YWwtdGV4dD5cblxuICAgICAgICAgIDxiciAvPjxiciAvPlxuXG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50WydkeW5hbWljVGV4dCddLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxuICAgICAgICAgICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgICAgICAgICBib2xkOiB0cnVlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIEV4YW1wbGUgNDogVXNpbmcgY29udGVudCBoZWxwZXIgLS0+XG4gICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICBjb250ZW50OiBjb21wb25lbnRDb250ZW50LmdldFRleHQoJ3dlbGNvbWVNZXNzYWdlJyksXG4gICAgICAgICAgICBjb2xvcjogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgc2l6ZTogJ2xhcmdlJyxcbiAgICAgICAgICAgIGJvbGQ6IHRydWUsXG4gICAgICAgICAgfVwiXG4gICAgICAgID48L3ZhbC10ZXh0PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLWRpdmlkZXJcIj48L2Rpdj5cblxuICAgICAgICA8IS0tIEV4YW1wbGUgNTogR2xvYmFsIGNvbnRlbnQgLSBidXR0b25zIHVzaW5nIGdsb2JhbCB0ZXh0IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWdyb3VwXCI+XG4gICAgICAgICAgPGlvbi1idXR0b24gW2ZpbGxdPVwiJ3NvbGlkJ1wiIFtjb2xvcl09XCIncHJpbWFyeSdcIj5cbiAgICAgICAgICAgIHt7IHNhdmVCdXR0b24kIHwgYXN5bmMgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gW2ZpbGxdPVwiJ291dGxpbmUnXCIgW2NvbG9yXT1cIidzZWNvbmRhcnknXCI+XG4gICAgICAgICAgICB7eyBjYW5jZWxCdXR0b24kIHwgYXN5bmMgfX1cbiAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgPGlvbi1idXR0b24gW2ZpbGxdPVwiJ291dGxpbmUnXCIgW2NvbG9yXT1cIidkYW5nZXInXCIgKGNsaWNrKT1cInNob3dEZWxldGVDb25maXJtYXRpb24oKVwiPlxuICAgICAgICAgICAge3sgZGVsZXRlQnV0dG9uJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgPCEtLSBFeGFtcGxlIDY6IEdsb2JhbCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvbiAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb25maXJtYXRpb25cIiBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCI+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBkZWxldGVDb25maXJtYXRpb25UZXh0JCB8IGFzeW5jLFxuICAgICAgICAgICAgICBjb2xvcjogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICBzaXplOiAnbWVkaXVtJyxcbiAgICAgICAgICAgICAgYm9sZDogdHJ1ZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDxiciAvPjxiciAvPlxuICAgICAgICAgIDxpb24tYnV0dG9uIFtmaWxsXT1cIidzb2xpZCdcIiBbY29sb3JdPVwiJ2RhbmdlcidcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiaGlkZURlbGV0ZUNvbmZpcm1hdGlvbigpXCI+XG4gICAgICAgICAgICB7eyBva0J1dHRvbiQgfCBhc3luYyB9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8aW9uLWJ1dHRvbiBbZmlsbF09XCInY2xlYXInXCIgW2NvbG9yXT1cIidtZWRpdW0nXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImhpZGVEZWxldGVDb25maXJtYXRpb24oKVwiPlxuICAgICAgICAgICAge3sgY2FuY2VsQnV0dG9uJCB8IGFzeW5jIH19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1kaXZpZGVyXCI+PC9kaXY+XG5cbiAgICAgICAgPCEtLSBFeGFtcGxlIDc6IExhbmd1YWdlIHN3aXRjaGluZyBidXR0b24gLS0+XG4gICAgICAgIDxpb24tYnV0dG9uIGV4cGFuZD1cImJsb2NrXCIgZmlsbD1cIm91dGxpbmVcIiBjb2xvcj1cInRlcnRpYXJ5XCIgKGNsaWNrKT1cInRvZ2dsZUxhbmd1YWdlKClcIj5cbiAgICAgICAgICB7eyBidXR0b25UZXh0JCB8IGFzeW5jIH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICA8IS0tIEV4YW1wbGUgODogQ3VycmVudCBsYW5ndWFnZSBkaXNwbGF5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGFuZ3VhZ2UtaW5mb1wiPlxuICAgICAgICAgIDxwPlxuICAgICAgICAgICAgQ3VycmVudCBsYW5ndWFnZTpcbiAgICAgICAgICAgIDxzdHJvbmc+e3sgY3VycmVudExhbmd1YWdlJCB8IGFzeW5jIH19PC9zdHJvbmc+XG4gICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgPCEtLSBFeGFtcGxlIG9mIG1peGVkIGdsb2JhbCBhbmQgY29tcG9uZW50IGNvbnRlbnQgLS0+XG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICBjb250ZW50OiBsb2FkaW5nVGV4dCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICA+PC92YWwtdGV4dD5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgIDwvaW9uLWNhcmQ+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3JlYWN0aXZlLWNvbnRlbnQtZXhhbXBsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG4vKipcbiAqIFJlYWN0aXZlIENvbnRlbnQgRXhhbXBsZSBDb21wb25lbnRcbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBkZW1vbnN0cmF0ZXMgdmFyaW91cyB3YXlzIHRvIHVzZSB0aGUgbmV3IHJlYWN0aXZlIGNvbnRlbnQgc3lzdGVtIHdpdGggQ29udGVudFNlcnZpY2U6XG4gKiAxLiBEaXJlY3QgcmVhY3RpdmUgY29udGVudCBiaW5kaW5nIHdpdGggdmFsLXRleHRcbiAqIDIuIENvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uIChkeW5hbWljIHZhbHVlcylcbiAqIDMuIE11bHRpcGxlIGNvbnRlbnQga2V5cyByZXRyaWV2ZWQgYXQgb25jZVxuICogNC4gVXNpbmcgdGhlIHNjb3BlZCBjb250ZW50IGhlbHBlciAoZm9yQ29tcG9uZW50KVxuICogNS4gTGFuZ3VhZ2Ugc3dpdGNoaW5nIGZ1bmN0aW9uYWxpdHlcbiAqXG4gKiBUaGUgY29tcG9uZW50IGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBhbGwgdGV4dCB3aGVuIHRoZSBsYW5ndWFnZSBjaGFuZ2VzLFxuICogdXNpbmcgdGhlIHNpbXBsaWZpZWQgQ29udGVudFNlcnZpY2UgQVBJIHRoYXQgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbWFudWFsXG4gKiBMYW5nU2VydmljZSBpbmplY3Rpb24gYW5kIHV0aWxpdHkgZnVuY3Rpb24gaW1wb3J0cy5cbiAqXG4gKiBAZXhhbXBsZSBVc2FnZSBwYXR0ZXJuczpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFNpbXBsZSBpbmplY3Rpb25cbiAqIGNvbnRlbnQgPSBpbmplY3QoQ29udGVudFNlcnZpY2UpO1xuICpcbiAqIC8vIFNjb3BlZCBoZWxwZXIgZm9yIHRoaXMgY29tcG9uZW50XG4gKiBjb21wb25lbnRDb250ZW50ID0gdGhpcy5jb250ZW50LmZvckNvbXBvbmVudCgnTXlDb21wb25lbnQnKTtcbiAqXG4gKiAvLyBHZXQgcmVhY3RpdmUgY29udGVudFxuICogdGl0bGUkID0gdGhpcy5jb21wb25lbnRDb250ZW50LmdldCgndGl0bGUnKTtcbiAqIG11bHRpcGxlVGV4dHMkID0gdGhpcy5jb21wb25lbnRDb250ZW50LmdldE11bHRpcGxlKFsndGl0bGUnLCAnc3VidGl0bGUnXSk7XG4gKiBgYGBcbiAqIHdpdGhvdXQgcmVxdWlyaW5nIG1hbnVhbCBzdWJzY3JpcHRpb25zIG9yIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWFjdGl2ZUNvbnRlbnRFeGFtcGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gVXNlIHRoZSBuZXcgQ29udGVudFNlcnZpY2Ugd2l0aCBpbmplY3RcbiAgY29udGVudCA9IGluamVjdChDb250ZW50U2VydmljZSk7XG5cbiAgLy8gQ3JlYXRlIGEgc2NvcGVkIGNvbnRlbnQgaGVscGVyIGZvciB0aGlzIGNvbXBvbmVudFxuICBjb21wb25lbnRDb250ZW50ID0gdGhpcy5jb250ZW50LmZvckNvbXBvbmVudCgnUmVhY3RpdmVDb250ZW50RXhhbXBsZScpO1xuXG4gIC8vIE9ic2VydmFibGUgZm9yIGN1cnJlbnQgbGFuZ3VhZ2VcbiAgY3VycmVudExhbmd1YWdlJDogT2JzZXJ2YWJsZTxMYW5nT3B0aW9uPjtcblxuICAvLyBPYnNlcnZhYmxlIGZvciBidXR0b24gdGV4dFxuICBidXR0b25UZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIC8vIEdsb2JhbCBjb250ZW50IG9ic2VydmFibGVzXG4gIHNhdmVCdXR0b24kOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIGNhbmNlbEJ1dHRvbiQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZGVsZXRlQnV0dG9uJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBva0J1dHRvbiQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgZGVsZXRlQ29uZmlybWF0aW9uVGV4dCQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgbG9hZGluZ1RleHQkOiBPYnNlcnZhYmxlPHN0cmluZz47XG5cbiAgLy8gU3RhdGUgZm9yIGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgc2hvd0NvbmZpcm1hdGlvbiA9IGZhbHNlO1xuXG4gIC8vIEV4YW1wbGUgMTogU2ltcGxlIHJlYWN0aXZlIGNvbnRlbnQgcHJvcHMgZm9yIHZhbC10ZXh0XG4gIHRpdGxlUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50S2V5OiAndGl0bGUnLFxuICAgIGNvbnRlbnRDbGFzczogJ1JlYWN0aXZlQ29udGVudEV4YW1wbGUnLFxuICAgIGNvbnRlbnRGYWxsYmFjazogJ0RlZmF1bHQgVGl0bGUnLFxuICAgIGNvbG9yOiAncHJpbWFyeScsXG4gICAgc2l6ZTogJ3hsYXJnZScsXG4gICAgYm9sZDogdHJ1ZSxcbiAgfTtcblxuICAvLyBFeGFtcGxlIDI6IFJlYWN0aXZlIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uXG4gIGdyZWV0aW5nUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50S2V5OiAnZ3JlZXRpbmcnLFxuICAgIGNvbnRlbnRDbGFzczogJ1JlYWN0aXZlQ29udGVudEV4YW1wbGUnLFxuICAgIGNvbnRlbnRJbnRlcnBvbGF0aW9uOiB7IG5hbWU6ICdEZXZlbG9wZXInLCBjb3VudDogMyB9LFxuICAgIGNvbnRlbnRGYWxsYmFjazogJ0hlbGxvIERldmVsb3BlcicsXG4gICAgY29sb3I6ICdzZWNvbmRhcnknLFxuICAgIHNpemU6ICdsYXJnZScsXG4gICAgYm9sZDogZmFsc2UsXG4gIH07XG5cbiAgLy8gRXhhbXBsZSAzOiBNdWx0aXBsZSBjb250ZW50IGtleXNcbiAgbXVsdGlwbGVDb250ZW50JDogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PjtcblxuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gU2V0IHVwIHJlYWN0aXZlIG9ic2VydmFibGVzIHVzaW5nIENvbnRlbnRTZXJ2aWNlXG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2UkID0gdGhpcy5jb250ZW50LmN1cnJlbnRMYW5nJDtcblxuICAgIC8vIEV4YW1wbGUgMzogR2V0IG11bHRpcGxlIGNvbnRlbnQga2V5cyByZWFjdGl2ZWx5IC0gdXNpbmcgdGhlIG5ldyBBUElcbiAgICB0aGlzLm11bHRpcGxlQ29udGVudCQgPSB0aGlzLmNvbXBvbmVudENvbnRlbnQuZ2V0TXVsdGlwbGUoWydkZXNjcmlwdGlvbicsICdkeW5hbWljVGV4dCddKTtcblxuICAgIC8vIEJ1dHRvbiB0ZXh0IHJlYWN0aXZlIC0gdXNpbmcgdGhlIG5ldyBzaW1wbGlmaWVkIEFQSSB3aXRoIG9wdGlvbnNcbiAgICB0aGlzLmJ1dHRvblRleHQkID0gdGhpcy5jb21wb25lbnRDb250ZW50LmdldCgnYnV0dG9uVGV4dCcpO1xuXG4gICAgLy8gR2xvYmFsIGNvbnRlbnQgb2JzZXJ2YWJsZXMgdXNpbmcgdW5pZmllZCBmcm9tQ29udGVudCBtZXRob2RcbiAgICB0aGlzLnNhdmVCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2F2ZScgfSk7XG4gICAgdGhpcy5jYW5jZWxCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnY2FuY2VsJyB9KTtcbiAgICB0aGlzLmRlbGV0ZUJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdkZWxldGUnIH0pO1xuICAgIHRoaXMub2tCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnb2snIH0pO1xuICAgIHRoaXMubG9hZGluZ1RleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbG9hZGluZycgfSk7XG5cbiAgICAvLyBHbG9iYWwgY29udGVudCB3aXRoIGludGVycG9sYXRpb24gdXNpbmcgdW5pZmllZCBtZXRob2RcbiAgICB0aGlzLmRlbGV0ZUNvbmZpcm1hdGlvblRleHQkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICAgIGtleTogJ2RlbGV0ZUNvbmZpcm1hdGlvbicsXG4gICAgICBpbnRlcnBvbGF0aW9uOiB7IGl0ZW1OYW1lOiAnZXN0ZSBlbGVtZW50bycgfSxcbiAgICB9KTtcblxuICAgIC8vIEV4YW1wbGUgb2Ygc3luY2hyb25vdXMgZ2xvYmFsIGNvbnRlbnQgYWNjZXNzXG4gICAgY29uc29sZS5sb2coJ0dsb2JhbCBzYXZlIHRleHQ6JywgdGhpcy5jb250ZW50LmdldFRleHQoJ3NhdmUnKSk7XG4gICAgY29uc29sZS5sb2coJ0dsb2JhbCBjYW5jZWwgdGV4dDonLCB0aGlzLmNvbnRlbnQuZ2V0R2xvYmFsVGV4dCgnY2FuY2VsJykpO1xuXG4gICAgLy8gRXhhbXBsZSBvZiB1c2luZyBuZXcgc2NvcGVkIGhlbHBlciB3aXRoIGludGVycG9sYXRpb25cbiAgICBjb25zdCBncmVldGluZ1dpdGhOZXdBUEkkID0gdGhpcy5jb21wb25lbnRDb250ZW50LmdldCgnZ3JlZXRpbmcnLCB7XG4gICAgICBpbnRlcnBvbGF0aW9uOiB7IG5hbWU6ICdEZXZlbG9wZXInLCBjb3VudDogMyB9LFxuICAgICAgZmFsbGJhY2s6ICdIZWxsbyEnLFxuICAgIH0pO1xuICAgIGNvbnNvbGUubG9nKCdOZXcgdW5pZmllZCBBUEkgd29ya3MhJywgZ3JlZXRpbmdXaXRoTmV3QVBJJCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGJldHdlZW4gU3BhbmlzaCBhbmQgRW5nbGlzaFxuICAgKi9cbiAgdG9nZ2xlTGFuZ3VhZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmNvbnRlbnQuY3VycmVudExhbmc7XG4gICAgY29uc3QgbmV3TGFuZyA9IGN1cnJlbnRMYW5nID09PSBMYW5nT3B0aW9uLkVTID8gTGFuZ09wdGlvbi5FTiA6IExhbmdPcHRpb24uRVM7XG4gICAgdGhpcy5jb250ZW50LnNldExhbmcobmV3TGFuZyk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBkZWxldGUgY29uZmlybWF0aW9uIGRpYWxvZ1xuICAgKi9cbiAgc2hvd0RlbGV0ZUNvbmZpcm1hdGlvbigpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dDb25maXJtYXRpb24gPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgZGVsZXRlIGNvbmZpcm1hdGlvbiBkaWFsb2dcbiAgICovXG4gIGhpZGVEZWxldGVDb25maXJtYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zaG93Q29uZmlybWF0aW9uID0gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -1,15 +0,0 @@
1
- import { TextContent } from '../types';
2
- const text = {
3
- es: {
4
- light: 'Siempre claro',
5
- dark: 'Siempre oscuro',
6
- auto: 'Automático',
7
- },
8
- en: {
9
- light: 'Always light',
10
- dark: 'Always dark',
11
- auto: 'System settings',
12
- },
13
- };
14
- export default new TextContent(text);
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUtc2V0dGluZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2NvbXBvbmVudHMvdGhlbWUtc2V0dGluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekQsTUFBTSxJQUFJLEdBQXFCO0lBQzdCLEVBQUUsRUFBRTtRQUNGLEtBQUssRUFBRSxlQUFlO1FBQ3RCLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsSUFBSSxFQUFFLFlBQVk7S0FDbkI7SUFDRCxFQUFFLEVBQUU7UUFDRixLQUFLLEVBQUUsY0FBYztRQUNyQixJQUFJLEVBQUUsYUFBYTtRQUNuQixJQUFJLEVBQUUsaUJBQWlCO0tBQ3hCO0NBQ0YsQ0FBQztBQUVGLGVBQWUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMYW5ndWFnZXNDb250ZW50LCBUZXh0Q29udGVudCB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgdGV4dDogTGFuZ3VhZ2VzQ29udGVudCA9IHtcbiAgZXM6IHtcbiAgICBsaWdodDogJ1NpZW1wcmUgY2xhcm8nLFxuICAgIGRhcms6ICdTaWVtcHJlIG9zY3VybycsXG4gICAgYXV0bzogJ0F1dG9tw6F0aWNvJyxcbiAgfSxcbiAgZW46IHtcbiAgICBsaWdodDogJ0Fsd2F5cyBsaWdodCcsXG4gICAgZGFyazogJ0Fsd2F5cyBkYXJrJyxcbiAgICBhdXRvOiAnU3lzdGVtIHNldHRpbmdzJyxcbiAgfSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBUZXh0Q29udGVudCh0ZXh0KTtcbiJdfQ==
@@ -1,9 +0,0 @@
1
- /**
2
- * Content configuration for the Global Content Example component.
3
- *
4
- * This demonstrates component-specific content that works alongside
5
- * global content to create a comprehensive content management system.
6
- */
7
- import { TextContent } from '../../services/lang-provider/types';
8
- declare const _default: TextContent;
9
- export default _default;
@@ -1,73 +0,0 @@
1
- import { TextMetadata } from '../atoms/text/types';
2
- import * as i0 from "@angular/core";
3
- /**
4
- * Comprehensive example demonstrating global content usage.
5
- *
6
- * This component shows:
7
- * 1. Global button texts
8
- * 2. Global state messages
9
- * 3. Global confirmations with interpolation
10
- * 4. Mixing global and component-specific content
11
- * 5. Language switching
12
- */
13
- export declare class GlobalContentExampleComponent {
14
- private content;
15
- private componentContent;
16
- formData: {
17
- name: string;
18
- email: string;
19
- message: string;
20
- };
21
- actionPerformed: boolean;
22
- titleProps: TextMetadata;
23
- languageLabel: TextMetadata;
24
- componentDescriptionProps: TextMetadata;
25
- saveButton$: import("rxjs").Observable<string>;
26
- editButton$: import("rxjs").Observable<string>;
27
- deleteButton$: import("rxjs").Observable<string>;
28
- cancelButton$: import("rxjs").Observable<string>;
29
- backButton$: import("rxjs").Observable<string>;
30
- nextButton$: import("rxjs").Observable<string>;
31
- okButton$: import("rxjs").Observable<string>;
32
- closeButton$: import("rxjs").Observable<string>;
33
- addButton$: import("rxjs").Observable<string>;
34
- removeButton$: import("rxjs").Observable<string>;
35
- searchButton$: import("rxjs").Observable<string>;
36
- filterButton$: import("rxjs").Observable<string>;
37
- sortButton$: import("rxjs").Observable<string>;
38
- refreshButton$: import("rxjs").Observable<string>;
39
- loadingText$: import("rxjs").Observable<string>;
40
- successText$: import("rxjs").Observable<string>;
41
- errorText$: import("rxjs").Observable<string>;
42
- warningText$: import("rxjs").Observable<string>;
43
- infoText$: import("rxjs").Observable<string>;
44
- noDataText$: import("rxjs").Observable<string>;
45
- requiredText$: import("rxjs").Observable<string>;
46
- optionalText$: import("rxjs").Observable<string>;
47
- searchPlaceholder$: import("rxjs").Observable<string>;
48
- deleteConfirmation$: import("rxjs").Observable<string>;
49
- areYouSureText$: import("rxjs").Observable<string>;
50
- unsavedChangesText$: import("rxjs").Observable<string>;
51
- /**
52
- * Set language
53
- */
54
- setLanguage(lang: 'es' | 'en'): void;
55
- /**
56
- * Perform an action to demonstrate status messages
57
- */
58
- performAction(): void;
59
- /**
60
- * Cancel action
61
- */
62
- cancelAction(): void;
63
- /**
64
- * Example of synchronous global content access
65
- */
66
- getOkTextSync(): string;
67
- /**
68
- * Example of synchronous global content access using getText
69
- */
70
- getCancelTextSync(): string;
71
- static ɵfac: i0.ɵɵFactoryDeclaration<GlobalContentExampleComponent, never>;
72
- static ɵcmp: i0.ɵɵComponentDeclaration<GlobalContentExampleComponent, "val-global-content-example", never, {}, {}, never, never, true, never>;
73
- }
@@ -1,32 +0,0 @@
1
- /**
2
- * Example content configuration for demonstrating the reactive content system.
3
- *
4
- * This file shows how to structure content for components that use the reactive
5
- * language system with the new fromContent pattern.
6
- */
7
- import { TextContent } from '../../services/lang-provider/types';
8
- declare const _default: TextContent;
9
- export default _default;
10
- /**
11
- * Type-safe content keys for the example component.
12
- * Use this interface to ensure type safety when accessing content keys.
13
- */
14
- export interface ExampleComponentContentKeys {
15
- title: string;
16
- subtitle: string;
17
- description: string;
18
- greeting: string;
19
- welcomeMessage: string;
20
- dynamicText: string;
21
- buttonText: string;
22
- loadingText: string;
23
- errorMessage: string;
24
- successMessage: string;
25
- confirmDialog: string;
26
- cancelButton: string;
27
- acceptButton: string;
28
- }
29
- /**
30
- * Utility type for getting content keys with type safety.
31
- */
32
- export type ExampleContentKey = keyof ExampleComponentContentKeys;
@@ -1,47 +0,0 @@
1
- import { OnInit } from '@angular/core';
2
- import { Observable } from 'rxjs';
3
- import { ContentService } from '../../services/content.service';
4
- import { LangOption } from '../../services/lang-provider/types';
5
- import { TextMetadata } from '../atoms/text/types';
6
- import * as i0 from "@angular/core";
7
- export declare class ReactiveContentExampleComponent implements OnInit {
8
- content: ContentService;
9
- componentContent: {
10
- get: (key: string, options?: {
11
- fallback?: string;
12
- interpolation?: Record<string, string | number>;
13
- }) => Observable<string>;
14
- getWithInterpolation: (key: string, interpolation: Record<string, string | number>, fallback?: string) => Observable<string>;
15
- getMultiple: (keys: string[]) => Observable<Record<string, string>>;
16
- getText: (key: string, fallback?: string) => string;
17
- hasContent: (key: string) => boolean;
18
- };
19
- currentLanguage$: Observable<LangOption>;
20
- buttonText$: Observable<string>;
21
- saveButton$: Observable<string>;
22
- cancelButton$: Observable<string>;
23
- deleteButton$: Observable<string>;
24
- okButton$: Observable<string>;
25
- deleteConfirmationText$: Observable<string>;
26
- loadingText$: Observable<string>;
27
- showConfirmation: boolean;
28
- titleProps: TextMetadata;
29
- greetingProps: TextMetadata;
30
- multipleContent$: Observable<Record<string, string>>;
31
- constructor();
32
- ngOnInit(): void;
33
- /**
34
- * Toggle between Spanish and English
35
- */
36
- toggleLanguage(): void;
37
- /**
38
- * Show delete confirmation dialog
39
- */
40
- showDeleteConfirmation(): void;
41
- /**
42
- * Hide delete confirmation dialog
43
- */
44
- hideDeleteConfirmation(): void;
45
- static ɵfac: i0.ɵɵFactoryDeclaration<ReactiveContentExampleComponent, never>;
46
- static ɵcmp: i0.ɵɵComponentDeclaration<ReactiveContentExampleComponent, "val-reactive-content-example", never, {}, {}, never, never, true, never>;
47
- }
@@ -1,3 +0,0 @@
1
- import { TextContent } from '../types';
2
- declare const _default: TextContent;
3
- export default _default;