valtech-components 2.0.302 → 2.0.305

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 (32) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +103 -23
  2. package/esm2022/lib/components/types.mjs +1 -1
  3. package/esm2022/lib/services/lang-provider/content.mjs +1 -72
  4. package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +4 -9
  5. package/esm2022/lib/shared/utils/content.mjs +2 -8
  6. package/esm2022/public-api.mjs +1 -12
  7. package/fesm2022/valtech-components.mjs +124 -2824
  8. package/fesm2022/valtech-components.mjs.map +1 -1
  9. package/lib/components/atoms/button/button.component.d.ts +33 -2
  10. package/lib/components/types.d.ts +19 -7
  11. package/package.json +1 -1
  12. package/public-api.d.ts +0 -10
  13. package/esm2022/lib/examples/comprehensive-link-test.component.mjs +0 -208
  14. package/esm2022/lib/examples/custom-content-demo.component.mjs +0 -291
  15. package/esm2022/lib/examples/display-demo.component.mjs +0 -518
  16. package/esm2022/lib/examples/display-simple-example.component.mjs +0 -202
  17. package/esm2022/lib/examples/link-processing-example.component.mjs +0 -233
  18. package/esm2022/lib/examples/multi-language-demo.component.mjs +0 -304
  19. package/esm2022/lib/examples/reactive-components-demo.component.mjs +0 -303
  20. package/esm2022/lib/examples/reactivity-test.component.mjs +0 -200
  21. package/esm2022/lib/examples/selector-examples.component.mjs +0 -234
  22. package/esm2022/lib/examples/user-issue-test.component.mjs +0 -267
  23. package/lib/examples/comprehensive-link-test.component.d.ts +0 -23
  24. package/lib/examples/custom-content-demo.component.d.ts +0 -26
  25. package/lib/examples/display-demo.component.d.ts +0 -62
  26. package/lib/examples/display-simple-example.component.d.ts +0 -23
  27. package/lib/examples/link-processing-example.component.d.ts +0 -26
  28. package/lib/examples/multi-language-demo.component.d.ts +0 -34
  29. package/lib/examples/reactive-components-demo.component.d.ts +0 -45
  30. package/lib/examples/reactivity-test.component.d.ts +0 -27
  31. package/lib/examples/selector-examples.component.d.ts +0 -21
  32. package/lib/examples/user-issue-test.component.d.ts +0 -31
