valtech-components 2.0.326 → 2.0.328
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/esm2022/lib/components/atoms/button/button.component.mjs +18 -18
- package/esm2022/lib/components/atoms/display/display.component.mjs +13 -16
- package/esm2022/lib/components/atoms/text/text.component.mjs +19 -19
- package/esm2022/lib/components/atoms/title/title.component.mjs +7 -7
- package/esm2022/lib/components/atoms/title/types.mjs +6 -2
- package/esm2022/lib/components/molecules/alert-box/alert-box.component.mjs +6 -6
- package/esm2022/lib/components/molecules/language-selector/language-selector.component.mjs +6 -17
- package/esm2022/lib/components/organisms/form/form.component.mjs +1 -1
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +66 -1
- package/esm2022/lib/shared/utils/simple-content.mjs +119 -0
- package/esm2022/public-api.mjs +3 -3
- package/fesm2022/valtech-components.mjs +413 -680
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/button/button.component.d.ts +3 -3
- package/lib/components/atoms/display/display.component.d.ts +2 -3
- package/lib/components/atoms/text/text.component.d.ts +3 -3
- package/lib/components/atoms/title/title.component.d.ts +1 -2
- package/lib/components/atoms/title/types.d.ts +10 -4
- package/lib/components/molecules/alert-box/alert-box.component.d.ts +3 -3
- package/lib/components/molecules/language-selector/language-selector.component.d.ts +1 -3
- package/lib/services/lang-provider/lang-provider.service.d.ts +50 -0
- package/lib/shared/utils/simple-content.d.ts +120 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -2
- package/esm2022/lib/services/content.service.mjs +0 -327
- package/esm2022/lib/shared/utils/reactive-content.mjs +0 -117
- package/lib/services/content.service.d.ts +0 -296
- package/lib/shared/utils/reactive-content.d.ts +0 -109
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { createContentHelper, fromContent, fromMultipleContent, interpolateContent, } from '../shared/utils/content';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "./lang-provider/lang-provider.service";
|
|
5
|
-
/**
|
|
6
|
-
* ContentService - High-level reactive content management service.
|
|
7
|
-
*
|
|
8
|
-
* This service provides a clean, convenient API for reactive content management
|
|
9
|
-
* without requiring direct interaction with LangService. It acts as a facade
|
|
10
|
-
* that simplifies the most common content operations.
|
|
11
|
-
*
|
|
12
|
-
* @example Basic usage:
|
|
13
|
-
* ```typescript
|
|
14
|
-
* @Component({})
|
|
15
|
-
* export class MyComponent {
|
|
16
|
-
* content = inject(ContentService);
|
|
17
|
-
*
|
|
18
|
-
* title$ = this.content.fromContent({
|
|
19
|
-
* className: 'MyComponent',
|
|
20
|
-
* key: 'title'
|
|
21
|
-
* });
|
|
22
|
-
*
|
|
23
|
-
* constructor() {}
|
|
24
|
-
* }
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
|
-
export class ContentService {
|
|
28
|
-
constructor(langService) {
|
|
29
|
-
this.langService = langService;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Get current language as an observable stream.
|
|
33
|
-
* Emits whenever the language changes.
|
|
34
|
-
*/
|
|
35
|
-
get currentLang$() {
|
|
36
|
-
return this.langService.currentLang$;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get current language synchronously.
|
|
40
|
-
*/
|
|
41
|
-
get currentLang() {
|
|
42
|
-
return this.langService.currentLang;
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Set the current language.
|
|
46
|
-
* This will trigger updates in all reactive content.
|
|
47
|
-
*
|
|
48
|
-
* @param lang - The language to set
|
|
49
|
-
*/
|
|
50
|
-
setLang(lang) {
|
|
51
|
-
this.langService.setLang(lang);
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Create a reactive content observable from a content key.
|
|
55
|
-
* This is the primary method for reactive content with unified support
|
|
56
|
-
* for both simple content and content with interpolation.
|
|
57
|
-
*
|
|
58
|
-
* @param config - Content configuration with optional interpolation. If className is omitted, searches in global content.
|
|
59
|
-
* @returns Observable that emits the content string and updates on language change
|
|
60
|
-
*
|
|
61
|
-
* @example Simple global content:
|
|
62
|
-
* ```typescript
|
|
63
|
-
* // Searches in global content (no className needed)
|
|
64
|
-
* okButton$ = this.content.fromContent({
|
|
65
|
-
* key: 'ok',
|
|
66
|
-
* fallback: 'OK'
|
|
67
|
-
* });
|
|
68
|
-
* ```
|
|
69
|
-
*
|
|
70
|
-
* @example Component-specific content:
|
|
71
|
-
* ```typescript
|
|
72
|
-
* title$ = this.content.fromContent({
|
|
73
|
-
* className: 'HeaderComponent',
|
|
74
|
-
* key: 'title',
|
|
75
|
-
* fallback: 'Default Title'
|
|
76
|
-
* });
|
|
77
|
-
* ```
|
|
78
|
-
*
|
|
79
|
-
* @example Content with interpolation:
|
|
80
|
-
* ```typescript
|
|
81
|
-
* // Global content with interpolation
|
|
82
|
-
* confirmation$ = this.content.fromContent({
|
|
83
|
-
* key: 'deleteConfirmation',
|
|
84
|
-
* interpolation: { itemName: 'archivo' }
|
|
85
|
-
* });
|
|
86
|
-
*
|
|
87
|
-
* // Component content with interpolation
|
|
88
|
-
* greeting$ = this.content.fromContent({
|
|
89
|
-
* className: 'WelcomeComponent',
|
|
90
|
-
* key: 'greeting',
|
|
91
|
-
* interpolation: { name: 'John', count: 5 }
|
|
92
|
-
* });
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
fromContent(config) {
|
|
96
|
-
return fromContent(this.langService, config);
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Create a reactive content observable with interpolation support.
|
|
100
|
-
*
|
|
101
|
-
* @deprecated Use fromContent() with interpolation property instead.
|
|
102
|
-
* This method is kept for backward compatibility.
|
|
103
|
-
*
|
|
104
|
-
* @param config - Interpolated content configuration. If className is omitted, searches in global content.
|
|
105
|
-
* @returns Observable that emits the interpolated content string
|
|
106
|
-
*
|
|
107
|
-
* @example Migration:
|
|
108
|
-
* ```typescript
|
|
109
|
-
* // OLD (deprecated):
|
|
110
|
-
* greeting$ = this.content.fromContentWithInterpolation({
|
|
111
|
-
* className: 'WelcomeComponent',
|
|
112
|
-
* key: 'greeting',
|
|
113
|
-
* interpolation: { name: 'John', count: 5 }
|
|
114
|
-
* });
|
|
115
|
-
*
|
|
116
|
-
* // NEW (recommended):
|
|
117
|
-
* greeting$ = this.content.fromContent({
|
|
118
|
-
* className: 'WelcomeComponent',
|
|
119
|
-
* key: 'greeting',
|
|
120
|
-
* interpolation: { name: 'John', count: 5 }
|
|
121
|
-
* });
|
|
122
|
-
* ```
|
|
123
|
-
*/
|
|
124
|
-
fromContentWithInterpolation(config) {
|
|
125
|
-
// Delegate to the unified fromContent method
|
|
126
|
-
return this.fromContent(config);
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* Create multiple reactive content observables at once.
|
|
130
|
-
* Useful when a component needs several content strings.
|
|
131
|
-
*
|
|
132
|
-
* @param className - The component class name
|
|
133
|
-
* @param keys - Array of content keys to retrieve
|
|
134
|
-
* @returns Observable that emits an object with all requested content
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* ```typescript
|
|
138
|
-
* content$ = this.content.fromMultipleContent('FormComponent', [
|
|
139
|
-
* 'title', 'submitButton', 'cancelButton'
|
|
140
|
-
* ]);
|
|
141
|
-
*
|
|
142
|
-
* // In template
|
|
143
|
-
* <ng-container *ngIf="content$ | async as content">
|
|
144
|
-
* <h2>{{ content['title'] }}</h2>
|
|
145
|
-
* <button>{{ content['submitButton'] }}</button>
|
|
146
|
-
* <button>{{ content['cancelButton'] }}</button>
|
|
147
|
-
* </ng-container>
|
|
148
|
-
* ```
|
|
149
|
-
*/
|
|
150
|
-
fromMultipleContent(className, keys) {
|
|
151
|
-
return fromMultipleContent(this.langService, className, keys);
|
|
152
|
-
}
|
|
153
|
-
getText(classNameOrKey, keyOrFallback, fallback) {
|
|
154
|
-
// Handle overloaded signatures
|
|
155
|
-
if (keyOrFallback === undefined ||
|
|
156
|
-
(typeof keyOrFallback === 'string' && fallback === undefined)) {
|
|
157
|
-
// Single parameter or two parameters (key, fallback) - treat as global content
|
|
158
|
-
return this.langService.getText('_global', classNameOrKey, keyOrFallback);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
// Three parameters (className, key, fallback) - treat as component content
|
|
162
|
-
return this.langService.getText(classNameOrKey, keyOrFallback, fallback);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Get a single global content string synchronously.
|
|
167
|
-
* This is a convenience method that's equivalent to getText(key, fallback).
|
|
168
|
-
*
|
|
169
|
-
* @param key - The text key
|
|
170
|
-
* @param fallback - Optional fallback text if key is not found
|
|
171
|
-
* @returns The text string or fallback
|
|
172
|
-
*
|
|
173
|
-
* @example
|
|
174
|
-
* ```typescript
|
|
175
|
-
* const okText = this.content.getGlobalText('ok');
|
|
176
|
-
* const cancelText = this.content.getGlobalText('cancel', 'Cancel');
|
|
177
|
-
* ```
|
|
178
|
-
*/
|
|
179
|
-
getGlobalText(key, fallback) {
|
|
180
|
-
return this.langService.getText('_global', key, fallback);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Check if a content key exists for a component.
|
|
184
|
-
*
|
|
185
|
-
* @param className - The component class name
|
|
186
|
-
* @param key - The text key
|
|
187
|
-
* @returns True if the key exists in any language
|
|
188
|
-
*
|
|
189
|
-
* @example
|
|
190
|
-
* ```typescript
|
|
191
|
-
* if (this.content.hasContent('MyComponent', 'optionalText')) {
|
|
192
|
-
* // Show optional content
|
|
193
|
-
* }
|
|
194
|
-
* ```
|
|
195
|
-
*/
|
|
196
|
-
hasContent(className, key) {
|
|
197
|
-
return this.langService.hasContent(className, key);
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Helper function to interpolate values into a content string.
|
|
201
|
-
* Useful for processing content strings manually.
|
|
202
|
-
*
|
|
203
|
-
* @param content - The content string with placeholders
|
|
204
|
-
* @param values - Object with values to interpolate
|
|
205
|
-
* @returns The interpolated string
|
|
206
|
-
*
|
|
207
|
-
* @example
|
|
208
|
-
* ```typescript
|
|
209
|
-
* const result = this.content.interpolate("Hello {name}!", { name: "World" });
|
|
210
|
-
* // Returns: "Hello World!"
|
|
211
|
-
* ```
|
|
212
|
-
*/
|
|
213
|
-
interpolate(content, values) {
|
|
214
|
-
return interpolateContent(content, values);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Create a content helper bound to a specific component class.
|
|
218
|
-
* This provides a scoped API for components that need multiple content strings.
|
|
219
|
-
*
|
|
220
|
-
* @param className - The component class name
|
|
221
|
-
* @returns Content helper with methods scoped to the class
|
|
222
|
-
*
|
|
223
|
-
* @example
|
|
224
|
-
* ```typescript
|
|
225
|
-
* export class MyComponent {
|
|
226
|
-
* private contentHelper = this.content.createHelper('MyComponent');
|
|
227
|
-
*
|
|
228
|
-
* ngOnInit() {
|
|
229
|
-
* this.title$ = this.contentHelper.get('title');
|
|
230
|
-
* this.allContent$ = this.contentHelper.getMultiple(['title', 'description']);
|
|
231
|
-
* }
|
|
232
|
-
*
|
|
233
|
-
* constructor(private content: ContentService) {}
|
|
234
|
-
* }
|
|
235
|
-
* ```
|
|
236
|
-
*/
|
|
237
|
-
createHelper(className) {
|
|
238
|
-
return createContentHelper(this.langService, className);
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Create a scoped content service for a specific component class.
|
|
242
|
-
* This provides an even more convenient API for components with many content needs.
|
|
243
|
-
*
|
|
244
|
-
* @param className - The component class name
|
|
245
|
-
* @returns Scoped content service
|
|
246
|
-
*
|
|
247
|
-
* @example
|
|
248
|
-
* ```typescript
|
|
249
|
-
* export class MyComponent {
|
|
250
|
-
* private content = inject(ContentService).forComponent('MyComponent');
|
|
251
|
-
*
|
|
252
|
-
* // Simple content
|
|
253
|
-
* title$ = this.content.get('title');
|
|
254
|
-
*
|
|
255
|
-
* // Content with interpolation
|
|
256
|
-
* greeting$ = this.content.get('greeting', {
|
|
257
|
-
* interpolation: { name: 'John' }
|
|
258
|
-
* });
|
|
259
|
-
*
|
|
260
|
-
* // Content with fallback
|
|
261
|
-
* subtitle$ = this.content.get('subtitle', {
|
|
262
|
-
* fallback: 'Default Subtitle'
|
|
263
|
-
* });
|
|
264
|
-
*
|
|
265
|
-
* // Multiple texts
|
|
266
|
-
* allTexts$ = this.content.getMultiple(['title', 'subtitle', 'description']);
|
|
267
|
-
*
|
|
268
|
-
* constructor() {}
|
|
269
|
-
* }
|
|
270
|
-
* ```
|
|
271
|
-
*/
|
|
272
|
-
forComponent(className) {
|
|
273
|
-
return {
|
|
274
|
-
/**
|
|
275
|
-
* Get a single content string reactively for this component.
|
|
276
|
-
* Supports optional interpolation.
|
|
277
|
-
*/
|
|
278
|
-
get: (key, options) => {
|
|
279
|
-
return this.fromContent({
|
|
280
|
-
className,
|
|
281
|
-
key,
|
|
282
|
-
fallback: options?.fallback,
|
|
283
|
-
interpolation: options?.interpolation,
|
|
284
|
-
});
|
|
285
|
-
},
|
|
286
|
-
/**
|
|
287
|
-
* Get content with interpolation for this component.
|
|
288
|
-
* @deprecated Use get() with interpolation option instead.
|
|
289
|
-
*/
|
|
290
|
-
getWithInterpolation: (key, interpolation, fallback) => {
|
|
291
|
-
return this.fromContent({
|
|
292
|
-
className,
|
|
293
|
-
key,
|
|
294
|
-
interpolation,
|
|
295
|
-
fallback,
|
|
296
|
-
});
|
|
297
|
-
},
|
|
298
|
-
/**
|
|
299
|
-
* Get multiple content strings for this component.
|
|
300
|
-
*/
|
|
301
|
-
getMultiple: (keys) => {
|
|
302
|
-
return this.fromMultipleContent(className, keys);
|
|
303
|
-
},
|
|
304
|
-
/**
|
|
305
|
-
* Get a single content string synchronously for this component.
|
|
306
|
-
*/
|
|
307
|
-
getText: (key, fallback) => {
|
|
308
|
-
return this.getText(className, key, fallback);
|
|
309
|
-
},
|
|
310
|
-
/**
|
|
311
|
-
* Check if a content key exists for this component.
|
|
312
|
-
*/
|
|
313
|
-
hasContent: (key) => {
|
|
314
|
-
return this.hasContent(className, key);
|
|
315
|
-
},
|
|
316
|
-
};
|
|
317
|
-
}
|
|
318
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ContentService, deps: [{ token: i1.LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
319
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ContentService, providedIn: 'root' }); }
|
|
320
|
-
}
|
|
321
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ContentService, decorators: [{
|
|
322
|
-
type: Injectable,
|
|
323
|
-
args: [{
|
|
324
|
-
providedIn: 'root',
|
|
325
|
-
}]
|
|
326
|
-
}], ctorParameters: () => [{ type: i1.LangService }] });
|
|
327
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvc2VydmljZXMvY29udGVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUdMLG1CQUFtQixFQUNuQixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLGtCQUFrQixHQUNuQixNQUFNLHlCQUF5QixDQUFDOzs7QUFJakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUlILE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO0lBQUcsQ0FBQztJQUVoRDs7O09BR0c7SUFDSCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsT0FBTyxDQUFDLElBQWdCO1FBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Q0c7SUFDSCxXQUFXLENBQUMsTUFBcUI7UUFDL0IsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5Qkc7SUFDSCw0QkFBNEIsQ0FDMUIsTUFBZ0Y7UUFFaEYsNkNBQTZDO1FBQzdDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxN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TyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN6QyxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7K0dBaFZVLGNBQWM7bUhBQWQsY0FBYyxjQUZiLE1BQU07OzRGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQ29udGVudENvbmZpZyxcbiAgSW50ZXJwb2xhdGVkQ29udGVudENvbmZpZyxcbiAgY3JlYXRlQ29udGVudEhlbHBlcixcbiAgZnJvbUNvbnRlbnQsXG4gIGZyb21NdWx0aXBsZUNvbnRlbnQsXG4gIGludGVycG9sYXRlQ29udGVudCxcbn0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzL2NvbnRlbnQnO1xuaW1wb3J0IHsgTGFuZ1NlcnZpY2UgfSBmcm9tICcuL2xhbmctcHJvdmlkZXIvbGFuZy1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7IExhbmdPcHRpb24gfSBmcm9tICcuL2xhbmctcHJvdmlkZXIvdHlwZXMnO1xuXG4vKipcbiAqIENvbnRlbnRTZXJ2aWNlIC0gSGlnaC1sZXZlbCByZWFjdGl2ZSBjb250ZW50IG1hbmFnZW1lbnQgc2VydmljZS5cbiAqXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgYSBjbGVhbiwgY29udmVuaWVudCBBUEkgZm9yIHJlYWN0aXZlIGNvbnRlbnQgbWFuYWdlbWVudFxuICogd2l0aG91dCByZXF1aXJpbmcgZGlyZWN0IGludGVyYWN0aW9uIHdpdGggTGFuZ1NlcnZpY2UuIEl0IGFjdHMgYXMgYSBmYWNhZGVcbiAqIHRoYXQgc2ltcGxpZmllcyB0aGUgbW9zdCBjb21tb24gY29udGVudCBvcGVyYXRpb25zLlxuICpcbiAqIEBleGFtcGxlIEJhc2ljIHVzYWdlOlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7fSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIGNvbnRlbnQgPSBpbmplY3QoQ29udGVudFNlcnZpY2UpO1xuICpcbiAqICAgdGl0bGUkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAqICAgICBjbGFzc05hbWU6ICdNeUNvbXBvbmVudCcsXG4gKiAgICAga2V5OiAndGl0bGUnXG4gKiAgIH0pO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7fVxuICogfVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDb250ZW50U2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbGFuZ1NlcnZpY2U6IExhbmdTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBsYW5ndWFnZSBhcyBhbiBvYnNlcnZhYmxlIHN0cmVhbS5cbiAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGxhbmd1YWdlIGNoYW5nZXMuXG4gICAqL1xuICBnZXQgY3VycmVudExhbmckKCk6IE9ic2VydmFibGU8TGFuZ09wdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBsYW5ndWFnZSBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IExhbmdPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZS5cbiAgICogVGhpcyB3aWxsIHRyaWdnZXIgdXBkYXRlcyBpbiBhbGwgcmVhY3RpdmUgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIGxhbmcgLSBUaGUgbGFuZ3VhZ2UgdG8gc2V0XG4gICAqL1xuICBzZXRMYW5nKGxhbmc6IExhbmdPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLmxhbmdTZXJ2aWNlLnNldExhbmcobGFuZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVhY3RpdmUgY29udGVudCBvYnNlcnZhYmxlIGZyb20gYSBjb250ZW50IGtleS5cbiAgICogVGhpcyBpcyB0aGUgcHJpbWFyeSBtZXRob2QgZm9yIHJlYWN0aXZlIGNvbnRlbnQgd2l0aCB1bmlmaWVkIHN1cHBvcnRcbiAgICogZm9yIGJvdGggc2ltcGxlIGNvbnRlbnQgYW5kIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnIC0gQ29udGVudCBjb25maWd1cmF0aW9uIHdpdGggb3B0aW9uYWwgaW50ZXJwb2xhdGlvbi4gSWYgY2xhc3NOYW1lIGlzIG9taXR0ZWQsIHNlYXJjaGVzIGluIGdsb2JhbCBjb250ZW50LlxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIGNvbnRlbnQgc3RyaW5nIGFuZCB1cGRhdGVzIG9uIGxhbmd1YWdlIGNoYW5nZVxuICAgKlxuICAgKiBAZXhhbXBsZSBTaW1wbGUgZ2xvYmFsIGNvbnRlbnQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2VhcmNoZXMgaW4gZ2xvYmFsIGNvbnRlbnQgKG5vIGNsYXNzTmFtZSBuZWVkZWQpXG4gICAqIG9rQnV0dG9uJCA9IHRoaXMuY29udGVudC5mcm9tQ29udGVudCh7XG4gICAqICAga2V5OiAnb2snLFxuICAgKiAgIGZhbGxiYWNrOiAnT0snXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgQ29tcG9uZW50LXNwZWNpZmljIGNvbnRlbnQ6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGl0bGUkID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICogICBjbGFzc05hbWU6ICdIZWFkZXJDb21wb25lbnQnLFxuICAgKiAgIGtleTogJ3RpdGxlJyxcbiAgICogICBmYWxsYmFjazogJ0RlZmF1bHQgVGl0bGUnXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGUgQ29udGVudCB3aXRoIGludGVycG9sYXRpb246XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gR2xvYmFsIGNvbnRlbnQgd2l0aCBpbnRlcnBvbGF0aW9uXG4gICAqIGNvbmZpcm1hdGlvbiQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoe1xuICAgKiAgIGtleTogJ2RlbGV0ZUNvbmZpcm1hdGlvbicsXG4gICAqICAgaW50ZXJwb2xhdGlvbjogeyBpdGVtTmFtZTogJ2FyY2hpdm8nIH1cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIENvbXBvbmVudCBjb250ZW50IHdpdGggaW50ZXJwb2xhdGlvblxuICAgKiBncmVldGluZyQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnQoe1xuICAgKiAgIGNsYXNzTmFtZTogJ1dlbGNvbWVDb21wb25lbnQnLFxuICAgKiAgIGtleTogJ2dyZWV0aW5nJyxcbiAgICogICBpbnRlcnBvbGF0aW9uOiB7IG5hbWU6ICdKb2huJywgY291bnQ6IDUgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBmcm9tQ29udGVudChjb25maWc6IENvbnRlbnRDb25maWcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHJlYWN0aXZlIGNvbnRlbnQgb2JzZXJ2YWJsZSB3aXRoIGludGVycG9sYXRpb24gc3VwcG9ydC5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGZyb21Db250ZW50KCkgd2l0aCBpbnRlcnBvbGF0aW9uIHByb3BlcnR5IGluc3RlYWQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBJbnRlcnBvbGF0ZWQgY29udGVudCBjb25maWd1cmF0aW9uLiBJZiBjbGFzc05hbWUgaXMgb21pdHRlZCwgc2VhcmNoZXMgaW4gZ2xvYmFsIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgaW50ZXJwb2xhdGVkIGNvbnRlbnQgc3RyaW5nXG4gICAqXG4gICAqIEBleGFtcGxlIE1pZ3JhdGlvbjpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBPTEQgKGRlcHJlY2F0ZWQpOlxuICAgKiBncmVldGluZyQgPSB0aGlzLmNvbnRlbnQuZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbih7XG4gICAqICAgY2xhc3NOYW1lOiAnV2VsY29tZUNvbXBvbmVudCcsXG4gICAqICAga2V5OiAnZ3JlZXRpbmcnLFxuICAgKiAgIGludGVycG9sYXRpb246IHsgbmFtZTogJ0pvaG4nLCBjb3VudDogNSB9XG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBORVcgKHJlY29tbWVuZGVkKTpcbiAgICogZ3JlZXRpbmckID0gdGhpcy5jb250ZW50LmZyb21Db250ZW50KHtcbiAgICogICBjbGFzc05hbWU6ICdXZWxjb21lQ29tcG9uZW50JyxcbiAgICogICBrZXk6ICdncmVldGluZycsXG4gICAqICAgaW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnSm9obicsIGNvdW50OiA1IH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZnJvbUNvbnRlbnRXaXRoSW50ZXJwb2xhdGlvbihcbiAgICBjb25maWc6IEludGVycG9sYXRlZENvbnRlbnRDb25maWcgfCBPbWl0PEludGVycG9sYXRlZENvbnRlbnRDb25maWcsICdjbGFzc05hbWUnPlxuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIC8vIERlbGVnYXRlIHRvIHRoZSB1bmlmaWVkIGZyb21Db250ZW50IG1ldGhvZFxuICAgIHJldHVybiB0aGlzLmZyb21Db250ZW50KGNvbmZpZyBhcyBDb250ZW50Q29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbXVsdGlwbGUgcmVhY3RpdmUgY29udGVudCBvYnNlcnZhYmxlcyBhdCBvbmNlLlxuICAgKiBVc2VmdWwgd2hlbiBhIGNvbXBvbmVudCBuZWVkcyBzZXZlcmFsIGNvbnRlbnQgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIGNvbnRlbnQga2V5cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggYWxsIHJlcXVlc3RlZCBjb250ZW50XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29udGVudCQgPSB0aGlzLmNvbnRlbnQuZnJvbU11bHRpcGxlQ29udGVudCgnRm9ybUNvbXBvbmVudCcsIFtcbiAgICogICAndGl0bGUnLCAnc3VibWl0QnV0dG9uJywgJ2NhbmNlbEJ1dHRvbidcbiAgICogXSk7XG4gICAqXG4gICAqIC8vIEluIHRlbXBsYXRlXG4gICAqIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50JCB8IGFzeW5jIGFzIGNvbnRlbnRcIj5cbiAgICogICA8aDI+e3sgY29udGVudFsndGl0bGUnXSB9fTwvaDI+XG4gICAqICAgPGJ1dHRvbj57eyBjb250ZW50WydzdWJtaXRCdXR0b24nXSB9fTwvYnV0dG9uPlxuICAgKiAgIDxidXR0b24+e3sgY29udGVudFsnY2FuY2VsQnV0dG9uJ10gfX08L2J1dHRvbj5cbiAgICogPC9uZy1jb250YWluZXI+XG4gICAqIGBgYFxuICAgKi9cbiAgZnJvbU11bHRpcGxlQ29udGVudChjbGFzc05hbWU6IHN0cmluZywga2V5czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICByZXR1cm4gZnJvbU11bHRpcGxlQ29udGVudCh0aGlzLmxhbmdTZXJ2aWNlLCBjbGFzc05hbWUsIGtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNpbmdsZSBjb250ZW50IHN0cmluZyBzeW5jaHJvbm91c2x5IGZvciB0aGUgY3VycmVudCBsYW5ndWFnZS5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZS4gSWYgb21pdHRlZCwgc2VhcmNoZXMgaW4gZ2xvYmFsIGNvbnRlbnQuXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBrZXkgaXMgbm90IGZvdW5kXG4gICAqIEByZXR1cm5zIFRoZSB0ZXh0IHN0cmluZyBvciBmYWxsYmFja1xuICAgKlxuICAgKiBAZXhhbXBsZSBDb21wb25lbnQtc3BlY2lmaWM6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGl0bGUgPSB0aGlzLmNvbnRlbnQuZ2V0VGV4dCgnTXlDb21wb25lbnQnLCAndGl0bGUnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEdsb2JhbCBjb250ZW50OlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IG9rVGV4dCA9IHRoaXMuY29udGVudC5nZXRUZXh0KCdvaycpOyAvLyBGaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGtleVxuICAgKiAvLyBvciBtb3JlIGV4cGxpY2l0bHk6XG4gICAqIGNvbnN0IG9rVGV4dCA9IHRoaXMuY29udGVudC5nZXRHbG9iYWxUZXh0KCdvaycpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFRleHQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleT86IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmc7XG4gIGdldFRleHQoa2V5OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nO1xuICBnZXRUZXh0KGNsYXNzTmFtZU9yS2V5OiBzdHJpbmcsIGtleU9yRmFsbGJhY2s/OiBzdHJpbmcsIGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBIYW5kbGUgb3ZlcmxvYWRlZCBzaWduYXR1cmVzXG4gICAgaWYgKFxuICAgICAga2V5T3JGYWxsYmFjayA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAodHlwZW9mIGtleU9yRmFsbGJhY2sgPT09ICdzdHJpbmcnICYmIGZhbGxiYWNrID09PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICAvLyBTaW5nbGUgcGFyYW1ldGVyIG9yIHR3byBwYXJhbWV0ZXJzIChrZXksIGZhbGxiYWNrKSAtIHRyZWF0IGFzIGdsb2JhbCBjb250ZW50XG4gICAgICByZXR1cm4gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdfZ2xvYmFsJywgY2xhc3NOYW1lT3JLZXksIGtleU9yRmFsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUaHJlZSBwYXJhbWV0ZXJzIChjbGFzc05hbWUsIGtleSwgZmFsbGJhY2spIC0gdHJlYXQgYXMgY29tcG9uZW50IGNvbnRlbnRcbiAgICAgIHJldHVybiB0aGlzLmxhbmdTZXJ2aWNlLmdldFRleHQoY2xhc3NOYW1lT3JLZXksIGtleU9yRmFsbGJhY2ssIGZhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgc2luZ2xlIGdsb2JhbCBjb250ZW50IHN0cmluZyBzeW5jaHJvbm91c2x5LlxuICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQncyBlcXVpdmFsZW50IHRvIGdldFRleHQoa2V5LCBmYWxsYmFjaykuXG4gICAqXG4gICAqIEBwYXJhbSBrZXkgLSBUaGUgdGV4dCBrZXlcbiAgICogQHBhcmFtIGZhbGxiYWNrIC0gT3B0aW9uYWwgZmFsbGJhY2sgdGV4dCBpZiBrZXkgaXMgbm90IGZvdW5kXG4gICAqIEByZXR1cm5zIFRoZSB0ZXh0IHN0cmluZyBvciBmYWxsYmFja1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IG9rVGV4dCA9IHRoaXMuY29udGVudC5nZXRHbG9iYWxUZXh0KCdvaycpO1xuICAgKiBjb25zdCBjYW5jZWxUZXh0ID0gdGhpcy5jb250ZW50LmdldEdsb2JhbFRleHQoJ2NhbmNlbCcsICdDYW5jZWwnKTtcbiAgICogYGBgXG4gICAqL1xuICBnZXRHbG9iYWxUZXh0KGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubGFuZ1NlcnZpY2UuZ2V0VGV4dCgnX2dsb2JhbCcsIGtleSwgZmFsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29udGVudCBrZXkgZXhpc3RzIGZvciBhIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHRleHQga2V5XG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGtleSBleGlzdHMgaW4gYW55IGxhbmd1YWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKHRoaXMuY29udGVudC5oYXNDb250ZW50KCdNeUNvbXBvbmVudCcsICdvcHRpb25hbFRleHQnKSkge1xuICAgKiAgIC8vIFNob3cgb3B0aW9uYWwgY29udGVudFxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgaGFzQ29udGVudChjbGFzc05hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYW5nU2VydmljZS5oYXNDb250ZW50KGNsYXNzTmFtZSwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gaW50ZXJwb2xhdGUgdmFsdWVzIGludG8gYSBjb250ZW50IHN0cmluZy5cbiAgICogVXNlZnVsIGZvciBwcm9jZXNzaW5nIGNvbnRlbnQgc3RyaW5ncyBtYW51YWxseS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRlbnQgLSBUaGUgY29udGVudCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnNcbiAgICogQHBhcmFtIHZhbHVlcyAtIE9iamVjdCB3aXRoIHZhbHVlcyB0byBpbnRlcnBvbGF0ZVxuICAgKiBAcmV0dXJucyBUaGUgaW50ZXJwb2xhdGVkIHN0cmluZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udGVudC5pbnRlcnBvbGF0ZShcIkhlbGxvIHtuYW1lfSFcIiwgeyBuYW1lOiBcIldvcmxkXCIgfSk7XG4gICAqIC8vIFJldHVybnM6IFwiSGVsbG8gV29ybGQhXCJcbiAgICogYGBgXG4gICAqL1xuICBpbnRlcnBvbGF0ZShjb250ZW50OiBzdHJpbmcsIHZhbHVlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4pOiBzdHJpbmcge1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZUNvbnRlbnQoY29udGVudCwgdmFsdWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBjb250ZW50IGhlbHBlciBib3VuZCB0byBhIHNwZWNpZmljIGNvbXBvbmVudCBjbGFzcy5cbiAgICogVGhpcyBwcm92aWRlcyBhIHNjb3BlZCBBUEkgZm9yIGNvbXBvbmVudHMgdGhhdCBuZWVkIG11bHRpcGxlIGNvbnRlbnQgc3RyaW5ncy5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcmV0dXJucyBDb250ZW50IGhlbHBlciB3aXRoIG1ldGhvZHMgc2NvcGVkIHRvIHRoZSBjbGFzc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gICAqICAgcHJpdmF0ZSBjb250ZW50SGVscGVyID0gdGhpcy5jb250ZW50LmNyZWF0ZUhlbHBlcignTXlDb21wb25lbnQnKTtcbiAgICpcbiAgICogICBuZ09uSW5pdCgpIHtcbiAgICogICAgIHRoaXMudGl0bGUkID0gdGhpcy5jb250ZW50SGVscGVyLmdldCgndGl0bGUnKTtcbiAgICogICAgIHRoaXMuYWxsQ29udGVudCQgPSB0aGlzLmNvbnRlbnRIZWxwZXIuZ2V0TXVsdGlwbGUoWyd0aXRsZScsICdkZXNjcmlwdGlvbiddKTtcbiAgICogICB9XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb250ZW50OiBDb250ZW50U2VydmljZSkge31cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGNyZWF0ZUhlbHBlcihjbGFzc05hbWU6IHN0cmluZykge1xuICAgIHJldHVybiBjcmVhdGVDb250ZW50SGVscGVyKHRoaXMubGFuZ1NlcnZpY2UsIGNsYXNzTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgc2NvcGVkIGNvbnRlbnQgc2VydmljZSBmb3IgYSBzcGVjaWZpYyBjb21wb25lbnQgY2xhc3MuXG4gICAqIFRoaXMgcHJvdmlkZXMgYW4gZXZlbiBtb3JlIGNvbnZlbmllbnQgQVBJIGZvciBjb21wb25lbnRzIHdpdGggbWFueSBjb250ZW50IG5lZWRzLlxuICAgKlxuICAgKiBAcGFyYW0gY2xhc3NOYW1lIC0gVGhlIGNvbXBvbmVudCBjbGFzcyBuYW1lXG4gICAqIEByZXR1cm5zIFNjb3BlZCBjb250ZW50IHNlcnZpY2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICAgKiAgIHByaXZhdGUgY29udGVudCA9IGluamVjdChDb250ZW50U2VydmljZSkuZm9yQ29tcG9uZW50KCdNeUNvbXBvbmVudCcpO1xuICAgKlxuICAgKiAgIC8vIFNpbXBsZSBjb250ZW50XG4gICAqICAgdGl0bGUkID0gdGhpcy5jb250ZW50LmdldCgndGl0bGUnKTtcbiAgICpcbiAgICogICAvLyBDb250ZW50IHdpdGggaW50ZXJwb2xhdGlvblxuICAgKiAgIGdyZWV0aW5nJCA9IHRoaXMuY29udGVudC5nZXQoJ2dyZWV0aW5nJywge1xuICAgKiAgICAgaW50ZXJwb2xhdGlvbjogeyBuYW1lOiAnSm9obicgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIC8vIENvbnRlbnQgd2l0aCBmYWxsYmFja1xuICAgKiAgIHN1YnRpdGxlJCA9IHRoaXMuY29udGVudC5nZXQoJ3N1YnRpdGxlJywge1xuICAgKiAgICAgZmFsbGJhY2s6ICdEZWZhdWx0IFN1YnRpdGxlJ1xuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIC8vIE11bHRpcGxlIHRleHRzXG4gICAqICAgYWxsVGV4dHMkID0gdGhpcy5jb250ZW50LmdldE11bHRpcGxlKFsndGl0bGUnLCAnc3VidGl0bGUnLCAnZGVzY3JpcHRpb24nXSk7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IoKSB7fVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZm9yQ29tcG9uZW50KGNsYXNzTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgc2luZ2xlIGNvbnRlbnQgc3RyaW5nIHJlYWN0aXZlbHkgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgICAgICogU3VwcG9ydHMgb3B0aW9uYWwgaW50ZXJwb2xhdGlvbi5cbiAgICAgICAqL1xuICAgICAgZ2V0OiAoXG4gICAgICAgIGtleTogc3RyaW5nLFxuICAgICAgICBvcHRpb25zPzogeyBmYWxsYmFjaz86IHN0cmluZzsgaW50ZXJwb2xhdGlvbj86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gfVxuICAgICAgKTogT2JzZXJ2YWJsZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbUNvbnRlbnQoe1xuICAgICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgZmFsbGJhY2s6IG9wdGlvbnM/LmZhbGxiYWNrLFxuICAgICAgICAgIGludGVycG9sYXRpb246IG9wdGlvbnM/LmludGVycG9sYXRpb24sXG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgY29udGVudCB3aXRoIGludGVycG9sYXRpb24gZm9yIHRoaXMgY29tcG9uZW50LlxuICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldCgpIHdpdGggaW50ZXJwb2xhdGlvbiBvcHRpb24gaW5zdGVhZC5cbiAgICAgICAqL1xuICAgICAgZ2V0V2l0aEludGVycG9sYXRpb246IChcbiAgICAgICAga2V5OiBzdHJpbmcsXG4gICAgICAgIGludGVycG9sYXRpb246IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4sXG4gICAgICAgIGZhbGxiYWNrPzogc3RyaW5nXG4gICAgICApOiBPYnNlcnZhYmxlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tQ29udGVudCh7XG4gICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgIGZhbGxiYWNrLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG11bHRpcGxlIGNvbnRlbnQgc3RyaW5ncyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICAgKi9cbiAgICAgIGdldE11bHRpcGxlOiAoa2V5czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZnJvbU11bHRpcGxlQ29udGVudChjbGFzc05hbWUsIGtleXMpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgc3luY2hyb25vdXNseSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICAgKi9cbiAgICAgIGdldFRleHQ6IChrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRUZXh0KGNsYXNzTmFtZSwga2V5LCBmYWxsYmFjayk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGEgY29udGVudCBrZXkgZXhpc3RzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgICAqL1xuICAgICAgaGFzQ29udGVudDogKGtleTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc0NvbnRlbnQoY2xhc3NOYW1lLCBrZXkpO1xuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Enhanced content utilities for multi-language component support.
|
|
3
|
-
* Extends the base content utilities to provide specialized helpers for different component patterns.
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Helper class for managing reactive content in components.
|
|
7
|
-
*/
|
|
8
|
-
export class ComponentContentHelper {
|
|
9
|
-
constructor(contentService, defaultClassName) {
|
|
10
|
-
this.contentService = contentService;
|
|
11
|
-
this.defaultClassName = defaultClassName;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Resolves content based on hybrid configuration (static vs reactive).
|
|
15
|
-
*/
|
|
16
|
-
resolveContent(config) {
|
|
17
|
-
// Static content takes precedence
|
|
18
|
-
if (config.content !== undefined) {
|
|
19
|
-
return config.content;
|
|
20
|
-
}
|
|
21
|
-
// Use reactive content if configured
|
|
22
|
-
if (config.contentConfig) {
|
|
23
|
-
return this.contentService.fromContent({
|
|
24
|
-
className: config.contentConfig.className || this.defaultClassName || '_global',
|
|
25
|
-
key: config.contentConfig.key,
|
|
26
|
-
fallback: config.contentConfig.fallback,
|
|
27
|
-
interpolation: config.contentConfig.interpolation,
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
// No content configured
|
|
31
|
-
return '';
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Resolves multiple text properties for components with multiple text fields.
|
|
35
|
-
*/
|
|
36
|
-
resolveMultipleTexts(config) {
|
|
37
|
-
const result = {};
|
|
38
|
-
Object.entries(config.textConfigs).forEach(([property, contentConfig]) => {
|
|
39
|
-
result[property] = this.contentService.fromContent({
|
|
40
|
-
className: contentConfig.className || this.defaultClassName || '_global',
|
|
41
|
-
key: contentConfig.key,
|
|
42
|
-
fallback: contentConfig.fallback,
|
|
43
|
-
interpolation: contentConfig.interpolation,
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
return result;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Creates a reactive content configuration for array items.
|
|
50
|
-
* Useful for list components where items might have translatable text.
|
|
51
|
-
*/
|
|
52
|
-
createArrayItemConfig(baseKey, index, fallback) {
|
|
53
|
-
return {
|
|
54
|
-
className: this.defaultClassName || '_global',
|
|
55
|
-
key: `${baseKey}.${index}`,
|
|
56
|
-
fallback: fallback,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Helper for button/action text that commonly needs translation.
|
|
61
|
-
*/
|
|
62
|
-
createActionConfig(actionKey, fallback) {
|
|
63
|
-
return {
|
|
64
|
-
className: '_global',
|
|
65
|
-
key: actionKey,
|
|
66
|
-
fallback: fallback,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Factory function to create content helpers for components.
|
|
72
|
-
*/
|
|
73
|
-
export function createComponentContentHelper(contentService, componentClassName) {
|
|
74
|
-
return new ComponentContentHelper(contentService, componentClassName);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Utility function to determine if content should be reactive.
|
|
78
|
-
*/
|
|
79
|
-
export function shouldUseReactiveContent(config) {
|
|
80
|
-
return config.content === undefined && config.contentConfig !== undefined;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Enhanced props factory for components that support reactive content.
|
|
84
|
-
*/
|
|
85
|
-
export function createReactiveProps(contentHelper, staticProps, contentConfig) {
|
|
86
|
-
return {
|
|
87
|
-
...staticProps,
|
|
88
|
-
...contentConfig,
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Helper for list components that need to mix static and reactive content.
|
|
93
|
-
*/
|
|
94
|
-
export class ListContentHelper {
|
|
95
|
-
constructor(contentHelper) {
|
|
96
|
-
this.contentHelper = contentHelper;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Resolves a list configuration into final items.
|
|
100
|
-
*/
|
|
101
|
-
resolveListItems(config) {
|
|
102
|
-
const items = [];
|
|
103
|
-
// Add static items first
|
|
104
|
-
if (config.staticItems) {
|
|
105
|
-
items.push(...config.staticItems);
|
|
106
|
-
}
|
|
107
|
-
// Add reactive items
|
|
108
|
-
if (config.reactiveItems) {
|
|
109
|
-
for (let i = 0; i < config.reactiveItems.count; i++) {
|
|
110
|
-
const item = config.reactiveItems.itemTemplate(this.contentHelper, i);
|
|
111
|
-
items.push(item);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
return items;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3RpdmUtY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NoYXJlZC91dGlscy9yZWFjdGl2ZS1jb250ZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQW1ESDs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDakMsWUFDVSxjQUE4QixFQUM5QixnQkFBeUI7UUFEekIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUztJQUNoQyxDQUFDO0lBRUo7O09BRUc7SUFDSCxjQUFjLENBQUMsTUFBMkI7UUFDeEMsa0NBQWtDO1FBQ2xDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDeEIsQ0FBQztRQUVELHFDQUFxQztRQUNyQyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO2dCQUNyQyxTQUFTLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFNBQVM7Z0JBQy9FLEdBQUcsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUc7Z0JBQzdCLFFBQVEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLFFBQVE7Z0JBQ3ZDLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLGFBQWE7YUFDbEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELHdCQUF3QjtRQUN4QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQixDQUFDLE1BQXVCO1FBQzFDLE1BQU0sTUFBTSxHQUF1QyxFQUFFLENBQUM7UUFFdEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRTtZQUN2RSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUM7Z0JBQ2pELFNBQVMsRUFBRSxhQUFhLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxTQUFTO2dCQUN4RSxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUc7Z0JBQ3RCLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDaEMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxhQUFhO2FBQzNDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILHFCQUFxQixDQUFDLE9BQWUsRUFBRSxLQUFhLEVBQUUsUUFBaUI7UUFDckUsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLElBQUksU0FBUztZQUM3QyxHQUFHLEVBQUUsR0FBRyxPQUFPLElBQUksS0FBSyxFQUFFO1lBQzFCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQkFBa0IsQ0FDaEIsU0FpQmEsRUFDYixRQUFpQjtRQUVqQixPQUFPO1lBQ0wsU0FBUyxFQUFFLFNBQVM7WUFDcEIsR0FBRyxFQUFFLFNBQVM7WUFDZCxRQUFRLEVBQUUsUUFBUTtTQUNuQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsNEJBQTRCLENBQzFDLGNBQThCLEVBQzlCLGtCQUEyQjtJQUUzQixPQUFPLElBQUksc0JBQXNCLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUFDLE1BQTJCO0lBQ2xFLE9BQU8sTUFBTSxDQUFDLE9BQU8sS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTLENBQUM7QUFDNUUsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxhQUFxQyxFQUNyQyxXQUErQyxFQUMvQyxhQUFrQztJQUVsQyxPQUFPO1FBQ0wsR0FBRyxXQUFXO1FBQ2QsR0FBRyxhQUFhO0tBQ1osQ0FBQztBQUNULENBQUM7QUFtQkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8saUJBQWlCO0lBQzVCLFlBQW9CLGFBQXFDO1FBQXJDLGtCQUFhLEdBQWIsYUFBYSxDQUF3QjtJQUFHLENBQUM7SUFFN0Q7O09BRUc7SUFDSCxnQkFBZ0IsQ0FBQyxNQUE4QjtRQUM3QyxNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7UUFFdEIseUJBQXlCO1FBQ3pCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbmhhbmNlZCBjb250ZW50IHV0aWxpdGllcyBmb3IgbXVsdGktbGFuZ3VhZ2UgY29tcG9uZW50IHN1cHBvcnQuXG4gKiBFeHRlbmRzIHRoZSBiYXNlIGNvbnRlbnQgdXRpbGl0aWVzIHRvIHByb3ZpZGUgc3BlY2lhbGl6ZWQgaGVscGVycyBmb3IgZGlmZmVyZW50IGNvbXBvbmVudCBwYXR0ZXJucy5cbiAqL1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb250ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbnRlbnQuc2VydmljZSc7XG5cbi8qKlxuICogQmFzZSBjb25maWd1cmF0aW9uIGZvciByZWFjdGl2ZSBjb250ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWN0aXZlQ29udGVudENvbmZpZyB7XG4gIC8qKiBDb250ZW50IGNsYXNzIG5hbWUgLSBkZWZhdWx0cyB0byAnX2dsb2JhbCcgaWYgbm90IHByb3ZpZGVkICovXG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgLyoqIENvbnRlbnQga2V5ICovXG4gIGtleTogc3RyaW5nO1xuICAvKiogRmFsbGJhY2sgdGV4dCBpZiBjb250ZW50IGlzIG5vdCBmb3VuZCAqL1xuICBmYWxsYmFjaz86IHN0cmluZztcbiAgLyoqIEludGVycG9sYXRpb24gZGF0YSBmb3IgcGFyYW1ldGVyaXplZCBjb250ZW50ICovXG4gIGludGVycG9sYXRpb24/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IGJvdGggc3RhdGljIGFuZCByZWFjdGl2ZSBjb250ZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEh5YnJpZENvbnRlbnRDb25maWcge1xuICAvKiogU3RhdGljIGNvbnRlbnQgLSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcmVhY3RpdmUgY29udGVudCAqL1xuICBjb250ZW50Pzogc3RyaW5nO1xuICAvKiogUmVhY3RpdmUgY29udGVudCBjb25maWd1cmF0aW9uICovXG4gIGNvbnRlbnRDb25maWc/OiBSZWFjdGl2ZUNvbnRlbnRDb25maWc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgY29tcG9uZW50cyB3aXRoIG11bHRpcGxlIHRleHQgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNdWx0aVRleHRDb25maWcge1xuICAvKiogTWFwIG9mIHByb3BlcnR5IG5hbWVzIHRvIHRoZWlyIGNvbnRlbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgdGV4dENvbmZpZ3M6IFJlY29yZDxzdHJpbmcsIFJlYWN0aXZlQ29udGVudENvbmZpZz47XG59XG5cbi8qKlxuICogRW5oYW5jZWQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHJlYWN0aXZlIGNvbnRlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhY3RpdmVUZXh0TWV0YWRhdGEgZXh0ZW5kcyBIeWJyaWRDb250ZW50Q29uZmlnIHtcbiAgLy8gU3RhbmRhcmQgdGV4dCBwcm9wZXJ0aWVzXG4gIHNpemU/OiAnc21hbGwnIHwgJ21lZGl1bScgfCAnbGFyZ2UnIHwgJ3hsYXJnZSc7XG4gIGNvbG9yPzogc3RyaW5nO1xuICBib2xkPzogYm9vbGVhbjtcblxuICAvLyBMaW5rIHByb2Nlc3NpbmcgKGZvciBhcHBsaWNhYmxlIGNvbXBvbmVudHMpXG4gIHByb2Nlc3NMaW5rcz86IGJvb2xlYW47XG4gIGxpbmtDb25maWc/OiBhbnk7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciBtYW5hZ2luZyByZWFjdGl2ZSBjb250ZW50IGluIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRDb250ZW50SGVscGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZW50U2VydmljZTogQ29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZWZhdWx0Q2xhc3NOYW1lPzogc3RyaW5nXG4gICkge31cblxuICAvKipcbiAgICogUmVzb2x2ZXMgY29udGVudCBiYXNlZCBvbiBoeWJyaWQgY29uZmlndXJhdGlvbiAoc3RhdGljIHZzIHJlYWN0aXZlKS5cbiAgICovXG4gIHJlc29sdmVDb250ZW50KGNvbmZpZzogSHlicmlkQ29udGVudENvbmZpZyk6IE9ic2VydmFibGU8c3RyaW5nPiB8IHN0cmluZyB7XG4gICAgLy8gU3RhdGljIGNvbnRlbnQgdGFrZXMgcHJlY2VkZW5jZVxuICAgIGlmIChjb25maWcuY29udGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29uZmlnLmNvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gVXNlIHJlYWN0aXZlIGNvbnRlbnQgaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29udGVudENvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jb250ZW50Q29uZmlnLmNsYXNzTmFtZSB8fCB0aGlzLmRlZmF1bHRDbGFzc05hbWUgfHwgJ19nbG9iYWwnLFxuICAgICAgICBrZXk6IGNvbmZpZy5jb250ZW50Q29uZmlnLmtleSxcbiAgICAgICAgZmFsbGJhY2s6IGNvbmZpZy5jb250ZW50Q29uZmlnLmZhbGxiYWNrLFxuICAgICAgICBpbnRlcnBvbGF0aW9uOiBjb25maWcuY29udGVudENvbmZpZy5pbnRlcnBvbGF0aW9uLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTm8gY29udGVudCBjb25maWd1cmVkXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG11bHRpcGxlIHRleHQgcHJvcGVydGllcyBmb3IgY29tcG9uZW50cyB3aXRoIG11bHRpcGxlIHRleHQgZmllbGRzLlxuICAgKi9cbiAgcmVzb2x2ZU11bHRpcGxlVGV4dHMoY29uZmlnOiBNdWx0aVRleHRDb25maWcpOiBSZWNvcmQ8c3RyaW5nLCBPYnNlcnZhYmxlPHN0cmluZz4+IHtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIE9ic2VydmFibGU8c3RyaW5nPj4gPSB7fTtcblxuICAgIE9iamVjdC5lbnRyaWVzKGNvbmZpZy50ZXh0Q29uZmlncykuZm9yRWFjaCgoW3Byb3BlcnR5LCBjb250ZW50Q29uZmlnXSkgPT4ge1xuICAgICAgcmVzdWx0W3Byb3BlcnR5XSA9IHRoaXMuY29udGVudFNlcnZpY2UuZnJvbUNvbnRlbnQoe1xuICAgICAgICBjbGFzc05hbWU6IGNvbnRlbnRDb25maWcuY2xhc3NOYW1lIHx8IHRoaXMuZGVmYXVsdENsYXNzTmFtZSB8fCAnX2dsb2JhbCcsXG4gICAgICAgIGtleTogY29udGVudENvbmZpZy5rZXksXG4gICAgICAgIGZhbGxiYWNrOiBjb250ZW50Q29uZmlnLmZhbGxiYWNrLFxuICAgICAgICBpbnRlcnBvbGF0aW9uOiBjb250ZW50Q29uZmlnLmludGVycG9sYXRpb24sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlYWN0aXZlIGNvbnRlbnQgY29uZmlndXJhdGlvbiBmb3IgYXJyYXkgaXRlbXMuXG4gICAqIFVzZWZ1bCBmb3IgbGlzdCBjb21wb25lbnRzIHdoZXJlIGl0ZW1zIG1pZ2h0IGhhdmUgdHJhbnNsYXRhYmxlIHRleHQuXG4gICAqL1xuICBjcmVhdGVBcnJheUl0ZW1Db25maWcoYmFzZUtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBmYWxsYmFjaz86IHN0cmluZyk6IFJlYWN0aXZlQ29udGVudENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5kZWZhdWx0Q2xhc3NOYW1lIHx8ICdfZ2xvYmFsJyxcbiAgICAgIGtleTogYCR7YmFzZUtleX0uJHtpbmRleH1gLFxuICAgICAgZmFsbGJhY2s6IGZhbGxiYWNrLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIGZvciBidXR0b24vYWN0aW9uIHRleHQgdGhhdCBjb21tb25seSBuZWVkcyB0cmFuc2xhdGlvbi5cbiAgICovXG4gIGNyZWF0ZUFjdGlvbkNvbmZpZyhcbiAgICBhY3Rpb25LZXk6XG4gICAgICB8ICdvaydcbiAgICAgIHwgJ2NhbmNlbCdcbiAgICAgIHwgJ3NhdmUnXG4gICAgICB8ICdkZWxldGUnXG4gICAgICB8ICdlZGl0J1xuICAgICAgfCAnY2xvc2UnXG4gICAgICB8ICdiYWNrJ1xuICAgICAgfCAnbmV4dCdcbiAgICAgIHwgJ3ByZXZpb3VzJ1xuICAgICAgfCAnZmluaXNoJ1xuICAgICAgfCAnY29udGludWUnXG4gICAgICB8ICdhZGQnXG4gICAgICB8ICdyZW1vdmUnXG4gICAgICB8ICdzZWFyY2gnXG4gICAgICB8ICdmaWx0ZXInXG4gICAgICB8ICdzb3J0J1xuICAgICAgfCAncmVmcmVzaCcsXG4gICAgZmFsbGJhY2s/OiBzdHJpbmdcbiAgKTogUmVhY3RpdmVDb250ZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xhc3NOYW1lOiAnX2dsb2JhbCcsXG4gICAgICBrZXk6IGFjdGlvbktleSxcbiAgICAgIGZhbGxiYWNrOiBmYWxsYmFjayxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgY29udGVudCBoZWxwZXJzIGZvciBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29tcG9uZW50Q29udGVudEhlbHBlcihcbiAgY29udGVudFNlcnZpY2U6IENvbnRlbnRTZXJ2aWNlLFxuICBjb21wb25lbnRDbGFzc05hbWU/OiBzdHJpbmdcbik6IENvbXBvbmVudENvbnRlbnRIZWxwZXIge1xuICByZXR1cm4gbmV3IENvbXBvbmVudENvbnRlbnRIZWxwZXIoY29udGVudFNlcnZpY2UsIGNvbXBvbmVudENsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgY29udGVudCBzaG91bGQgYmUgcmVhY3RpdmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VSZWFjdGl2ZUNvbnRlbnQoY29uZmlnOiBIeWJyaWRDb250ZW50Q29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuY29udGVudCA9PT0gdW5kZWZpbmVkICYmIGNvbmZpZy5jb250ZW50Q29uZmlnICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRW5oYW5jZWQgcHJvcHMgZmFjdG9yeSBmb3IgY29tcG9uZW50cyB0aGF0IHN1cHBvcnQgcmVhY3RpdmUgY29udGVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlYWN0aXZlUHJvcHM8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb250ZW50SGVscGVyOiBDb21wb25lbnRDb250ZW50SGVscGVyLFxuICBzdGF0aWNQcm9wczogT21pdDxULCBrZXlvZiBIeWJyaWRDb250ZW50Q29uZmlnPixcbiAgY29udGVudENvbmZpZzogSHlicmlkQ29udGVudENvbmZpZ1xuKTogVCB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGljUHJvcHMsXG4gICAgLi4uY29udGVudENvbmZpZyxcbiAgfSBhcyBUO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGxpc3QgY29tcG9uZW50cyB0aGF0IG1peCBzdGF0aWMgYW5kIGR5bmFtaWMgY29udGVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaXN0Q29tcG9uZW50Q29uZmlnPFQ+IHtcbiAgLyoqIFN0YXRpYyBpdGVtcyB0aGF0IGRvbid0IG5lZWQgdHJhbnNsYXRpb24gKi9cbiAgc3RhdGljSXRlbXM/OiBUW107XG4gIC8qKiBSZWFjdGl2ZSBpdGVtcyBjb25maWd1cmF0aW9uICovXG4gIHJlYWN0aXZlSXRlbXM/OiB7XG4gICAgLyoqIEJhc2Uga2V5IGZvciB0aGUgaXRlbXMgKGUuZy4sICduYXZpZ2F0aW9uTGlua3MnKSAqL1xuICAgIGJhc2VLZXk6IHN0cmluZztcbiAgICAvKiogTnVtYmVyIG9mIGl0ZW1zIGV4cGVjdGVkICovXG4gICAgY291bnQ6IG51bWJlcjtcbiAgICAvKiogVGVtcGxhdGUgZm9yIGNyZWF0aW5nIGluZGl2aWR1YWwgaXRlbXMgKi9cbiAgICBpdGVtVGVtcGxhdGU6IChjb250ZW50SGVscGVyOiBDb21wb25lbnRDb250ZW50SGVscGVyLCBpbmRleDogbnVtYmVyKSA9PiBUO1xuICB9O1xufVxuXG4vKipcbiAqIEhlbHBlciBmb3IgbGlzdCBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBtaXggc3RhdGljIGFuZCByZWFjdGl2ZSBjb250ZW50LlxuICovXG5leHBvcnQgY2xhc3MgTGlzdENvbnRlbnRIZWxwZXI8VD4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbnRlbnRIZWxwZXI6IENvbXBvbmVudENvbnRlbnRIZWxwZXIpIHt9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgbGlzdCBjb25maWd1cmF0aW9uIGludG8gZmluYWwgaXRlbXMuXG4gICAqL1xuICByZXNvbHZlTGlzdEl0ZW1zKGNvbmZpZzogTGlzdENvbXBvbmVudENvbmZpZzxUPik6IFRbXSB7XG4gICAgY29uc3QgaXRlbXM6IFRbXSA9IFtdO1xuXG4gICAgLy8gQWRkIHN0YXRpYyBpdGVtcyBmaXJzdFxuICAgIGlmIChjb25maWcuc3RhdGljSXRlbXMpIHtcbiAgICAgIGl0ZW1zLnB1c2goLi4uY29uZmlnLnN0YXRpY0l0ZW1zKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVhY3RpdmUgaXRlbXNcbiAgICBpZiAoY29uZmlnLnJlYWN0aXZlSXRlbXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmlnLnJlYWN0aXZlSXRlbXMuY291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBpdGVtID0gY29uZmlnLnJlYWN0aXZlSXRlbXMuaXRlbVRlbXBsYXRlKHRoaXMuY29udGVudEhlbHBlciwgaSk7XG4gICAgICAgIGl0ZW1zLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG59XG4iXX0=
|