valtech-components 2.0.304 → 2.0.306
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/organisms/article/article.component.mjs +494 -0
- package/esm2022/lib/components/organisms/article/types.mjs +157 -0
- package/esm2022/lib/services/lang-provider/content.mjs +1 -18
- package/esm2022/public-api.mjs +5 -1
- package/fesm2022/valtech-components.mjs +645 -18
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/article/article.component.d.ts +82 -0
- package/lib/components/organisms/article/types.d.ts +293 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -0
|
@@ -0,0 +1,494 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
|
|
3
|
+
import { ButtonComponent } from '../../atoms/button/button.component';
|
|
4
|
+
import { TextComponent } from '../../atoms/text/text.component';
|
|
5
|
+
import { TitleComponent } from '../../atoms/title/title.component';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
/**
|
|
9
|
+
* val-article
|
|
10
|
+
*
|
|
11
|
+
* Componente para crear artículos, blogs y documentación de forma declarativa.
|
|
12
|
+
* Permite combinar múltiples elementos (títulos, texto, imágenes, código, etc.)
|
|
13
|
+
* con espaciado automático y soporte multi-idioma.
|
|
14
|
+
*
|
|
15
|
+
* @example Uso básico:
|
|
16
|
+
* ```html
|
|
17
|
+
* <val-article [props]="articleConfig"></val-article>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example Con ArticleBuilder:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* articleConfig = new ArticleBuilder()
|
|
23
|
+
* .title(titleProps)
|
|
24
|
+
* .paragraph(textProps)
|
|
25
|
+
* .code('console.log("Hello World")', 'javascript')
|
|
26
|
+
* .build();
|
|
27
|
+
* ```
|
|
28
|
+
*
|
|
29
|
+
* @input props: ArticleMetadata - Configuración completa del artículo
|
|
30
|
+
*/
|
|
31
|
+
export class ArticleComponent {
|
|
32
|
+
constructor() { }
|
|
33
|
+
ngOnInit() {
|
|
34
|
+
// Validación básica
|
|
35
|
+
if (!this.props || !this.props.elements) {
|
|
36
|
+
console.warn('val-article: props.elements is required');
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Función de trackBy para optimizar el rendering de elementos
|
|
41
|
+
*/
|
|
42
|
+
trackByFn(index, element) {
|
|
43
|
+
return element.id || index;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Obtiene las clases CSS para el espaciado del elemento
|
|
47
|
+
*/
|
|
48
|
+
getElementSpacingClass(element) {
|
|
49
|
+
const spacing = element.spacing || this.props.defaultSpacing;
|
|
50
|
+
const classes = [];
|
|
51
|
+
if (spacing?.top) {
|
|
52
|
+
classes.push(`val-article__spacing-top--${spacing.top}`);
|
|
53
|
+
}
|
|
54
|
+
if (spacing?.bottom) {
|
|
55
|
+
classes.push(`val-article__spacing-bottom--${spacing.bottom}`);
|
|
56
|
+
}
|
|
57
|
+
if (spacing?.horizontal) {
|
|
58
|
+
classes.push(`val-article__spacing-horizontal--${spacing.horizontal}`);
|
|
59
|
+
}
|
|
60
|
+
return classes.join(' ');
|
|
61
|
+
}
|
|
62
|
+
// === FUNCIONES DE TIPO PARA TYPESCRIPT ===
|
|
63
|
+
getTitleElement(element) {
|
|
64
|
+
return element;
|
|
65
|
+
}
|
|
66
|
+
getSubtitleElement(element) {
|
|
67
|
+
return element;
|
|
68
|
+
}
|
|
69
|
+
getTextElement(element) {
|
|
70
|
+
return element;
|
|
71
|
+
}
|
|
72
|
+
getQuoteElement(element) {
|
|
73
|
+
return element;
|
|
74
|
+
}
|
|
75
|
+
getHighlightElement(element) {
|
|
76
|
+
return element;
|
|
77
|
+
}
|
|
78
|
+
getCodeElement(element) {
|
|
79
|
+
return element;
|
|
80
|
+
}
|
|
81
|
+
getListElement(element) {
|
|
82
|
+
return element;
|
|
83
|
+
}
|
|
84
|
+
getButtonElement(element) {
|
|
85
|
+
return element;
|
|
86
|
+
}
|
|
87
|
+
getSeparatorElement(element) {
|
|
88
|
+
return element;
|
|
89
|
+
}
|
|
90
|
+
getImageElement(element) {
|
|
91
|
+
return element;
|
|
92
|
+
}
|
|
93
|
+
getVideoElement(element) {
|
|
94
|
+
return element;
|
|
95
|
+
}
|
|
96
|
+
getCustomElement(element) {
|
|
97
|
+
return element;
|
|
98
|
+
}
|
|
99
|
+
// === FUNCIONES AUXILIARES PARA PROPS ===
|
|
100
|
+
getQuoteTextProps(element) {
|
|
101
|
+
const quoteElement = this.getQuoteElement(element);
|
|
102
|
+
const { author, source, ...textProps } = quoteElement.props;
|
|
103
|
+
return textProps;
|
|
104
|
+
}
|
|
105
|
+
getHighlightTextProps(element) {
|
|
106
|
+
const highlightElement = this.getHighlightElement(element);
|
|
107
|
+
const { backgroundColor, rounded, ...textProps } = highlightElement.props;
|
|
108
|
+
return textProps;
|
|
109
|
+
}
|
|
110
|
+
getHighlightColor(element) {
|
|
111
|
+
const highlightElement = this.getHighlightElement(element);
|
|
112
|
+
return highlightElement.props.backgroundColor || 'var(--ion-color-light)';
|
|
113
|
+
}
|
|
114
|
+
getButtonProps(element) {
|
|
115
|
+
const buttonElement = this.getButtonElement(element);
|
|
116
|
+
const { alignment, ...buttonProps } = buttonElement.props;
|
|
117
|
+
return buttonProps;
|
|
118
|
+
}
|
|
119
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ArticleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
120
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ArticleComponent, isStandalone: true, selector: "val-article", inputs: { props: "props" }, ngImport: i0, template: `
|
|
121
|
+
<article
|
|
122
|
+
class="val-article"
|
|
123
|
+
[class]="props.cssClass"
|
|
124
|
+
[ngClass]="{
|
|
125
|
+
'val-article--centered': props.centered,
|
|
126
|
+
'val-article--light': props.theme === 'light',
|
|
127
|
+
'val-article--dark': props.theme === 'dark',
|
|
128
|
+
}"
|
|
129
|
+
[style.max-width]="props.maxWidth"
|
|
130
|
+
>
|
|
131
|
+
<div
|
|
132
|
+
*ngFor="let element of props.elements; trackBy: trackByFn"
|
|
133
|
+
class="val-article__element"
|
|
134
|
+
[class]="element.cssClass"
|
|
135
|
+
[ngClass]="getElementSpacingClass(element)"
|
|
136
|
+
[style.display]="element.visible === false ? 'none' : 'block'"
|
|
137
|
+
>
|
|
138
|
+
<!-- Título -->
|
|
139
|
+
<ng-container *ngIf="element.type === 'title'">
|
|
140
|
+
<val-title [props]="getTitleElement(element).props"></val-title>
|
|
141
|
+
</ng-container>
|
|
142
|
+
|
|
143
|
+
<!-- Subtítulo -->
|
|
144
|
+
<ng-container *ngIf="element.type === 'subtitle'">
|
|
145
|
+
<val-title [props]="getSubtitleElement(element).props"></val-title>
|
|
146
|
+
</ng-container>
|
|
147
|
+
|
|
148
|
+
<!-- Texto/Párrafo -->
|
|
149
|
+
<ng-container *ngIf="element.type === 'text' || element.type === 'paragraph'">
|
|
150
|
+
<val-text [props]="getTextElement(element).props"></val-text>
|
|
151
|
+
</ng-container>
|
|
152
|
+
|
|
153
|
+
<!-- Cita -->
|
|
154
|
+
<ng-container *ngIf="element.type === 'quote'">
|
|
155
|
+
<div class="val-article__quote">
|
|
156
|
+
<div class="val-article__quote-content">
|
|
157
|
+
<val-text [props]="getQuoteTextProps(element)"></val-text>
|
|
158
|
+
</div>
|
|
159
|
+
<div *ngIf="getQuoteElement(element).props.author" class="val-article__quote-author">
|
|
160
|
+
— {{ getQuoteElement(element).props.author }}
|
|
161
|
+
<span *ngIf="getQuoteElement(element).props.source" class="val-article__quote-source">
|
|
162
|
+
, {{ getQuoteElement(element).props.source }}
|
|
163
|
+
</span>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
</ng-container>
|
|
167
|
+
|
|
168
|
+
<!-- Texto destacado -->
|
|
169
|
+
<ng-container *ngIf="element.type === 'highlight'">
|
|
170
|
+
<div
|
|
171
|
+
class="val-article__highlight"
|
|
172
|
+
[ngClass]="{
|
|
173
|
+
'val-article__highlight--rounded': getHighlightElement(element).props.rounded,
|
|
174
|
+
}"
|
|
175
|
+
[style.background-color]="getHighlightColor(element)"
|
|
176
|
+
>
|
|
177
|
+
<val-text [props]="getHighlightTextProps(element)"></val-text>
|
|
178
|
+
</div>
|
|
179
|
+
</ng-container>
|
|
180
|
+
|
|
181
|
+
<!-- Código -->
|
|
182
|
+
<ng-container *ngIf="element.type === 'code'">
|
|
183
|
+
<div class="val-article__code">
|
|
184
|
+
<div *ngIf="getCodeElement(element).props.language" class="val-article__code-language">
|
|
185
|
+
{{ getCodeElement(element).props.language }}
|
|
186
|
+
</div>
|
|
187
|
+
<pre
|
|
188
|
+
class="val-article__code-content"
|
|
189
|
+
[ngClass]="{
|
|
190
|
+
'val-article__code-content--dark': getCodeElement(element).props.theme === 'dark',
|
|
191
|
+
}"
|
|
192
|
+
><code>{{ getCodeElement(element).props.code }}</code></pre>
|
|
193
|
+
</div>
|
|
194
|
+
</ng-container>
|
|
195
|
+
|
|
196
|
+
<!-- Lista -->
|
|
197
|
+
<ng-container *ngIf="element.type === 'list'">
|
|
198
|
+
<ul *ngIf="getListElement(element).props.listType !== 'ordered'" class="val-article__list">
|
|
199
|
+
<li *ngFor="let item of getListElement(element).props.items" class="val-article__list-item">
|
|
200
|
+
<span *ngIf="getListElement(element).props.listType === 'checklist'" class="val-article__list-check"
|
|
201
|
+
>✓</span
|
|
202
|
+
>
|
|
203
|
+
{{ item.text }}
|
|
204
|
+
</li>
|
|
205
|
+
</ul>
|
|
206
|
+
<ol
|
|
207
|
+
*ngIf="getListElement(element).props.listType === 'ordered'"
|
|
208
|
+
class="val-article__list val-article__list--ordered"
|
|
209
|
+
>
|
|
210
|
+
<li *ngFor="let item of getListElement(element).props.items" class="val-article__list-item">
|
|
211
|
+
{{ item.text }}
|
|
212
|
+
</li>
|
|
213
|
+
</ol>
|
|
214
|
+
</ng-container>
|
|
215
|
+
|
|
216
|
+
<!-- Botón -->
|
|
217
|
+
<ng-container *ngIf="element.type === 'button'">
|
|
218
|
+
<div
|
|
219
|
+
class="val-article__button-container"
|
|
220
|
+
[ngClass]="{
|
|
221
|
+
'val-article__button-container--left': getButtonElement(element).props.alignment === 'left',
|
|
222
|
+
'val-article__button-container--center': getButtonElement(element).props.alignment === 'center',
|
|
223
|
+
'val-article__button-container--right': getButtonElement(element).props.alignment === 'right',
|
|
224
|
+
}"
|
|
225
|
+
>
|
|
226
|
+
<val-button [props]="getButtonProps(element)"></val-button>
|
|
227
|
+
</div>
|
|
228
|
+
</ng-container>
|
|
229
|
+
|
|
230
|
+
<!-- Separador -->
|
|
231
|
+
<ng-container *ngIf="element.type === 'separator'">
|
|
232
|
+
<div class="val-article__separator">
|
|
233
|
+
<hr
|
|
234
|
+
*ngIf="getSeparatorElement(element).props.style === 'line'"
|
|
235
|
+
class="val-article__separator-line"
|
|
236
|
+
[ngClass]="{
|
|
237
|
+
'val-article__separator-line--thin': getSeparatorElement(element).props.thickness === 'thin',
|
|
238
|
+
'val-article__separator-line--thick': getSeparatorElement(element).props.thickness === 'thick',
|
|
239
|
+
}"
|
|
240
|
+
/>
|
|
241
|
+
<div *ngIf="getSeparatorElement(element).props.style === 'dots'" class="val-article__separator-dots">
|
|
242
|
+
• • •
|
|
243
|
+
</div>
|
|
244
|
+
<div
|
|
245
|
+
*ngIf="getSeparatorElement(element).props.style === 'space'"
|
|
246
|
+
class="val-article__separator-space"
|
|
247
|
+
></div>
|
|
248
|
+
</div>
|
|
249
|
+
</ng-container>
|
|
250
|
+
|
|
251
|
+
<!-- Imagen -->
|
|
252
|
+
<ng-container *ngIf="element.type === 'image'">
|
|
253
|
+
<figure
|
|
254
|
+
class="val-article__image"
|
|
255
|
+
[ngClass]="{
|
|
256
|
+
'val-article__image--left': getImageElement(element).props.alignment === 'left',
|
|
257
|
+
'val-article__image--center': getImageElement(element).props.alignment === 'center',
|
|
258
|
+
'val-article__image--right': getImageElement(element).props.alignment === 'right',
|
|
259
|
+
}"
|
|
260
|
+
>
|
|
261
|
+
<img
|
|
262
|
+
[src]="getImageElement(element).props.src"
|
|
263
|
+
[alt]="getImageElement(element).props.alt"
|
|
264
|
+
[title]="getImageElement(element).props.title"
|
|
265
|
+
[style.max-width]="getImageElement(element).props.maxWidth"
|
|
266
|
+
[ngClass]="{
|
|
267
|
+
'val-article__image-content--rounded': getImageElement(element).props.rounded,
|
|
268
|
+
}"
|
|
269
|
+
class="val-article__image-content"
|
|
270
|
+
/>
|
|
271
|
+
<figcaption *ngIf="getImageElement(element).props.caption" class="val-article__image-caption">
|
|
272
|
+
{{ getImageElement(element).props.caption }}
|
|
273
|
+
</figcaption>
|
|
274
|
+
</figure>
|
|
275
|
+
</ng-container>
|
|
276
|
+
|
|
277
|
+
<!-- Video -->
|
|
278
|
+
<ng-container *ngIf="element.type === 'video'">
|
|
279
|
+
<div class="val-article__video">
|
|
280
|
+
<video
|
|
281
|
+
[src]="getVideoElement(element).props.src"
|
|
282
|
+
[poster]="getVideoElement(element).props.poster"
|
|
283
|
+
[controls]="getVideoElement(element).props.controls !== false"
|
|
284
|
+
[autoplay]="getVideoElement(element).props.autoplay"
|
|
285
|
+
[muted]="getVideoElement(element).props.muted"
|
|
286
|
+
[style.max-width]="getVideoElement(element).props.maxWidth"
|
|
287
|
+
class="val-article__video-content"
|
|
288
|
+
>
|
|
289
|
+
Tu navegador no soporta el elemento video.
|
|
290
|
+
</video>
|
|
291
|
+
<div *ngIf="getVideoElement(element).props.title" class="val-article__video-title">
|
|
292
|
+
{{ getVideoElement(element).props.title }}
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</ng-container>
|
|
296
|
+
|
|
297
|
+
<!-- Contenido personalizado -->
|
|
298
|
+
<ng-container *ngIf="element.type === 'custom'">
|
|
299
|
+
<div class="val-article__custom" [innerHTML]="getCustomElement(element).props.htmlContent"></div>
|
|
300
|
+
</ng-container>
|
|
301
|
+
</div>
|
|
302
|
+
</article>
|
|
303
|
+
`, isInline: true, styles: [".val-article{width:100%;margin:0 auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.6;color:var(--ion-color-dark, #1f2937)}.val-article--centered{margin:0 auto}.val-article--light{background-color:var(--ion-color-light, #ffffff);color:var(--ion-color-dark, #1f2937)}.val-article--dark{background-color:var(--ion-color-dark, #1f2937);color:var(--ion-color-light, #ffffff)}.val-article__element{position:relative}.val-article__element:last-child{margin-bottom:0!important}.val-article__spacing-top--none{margin-top:0!important}.val-article__spacing-top--small{margin-top:.5rem!important}.val-article__spacing-top--medium{margin-top:1rem!important}.val-article__spacing-top--large{margin-top:1.5rem!important}.val-article__spacing-top--xlarge{margin-top:2.5rem!important}.val-article__spacing-bottom--none{margin-bottom:0!important}.val-article__spacing-bottom--small{margin-bottom:.5rem!important}.val-article__spacing-bottom--medium{margin-bottom:1rem!important}.val-article__spacing-bottom--large{margin-bottom:1.5rem!important}.val-article__spacing-bottom--xlarge{margin-bottom:2.5rem!important}.val-article__spacing-horizontal--none{margin-left:0!important;margin-right:0!important}.val-article__spacing-horizontal--small{margin-left:.5rem!important;margin-right:.5rem!important}.val-article__spacing-horizontal--medium{margin-left:1rem!important;margin-right:1rem!important}.val-article__spacing-horizontal--large{margin-left:1.5rem!important;margin-right:1.5rem!important}.val-article__spacing-horizontal--xlarge{margin-left:2.5rem!important;margin-right:2.5rem!important}.val-article__quote{border-left:4px solid #0969da;padding:1rem;margin:1rem 0;background-color:var(--ion-color-light-shade, #f8f9fa);border-radius:0 8px 8px 0;font-style:italic}.val-article__quote-content{margin-bottom:.5rem;font-size:1.1em}.val-article__quote-author{font-size:.9em;color:var(--ion-color-medium, #6c757d);font-style:normal;font-weight:500;text-align:right}.val-article__quote-source{font-weight:400;opacity:.8}.val-article__highlight{padding:1rem;margin:.5rem 0;background-color:var(--ion-color-warning-tint, #fff3cd);border:1px solid var(--ion-color-warning, #ffc107);border-radius:4px}.val-article__highlight--rounded{border-radius:12px}.val-article__code{margin:1rem 0;border-radius:8px;overflow:hidden;border:1px solid #e1e5e9}.val-article__code-language{background-color:var(--ion-color-medium-tint, #f8f9fa);padding:.5rem 1rem;font-size:.875em;font-weight:500;color:var(--ion-color-dark, #495057);border-bottom:1px solid #e1e5e9;text-transform:uppercase;letter-spacing:.5px}.val-article__code-content{background-color:#f6f8fa;color:#24292e;padding:1rem;margin:0;overflow-x:auto;font-family:SFMono-Regular,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875em;line-height:1.5}.val-article__code-content code{background:none;padding:0;font-size:inherit;color:inherit}.val-article__code-content--dark{background-color:#161b22;color:#f0f6fc}.val-article__list{margin:1rem 0;padding-left:1.5rem}.val-article__list--ordered{list-style-type:decimal}.val-article__list-item{margin-bottom:.5rem;line-height:1.6;position:relative}.val-article__list-item:last-child{margin-bottom:0}.val-article__list-check{color:var(--ion-color-success, #28a745);font-weight:700;margin-right:.5rem;position:absolute;left:-1.5rem}.val-article .val-article__list:has(.val-article__list-check){list-style:none;padding-left:1rem}.val-article__button-container{margin:1rem 0}.val-article__button-container--left{text-align:left}.val-article__button-container--center{text-align:center}.val-article__button-container--right{text-align:right}.val-article__separator{margin:1.5rem 0;text-align:center}.val-article__separator-line{border:none;height:1px;background-color:#d0d7de;margin:0}.val-article__separator-line--thin{height:1px}.val-article__separator-line--thick{height:3px}.val-article__separator-dots{color:#d0d7de;font-size:1.5em;letter-spacing:.5em;-webkit-user-select:none;user-select:none}.val-article__separator-space{height:1.5rem}.val-article__image{margin:1.5rem 0;text-align:center}.val-article__image--left{text-align:left}.val-article__image--center{text-align:center}.val-article__image--right{text-align:right}.val-article__image-content{max-width:100%;height:auto;border-radius:4px;box-shadow:0 2px 8px #0000001a;transition:transform .2s ease}.val-article__image-content:hover{transform:scale(1.02)}.val-article__image-content--rounded{border-radius:12px}.val-article__image-caption{margin-top:.5rem;font-size:.875em;color:var(--ion-color-medium, #6c757d);font-style:italic;text-align:center}.val-article__video{margin:1.5rem 0;text-align:center}.val-article__video-content{max-width:100%;height:auto;border-radius:8px;box-shadow:0 4px 12px #00000026}.val-article__video-title{margin-top:.5rem;font-size:.9em;color:var(--ion-color-medium, #6c757d);font-weight:500}.val-article__custom{margin:1rem 0}.val-article__custom *{max-width:100%}@media (max-width: 768px){.val-article__code-content{font-size:.8em;padding:.5rem}.val-article__image-content:hover{transform:none}.val-article__quote{padding:.5rem;margin:.5rem 0}.val-article__highlight{padding:.5rem}}@media (prefers-color-scheme: dark){.val-article--auto{background-color:var(--ion-color-dark, #1f2937);color:var(--ion-color-light, #ffffff)}.val-article--auto .val-article__quote{background-color:#ffffff0d}.val-article--auto .val-article__highlight{background-color:#ffc1071a;border-color:var(--ion-color-warning-shade, #e0a800)}.val-article--auto .val-article__code-content{background-color:#161b22;color:#f0f6fc}}.val-article__element{animation:fadeInUp .3s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (prefers-contrast: high){.val-article__separator-line{background-color:currentColor;opacity:.5}.val-article__quote{border-left-width:6px}}@media (prefers-reduced-motion: reduce){.val-article .val-article__element{animation:none}.val-article__image-content{transition:none}.val-article__image-content:hover{transform:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["props"], outputs: ["onClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
304
|
+
}
|
|
305
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ArticleComponent, decorators: [{
|
|
306
|
+
type: Component,
|
|
307
|
+
args: [{ selector: 'val-article', standalone: true, imports: [CommonModule, TitleComponent, TextComponent, ButtonComponent], template: `
|
|
308
|
+
<article
|
|
309
|
+
class="val-article"
|
|
310
|
+
[class]="props.cssClass"
|
|
311
|
+
[ngClass]="{
|
|
312
|
+
'val-article--centered': props.centered,
|
|
313
|
+
'val-article--light': props.theme === 'light',
|
|
314
|
+
'val-article--dark': props.theme === 'dark',
|
|
315
|
+
}"
|
|
316
|
+
[style.max-width]="props.maxWidth"
|
|
317
|
+
>
|
|
318
|
+
<div
|
|
319
|
+
*ngFor="let element of props.elements; trackBy: trackByFn"
|
|
320
|
+
class="val-article__element"
|
|
321
|
+
[class]="element.cssClass"
|
|
322
|
+
[ngClass]="getElementSpacingClass(element)"
|
|
323
|
+
[style.display]="element.visible === false ? 'none' : 'block'"
|
|
324
|
+
>
|
|
325
|
+
<!-- Título -->
|
|
326
|
+
<ng-container *ngIf="element.type === 'title'">
|
|
327
|
+
<val-title [props]="getTitleElement(element).props"></val-title>
|
|
328
|
+
</ng-container>
|
|
329
|
+
|
|
330
|
+
<!-- Subtítulo -->
|
|
331
|
+
<ng-container *ngIf="element.type === 'subtitle'">
|
|
332
|
+
<val-title [props]="getSubtitleElement(element).props"></val-title>
|
|
333
|
+
</ng-container>
|
|
334
|
+
|
|
335
|
+
<!-- Texto/Párrafo -->
|
|
336
|
+
<ng-container *ngIf="element.type === 'text' || element.type === 'paragraph'">
|
|
337
|
+
<val-text [props]="getTextElement(element).props"></val-text>
|
|
338
|
+
</ng-container>
|
|
339
|
+
|
|
340
|
+
<!-- Cita -->
|
|
341
|
+
<ng-container *ngIf="element.type === 'quote'">
|
|
342
|
+
<div class="val-article__quote">
|
|
343
|
+
<div class="val-article__quote-content">
|
|
344
|
+
<val-text [props]="getQuoteTextProps(element)"></val-text>
|
|
345
|
+
</div>
|
|
346
|
+
<div *ngIf="getQuoteElement(element).props.author" class="val-article__quote-author">
|
|
347
|
+
— {{ getQuoteElement(element).props.author }}
|
|
348
|
+
<span *ngIf="getQuoteElement(element).props.source" class="val-article__quote-source">
|
|
349
|
+
, {{ getQuoteElement(element).props.source }}
|
|
350
|
+
</span>
|
|
351
|
+
</div>
|
|
352
|
+
</div>
|
|
353
|
+
</ng-container>
|
|
354
|
+
|
|
355
|
+
<!-- Texto destacado -->
|
|
356
|
+
<ng-container *ngIf="element.type === 'highlight'">
|
|
357
|
+
<div
|
|
358
|
+
class="val-article__highlight"
|
|
359
|
+
[ngClass]="{
|
|
360
|
+
'val-article__highlight--rounded': getHighlightElement(element).props.rounded,
|
|
361
|
+
}"
|
|
362
|
+
[style.background-color]="getHighlightColor(element)"
|
|
363
|
+
>
|
|
364
|
+
<val-text [props]="getHighlightTextProps(element)"></val-text>
|
|
365
|
+
</div>
|
|
366
|
+
</ng-container>
|
|
367
|
+
|
|
368
|
+
<!-- Código -->
|
|
369
|
+
<ng-container *ngIf="element.type === 'code'">
|
|
370
|
+
<div class="val-article__code">
|
|
371
|
+
<div *ngIf="getCodeElement(element).props.language" class="val-article__code-language">
|
|
372
|
+
{{ getCodeElement(element).props.language }}
|
|
373
|
+
</div>
|
|
374
|
+
<pre
|
|
375
|
+
class="val-article__code-content"
|
|
376
|
+
[ngClass]="{
|
|
377
|
+
'val-article__code-content--dark': getCodeElement(element).props.theme === 'dark',
|
|
378
|
+
}"
|
|
379
|
+
><code>{{ getCodeElement(element).props.code }}</code></pre>
|
|
380
|
+
</div>
|
|
381
|
+
</ng-container>
|
|
382
|
+
|
|
383
|
+
<!-- Lista -->
|
|
384
|
+
<ng-container *ngIf="element.type === 'list'">
|
|
385
|
+
<ul *ngIf="getListElement(element).props.listType !== 'ordered'" class="val-article__list">
|
|
386
|
+
<li *ngFor="let item of getListElement(element).props.items" class="val-article__list-item">
|
|
387
|
+
<span *ngIf="getListElement(element).props.listType === 'checklist'" class="val-article__list-check"
|
|
388
|
+
>✓</span
|
|
389
|
+
>
|
|
390
|
+
{{ item.text }}
|
|
391
|
+
</li>
|
|
392
|
+
</ul>
|
|
393
|
+
<ol
|
|
394
|
+
*ngIf="getListElement(element).props.listType === 'ordered'"
|
|
395
|
+
class="val-article__list val-article__list--ordered"
|
|
396
|
+
>
|
|
397
|
+
<li *ngFor="let item of getListElement(element).props.items" class="val-article__list-item">
|
|
398
|
+
{{ item.text }}
|
|
399
|
+
</li>
|
|
400
|
+
</ol>
|
|
401
|
+
</ng-container>
|
|
402
|
+
|
|
403
|
+
<!-- Botón -->
|
|
404
|
+
<ng-container *ngIf="element.type === 'button'">
|
|
405
|
+
<div
|
|
406
|
+
class="val-article__button-container"
|
|
407
|
+
[ngClass]="{
|
|
408
|
+
'val-article__button-container--left': getButtonElement(element).props.alignment === 'left',
|
|
409
|
+
'val-article__button-container--center': getButtonElement(element).props.alignment === 'center',
|
|
410
|
+
'val-article__button-container--right': getButtonElement(element).props.alignment === 'right',
|
|
411
|
+
}"
|
|
412
|
+
>
|
|
413
|
+
<val-button [props]="getButtonProps(element)"></val-button>
|
|
414
|
+
</div>
|
|
415
|
+
</ng-container>
|
|
416
|
+
|
|
417
|
+
<!-- Separador -->
|
|
418
|
+
<ng-container *ngIf="element.type === 'separator'">
|
|
419
|
+
<div class="val-article__separator">
|
|
420
|
+
<hr
|
|
421
|
+
*ngIf="getSeparatorElement(element).props.style === 'line'"
|
|
422
|
+
class="val-article__separator-line"
|
|
423
|
+
[ngClass]="{
|
|
424
|
+
'val-article__separator-line--thin': getSeparatorElement(element).props.thickness === 'thin',
|
|
425
|
+
'val-article__separator-line--thick': getSeparatorElement(element).props.thickness === 'thick',
|
|
426
|
+
}"
|
|
427
|
+
/>
|
|
428
|
+
<div *ngIf="getSeparatorElement(element).props.style === 'dots'" class="val-article__separator-dots">
|
|
429
|
+
• • •
|
|
430
|
+
</div>
|
|
431
|
+
<div
|
|
432
|
+
*ngIf="getSeparatorElement(element).props.style === 'space'"
|
|
433
|
+
class="val-article__separator-space"
|
|
434
|
+
></div>
|
|
435
|
+
</div>
|
|
436
|
+
</ng-container>
|
|
437
|
+
|
|
438
|
+
<!-- Imagen -->
|
|
439
|
+
<ng-container *ngIf="element.type === 'image'">
|
|
440
|
+
<figure
|
|
441
|
+
class="val-article__image"
|
|
442
|
+
[ngClass]="{
|
|
443
|
+
'val-article__image--left': getImageElement(element).props.alignment === 'left',
|
|
444
|
+
'val-article__image--center': getImageElement(element).props.alignment === 'center',
|
|
445
|
+
'val-article__image--right': getImageElement(element).props.alignment === 'right',
|
|
446
|
+
}"
|
|
447
|
+
>
|
|
448
|
+
<img
|
|
449
|
+
[src]="getImageElement(element).props.src"
|
|
450
|
+
[alt]="getImageElement(element).props.alt"
|
|
451
|
+
[title]="getImageElement(element).props.title"
|
|
452
|
+
[style.max-width]="getImageElement(element).props.maxWidth"
|
|
453
|
+
[ngClass]="{
|
|
454
|
+
'val-article__image-content--rounded': getImageElement(element).props.rounded,
|
|
455
|
+
}"
|
|
456
|
+
class="val-article__image-content"
|
|
457
|
+
/>
|
|
458
|
+
<figcaption *ngIf="getImageElement(element).props.caption" class="val-article__image-caption">
|
|
459
|
+
{{ getImageElement(element).props.caption }}
|
|
460
|
+
</figcaption>
|
|
461
|
+
</figure>
|
|
462
|
+
</ng-container>
|
|
463
|
+
|
|
464
|
+
<!-- Video -->
|
|
465
|
+
<ng-container *ngIf="element.type === 'video'">
|
|
466
|
+
<div class="val-article__video">
|
|
467
|
+
<video
|
|
468
|
+
[src]="getVideoElement(element).props.src"
|
|
469
|
+
[poster]="getVideoElement(element).props.poster"
|
|
470
|
+
[controls]="getVideoElement(element).props.controls !== false"
|
|
471
|
+
[autoplay]="getVideoElement(element).props.autoplay"
|
|
472
|
+
[muted]="getVideoElement(element).props.muted"
|
|
473
|
+
[style.max-width]="getVideoElement(element).props.maxWidth"
|
|
474
|
+
class="val-article__video-content"
|
|
475
|
+
>
|
|
476
|
+
Tu navegador no soporta el elemento video.
|
|
477
|
+
</video>
|
|
478
|
+
<div *ngIf="getVideoElement(element).props.title" class="val-article__video-title">
|
|
479
|
+
{{ getVideoElement(element).props.title }}
|
|
480
|
+
</div>
|
|
481
|
+
</div>
|
|
482
|
+
</ng-container>
|
|
483
|
+
|
|
484
|
+
<!-- Contenido personalizado -->
|
|
485
|
+
<ng-container *ngIf="element.type === 'custom'">
|
|
486
|
+
<div class="val-article__custom" [innerHTML]="getCustomElement(element).props.htmlContent"></div>
|
|
487
|
+
</ng-container>
|
|
488
|
+
</div>
|
|
489
|
+
</article>
|
|
490
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".val-article{width:100%;margin:0 auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;line-height:1.6;color:var(--ion-color-dark, #1f2937)}.val-article--centered{margin:0 auto}.val-article--light{background-color:var(--ion-color-light, #ffffff);color:var(--ion-color-dark, #1f2937)}.val-article--dark{background-color:var(--ion-color-dark, #1f2937);color:var(--ion-color-light, #ffffff)}.val-article__element{position:relative}.val-article__element:last-child{margin-bottom:0!important}.val-article__spacing-top--none{margin-top:0!important}.val-article__spacing-top--small{margin-top:.5rem!important}.val-article__spacing-top--medium{margin-top:1rem!important}.val-article__spacing-top--large{margin-top:1.5rem!important}.val-article__spacing-top--xlarge{margin-top:2.5rem!important}.val-article__spacing-bottom--none{margin-bottom:0!important}.val-article__spacing-bottom--small{margin-bottom:.5rem!important}.val-article__spacing-bottom--medium{margin-bottom:1rem!important}.val-article__spacing-bottom--large{margin-bottom:1.5rem!important}.val-article__spacing-bottom--xlarge{margin-bottom:2.5rem!important}.val-article__spacing-horizontal--none{margin-left:0!important;margin-right:0!important}.val-article__spacing-horizontal--small{margin-left:.5rem!important;margin-right:.5rem!important}.val-article__spacing-horizontal--medium{margin-left:1rem!important;margin-right:1rem!important}.val-article__spacing-horizontal--large{margin-left:1.5rem!important;margin-right:1.5rem!important}.val-article__spacing-horizontal--xlarge{margin-left:2.5rem!important;margin-right:2.5rem!important}.val-article__quote{border-left:4px solid #0969da;padding:1rem;margin:1rem 0;background-color:var(--ion-color-light-shade, #f8f9fa);border-radius:0 8px 8px 0;font-style:italic}.val-article__quote-content{margin-bottom:.5rem;font-size:1.1em}.val-article__quote-author{font-size:.9em;color:var(--ion-color-medium, #6c757d);font-style:normal;font-weight:500;text-align:right}.val-article__quote-source{font-weight:400;opacity:.8}.val-article__highlight{padding:1rem;margin:.5rem 0;background-color:var(--ion-color-warning-tint, #fff3cd);border:1px solid var(--ion-color-warning, #ffc107);border-radius:4px}.val-article__highlight--rounded{border-radius:12px}.val-article__code{margin:1rem 0;border-radius:8px;overflow:hidden;border:1px solid #e1e5e9}.val-article__code-language{background-color:var(--ion-color-medium-tint, #f8f9fa);padding:.5rem 1rem;font-size:.875em;font-weight:500;color:var(--ion-color-dark, #495057);border-bottom:1px solid #e1e5e9;text-transform:uppercase;letter-spacing:.5px}.val-article__code-content{background-color:#f6f8fa;color:#24292e;padding:1rem;margin:0;overflow-x:auto;font-family:SFMono-Regular,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:.875em;line-height:1.5}.val-article__code-content code{background:none;padding:0;font-size:inherit;color:inherit}.val-article__code-content--dark{background-color:#161b22;color:#f0f6fc}.val-article__list{margin:1rem 0;padding-left:1.5rem}.val-article__list--ordered{list-style-type:decimal}.val-article__list-item{margin-bottom:.5rem;line-height:1.6;position:relative}.val-article__list-item:last-child{margin-bottom:0}.val-article__list-check{color:var(--ion-color-success, #28a745);font-weight:700;margin-right:.5rem;position:absolute;left:-1.5rem}.val-article .val-article__list:has(.val-article__list-check){list-style:none;padding-left:1rem}.val-article__button-container{margin:1rem 0}.val-article__button-container--left{text-align:left}.val-article__button-container--center{text-align:center}.val-article__button-container--right{text-align:right}.val-article__separator{margin:1.5rem 0;text-align:center}.val-article__separator-line{border:none;height:1px;background-color:#d0d7de;margin:0}.val-article__separator-line--thin{height:1px}.val-article__separator-line--thick{height:3px}.val-article__separator-dots{color:#d0d7de;font-size:1.5em;letter-spacing:.5em;-webkit-user-select:none;user-select:none}.val-article__separator-space{height:1.5rem}.val-article__image{margin:1.5rem 0;text-align:center}.val-article__image--left{text-align:left}.val-article__image--center{text-align:center}.val-article__image--right{text-align:right}.val-article__image-content{max-width:100%;height:auto;border-radius:4px;box-shadow:0 2px 8px #0000001a;transition:transform .2s ease}.val-article__image-content:hover{transform:scale(1.02)}.val-article__image-content--rounded{border-radius:12px}.val-article__image-caption{margin-top:.5rem;font-size:.875em;color:var(--ion-color-medium, #6c757d);font-style:italic;text-align:center}.val-article__video{margin:1.5rem 0;text-align:center}.val-article__video-content{max-width:100%;height:auto;border-radius:8px;box-shadow:0 4px 12px #00000026}.val-article__video-title{margin-top:.5rem;font-size:.9em;color:var(--ion-color-medium, #6c757d);font-weight:500}.val-article__custom{margin:1rem 0}.val-article__custom *{max-width:100%}@media (max-width: 768px){.val-article__code-content{font-size:.8em;padding:.5rem}.val-article__image-content:hover{transform:none}.val-article__quote{padding:.5rem;margin:.5rem 0}.val-article__highlight{padding:.5rem}}@media (prefers-color-scheme: dark){.val-article--auto{background-color:var(--ion-color-dark, #1f2937);color:var(--ion-color-light, #ffffff)}.val-article--auto .val-article__quote{background-color:#ffffff0d}.val-article--auto .val-article__highlight{background-color:#ffc1071a;border-color:var(--ion-color-warning-shade, #e0a800)}.val-article--auto .val-article__code-content{background-color:#161b22;color:#f0f6fc}}.val-article__element{animation:fadeInUp .3s ease-out}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@media (prefers-contrast: high){.val-article__separator-line{background-color:currentColor;opacity:.5}.val-article__quote{border-left-width:6px}}@media (prefers-reduced-motion: reduce){.val-article .val-article__element{animation:none}.val-article__image-content{transition:none}.val-article__image-content:hover{transform:none}}\n"] }]
|
|
491
|
+
}], ctorParameters: () => [], propDecorators: { props: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}] } });
|
|
494
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJ0aWNsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YWx0ZWNoLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9hcnRpY2xlL2FydGljbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7O0FBaU5uRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsZ0JBQWUsQ0FBQztJQUVoQixRQUFRO1FBQ04sb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QyxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILFNBQVMsQ0FBQyxLQUFhLEVBQUUsT0FBdUI7UUFDOUMsT0FBTyxPQUFPLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxzQkFBc0IsQ0FBQyxPQUF1QjtRQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQzdELE1BQU0sT0FBTyxHQUFhLEVBQUUs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Z0JBQWdCLG1HQWxOakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVMVCxrak1BeExTLFlBQVksOFZBQUUsY0FBYyx5RUFBRSxhQUFhLHdFQUFFLGVBQWU7OzRGQW1OM0QsZ0JBQWdCO2tCQXRONUIsU0FBUzsrQkFDRSxhQUFhLGNBQ1gsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLFlBQzdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1TFQsbUJBRWdCLHVCQUF1QixDQUFDLE1BQU07d0RBK0IvQyxLQUFLO3NCQURKLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGV4dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RleHQvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgQXJ0aWNsZUJ1dHRvbkVsZW1lbnQsXG4gIEFydGljbGVDb2RlRWxlbWVudCxcbiAgQXJ0aWNsZUN1c3RvbUVsZW1lbnQsXG4gIEFydGljbGVFbGVtZW50LFxuICBBcnRpY2xlSGlnaGxpZ2h0RWxlbWVudCxcbiAgQXJ0aWNsZUltYWdlRWxlbWVudCxcbiAgQXJ0aWNsZUxpc3RFbGVtZW50LFxuICBBcnRpY2xlTWV0YWRhdGEsXG4gIEFydGljbGVRdW90ZUVsZW1lbnQsXG4gIEFydGljbGVTZXBhcmF0b3JFbGVtZW50LFxuICBBcnRpY2xlU3VidGl0bGVFbGVtZW50LFxuICBBcnRpY2xlVGV4dEVsZW1lbnQsXG4gIEFydGljbGVUaXRsZUVsZW1lbnQsXG4gIEFydGljbGVWaWRlb0VsZW1lbnQsXG59IGZyb20gJy4vdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtYXJ0aWNsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFRpdGxlQ29tcG9uZW50LCBUZXh0Q29tcG9uZW50LCBCdXR0b25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxhcnRpY2xlXG4gICAgICBjbGFzcz1cInZhbC1hcnRpY2xlXCJcbiAgICAgIFtjbGFzc109XCJwcm9wcy5jc3NDbGFzc1wiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICd2YWwtYXJ0aWNsZS0tY2VudGVyZWQnOiBwcm9wcy5jZW50ZXJlZCxcbiAgICAgICAgJ3ZhbC1hcnRpY2xlLS1saWdodCc6IHByb3BzLnRoZW1lID09PSAnbGlnaHQnLFxuICAgICAgICAndmFsLWFydGljbGUtLWRhcmsnOiBwcm9wcy50aGVtZSA9PT0gJ2RhcmsnLFxuICAgICAgfVwiXG4gICAgICBbc3R5bGUubWF4LXdpZHRoXT1cInByb3BzLm1heFdpZHRoXCJcbiAgICA+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIHByb3BzLmVsZW1lbnRzOyB0cmFja0J5OiB0cmFja0J5Rm5cIlxuICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX19lbGVtZW50XCJcbiAgICAgICAgW2NsYXNzXT1cImVsZW1lbnQuY3NzQ2xhc3NcIlxuICAgICAgICBbbmdDbGFzc109XCJnZXRFbGVtZW50U3BhY2luZ0NsYXNzKGVsZW1lbnQpXCJcbiAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwiZWxlbWVudC52aXNpYmxlID09PSBmYWxzZSA/ICdub25lJyA6ICdibG9jaydcIlxuICAgICAgPlxuICAgICAgICA8IS0tIFTDrXR1bG8gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICd0aXRsZSdcIj5cbiAgICAgICAgICA8dmFsLXRpdGxlIFtwcm9wc109XCJnZXRUaXRsZUVsZW1lbnQoZWxlbWVudCkucHJvcHNcIj48L3ZhbC10aXRsZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBTdWJ0w610dWxvIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAnc3VidGl0bGUnXCI+XG4gICAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwiZ2V0U3VidGl0bGVFbGVtZW50KGVsZW1lbnQpLnByb3BzXCI+PC92YWwtdGl0bGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gVGV4dG8vUMOhcnJhZm8gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICd0ZXh0JyB8fCBlbGVtZW50LnR5cGUgPT09ICdwYXJhZ3JhcGgnXCI+XG4gICAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJnZXRUZXh0RWxlbWVudChlbGVtZW50KS5wcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ2l0YSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnQudHlwZSA9PT0gJ3F1b3RlJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fcXVvdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fcXVvdGUtY29udGVudFwiPlxuICAgICAgICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cImdldFF1b3RlVGV4dFByb3BzKGVsZW1lbnQpXCI+PC92YWwtdGV4dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldFF1b3RlRWxlbWVudChlbGVtZW50KS5wcm9wcy5hdXRob3JcIiBjbGFzcz1cInZhbC1hcnRpY2xlX19xdW90ZS1hdXRob3JcIj5cbiAgICAgICAgICAgICAg4oCUIHt7IGdldFF1b3RlRWxlbWVudChlbGVtZW50KS5wcm9wcy5hdXRob3IgfX1cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRRdW90ZUVsZW1lbnQoZWxlbWVudCkucHJvcHMuc291cmNlXCIgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fcXVvdGUtc291cmNlXCI+XG4gICAgICAgICAgICAgICAgLCB7eyBnZXRRdW90ZUVsZW1lbnQoZWxlbWVudCkucHJvcHMuc291cmNlIH19XG4gICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIFRleHRvIGRlc3RhY2FkbyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnQudHlwZSA9PT0gJ2hpZ2hsaWdodCdcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX19oaWdobGlnaHRcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAndmFsLWFydGljbGVfX2hpZ2hsaWdodC0tcm91bmRlZCc6IGdldEhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCkucHJvcHMucm91bmRlZCxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiZ2V0SGlnaGxpZ2h0Q29sb3IoZWxlbWVudClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiZ2V0SGlnaGxpZ2h0VGV4dFByb3BzKGVsZW1lbnQpXCI+PC92YWwtdGV4dD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBDw7NkaWdvIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAnY29kZSdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmFsLWFydGljbGVfX2NvZGVcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJnZXRDb2RlRWxlbWVudChlbGVtZW50KS5wcm9wcy5sYW5ndWFnZVwiIGNsYXNzPVwidmFsLWFydGljbGVfX2NvZGUtbGFuZ3VhZ2VcIj5cbiAgICAgICAgICAgICAge3sgZ2V0Q29kZUVsZW1lbnQoZWxlbWVudCkucHJvcHMubGFuZ3VhZ2UgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHByZVxuICAgICAgICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX19jb2RlLWNvbnRlbnRcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgJ3ZhbC1hcnRpY2xlX19jb2RlLWNvbnRlbnQtLWRhcmsnOiBnZXRDb2RlRWxlbWVudChlbGVtZW50KS5wcm9wcy50aGVtZSA9PT0gJ2RhcmsnLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgID48Y29kZT57eyBnZXRDb2RlRWxlbWVudChlbGVtZW50KS5wcm9wcy5jb2RlIH19PC9jb2RlPjwvcHJlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIExpc3RhIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAnbGlzdCdcIj5cbiAgICAgICAgICA8dWwgKm5nSWY9XCJnZXRMaXN0RWxlbWVudChlbGVtZW50KS5wcm9wcy5saXN0VHlwZSAhPT0gJ29yZGVyZWQnXCIgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fbGlzdFwiPlxuICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdldExpc3RFbGVtZW50KGVsZW1lbnQpLnByb3BzLml0ZW1zXCIgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fbGlzdC1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0TGlzdEVsZW1lbnQoZWxlbWVudCkucHJvcHMubGlzdFR5cGUgPT09ICdjaGVja2xpc3QnXCIgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fbGlzdC1jaGVja1wiXG4gICAgICAgICAgICAgICAgPuKckzwvc3BhblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGl0ZW0udGV4dCB9fVxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDxvbFxuICAgICAgICAgICAgKm5nSWY9XCJnZXRMaXN0RWxlbWVudChlbGVtZW50KS5wcm9wcy5saXN0VHlwZSA9PT0gJ29yZGVyZWQnXCJcbiAgICAgICAgICAgIGNsYXNzPVwidmFsLWFydGljbGVfX2xpc3QgdmFsLWFydGljbGVfX2xpc3QtLW9yZGVyZWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBnZXRMaXN0RWxlbWVudChlbGVtZW50KS5wcm9wcy5pdGVtc1wiIGNsYXNzPVwidmFsLWFydGljbGVfX2xpc3QtaXRlbVwiPlxuICAgICAgICAgICAgICB7eyBpdGVtLnRleHQgfX1cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC9vbD5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBCb3TDs24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdidXR0b24nXCI+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fYnV0dG9uLWNvbnRhaW5lclwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICd2YWwtYXJ0aWNsZV9fYnV0dG9uLWNvbnRhaW5lci0tbGVmdCc6IGdldEJ1dHRvbkVsZW1lbnQoZWxlbWVudCkucHJvcHMuYWxpZ25tZW50ID09PSAnbGVmdCcsXG4gICAgICAgICAgICAgICd2YWwtYXJ0aWNsZV9fYnV0dG9uLWNvbnRhaW5lci0tY2VudGVyJzogZ2V0QnV0dG9uRWxlbWVudChlbGVtZW50KS5wcm9wcy5hbGlnbm1lbnQgPT09ICdjZW50ZXInLFxuICAgICAgICAgICAgICAndmFsLWFydGljbGVfX2J1dHRvbi1jb250YWluZXItLXJpZ2h0JzogZ2V0QnV0dG9uRWxlbWVudChlbGVtZW50KS5wcm9wcy5hbGlnbm1lbnQgPT09ICdyaWdodCcsXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dmFsLWJ1dHRvbiBbcHJvcHNdPVwiZ2V0QnV0dG9uUHJvcHMoZWxlbWVudClcIj48L3ZhbC1idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gU2VwYXJhZG9yIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZWxlbWVudC50eXBlID09PSAnc2VwYXJhdG9yJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fc2VwYXJhdG9yXCI+XG4gICAgICAgICAgICA8aHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJnZXRTZXBhcmF0b3JFbGVtZW50KGVsZW1lbnQpLnByb3BzLnN0eWxlID09PSAnbGluZSdcIlxuICAgICAgICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX19zZXBhcmF0b3ItbGluZVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAndmFsLWFydGljbGVfX3NlcGFyYXRvci1saW5lLS10aGluJzogZ2V0U2VwYXJhdG9yRWxlbWVudChlbGVtZW50KS5wcm9wcy50aGlja25lc3MgPT09ICd0aGluJyxcbiAgICAgICAgICAgICAgICAndmFsLWFydGljbGVfX3NlcGFyYXRvci1saW5lLS10aGljayc6IGdldFNlcGFyYXRvckVsZW1lbnQoZWxlbWVudCkucHJvcHMudGhpY2tuZXNzID09PSAndGhpY2snLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZ2V0U2VwYXJhdG9yRWxlbWVudChlbGVtZW50KS5wcm9wcy5zdHlsZSA9PT0gJ2RvdHMnXCIgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fc2VwYXJhdG9yLWRvdHNcIj5cbiAgICAgICAgICAgICAg4oCiIOKAoiDigKJcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAqbmdJZj1cImdldFNlcGFyYXRvckVsZW1lbnQoZWxlbWVudCkucHJvcHMuc3R5bGUgPT09ICdzcGFjZSdcIlxuICAgICAgICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX19zZXBhcmF0b3Itc3BhY2VcIlxuICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEltYWdlbiAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnQudHlwZSA9PT0gJ2ltYWdlJ1wiPlxuICAgICAgICAgIDxmaWd1cmVcbiAgICAgICAgICAgIGNsYXNzPVwidmFsLWFydGljbGVfX2ltYWdlXCJcbiAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgJ3ZhbC1hcnRpY2xlX19pbWFnZS0tbGVmdCc6IGdldEltYWdlRWxlbWVudChlbGVtZW50KS5wcm9wcy5hbGlnbm1lbnQgPT09ICdsZWZ0JyxcbiAgICAgICAgICAgICAgJ3ZhbC1hcnRpY2xlX19pbWFnZS0tY2VudGVyJzogZ2V0SW1hZ2VFbGVtZW50KGVsZW1lbnQpLnByb3BzLmFsaWdubWVudCA9PT0gJ2NlbnRlcicsXG4gICAgICAgICAgICAgICd2YWwtYXJ0aWNsZV9faW1hZ2UtLXJpZ2h0JzogZ2V0SW1hZ2VFbGVtZW50KGVsZW1lbnQpLnByb3BzLmFsaWdubWVudCA9PT0gJ3JpZ2h0JyxcbiAgICAgICAgICAgIH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgW3NyY109XCJnZXRJbWFnZUVsZW1lbnQoZWxlbWVudCkucHJvcHMuc3JjXCJcbiAgICAgICAgICAgICAgW2FsdF09XCJnZXRJbWFnZUVsZW1lbnQoZWxlbWVudCkucHJvcHMuYWx0XCJcbiAgICAgICAgICAgICAgW3RpdGxlXT1cImdldEltYWdlRWxlbWVudChlbGVtZW50KS5wcm9wcy50aXRsZVwiXG4gICAgICAgICAgICAgIFtzdHlsZS5tYXgtd2lkdGhdPVwiZ2V0SW1hZ2VFbGVtZW50KGVsZW1lbnQpLnByb3BzLm1heFdpZHRoXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICd2YWwtYXJ0aWNsZV9faW1hZ2UtY29udGVudC0tcm91bmRlZCc6IGdldEltYWdlRWxlbWVudChlbGVtZW50KS5wcm9wcy5yb3VuZGVkLFxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9faW1hZ2UtY29udGVudFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGZpZ2NhcHRpb24gKm5nSWY9XCJnZXRJbWFnZUVsZW1lbnQoZWxlbWVudCkucHJvcHMuY2FwdGlvblwiIGNsYXNzPVwidmFsLWFydGljbGVfX2ltYWdlLWNhcHRpb25cIj5cbiAgICAgICAgICAgICAge3sgZ2V0SW1hZ2VFbGVtZW50KGVsZW1lbnQpLnByb3BzLmNhcHRpb24gfX1cbiAgICAgICAgICAgIDwvZmlnY2FwdGlvbj5cbiAgICAgICAgICA8L2ZpZ3VyZT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBWaWRlbyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVsZW1lbnQudHlwZSA9PT0gJ3ZpZGVvJ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWwtYXJ0aWNsZV9fdmlkZW9cIj5cbiAgICAgICAgICAgIDx2aWRlb1xuICAgICAgICAgICAgICBbc3JjXT1cImdldFZpZGVvRWxlbWVudChlbGVtZW50KS5wcm9wcy5zcmNcIlxuICAgICAgICAgICAgICBbcG9zdGVyXT1cImdldFZpZGVvRWxlbWVudChlbGVtZW50KS5wcm9wcy5wb3N0ZXJcIlxuICAgICAgICAgICAgICBbY29udHJvbHNdPVwiZ2V0VmlkZW9FbGVtZW50KGVsZW1lbnQpLnByb3BzLmNvbnRyb2xzICE9PSBmYWxzZVwiXG4gICAgICAgICAgICAgIFthdXRvcGxheV09XCJnZXRWaWRlb0VsZW1lbnQoZWxlbWVudCkucHJvcHMuYXV0b3BsYXlcIlxuICAgICAgICAgICAgICBbbXV0ZWRdPVwiZ2V0VmlkZW9FbGVtZW50KGVsZW1lbnQpLnByb3BzLm11dGVkXCJcbiAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aF09XCJnZXRWaWRlb0VsZW1lbnQoZWxlbWVudCkucHJvcHMubWF4V2lkdGhcIlxuICAgICAgICAgICAgICBjbGFzcz1cInZhbC1hcnRpY2xlX192aWRlby1jb250ZW50XCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgVHUgbmF2ZWdhZG9yIG5vIHNvcG9ydGEgZWwgZWxlbWVudG8gdmlkZW8uXG4gICAgICAgICAgICA8L3ZpZGVvPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdldFZpZGVvRWxlbWVudChlbGVtZW50KS5wcm9wcy50aXRsZVwiIGNsYXNzPVwidmFsLWFydGljbGVfX3ZpZGVvLXRpdGxlXCI+XG4gICAgICAgICAgICAgIHt7IGdldFZpZGVvRWxlbWVudChlbGVtZW50KS5wcm9wcy50aXRsZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQ29udGVuaWRvIHBlcnNvbmFsaXphZG8gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbGVtZW50LnR5cGUgPT09ICdjdXN0b20nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInZhbC1hcnRpY2xlX19jdXN0b21cIiBbaW5uZXJIVE1MXT1cImdldEN1c3RvbUVsZW1lbnQoZWxlbWVudCkucHJvcHMuaHRtbENvbnRlbnRcIj48L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L2FydGljbGU+XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL2FydGljbGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuLyoqXG4gKiB2YWwtYXJ0aWNsZVxuICpcbiAqIENvbXBvbmVudGUgcGFyYSBjcmVhciBhcnTDrWN1bG9zLCBibG9ncyB5IGRvY3VtZW50YWNpw7NuIGRlIGZvcm1hIGRlY2xhcmF0aXZhLlxuICogUGVybWl0ZSBjb21iaW5hciBtw7psdGlwbGVzIGVsZW1lbnRvcyAodMOtdHVsb3MsIHRleHRvLCBpbcOhZ2VuZXMsIGPDs2RpZ28sIGV0Yy4pXG4gKiBjb24gZXNwYWNpYWRvIGF1dG9tw6F0aWNvIHkgc29wb3J0ZSBtdWx0aS1pZGlvbWEuXG4gKlxuICogQGV4YW1wbGUgVXNvIGLDoXNpY286XG4gKiBgYGBodG1sXG4gKiA8dmFsLWFydGljbGUgW3Byb3BzXT1cImFydGljbGVDb25maWdcIj48L3ZhbC1hcnRpY2xlPlxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQ29uIEFydGljbGVCdWlsZGVyOlxuICogYGBgdHlwZXNjcmlwdFxuICogYXJ0aWNsZUNvbmZpZyA9IG5ldyBBcnRpY2xlQnVpbGRlcigpXG4gKiAgIC50aXRsZSh0aXRsZVByb3BzKVxuICogICAucGFyYWdyYXBoKHRleHRQcm9wcylcbiAqICAgLmNvZGUoJ2NvbnNvbGUubG9nKFwiSGVsbG8gV29ybGRcIiknLCAnamF2YXNjcmlwdCcpXG4gKiAgIC5idWlsZCgpO1xuICogYGBgXG4gKlxuICogQGlucHV0IHByb3BzOiBBcnRpY2xlTWV0YWRhdGEgLSBDb25maWd1cmFjacOzbiBjb21wbGV0YSBkZWwgYXJ0w61jdWxvXG4gKi9cbmV4cG9ydCBjbGFzcyBBcnRpY2xlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIENvbmZpZ3VyYWNpw7NuIGRlbCBhcnTDrWN1bG9cbiAgICogQHR5cGUge0FydGljbGVNZXRhZGF0YX1cbiAgICovXG4gIEBJbnB1dCgpXG4gIHByb3BzITogQXJ0aWNsZU1ldGFkYXRhO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBWYWxpZGFjacOzbiBiw6FzaWNhXG4gICAgaWYgKCF0aGlzLnByb3BzIHx8ICF0aGlzLnByb3BzLmVsZW1lbnRzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3ZhbC1hcnRpY2xlOiBwcm9wcy5lbGVtZW50cyBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGdW5jacOzbiBkZSB0cmFja0J5IHBhcmEgb3B0aW1pemFyIGVsIHJlbmRlcmluZyBkZSBlbGVtZW50b3NcbiAgICovXG4gIHRyYWNrQnlGbihpbmRleDogbnVtYmVyLCBlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IGFueSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuaWQgfHwgaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYXMgY2xhc2VzIENTUyBwYXJhIGVsIGVzcGFjaWFkbyBkZWwgZWxlbWVudG9cbiAgICovXG4gIGdldEVsZW1lbnRTcGFjaW5nQ2xhc3MoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNpbmcgPSBlbGVtZW50LnNwYWNpbmcgfHwgdGhpcy5wcm9wcy5kZWZhdWx0U3BhY2luZztcbiAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHNwYWNpbmc/LnRvcCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGB2YWwtYXJ0aWNsZV9fc3BhY2luZy10b3AtLSR7c3BhY2luZy50b3B9YCk7XG4gICAgfVxuICAgIGlmIChzcGFjaW5nPy5ib3R0b20pIHtcbiAgICAgIGNsYXNzZXMucHVzaChgdmFsLWFydGljbGVfX3NwYWNpbmctYm90dG9tLS0ke3NwYWNpbmcuYm90dG9tfWApO1xuICAgIH1cbiAgICBpZiAoc3BhY2luZz8uaG9yaXpvbnRhbCkge1xuICAgICAgY2xhc3Nlcy5wdXNoKGB2YWwtYXJ0aWNsZV9fc3BhY2luZy1ob3Jpem9udGFsLS0ke3NwYWNpbmcuaG9yaXpvbnRhbH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gIH1cblxuICAvLyA9PT0gRlVOQ0lPTkVTIERFIFRJUE8gUEFSQSBUWVBFU0NSSVBUID09PVxuXG4gIGdldFRpdGxlRWxlbWVudChlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IEFydGljbGVUaXRsZUVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVUaXRsZUVsZW1lbnQ7XG4gIH1cblxuICBnZXRTdWJ0aXRsZUVsZW1lbnQoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBBcnRpY2xlU3VidGl0bGVFbGVtZW50IHtcbiAgICByZXR1cm4gZWxlbWVudCBhcyBBcnRpY2xlU3VidGl0bGVFbGVtZW50O1xuICB9XG5cbiAgZ2V0VGV4dEVsZW1lbnQoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBBcnRpY2xlVGV4dEVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVUZXh0RWxlbWVudDtcbiAgfVxuXG4gIGdldFF1b3RlRWxlbWVudChlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IEFydGljbGVRdW90ZUVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVRdW90ZUVsZW1lbnQ7XG4gIH1cblxuICBnZXRIaWdobGlnaHRFbGVtZW50KGVsZW1lbnQ6IEFydGljbGVFbGVtZW50KTogQXJ0aWNsZUhpZ2hsaWdodEVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVIaWdobGlnaHRFbGVtZW50O1xuICB9XG5cbiAgZ2V0Q29kZUVsZW1lbnQoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBBcnRpY2xlQ29kZUVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVDb2RlRWxlbWVudDtcbiAgfVxuXG4gIGdldExpc3RFbGVtZW50KGVsZW1lbnQ6IEFydGljbGVFbGVtZW50KTogQXJ0aWNsZUxpc3RFbGVtZW50IHtcbiAgICByZXR1cm4gZWxlbWVudCBhcyBBcnRpY2xlTGlzdEVsZW1lbnQ7XG4gIH1cblxuICBnZXRCdXR0b25FbGVtZW50KGVsZW1lbnQ6IEFydGljbGVFbGVtZW50KTogQXJ0aWNsZUJ1dHRvbkVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVCdXR0b25FbGVtZW50O1xuICB9XG5cbiAgZ2V0U2VwYXJhdG9yRWxlbWVudChlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IEFydGljbGVTZXBhcmF0b3JFbGVtZW50IHtcbiAgICByZXR1cm4gZWxlbWVudCBhcyBBcnRpY2xlU2VwYXJhdG9yRWxlbWVudDtcbiAgfVxuXG4gIGdldEltYWdlRWxlbWVudChlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IEFydGljbGVJbWFnZUVsZW1lbnQge1xuICAgIHJldHVybiBlbGVtZW50IGFzIEFydGljbGVJbWFnZUVsZW1lbnQ7XG4gIH1cblxuICBnZXRWaWRlb0VsZW1lbnQoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBBcnRpY2xlVmlkZW9FbGVtZW50IHtcbiAgICByZXR1cm4gZWxlbWVudCBhcyBBcnRpY2xlVmlkZW9FbGVtZW50O1xuICB9XG5cbiAgZ2V0Q3VzdG9tRWxlbWVudChlbGVtZW50OiBBcnRpY2xlRWxlbWVudCk6IEFydGljbGVDdXN0b21FbGVtZW50IHtcbiAgICByZXR1cm4gZWxlbWVudCBhcyBBcnRpY2xlQ3VzdG9tRWxlbWVudDtcbiAgfVxuXG4gIC8vID09PSBGVU5DSU9ORVMgQVVYSUxJQVJFUyBQQVJBIFBST1BTID09PVxuXG4gIGdldFF1b3RlVGV4dFByb3BzKGVsZW1lbnQ6IEFydGljbGVFbGVtZW50KSB7XG4gICAgY29uc3QgcXVvdGVFbGVtZW50ID0gdGhpcy5nZXRRdW90ZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgeyBhdXRob3IsIHNvdXJjZSwgLi4udGV4dFByb3BzIH0gPSBxdW90ZUVsZW1lbnQucHJvcHM7XG4gICAgcmV0dXJuIHRleHRQcm9wcztcbiAgfVxuXG4gIGdldEhpZ2hsaWdodFRleHRQcm9wcyhlbGVtZW50OiBBcnRpY2xlRWxlbWVudCkge1xuICAgIGNvbnN0IGhpZ2hsaWdodEVsZW1lbnQgPSB0aGlzLmdldEhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCk7XG4gICAgY29uc3QgeyBiYWNrZ3JvdW5kQ29sb3IsIHJvdW5kZWQsIC4uLnRleHRQcm9wcyB9ID0gaGlnaGxpZ2h0RWxlbWVudC5wcm9wcztcbiAgICByZXR1cm4gdGV4dFByb3BzO1xuICB9XG5cbiAgZ2V0SGlnaGxpZ2h0Q29sb3IoZWxlbWVudDogQXJ0aWNsZUVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhpZ2hsaWdodEVsZW1lbnQgPSB0aGlzLmdldEhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCk7XG4gICAgcmV0dXJuIGhpZ2hsaWdodEVsZW1lbnQucHJvcHMuYmFja2dyb3VuZENvbG9yIHx8ICd2YXIoLS1pb24tY29sb3ItbGlnaHQpJztcbiAgfVxuXG4gIGdldEJ1dHRvblByb3BzKGVsZW1lbnQ6IEFydGljbGVFbGVtZW50KSB7XG4gICAgY29uc3QgYnV0dG9uRWxlbWVudCA9IHRoaXMuZ2V0QnV0dG9uRWxlbWVudChlbGVtZW50KTtcbiAgICBjb25zdCB7IGFsaWdubWVudCwgLi4uYnV0dG9uUHJvcHMgfSA9IGJ1dHRvbkVsZW1lbnQucHJvcHM7XG4gICAgcmV0dXJuIGJ1dHRvblByb3BzO1xuICB9XG59XG4iXX0=
|