@@ -1,304 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component } from '@angular/core';
3
- import { ButtonComponent } from '../components/atoms/button/button.component';
4
- import { TextComponent } from '../components/atoms/text/text.component';
5
- import { LANGUAGES } from '../services/lang-provider/types';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "../services/content.service";
8
- import * as i2 from "../services/lang-provider/lang-provider.service";
9
- import * as i3 from "@angular/common";
10
- /**
11
- * MultiLanguageDemoComponent - Demuestra el sistema de idiomas flexible.
12
- *
13
- * Este componente muestra cómo el sistema maneja múltiples idiomas,
14
- * fallbacks automáticos y warnings por traducciones faltantes.
15
- */
16
- export class MultiLanguageDemoComponent {
17
- constructor(content, langService) {
18
- this.content = content;
19
- this.langService = langService;
20
- this.availableLanguages = [];
21
- this.analysisResults = null;
22
- // Global content observables
23
- this.okButton$ = this.content.fromContent({ key: 'ok' });
24
- this.cancelButton$ = this.content.fromContent({ key: 'cancel' });
25
- this.saveButton$ = this.content.fromContent({ key: 'save' });
26
- this.deleteButton$ = this.content.fromContent({ key: 'delete' });
27
- // Content that might have missing translations
28
- this.nextButton$ = this.content.fromContent({ key: 'next', fallback: 'Next' });
29
- this.finishButton$ = this.content.fromContent({ key: 'finish', fallback: 'Finish' });
30
- this.searchPlaceholder$ = this.content.fromContent({ key: 'searchPlaceholder', fallback: 'Search...' });
31
- this.noDataMessage$ = this.content.fromContent({ key: 'noData', fallback: 'No data available' });
32
- }
33
- ngOnInit() {
34
- this.availableLanguages = this.langService.availableLangs;
35
- }
36
- switchLanguage(lang) {
37
- console.log(`Switching to language: ${lang}`);
38
- this.langService.setLang(lang);
39
- this.analysisResults = null; // Reset analysis when language changes
40
- }
41
- getLanguageName(lang) {
42
- const names = {
43
- [LANGUAGES.ES]: 'Español',
44
- [LANGUAGES.EN]: 'English',
45
- [LANGUAGES.FR]: 'Français',
46
- [LANGUAGES.DE]: 'Deutsch',
47
- pt: 'Português',
48
- };
49
- return names[lang] || lang.toUpperCase();
50
- }
51
- analyzeCurrentComponent() {
52
- const componentName = '_global'; // Analyzing global content for this demo
53
- const availableLanguages = this.langService.getAvailableLanguagesForComponent(componentName);
54
- const missingKeys = this.langService.getMissingContentKeys(componentName, this.langService.currentLang);
55
- this.analysisResults = {
56
- availableLanguages,
57
- missingKeys,
58
- };
59
- console.log('Component analysis results:', this.analysisResults);
60
- }
61
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, deps: [{ token: i1.ContentService }, { token: i2.LangService }], target: i0.ɵɵFactoryTarget.Component }); }
62
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiLanguageDemoComponent, isStandalone: true, selector: "val-multi-language-demo", ngImport: i0, template: `
63
- <div class="multi-lang-demo">
64
- <h2>Sistema de Idiomas Flexible</h2>
65
-
66
- <div class="language-info">
67
- <h3>Información del Sistema:</h3>
68
- <p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
69
- <p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
70
- <p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
71
- </div>
72
-
73
- <div class="language-switcher">
74
- <h3>Cambiar Idioma:</h3>
75
- <div class="button-group">
76
- <button
77
- *ngFor="let lang of availableLanguages"
78
- [class.active]="lang === langService.currentLang"
79
- (click)="switchLanguage(lang)"
80
- >
81
- {{ getLanguageName(lang) }}
82
- </button>
83
- <!-- Ejemplo de idioma no disponible -->
84
- <button (click)="switchLanguage('pt')">Português (no disponible)</button>
85
- </div>
86
- </div>
87
-
88
- <div class="content-examples">
89
- <h3>Contenido Global:</h3>
90
- <div class="example-grid">
91
- <val-text
92
- [props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
93
- ></val-text>
94
- <val-text
95
- [props]="{
96
- content: cancelButton$ | async,
97
- size: 'medium',
98
- color: 'dark',
99
- bold: false,
100
- processLinks: false,
101
- }"
102
- ></val-text>
103
- <val-text
104
- [props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
105
- ></val-text>
106
- <val-text
107
- [props]="{
108
- content: deleteButton$ | async,
109
- size: 'medium',
110
- color: 'dark',
111
- bold: false,
112
- processLinks: false,
113
- }"
114
- ></val-text>
115
- </div>
116
-
117
- <h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
118
- <div class="example-grid">
119
- <val-text
120
- [props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
121
- ></val-text>
122
- <val-text
123
- [props]="{
124
- content: finishButton$ | async,
125
- size: 'medium',
126
- color: 'dark',
127
- bold: false,
128
- processLinks: false,
129
- }"
130
- ></val-text>
131
- <val-text
132
- [props]="{
133
- content: searchPlaceholder$ | async,
134
- size: 'medium',
135
- color: 'dark',
136
- bold: false,
137
- processLinks: false,
138
- }"
139
- ></val-text>
140
- <val-text
141
- [props]="{
142
- content: noDataMessage$ | async,
143
- size: 'medium',
144
- color: 'dark',
145
- bold: false,
146
- processLinks: false,
147
- }"
148
- ></val-text>
149
- </div>
150
- </div>
151
-
152
- <div class="warning-info">
153
- <h3>Información de Warnings:</h3>
154
- <p>
155
- Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
156
- (francés, alemán).
157
- </p>
158
- <p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
159
- </div>
160
-
161
- <div class="component-analysis">
162
- <h3>Análisis del Componente:</h3>
163
- <button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
164
- <div *ngIf="analysisResults" class="analysis-results">
165
- <p>
166
- <strong>Idiomas disponibles para este componente:</strong>
167
- {{ analysisResults.availableLanguages.join(', ') }}
168
- </p>
169
- <div *ngIf="analysisResults.missingKeys.length > 0">
170
- <p>
171
- <strong>Claves faltantes en {{ langService.currentLang }}:</strong>
172
- </p>
173
- <ul>
174
- <li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
175
- </ul>
176
- </div>
177
- </div>
178
- </div>
179
- </div>
180
- `, isInline: true, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
181
- }
182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiLanguageDemoComponent, decorators: [{
183
- type: Component,
184
- args: [{ selector: 'val-multi-language-demo', standalone: true, imports: [CommonModule, TextComponent, ButtonComponent], template: `
185
- <div class="multi-lang-demo">
186
- <h2>Sistema de Idiomas Flexible</h2>
187
-
188
- <div class="language-info">
189
- <h3>Información del Sistema:</h3>
190
- <p><strong>Idioma actual:</strong> {{ langService.currentLang }}</p>
191
- <p><strong>Idioma por defecto:</strong> {{ langService.defaultLanguage }}</p>
192
- <p><strong>Idiomas disponibles:</strong> {{ langService.availableLangs.join(', ') }}</p>
193
- </div>
194
-
195
- <div class="language-switcher">
196
- <h3>Cambiar Idioma:</h3>
197
- <div class="button-group">
198
- <button
199
- *ngFor="let lang of availableLanguages"
200
- [class.active]="lang === langService.currentLang"
201
- (click)="switchLanguage(lang)"
202
- >
203
- {{ getLanguageName(lang) }}
204
- </button>
205
- <!-- Ejemplo de idioma no disponible -->
206
- <button (click)="switchLanguage('pt')">Português (no disponible)</button>
207
- </div>
208
- </div>
209
-
210
- <div class="content-examples">
211
- <h3>Contenido Global:</h3>
212
- <div class="example-grid">
213
- <val-text
214
- [props]="{ content: okButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
215
- ></val-text>
216
- <val-text
217
- [props]="{
218
- content: cancelButton$ | async,
219
- size: 'medium',
220
- color: 'dark',
221
- bold: false,
222
- processLinks: false,
223
- }"
224
- ></val-text>
225
- <val-text
226
- [props]="{ content: saveButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
227
- ></val-text>
228
- <val-text
229
- [props]="{
230
- content: deleteButton$ | async,
231
- size: 'medium',
232
- color: 'dark',
233
- bold: false,
234
- processLinks: false,
235
- }"
236
- ></val-text>
237
- </div>
238
-
239
- <h3>Contenido con Fallback (algunas traducciones faltantes):</h3>
240
- <div class="example-grid">
241
- <val-text
242
- [props]="{ content: nextButton$ | async, size: 'medium', color: 'dark', bold: false, processLinks: false }"
243
- ></val-text>
244
- <val-text
245
- [props]="{
246
- content: finishButton$ | async,
247
- size: 'medium',
248
- color: 'dark',
249
- bold: false,
250
- processLinks: false,
251
- }"
252
- ></val-text>
253
- <val-text
254
- [props]="{
255
- content: searchPlaceholder$ | async,
256
- size: 'medium',
257
- color: 'dark',
258
- bold: false,
259
- processLinks: false,
260
- }"
261
- ></val-text>
262
- <val-text
263
- [props]="{
264
- content: noDataMessage$ | async,
265
- size: 'medium',
266
- color: 'dark',
267
- bold: false,
268
- processLinks: false,
269
- }"
270
- ></val-text>
271
- </div>
272
- </div>
273
-
274
- <div class="warning-info">
275
- <h3>Información de Warnings:</h3>
276
- <p>
277
- Abre la consola del navegador para ver los warnings cuando cambies a idiomas con traducciones incompletas
278
- (francés, alemán).
279
- </p>
280
- <p>El sistema automáticamente usará el idioma por defecto o el primer idioma disponible como fallback.</p>
281
- </div>
282
-
283
- <div class="component-analysis">
284
- <h3>Análisis del Componente:</h3>
285
- <button (click)="analyzeCurrentComponent()">Analizar Contenido</button>
286
- <div *ngIf="analysisResults" class="analysis-results">
287
- <p>
288
- <strong>Idiomas disponibles para este componente:</strong>
289
- {{ analysisResults.availableLanguages.join(', ') }}
290
- </p>
291
- <div *ngIf="analysisResults.missingKeys.length > 0">
292
- <p>
293
- <strong>Claves faltantes en {{ langService.currentLang }}:</strong>
294
- </p>
295
- <ul>
296
- <li *ngFor="let key of analysisResults.missingKeys">{{ key }}</li>
297
- </ul>
298
- </div>
299
- </div>
300
- </div>
301
- </div>
302
- `, styles: [".multi-lang-demo{padding:20px;max-width:800px}.language-info,.content-examples,.warning-info,.component-analysis{margin:20px 0;padding:15px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}.button-group{display:flex;gap:10px;flex-wrap:wrap}.button-group button{padding:8px 16px;border:1px solid var(--ion-color-primary, #3880ff);background:#fff;color:var(--ion-color-primary, #3880ff);border-radius:4px;cursor:pointer;transition:all .2s}.button-group button:hover{background:var(--ion-color-primary-tint, #4992ff);color:#fff}.button-group button.active{background:var(--ion-color-primary, #3880ff);color:#fff}.example-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;margin-top:10px}.analysis-results{margin-top:10px;padding:10px;background:#fff;border-radius:4px}h2{color:var(--ion-color-primary, #3880ff)}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px}\n"] }]
303
- }], ctorParameters: () => [{ type: i1.ContentService }, { type: i2.LangService }] });
304
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktbGFuZ3VhZ2UtZGVtby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9leGFtcGxlcy9tdWx0aS1sYW5ndWFnZS1kZW1vLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDOUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBR3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7QUFFNUQ7Ozs7O0dBS0c7QUFpTUgsTUFBTSxPQUFPLDBCQUEwQjtJQWdCckMsWUFDUyxPQUF1QixFQUN2QixXQUF3QjtRQUR4QixZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQWpCakMsdUJBQWtCLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLG9CQUFlLEdBQW1FLElBQUksQ0FBQztRQUV2Riw2QkFBNkI7UUFDN0IsY0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDcEQsa0JBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVELGdCQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RCxrQkFBYSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFD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c0hUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL2xhbmctcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQgeyBMQU5HVUFHRVMgfSBmcm9tICcuLi9zZXJ2aWNlcy9sYW5nLXByb3ZpZGVyL3R5cGVzJztcblxuLyoqXG4gKiBNdWx0aUxhbmd1YWdlRGVtb0NvbXBvbmVudCAtIERlbXVlc3RyYSBlbCBzaXN0ZW1hIGRlIGlkaW9tYXMgZmxleGlibGUuXG4gKlxuICogRXN0ZSBjb21wb25lbnRlIG11ZXN0cmEgY8OzbW8gZWwgc2lzdGVtYSBtYW5lamEgbcO6bHRpcGxlcyBpZGlvbWFzLFxuICogZmFsbGJhY2tzIGF1dG9tw6F0aWNvcyB5IHdhcm5pbmdzIHBvciB0cmFkdWNjaW9uZXMgZmFsdGFudGVzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtbXVsdGktbGFuZ3VhZ2UtZGVtbycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRleHRDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cIm11bHRpLWxhbmctZGVtb1wiPlxuICAgICAgPGgyPlNpc3RlbWEgZGUgSWRpb21hcyBGbGV4aWJsZTwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1pbmZvXCI+XG4gICAgICAgIDxoMz5JbmZvcm1hY2nDs24gZGVsIFNpc3RlbWE6PC9oMz5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgYWN0dWFsOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5jdXJyZW50TGFuZyB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWEgcG9yIGRlZmVjdG86PC9zdHJvbmc+IHt7IGxhbmdTZXJ2aWNlLmRlZmF1bHRMYW5ndWFnZSB9fTwvcD5cbiAgICAgICAgPHA+PHN0cm9uZz5JZGlvbWFzIGRpc3BvbmlibGVzOjwvc3Ryb25nPiB7eyBsYW5nU2VydmljZS5hdmFpbGFibGVMYW5ncy5qb2luKCcsICcpIH19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJsYW5ndWFnZS1zd2l0Y2hlclwiPlxuICAgICAgICA8aDM+Q2FtYmlhciBJZGlvbWE6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsYW5nIG9mIGF2YWlsYWJsZUxhbmd1YWdlc1wiXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxhbmcgPT09IGxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzd2l0Y2hMYW5ndWFnZShsYW5nKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgZ2V0TGFuZ3VhZ2VOYW1lKGxhbmcpIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPCEtLSBFamVtcGxvIGRlIGlkaW9tYSBubyBkaXNwb25pYmxlIC0tPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cInN3aXRjaExhbmd1YWdlKCdwdCcpXCI+UG9ydHVndcOqcyAobm8gZGlzcG9uaWJsZSk8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZXhhbXBsZXNcIj5cbiAgICAgICAgPGgzPkNvbnRlbmlkbyBHbG9iYWw6PC9oMz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtZ3JpZFwiPlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cInsgY29udGVudDogb2tCdXR0b24kIHwgYXN5bmMsIHNpemU6ICdtZWRpdW0nLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSwgcHJvY2Vzc0xpbmtzOiBmYWxzZSB9XCJcbiAgICAgICAgICA+PC92YWwtdGV4dD5cbiAgICAgICAgICA8dmFsLXRleHRcbiAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IGNhbmNlbEJ1dHRvbiQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBzYXZlQnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBkZWxldGVCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8aDM+Q29udGVuaWRvIGNvbiBGYWxsYmFjayAoYWxndW5hcyB0cmFkdWNjaW9uZXMgZmFsdGFudGVzKTo8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1ncmlkXCI+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwieyBjb250ZW50OiBuZXh0QnV0dG9uJCB8IGFzeW5jLCBzaXplOiAnbWVkaXVtJywgY29sb3I6ICdkYXJrJywgYm9sZDogZmFsc2UsIHByb2Nlc3NMaW5rczogZmFsc2UgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgICAgPHZhbC10ZXh0XG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICBjb250ZW50OiBmaW5pc2hCdXR0b24kIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogc2VhcmNoUGxhY2Vob2xkZXIkIHwgYXN5bmMsXG4gICAgICAgICAgICAgIHNpemU6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICBib2xkOiBmYWxzZSxcbiAgICAgICAgICAgICAgcHJvY2Vzc0xpbmtzOiBmYWxzZSxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID48L3ZhbC10ZXh0PlxuICAgICAgICAgIDx2YWwtdGV4dFxuICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgY29udGVudDogbm9EYXRhTWVzc2FnZSQgfCBhc3luYyxcbiAgICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsXG4gICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgIGJvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICAgICAgICAgICAgfVwiXG4gICAgICAgICAgPjwvdmFsLXRleHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLWluZm9cIj5cbiAgICAgICAgPGgzPkluZm9ybWFjacOzbiBkZSBXYXJuaW5nczo8L2gzPlxuICAgICAgICA8cD5cbiAgICAgICAgICBBYnJlIGxhIGNvbnNvbGEgZGVsIG5hdmVnYWRvciBwYXJhIHZlciBsb3Mgd2FybmluZ3MgY3VhbmRvIGNhbWJpZXMgYSBpZGlvbWFzIGNvbiB0cmFkdWNjaW9uZXMgaW5jb21wbGV0YXNcbiAgICAgICAgICAoZnJhbmPDqXMsIGFsZW3DoW4pLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwPkVsIHNpc3RlbWEgYXV0b23DoXRpY2FtZW50ZSB1c2Fyw6EgZWwgaWRpb21hIHBvciBkZWZlY3RvIG8gZWwgcHJpbWVyIGlkaW9tYSBkaXNwb25pYmxlIGNvbW8gZmFsbGJhY2suPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYW5hbHlzaXNcIj5cbiAgICAgICAgPGgzPkFuw6FsaXNpcyBkZWwgQ29tcG9uZW50ZTo8L2gzPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJhbmFseXplQ3VycmVudENvbXBvbmVudCgpXCI+QW5hbGl6YXIgQ29udGVuaWRvPC9idXR0b24+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhbmFseXNpc1Jlc3VsdHNcIiBjbGFzcz1cImFuYWx5c2lzLXJlc3VsdHNcIj5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxzdHJvbmc+SWRpb21hcyBkaXNwb25pYmxlcyBwYXJhIGVzdGUgY29tcG9uZW50ZTo8L3N0cm9uZz5cbiAgICAgICAgICAgIHt7IGFuYWx5c2lzUmVzdWx0cy5hdmFpbGFibGVMYW5ndWFnZXMuam9pbignLCAnKSB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYW5hbHlzaXNSZXN1bHRzLm1pc3NpbmdLZXlzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICA8c3Ryb25nPkNsYXZlcyBmYWx0YW50ZXMgZW4ge3sgbGFuZ1NlcnZpY2UuY3VycmVudExhbmcgfX06PC9zdHJvbmc+XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQga2V5IG9mIGFuYWx5c2lzUmVzdWx0cy5taXNzaW5nS2V5c1wiPnt7IGtleSB9fTwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICAubXVsdGktbGFuZy1kZW1vIHtcbiAgICAgICAgcGFkZGluZzogMjBweDtcbiAgICAgICAgbWF4LXdpZHRoOiA4MDBweDtcbiAgICAgIH1cblxuICAgICAgLmxhbmd1YWdlLWluZm8sXG4gICAgICAuY29udGVudC1leGFtcGxlcyxcbiAgICAgIC53YXJuaW5nLWluZm8sXG4gICAgICAuY29tcG9uZW50LWFuYWx5c2lzIHtcbiAgICAgICAgbWFyZ2luOiAyMHB4IDA7XG4gICAgICAgIHBhZGRpbmc6IDE1cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LXRpbnQsICNmNWY2ZjkpO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b24tZ3JvdXAgYnV0dG9uIHtcbiAgICAgICAgcGFkZGluZzogOHB4IDE2cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycztcbiAgICAgIH1cblxuICAgICAgLmJ1dHRvbi1ncm91cCBidXR0b246aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS10aW50LCAjNDk5MmZmKTtcbiAgICAgICAgY29sb3I6IHdoaXRlO1xuICAgICAgfVxuXG4gICAgICAuYnV0dG9uLWdyb3VwIGJ1dHRvbi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSwgIzM4ODBmZik7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgIH1cblxuICAgICAgLmV4YW1wbGUtZ3JpZCB7XG4gICAgICAgIGRpc3BsYXk6IGdyaWQ7XG4gICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICB9XG5cbiAgICAgIC5hbmFseXNpcy1yZXN1bHRzIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICAgICAgcGFkZGluZzogMTBweDtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIH1cblxuICAgICAgaDIge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXByaW1hcnksICMzODgwZmYpO1xuICAgICAgfVxuXG4gICAgICBoMyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzIyMjQyOCk7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTXVsdGlMYW5ndWFnZURlbW9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdID0gW107XG4gIGFuYWx5c2lzUmVzdWx0czogeyBhdmFpbGFibGVMYW5ndWFnZXM6IHN0cmluZ1tdOyBtaXNzaW5nS2V5czogc3RyaW5nW10gfSB8IG51bGwgPSBudWxsO1xuXG4gIC8vIEdsb2JhbCBjb250ZW50IG9ic2VydmFibGVzXG4gIG9rQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ29rJyB9KTtcbiAgY2FuY2VsQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ2NhbmNlbCcgfSk7XG4gIHNhdmVCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnc2F2ZScgfSk7XG4gIGRlbGV0ZUJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdkZWxldGUnIH0pO1xuXG4gIC8vIENvbnRlbnQgdGhhdCBtaWdodCBoYXZlIG1pc3NpbmcgdHJhbnNsYXRpb25zXG4gIG5leHRCdXR0b24kID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHsga2V5OiAnbmV4dCcsIGZhbGxiYWNrOiAnTmV4dCcgfSk7XG4gIGZpbmlzaEJ1dHRvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoeyBrZXk6ICdmaW5pc2gnLCBmYWxsYmFjazogJ0ZpbmlzaCcgfSk7XG4gIHNlYXJjaFBsYWNlaG9sZGVyJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ3NlYXJjaFBsYWNlaG9sZGVyJywgZmFsbGJhY2s6ICdTZWFyY2guLi4nIH0pO1xuICBub0RhdGFNZXNzYWdlJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7IGtleTogJ25vRGF0YScsIGZhbGxiYWNrOiAnTm8gZGF0YSBhdmFpbGFibGUnIH0pO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb250ZW50OiBDb250ZW50U2VydmljZSxcbiAgICBwdWJsaWMgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmd1YWdlcyA9IHRoaXMubGFuZ1NlcnZpY2UuYXZhaWxhYmxlTGFuZ3M7XG4gIH1cblxuICBzd2l0Y2hMYW5ndWFnZShsYW5nOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhgU3dpdGNoaW5nIHRvIGxhbmd1YWdlOiAke2xhbmd9YCk7XG4gICAgdGhpcy5sYW5nU2VydmljZS5zZXRMYW5nKGxhbmcpO1xuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0gbnVsbDsgLy8gUmVzZXQgYW5hbHlzaXMgd2hlbiBsYW5ndWFnZSBjaGFuZ2VzXG4gIH1cblxuICBnZXRMYW5ndWFnZU5hbWUobGFuZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBuYW1lczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFtMQU5HVUFHRVMuRVNdOiAnRXNwYcOxb2wnLFxuICAgICAgW0xBTkdVQUdFUy5FTl06ICdFbmdsaXNoJyxcbiAgICAgIFtMQU5HVUFHRVMuRlJdOiAnRnJhbsOnYWlzJyxcbiAgICAgIFtMQU5HVUFHRVMuREVdOiAnRGV1dHNjaCcsXG4gICAgICBwdDogJ1BvcnR1Z3XDqnMnLFxuICAgIH07XG4gICAgcmV0dXJuIG5hbWVzW2xhbmddIHx8IGxhbmcudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGFuYWx5emVDdXJyZW50Q29tcG9uZW50KCkge1xuICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSAnX2dsb2JhbCc7IC8vIEFuYWx5emluZyBnbG9iYWwgY29udGVudCBmb3IgdGhpcyBkZW1vXG4gICAgY29uc3QgYXZhaWxhYmxlTGFuZ3VhZ2VzID0gdGhpcy5sYW5nU2VydmljZS5nZXRBdmFpbGFibGVMYW5ndWFnZXNGb3JDb21wb25lbnQoY29tcG9uZW50TmFtZSk7XG4gICAgY29uc3QgbWlzc2luZ0tleXMgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldE1pc3NpbmdDb250ZW50S2V5cyhjb21wb25lbnROYW1lLCB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nKTtcblxuICAgIHRoaXMuYW5hbHlzaXNSZXN1bHRzID0ge1xuICAgICAgYXZhaWxhYmxlTGFuZ3VhZ2VzLFxuICAgICAgbWlzc2luZ0tleXMsXG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgYW5hbHlzaXMgcmVzdWx0czonLCB0aGlzLmFuYWx5c2lzUmVzdWx0cyk7XG4gIH1cbn1cbiJdfQ==