valtech-components 4.0.982 → 4.0.984

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/esm2022/lib/components/atoms/button/button.component.mjs +3 -1
  2. package/esm2022/lib/components/organisms/field-schema-editor/field-schema-editor.component.mjs +364 -0
  3. package/esm2022/lib/components/organisms/field-schema-editor/field-schema-editor.i18n.mjs +71 -0
  4. package/esm2022/lib/components/organisms/field-schema-editor/types.mjs +2 -0
  5. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +289 -136
  6. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +19 -7
  7. package/esm2022/lib/components/organisms/survey-builder/types.mjs +31 -2
  8. package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +294 -26
  9. package/esm2022/lib/components/types.mjs +1 -1
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/esm2022/public-api.mjs +3 -1
  12. package/fesm2022/valtech-components.mjs +1108 -231
  13. package/fesm2022/valtech-components.mjs.map +1 -1
  14. package/lib/components/organisms/article/article.component.d.ts +1 -0
  15. package/lib/components/organisms/field-schema-editor/field-schema-editor.component.d.ts +99 -0
  16. package/lib/components/organisms/field-schema-editor/field-schema-editor.i18n.d.ts +2 -0
  17. package/lib/components/organisms/field-schema-editor/types.d.ts +60 -0
  18. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +36 -14
  19. package/lib/components/organisms/survey-builder/types.d.ts +23 -5
  20. package/lib/components/organisms/survey-response/survey-response.component.d.ts +42 -1
  21. package/lib/components/types.d.ts +6 -0
  22. package/lib/version.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +2 -0
@@ -5,14 +5,18 @@ import { firstValueFrom } from 'rxjs';
5
5
  import { I18nService } from '../../../services/i18n';
6
6
  import { RequestService } from '../../../services/requests/request.service';
7
7
  import { RequestFormBuilderService } from '../../../services/requests/request-form-builder.service';
8
- import { FIELD_TYPE_EMOJI_RATING } from '../../../services/requests/types';
8
+ import { ComponentStates } from '../../types';
9
9
  import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
10
10
  import { TextInputComponent } from '../../molecules/text-input/text-input.component';
11
11
  import { ButtonComponent } from '../../atoms/button/button.component';
12
- import { TitleComponent } from '../../atoms/title/title.component';
12
+ import { FormFieldComponent } from '../../molecules/form-field/form-field.component';
13
+ import { FIELD_TYPES_WITH_OPTIONS, FieldSchemaEditorComponent, } from '../field-schema-editor/field-schema-editor.component';
14
+ import { FIELD_SCHEMA_EDITOR_I18N } from '../field-schema-editor/field-schema-editor.i18n';
15
+ import { SURVEY_QUESTION_TYPES } from './types';
13
16
  import { SURVEY_BUILDER_I18N } from './survey-builder.i18n';
14
17
  import * as i0 from "@angular/core";
15
18
  const NAMESPACE = 'SurveyBuilder';
19
+ const EDITOR_NAMESPACE = 'FieldSchemaEditor';
16
20
  const DEFAULT_TYPE_PREFIX = 'survey';
17
21
  let rowUid = 0;
18
22
  /**
@@ -23,11 +27,14 @@ let rowUid = 0;
23
27
  * true` (cada respuesta se agrega, no se revisa una por una) y el `EntityRef`
24
28
  * que le pasa el consumer (ej. el evento de bingo dueño de la encuesta).
25
29
  *
26
- * v1 solo ofrece los dos tipos de pregunta que `val-survey-response` sabe
27
- * renderizar: emoji-rating y texto libre. Reusa `RequestFormBuilderService`
28
- * (`toToken`/`uniqueFieldName`/`createFieldSchema`) para el nombre de campo
29
- * es la misma primitiva que ya arma el formulario dinámico de `request`, no
30
- * una reimplementación.
30
+ * Cada pregunta se edita con `val-field-schema-editor`, el mismo editor que usa
31
+ * el checkout de bingo de ahí que una pregunta tenga tipo, placeholder, nota
32
+ * y opciones, no solo texto. La v1 de este componente tenía su propio editor
33
+ * pobre (dos tipos, sin opciones); la Fase 5 del ADR-092 lo reemplazó por el
34
+ * organism compartido en vez de mejorarlo por duplicado.
35
+ *
36
+ * El catálogo que ofrece sale de `SURVEY_QUESTION_TYPES` — acotado a lo que
37
+ * `val-survey-response` sabe renderizar, no a lo que el editor sabe editar.
31
38
  */
32
39
  export class SurveyBuilderComponent {
33
40
  constructor() {
@@ -37,15 +44,21 @@ export class SurveyBuilderComponent {
37
44
  this.requests = inject(RequestService);
38
45
  this.formBuilder = inject(RequestFormBuilderService);
39
46
  this.errors = inject(ValtechErrorService);
40
- this.emojiType = FIELD_TYPE_EMOJI_RATING;
41
47
  this.titleControl = new FormControl('', { nonNullable: true });
42
48
  this.subtitleControl = new FormControl('', { nonNullable: true });
43
49
  this.questions = signal([]);
50
+ this.editingId = signal('');
51
+ this.validationError = signal('');
44
52
  this.saving = signal(false);
45
- this.rowControls = new Map();
46
53
  if (!this.i18n.hasNamespace(NAMESPACE)) {
47
54
  this.i18n.registerDefaults(NAMESPACE, SURVEY_BUILDER_I18N);
48
55
  }
56
+ // El nombre del tipo de cada pregunta se muestra en la fila colapsada, que
57
+ // dibuja este componente y no el editor — si nadie montó un editor todavía,
58
+ // el namespace no existiría y la fila mostraría la clave cruda.
59
+ if (!this.i18n.hasNamespace(EDITOR_NAMESPACE)) {
60
+ this.i18n.registerDefaults(EDITOR_NAMESPACE, FIELD_SCHEMA_EDITOR_I18N);
61
+ }
49
62
  }
50
63
  async ngOnInit() {
51
64
  if (!this.props.typeId)
@@ -64,53 +77,143 @@ export class SurveyBuilderComponent {
64
77
  });
65
78
  }
66
79
  }
67
- rowFromField(f) {
68
- const id = `row-${rowUid++}`;
69
- this.rowControls.set(id, new FormControl(f.label ?? '', { nonNullable: true }));
80
+ t(key) {
81
+ this.i18n.lang();
82
+ return this.i18n.t(key, NAMESPACE);
83
+ }
84
+ typeLabel(type) {
85
+ this.i18n.lang();
86
+ return this.i18n.t(`type${type}`, EDITOR_NAMESPACE);
87
+ }
88
+ questionTypes() {
89
+ return this.props.questionTypes?.length ? this.props.questionTypes : SURVEY_QUESTION_TYPES;
90
+ }
91
+ editorProps(row) {
92
+ return { mode: 'edit', field: row, allowedTypes: this.questionTypes() };
93
+ }
94
+ iconAction(token, icon, label, disabled = false, color = 'dark') {
70
95
  return {
71
- id,
72
- label: f.label ?? '',
73
- type: f.type === FIELD_TYPE_EMOJI_RATING ? 'EMOJI_RATING' : 'TEXTAREA',
74
- required: !!f.required,
96
+ token,
97
+ text: '',
98
+ ariaLabel: label,
99
+ color,
100
+ fill: 'clear',
101
+ shape: 'round',
102
+ size: 'small',
103
+ type: 'button',
104
+ state: disabled ? ComponentStates.DISABLED : ComponentStates.ENABLED,
105
+ icon: { name: icon, slot: 'icon-only' },
75
106
  };
76
107
  }
77
- rowLabelControl(row) {
78
- let control = this.rowControls.get(row.id);
79
- if (!control) {
80
- control = new FormControl(row.label, { nonNullable: true });
81
- this.rowControls.set(row.id, control);
82
- }
83
- return control;
84
- }
85
108
  addQuestion() {
86
- const id = `row-${rowUid++}`;
87
- this.rowControls.set(id, new FormControl('', { nonNullable: true }));
88
- this.questions.update(rows => [...rows, { id, label: '', type: 'TEXTAREA', required: true }]);
109
+ const row = {
110
+ id: `row-${rowUid++}`,
111
+ name: '',
112
+ label: '',
113
+ placeholderText: '',
114
+ hintText: '',
115
+ type: this.questionTypes()[0],
116
+ required: true,
117
+ };
118
+ this.questions.update(rows => [...rows, row]);
119
+ // Una pregunta recién agregada está vacía: abrirla es el único paso
120
+ // siguiente posible, y dejarla cerrada la haría ver como una fila rota.
121
+ this.editingId.set(row.id);
122
+ }
123
+ toggleEdit(row) {
124
+ this.editingId.update(current => (current === row.id ? '' : row.id));
89
125
  }
90
126
  removeQuestion(row) {
91
- this.rowControls.delete(row.id);
92
127
  this.questions.update(rows => rows.filter(r => r.id !== row.id));
128
+ if (this.editingId() === row.id)
129
+ this.editingId.set('');
130
+ }
131
+ duplicate(row) {
132
+ const copy = {
133
+ ...row,
134
+ id: `row-${rowUid++}`,
135
+ // Sin token propio la copia pisaría las respuestas del original: dos
136
+ // campos con el mismo `name` son el mismo campo para el backend.
137
+ name: this.formBuilder.uniqueFieldName(row.name || row.label, this.questions()),
138
+ options: row.options ? row.options.map(o => ({ ...o })) : undefined,
139
+ };
140
+ this.questions.update(rows => {
141
+ const index = rows.findIndex(r => r.id === row.id);
142
+ return [...rows.slice(0, index + 1), copy, ...rows.slice(index + 1)];
143
+ });
144
+ }
145
+ move(index, delta) {
146
+ const target = index + delta;
147
+ this.questions.update(rows => {
148
+ if (target < 0 || target >= rows.length)
149
+ return rows;
150
+ const next = [...rows];
151
+ [next[index], next[target]] = [next[target], next[index]];
152
+ return next;
153
+ });
154
+ }
155
+ /**
156
+ * Guarda lo que se está escribiendo, sin cerrar el editor ni validar.
157
+ *
158
+ * Sin esto, lo tipeado solo existía dentro del editor hasta que alguien
159
+ * tocaba "Listo": la fila seguía diciendo "Pregunta sin texto" y, peor,
160
+ * "Guardar encuesta" fallaba con "todas las preguntas necesitan texto" sobre
161
+ * una pregunta que en pantalla claramente tenía texto. Tocar "Listo" era un
162
+ * paso obligatorio que no se veía por ningún lado.
163
+ */
164
+ draftQuestion(field) {
165
+ this.questions.update(rows => rows.map(r => (r.id === field.id ? { ...r, ...field } : r)));
166
+ if (this.validationError())
167
+ this.validationError.set('');
93
168
  }
94
- setType(row, type) {
95
- this.questions.update(rows => rows.map(r => (r.id === row.id ? { ...r, type } : r)));
169
+ applyQuestion(field) {
170
+ this.questions.update(rows => rows.map(r => r.id === field.id
171
+ ? {
172
+ ...field,
173
+ name: this.formBuilder.uniqueFieldName(field.name || field.label, rows.filter(o => o.id !== r.id)),
174
+ }
175
+ : r));
176
+ this.editingId.set('');
177
+ this.validationError.set('');
96
178
  }
97
179
  async save() {
98
180
  if (this.saving())
99
181
  return;
182
+ this.validationError.set('');
100
183
  const title = this.titleControl.value.trim();
101
184
  if (!title) {
102
185
  this.titleControl.markAsTouched();
186
+ this.validationError.set(this.t('noTitle'));
103
187
  return;
104
188
  }
105
189
  const rows = this.questions();
106
- const labels = rows.map(r => (this.rowControls.get(r.id)?.value ?? '').trim());
107
- if (rows.length === 0 || labels.some(l => !l))
190
+ if (!rows.length) {
191
+ this.validationError.set(this.t('noQuestions'));
108
192
  return;
193
+ }
194
+ if (rows.some(r => !r.label.trim())) {
195
+ this.validationError.set(this.t('emptyQuestionLabel'));
196
+ return;
197
+ }
198
+ // El editor ya lo valida al cerrar cada pregunta, pero una pregunta abierta
199
+ // (o cargada de una encuesta vieja) puede llegar acá sin opciones.
200
+ if (rows.some(r => FIELD_TYPES_WITH_OPTIONS.includes(r.type) && !r.options?.length)) {
201
+ this.validationError.set(this.t('missingOptions'));
202
+ return;
203
+ }
109
204
  this.saving.set(true);
110
205
  const fieldSchema = [];
111
206
  rows.forEach((row, index) => {
112
- const name = this.formBuilder.uniqueFieldName(labels[index], fieldSchema);
113
- fieldSchema.push(this.formBuilder.createFieldSchema({ name, label: labels[index], type: row.type, required: row.required }, index));
207
+ const name = this.formBuilder.uniqueFieldName(row.name || row.label, fieldSchema);
208
+ fieldSchema.push(this.formBuilder.createFieldSchema({
209
+ name,
210
+ label: row.label.trim(),
211
+ type: row.type,
212
+ required: row.required,
213
+ placeholderText: row.placeholderText,
214
+ hintText: row.hintText,
215
+ options: row.options,
216
+ }, index));
114
217
  });
115
218
  const typeId = this.props.typeId ?? `${this.props.typePrefix ?? DEFAULT_TYPE_PREFIX}:${this.formBuilder.toToken(title)}`;
116
219
  const subtitle = this.subtitleControl.value.trim();
@@ -140,68 +243,89 @@ export class SurveyBuilderComponent {
140
243
  });
141
244
  }
142
245
  }
143
- t(key) {
144
- return this.i18n.t(key, NAMESPACE);
246
+ rowFromField(f) {
247
+ return {
248
+ id: `row-${rowUid++}`,
249
+ name: f.name,
250
+ label: f.label ?? '',
251
+ placeholderText: f.placeholderText ?? '',
252
+ hintText: f.hintText ?? '',
253
+ type: f.type,
254
+ required: !!f.required,
255
+ options: f.options,
256
+ };
145
257
  }
146
258
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
147
259
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyBuilderComponent, isStandalone: true, selector: "val-survey-builder", inputs: { props: "props" }, outputs: { saved: "saved" }, ngImport: i0, template: `
148
260
  <div class="survey-builder">
149
- <div class="survey-builder__field">
150
- <val-title [props]="{ content: t('titleLabel'), size: 'small', color: 'dark', bold: false }" />
261
+ <val-form-field [label]="t('titleLabel')">
151
262
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
152
- </div>
153
- <div class="survey-builder__field">
154
- <val-title [props]="{ content: t('subtitleLabel'), size: 'small', color: 'dark', bold: false }" />
263
+ </val-form-field>
264
+ <val-form-field [label]="t('subtitleLabel')">
155
265
  <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
156
- </div>
266
+ </val-form-field>
157
267
 
158
268
  <div class="survey-builder__questions">
159
269
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
160
270
 
161
- @for (row of questions(); track row.id) {
271
+ @if (!questions().length) {
272
+ <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
273
+ }
274
+
275
+ @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
162
276
  <div class="survey-builder__row">
163
- <val-text-input [props]="{ control: rowLabelControl(row), placeholder: t('questionLabelPlaceholder') }" />
164
- <div class="survey-builder__row-actions">
165
- <val-button
166
- [props]="{
167
- token: 'q-type-emoji-' + row.id,
168
- text: t('typeEmoji'),
169
- color: row.type === emojiType ? 'primary' : 'medium',
170
- fill: row.type === emojiType ? 'solid' : 'outline',
171
- shape: 'round',
172
- size: 'small',
173
- type: 'button',
174
- state: 'ENABLED',
175
- }"
176
- (onClick)="setType(row, emojiType)"
177
- />
178
- <val-button
179
- [props]="{
180
- token: 'q-type-text-' + row.id,
181
- text: t('typeText'),
182
- color: row.type === 'TEXTAREA' ? 'primary' : 'medium',
183
- fill: row.type === 'TEXTAREA' ? 'solid' : 'outline',
184
- shape: 'round',
185
- size: 'small',
186
- type: 'button',
187
- state: 'ENABLED',
188
- }"
189
- (onClick)="setType(row, 'TEXTAREA')"
190
- />
191
- <val-button
192
- [props]="{
193
- token: 'q-remove-' + row.id,
194
- text: t('removeQuestion'),
195
- color: 'danger',
196
- fill: 'clear',
197
- shape: 'round',
198
- size: 'small',
199
- type: 'button',
200
- state: 'ENABLED',
201
- }"
202
- (onClick)="removeQuestion(row)"
203
- />
277
+ <div class="survey-builder__row-head">
278
+ <div class="survey-builder__row-text">
279
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
280
+ <span>{{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}</span>
281
+ </div>
282
+ <div class="survey-builder__row-actions">
283
+ <val-button
284
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
285
+ (onClick)="move(i, -1)"
286
+ />
287
+ <val-button
288
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
289
+ (onClick)="move(i, 1)"
290
+ />
291
+ <val-button
292
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
293
+ (onClick)="duplicate(row)"
294
+ />
295
+ <val-button
296
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
297
+ (onClick)="toggleEdit(row)"
298
+ />
299
+ <val-button
300
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
301
+ (onClick)="removeQuestion(row)"
302
+ />
303
+ </div>
204
304
  </div>
305
+
306
+ @if (editingId() === row.id) {
307
+ <div class="survey-builder__row-editor">
308
+ <val-field-schema-editor
309
+ #editor
310
+ [props]="editorProps(row)"
311
+ (changed)="draftQuestion($event)"
312
+ (save)="applyQuestion($event)"
313
+ />
314
+ <val-button
315
+ [props]="{
316
+ token: 'q-done-' + row.id,
317
+ text: t('doneEditing'),
318
+ color: 'dark',
319
+ fill: 'solid',
320
+ shape: 'round',
321
+ size: 'default',
322
+ type: 'button',
323
+ state: 'ENABLED',
324
+ }"
325
+ (onClick)="editor.submit()"
326
+ />
327
+ </div>
328
+ }
205
329
  </div>
206
330
  }
207
331
 
@@ -221,6 +345,10 @@ export class SurveyBuilderComponent {
221
345
  />
222
346
  </div>
223
347
 
348
+ @if (validationError()) {
349
+ <p class="survey-builder__error">{{ validationError() }}</p>
350
+ }
351
+
224
352
  <val-button
225
353
  [props]="{
226
354
  token: 'survey-builder-save',
@@ -228,6 +356,7 @@ export class SurveyBuilderComponent {
228
356
  color: 'dark',
229
357
  fill: 'solid',
230
358
  shape: 'round',
359
+ size: 'large',
231
360
  expand: 'block',
232
361
  type: 'button',
233
362
  state: saving() ? 'WORKING' : 'ENABLED',
@@ -235,68 +364,87 @@ export class SurveyBuilderComponent {
235
364
  (onClick)="save()"
236
365
  />
237
366
  </div>
238
- `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__field{display:flex;flex-direction:column;gap:6px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:12px;background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-actions{display:flex;gap:8px;flex-wrap:wrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }] }); }
367
+ `, isInline: true, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: FormFieldComponent, selector: "val-form-field", inputs: ["label"] }, { kind: "component", type: FieldSchemaEditorComponent, selector: "val-field-schema-editor", inputs: ["props"], outputs: ["save", "changed"] }] }); }
239
368
  }
240
369
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, decorators: [{
241
370
  type: Component,
242
- args: [{ selector: 'val-survey-builder', standalone: true, imports: [CommonModule, ReactiveFormsModule, TextInputComponent, ButtonComponent, TitleComponent], template: `
371
+ args: [{ selector: 'val-survey-builder', standalone: true, imports: [
372
+ CommonModule,
373
+ ReactiveFormsModule,
374
+ TextInputComponent,
375
+ ButtonComponent,
376
+ FormFieldComponent,
377
+ FieldSchemaEditorComponent,
378
+ ], template: `
243
379
  <div class="survey-builder">
244
- <div class="survey-builder__field">
245
- <val-title [props]="{ content: t('titleLabel'), size: 'small', color: 'dark', bold: false }" />
380
+ <val-form-field [label]="t('titleLabel')">
246
381
  <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
247
- </div>
248
- <div class="survey-builder__field">
249
- <val-title [props]="{ content: t('subtitleLabel'), size: 'small', color: 'dark', bold: false }" />
382
+ </val-form-field>
383
+ <val-form-field [label]="t('subtitleLabel')">
250
384
  <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
251
- </div>
385
+ </val-form-field>
252
386
 
253
387
  <div class="survey-builder__questions">
254
388
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
255
389
 
256
- @for (row of questions(); track row.id) {
390
+ @if (!questions().length) {
391
+ <p class="survey-builder__empty">{{ t('noQuestions') }}</p>
392
+ }
393
+
394
+ @for (row of questions(); track row.id; let i = $index; let first = $first; let last = $last) {
257
395
  <div class="survey-builder__row">
258
- <val-text-input [props]="{ control: rowLabelControl(row), placeholder: t('questionLabelPlaceholder') }" />
259
- <div class="survey-builder__row-actions">
260
- <val-button
261
- [props]="{
262
- token: 'q-type-emoji-' + row.id,
263
- text: t('typeEmoji'),
264
- color: row.type === emojiType ? 'primary' : 'medium',
265
- fill: row.type === emojiType ? 'solid' : 'outline',
266
- shape: 'round',
267
- size: 'small',
268
- type: 'button',
269
- state: 'ENABLED',
270
- }"
271
- (onClick)="setType(row, emojiType)"
272
- />
273
- <val-button
274
- [props]="{
275
- token: 'q-type-text-' + row.id,
276
- text: t('typeText'),
277
- color: row.type === 'TEXTAREA' ? 'primary' : 'medium',
278
- fill: row.type === 'TEXTAREA' ? 'solid' : 'outline',
279
- shape: 'round',
280
- size: 'small',
281
- type: 'button',
282
- state: 'ENABLED',
283
- }"
284
- (onClick)="setType(row, 'TEXTAREA')"
285
- />
286
- <val-button
287
- [props]="{
288
- token: 'q-remove-' + row.id,
289
- text: t('removeQuestion'),
290
- color: 'danger',
291
- fill: 'clear',
292
- shape: 'round',
293
- size: 'small',
294
- type: 'button',
295
- state: 'ENABLED',
296
- }"
297
- (onClick)="removeQuestion(row)"
298
- />
396
+ <div class="survey-builder__row-head">
397
+ <div class="survey-builder__row-text">
398
+ <strong>{{ row.label || t('untitledQuestion') }}</strong>
399
+ <span>{{ typeLabel(row.type) }}{{ row.required ? ' · ' + t('requiredTag') : '' }}</span>
400
+ </div>
401
+ <div class="survey-builder__row-actions">
402
+ <val-button
403
+ [props]="iconAction('q-up-' + row.id, 'arrow-up-outline', t('moveUp'), first)"
404
+ (onClick)="move(i, -1)"
405
+ />
406
+ <val-button
407
+ [props]="iconAction('q-down-' + row.id, 'arrow-down-outline', t('moveDown'), last)"
408
+ (onClick)="move(i, 1)"
409
+ />
410
+ <val-button
411
+ [props]="iconAction('q-copy-' + row.id, 'copy-outline', t('duplicateQuestion'))"
412
+ (onClick)="duplicate(row)"
413
+ />
414
+ <val-button
415
+ [props]="iconAction('q-edit-' + row.id, 'create-outline', t('editQuestion'))"
416
+ (onClick)="toggleEdit(row)"
417
+ />
418
+ <val-button
419
+ [props]="iconAction('q-remove-' + row.id, 'trash-outline', t('removeQuestion'), false, 'danger')"
420
+ (onClick)="removeQuestion(row)"
421
+ />
422
+ </div>
299
423
  </div>
424
+
425
+ @if (editingId() === row.id) {
426
+ <div class="survey-builder__row-editor">
427
+ <val-field-schema-editor
428
+ #editor
429
+ [props]="editorProps(row)"
430
+ (changed)="draftQuestion($event)"
431
+ (save)="applyQuestion($event)"
432
+ />
433
+ <val-button
434
+ [props]="{
435
+ token: 'q-done-' + row.id,
436
+ text: t('doneEditing'),
437
+ color: 'dark',
438
+ fill: 'solid',
439
+ shape: 'round',
440
+ size: 'default',
441
+ type: 'button',
442
+ state: 'ENABLED',
443
+ }"
444
+ (onClick)="editor.submit()"
445
+ />
446
+ </div>
447
+ }
300
448
  </div>
301
449
  }
302
450
 
@@ -316,6 +464,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
316
464
  />
317
465
  </div>
318
466
 
467
+ @if (validationError()) {
468
+ <p class="survey-builder__error">{{ validationError() }}</p>
469
+ }
470
+
319
471
  <val-button
320
472
  [props]="{
321
473
  token: 'survey-builder-save',
@@ -323,6 +475,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
323
475
  color: 'dark',
324
476
  fill: 'solid',
325
477
  shape: 'round',
478
+ size: 'large',
326
479
  expand: 'block',
327
480
  type: 'button',
328
481
  state: saving() ? 'WORKING' : 'ENABLED',
@@ -330,10 +483,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
330
483
  (onClick)="save()"
331
484
  />
332
485
  </div>
333
- `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__field{display:flex;flex-direction:column;gap:6px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:8px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:12px;background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-actions{display:flex;gap:8px;flex-wrap:wrap}\n"] }]
486
+ `, styles: [":host{display:block}.survey-builder{display:flex;flex-direction:column;gap:16px}.survey-builder__questions{display:flex;flex-direction:column;gap:12px}.survey-builder__questions-label{font-size:.8125rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--ion-color-medium, #92949c)}.survey-builder__empty{margin:0;font-size:.875rem;color:var(--ion-color-medium, #92949c)}.survey-builder__row{display:flex;flex-direction:column;gap:12px;padding:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:var(--val-radius-md, 12px);background:var(--ion-card-background, var(--ion-background-color, #fff))}.survey-builder__row-head{display:flex;flex-direction:column;gap:8px}.survey-builder__row-text{display:flex;flex-direction:column;gap:2px;min-width:0}.survey-builder__row-text strong{color:var(--ion-text-color, #000);font-size:.9375rem}.survey-builder__row-text span{color:var(--ion-color-medium, #92949c);font-size:.8125rem}.survey-builder__row-actions{display:flex;gap:4px;flex-wrap:wrap}.survey-builder__row-editor{display:flex;flex-direction:column;gap:12px;padding-top:12px;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .1))}.survey-builder__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}@media (min-width: 576px){.survey-builder__row-head{flex-direction:row;align-items:flex-start;justify-content:space-between}.survey-builder__row-text{flex:1}}\n"] }]
334
487
  }], ctorParameters: () => [], propDecorators: { props: [{
335
488
  type: Input
336
489
  }], saved: [{
337
490
  type: Output
338
491
  }] } });
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ3BHLE9BQU8sRUFBa0IsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMzRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRW5FLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDOztBQUU1RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUM7QUFDbEMsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUM7QUFFckMsSUFBSSxN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RSxrQkFBa0Isd0ZBQUUsZUFBZSwwR0FBRSxjQUFjOzs0RkF5SXJGLHNCQUFzQjtrQkE1SWxDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLFlBQ3ZGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkZUO3dEQThDUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3QtZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYsIEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvdHlwZXMnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RleHQtaW5wdXQvdGV4dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy90aXRsZS90aXRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3VydmV5QnVpbGRlck1ldGFkYXRhLCBTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50LCBTdXJ2ZXlRdWVzdGlvblJvdyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgU1VSVkVZX0JVSUxERVJfSTE4TiB9IGZyb20gJy4vc3VydmV5LWJ1aWxkZXIuaTE4bic7XG5cbmNvbnN0IE5BTUVTUEFDRSA9ICdTdXJ2ZXlCdWlsZGVyJztcbmNvbnN0IERFRkFVTFRfVFlQRV9QUkVGSVggPSAnc3VydmV5JztcblxubGV0IHJvd1VpZCA9IDA7XG5cbi8qKlxuICogdmFsLXN1cnZleS1idWlsZGVyXG4gKlxuICogQXV0b3LDrWEgZGUgdW5hIGVuY3Vlc3RhOiB0w610dWxvLCBzdWJ0w610dWxvLCBwcmVndW50YXMg4oCUIGFybWEgbyBhY3R1YWxpemEgdW5cbiAqIGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcIjxwcmVmaXg+OjxzbHVnPlwiYCAoQURSLTA5MiksIGBza2lwUmV2aWV3OlxuICogdHJ1ZWAgKGNhZGEgcmVzcHVlc3RhIHNlIGFncmVnYSwgbm8gc2UgcmV2aXNhIHVuYSBwb3IgdW5hKSB5IGVsIGBFbnRpdHlSZWZgXG4gKiBxdWUgbGUgcGFzYSBlbCBjb25zdW1lciAoZWouIGVsIGV2ZW50byBkZSBiaW5nbyBkdWXDsW8gZGUgbGEgZW5jdWVzdGEpLlxuICpcbiAqIHYxIHNvbG8gb2ZyZWNlIGxvcyBkb3MgdGlwb3MgZGUgcHJlZ3VudGEgcXVlIGB2YWwtc3VydmV5LXJlc3BvbnNlYCBzYWJlXG4gKiByZW5kZXJpemFyOiBlbW9qaS1yYXRpbmcgeSB0ZXh0byBsaWJyZS4gUmV1c2EgYFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2VgXG4gKiAoYHRvVG9rZW5gL2B1bmlxdWVGaWVsZE5hbWVgL2BjcmVhdGVGaWVsZFNjaGVtYWApIHBhcmEgZWwgbm9tYnJlIGRlIGNhbXBvIOKAlFxuICogZXMgbGEgbWlzbWEgcHJpbWl0aXZhIHF1ZSB5YSBhcm1hIGVsIGZvcm11bGFyaW8gZGluw6FtaWNvIGRlIGByZXF1ZXN0YCwgbm9cbiAqIHVuYSByZWltcGxlbWVudGFjacOzbi5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXN1cnZleS1idWlsZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVGV4dElucHV0Q29tcG9uZW50LCBCdXR0b25Db21wb25lbnQsIFRpdGxlQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fZmllbGRcIj5cbiAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiB0KCd0aXRsZUxhYmVsJyksIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogdGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgndGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ZpZWxkXCI+XG4gICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogdCgnc3VidGl0bGVMYWJlbCcpLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnLCBib2xkOiBmYWxzZSB9XCIgLz5cbiAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1YnRpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1YnRpdGxlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWxcIj57eyB0KCdxdWVzdGlvbnNMYWJlbCcpIH19PC9zcGFuPlxuXG4gICAgICAgIEBmb3IgKHJvdyBvZiBxdWVzdGlvbnMoKTsgdHJhY2sgcm93LmlkKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3dcIj5cbiAgICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiByb3dMYWJlbENvbnRyb2wocm93KSwgcGxhY2Vob2xkZXI6IHQoJ3F1ZXN0aW9uTGFiZWxQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtdHlwZS1lbW9qaS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdCgndHlwZUVtb2ppJyksXG4gICAgICAgICAgICAgICAgICBjb2xvcjogcm93LnR5cGUgPT09IGVtb2ppVHlwZSA/ICdwcmltYXJ5JyA6ICdtZWRpdW0nLFxuICAgICAgICAgICAgICAgICAgZmlsbDogcm93LnR5cGUgPT09IGVtb2ppVHlwZSA/ICdzb2xpZCcgOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2V0VHlwZShyb3csIGVtb2ppVHlwZSlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtdHlwZS10ZXh0LScgKyByb3cuaWQsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0KCd0eXBlVGV4dCcpLFxuICAgICAgICAgICAgICAgICAgY29sb3I6IHJvdy50eXBlID09PSAnVEVYVEFSRUEnID8gJ3ByaW1hcnknIDogJ21lZGl1bScsXG4gICAgICAgICAgICAgICAgICBmaWxsOiByb3cudHlwZSA9PT0gJ1RFWFRBUkVBJyA/ICdzb2xpZCcgOiAnb3V0bGluZScsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2V0VHlwZShyb3csICdURVhUQVJFQScpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgdG9rZW46ICdxLXJlbW92ZS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgdGV4dDogdCgncmVtb3ZlUXVlc3Rpb24nKSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFuZ2VyJyxcbiAgICAgICAgICAgICAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVtb3ZlUXVlc3Rpb24ocm93KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItYWRkLXF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHRleHQ6IHQoJ2FkZFF1ZXN0aW9uJyksXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICBpY29uOiB7IG5hbWU6ICdhZGQtb3V0bGluZScsIHNsb3Q6ICdzdGFydCcgfSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob25DbGljayk9XCJhZGRRdWVzdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8dmFsLWJ1dHRvblxuICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItc2F2ZScsXG4gICAgICAgICAgdGV4dDogdCgnc2F2ZScpLFxuICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgc3RhdGU6IHNhdmluZygpID8gJ1dPUktJTkcnIDogJ0VOQUJMRUQnLFxuICAgICAgICB9XCJcbiAgICAgICAgKG9uQ2xpY2spPVwic2F2ZSgpXCJcbiAgICAgIC8+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ZpZWxkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsIHtcbiAgICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjA0ZW07XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1hY3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTdXJ2ZXlCdWlsZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgcHJvcHM6IFN1cnZleUJ1aWxkZXJNZXRhZGF0YSA9IHt9O1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1cnZleUJ1aWxkZXJTYXZlRXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0cyA9IGluamVjdChSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXIgPSBpbmplY3QoUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JzID0gaW5qZWN0KFZhbHRlY2hFcnJvclNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGVtb2ppVHlwZSA9IEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HO1xuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgcXVlc3Rpb25zID0gc2lnbmFsPFN1cnZleVF1ZXN0aW9uUm93W10+KFtdKTtcbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJvd0NvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1Db250cm9sPHN0cmluZz4+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKE5BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKE5BTUVTUEFDRSwgU1VSVkVZX0JVSUxERVJfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnByb3BzLnR5cGVJZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFJlcXVlc3RUeXBlKHRoaXMucHJvcHMudHlwZUlkKSk7XG4gICAgICB0aGlzLnRpdGxlQ29udHJvbC5zZXRWYWx1ZShjZmcubGFiZWwpO1xuICAgICAgdGhpcy5zdWJ0aXRsZUNvbnRyb2wuc2V0VmFsdWUoY2ZnLnN1YnRpdGxlID8/ICcnKTtcbiAgICAgIHRoaXMucXVlc3Rpb25zLnNldChbLi4uY2ZnLmZpZWxkU2NoZW1hXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikubWFwKGYgPT4gdGhpcy5yb3dGcm9tRmllbGQoZikpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3N1cnZleUJ1aWxkZXIubG9hZCcsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnbG9hZEVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogTkFNRVNQQUNFLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3dGcm9tRmllbGQoZjogRmllbGRTY2hlbWFEZWYpOiBTdXJ2ZXlRdWVzdGlvblJvdyB7XG4gICAgY29uc3QgaWQgPSBgcm93LSR7cm93VWlkKyt9YDtcbiAgICB0aGlzLnJvd0NvbnRyb2xzLnNldChpZCwgbmV3IEZvcm1Db250cm9sKGYubGFiZWwgPz8gJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIGxhYmVsOiBmLmxhYmVsID8/ICcnLFxuICAgICAgdHlwZTogZi50eXBlID09PSBGSUVMRF9UWVBFX0VNT0pJX1JBVElORyA/ICdFTU9KSV9SQVRJTkcnIDogJ1RFWFRBUkVBJyxcbiAgICAgIHJlcXVpcmVkOiAhIWYucmVxdWlyZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJvd0xhYmVsQ29udHJvbChyb3c6IFN1cnZleVF1ZXN0aW9uUm93KTogRm9ybUNvbnRyb2w8c3RyaW5nPiB7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLnJvd0NvbnRyb2xzLmdldChyb3cuaWQpO1xuICAgIGlmICghY29udHJvbCkge1xuICAgICAgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbChyb3cubGFiZWwsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgICB0aGlzLnJvd0NvbnRyb2xzLnNldChyb3cuaWQsIGNvbnRyb2wpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIGFkZFF1ZXN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gYHJvdy0ke3Jvd1VpZCsrfWA7XG4gICAgdGhpcy5yb3dDb250cm9scy5zZXQoaWQsIG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSk7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gWy4uLnJvd3MsIHsgaWQsIGxhYmVsOiAnJywgdHlwZTogJ1RFWFRBUkVBJywgcmVxdWlyZWQ6IHRydWUgfV0pO1xuICB9XG5cbiAgcmVtb3ZlUXVlc3Rpb24ocm93OiBTdXJ2ZXlRdWVzdGlvblJvdyk6IHZvaWQge1xuICAgIHRoaXMucm93Q29udHJvbHMuZGVsZXRlKHJvdy5pZCk7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gcm93cy5maWx0ZXIociA9PiByLmlkICE9PSByb3cuaWQpKTtcbiAgfVxuXG4gIHNldFR5cGUocm93OiBTdXJ2ZXlRdWVzdGlvblJvdywgdHlwZTogU3VydmV5UXVlc3Rpb25Sb3dbJ3R5cGUnXSk6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHJvd3MubWFwKHIgPT4gKHIuaWQgPT09IHJvdy5pZCA/IHsgLi4uciwgdHlwZSB9IDogcikpKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2F2aW5nKCkpIHJldHVybjtcblxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy50aXRsZUNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHRoaXMudGl0bGVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5xdWVzdGlvbnMoKTtcbiAgICBjb25zdCBsYWJlbHMgPSByb3dzLm1hcChyID0+ICh0aGlzLnJvd0NvbnRyb2xzLmdldChyLmlkKT8udmFsdWUgPz8gJycpLnRyaW0oKSk7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwIHx8IGxhYmVscy5zb21lKGwgPT4gIWwpKSByZXR1cm47XG5cbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG5cbiAgICBjb25zdCBmaWVsZFNjaGVtYTogRmllbGRTY2hlbWFEZWZbXSA9IFtdO1xuICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKGxhYmVsc1tpbmRleF0sIGZpZWxkU2NoZW1hKTtcbiAgICAgIGZpZWxkU2NoZW1hLnB1c2goXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY3JlYXRlRmllbGRTY2hlbWEoXG4gICAgICAgICAgeyBuYW1lLCBsYWJlbDogbGFiZWxzW2luZGV4XSwgdHlwZTogcm93LnR5cGUsIHJlcXVpcmVkOiByb3cucmVxdWlyZWQgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZUlkID1cbiAgICAgIHRoaXMucHJvcHMudHlwZUlkID8/IGAke3RoaXMucHJvcHMudHlwZVByZWZpeCA/PyBERUZBVUxUX1RZUEVfUFJFRklYfToke3RoaXMuZm9ybUJ1aWxkZXIudG9Ub2tlbih0aXRsZSl9YDtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBsYWJlbDogdGl0bGUsXG4gICAgICBzdWJ0aXRsZSxcbiAgICAgIGVudGl0eVJlZjogdGhpcy5wcm9wcy5lbnRpdHlSZWYsXG4gICAgICBza2lwUmV2aWV3OiB0cnVlLFxuICAgICAgZmllbGRTY2hlbWEsXG4gICAgICBhbGxvd0Fub255bW91czogdGhpcy5wcm9wcy5hbGxvd0Fub255bW91cyA/PyB0cnVlLFxuICAgICAgdmlzaWJpbGl0eTogdGhpcy5wcm9wcy52aXNpYmlsaXR5ID8/ICgnUFVCTElDJyBhcyBjb25zdCksXG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGwkID0gdGhpcy5wcm9wcy50eXBlSWRcbiAgICAgID8gdGhpcy5yZXF1ZXN0cy51cGRhdGVSZXF1ZXN0VHlwZSh0aGlzLnByb3BzLnR5cGVJZCwgcGF5bG9hZClcbiAgICAgIDogdGhpcy5yZXF1ZXN0cy5jcmVhdGVSZXF1ZXN0VHlwZSh7IC4uLnBheWxvYWQsIHR5cGVJZCB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eXBlQ29uZmlnID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY2FsbCQpO1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2F2ZWQuZW1pdCh7IHR5cGVDb25maWcgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNhdmluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5zYXZlJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdzYXZlRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCBOQU1FU1BBQ0UpO1xuICB9XG59XG4iXX0=
492
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBRXBHLE9BQU8sRUFBa0IsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTlELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLDBCQUEwQixHQUMzQixNQUFNLHNEQUFzRCxDQUFDO0FBQzlELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRTNGLE9BQU8sRUFBaUQscUJB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Q1AsWUFBWTt3QkFDWixtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLDBCQUEwQjtxQkFDM0IsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEdUO3dEQTJGUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3QtZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy90eXBlcyc7XG5pbXBvcnQgeyBCdXR0b25NZXRhZGF0YSwgQ29tcG9uZW50U3RhdGVzIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBDb2xvciB9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7IFZhbHRlY2hFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvdmFsdGVjaC1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IFRleHRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90ZXh0LWlucHV0L3RleHQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9mb3JtLWZpZWxkL2Zvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIEZJRUxEX1RZUEVTX1dJVEhfT1BUSU9OUyxcbiAgRmllbGRTY2hlbWFFZGl0b3JDb21wb25lbnQsXG59IGZyb20gJy4uL2ZpZWxkLXNjaGVtYS1lZGl0b3IvZmllbGQtc2NoZW1hLWVkaXRvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRklFTERfU0NIRU1BX0VESVRPUl9JMThOIH0gZnJvbSAnLi4vZmllbGQtc2NoZW1hLWVkaXRvci9maWVsZC1zY2hlbWEtZWRpdG9yLmkxOG4nO1xuaW1wb3J0IHsgRWRpdGFibGVGaWVsZERlZiwgRmllbGRTY2hlbWFFZGl0b3JNZXRhZGF0YSB9IGZyb20gJy4uL2ZpZWxkLXNjaGVtYS1lZGl0b3IvdHlwZXMnO1xuaW1wb3J0IHsgU3VydmV5QnVpbGRlck1ldGFkYXRhLCBTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50LCBTVVJWRVlfUVVFU1RJT05fVFlQRVMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNVUlZFWV9CVUlMREVSX0kxOE4gfSBmcm9tICcuL3N1cnZleS1idWlsZGVyLmkxOG4nO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnU3VydmV5QnVpbGRlcic7XG5jb25zdCBFRElUT1JfTkFNRVNQQUNFID0gJ0ZpZWxkU2NoZW1hRWRpdG9yJztcbmNvbnN0IERFRkFVTFRfVFlQRV9QUkVGSVggPSAnc3VydmV5JztcblxubGV0IHJvd1VpZCA9IDA7XG5cbi8qKlxuICogdmFsLXN1cnZleS1idWlsZGVyXG4gKlxuICogQXV0b3LDrWEgZGUgdW5hIGVuY3Vlc3RhOiB0w610dWxvLCBzdWJ0w610dWxvLCBwcmVndW50YXMg4oCUIGFybWEgbyBhY3R1YWxpemEgdW5cbiAqIGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcIjxwcmVmaXg+OjxzbHVnPlwiYCAoQURSLTA5MiksIGBza2lwUmV2aWV3OlxuICogdHJ1ZWAgKGNhZGEgcmVzcHVlc3RhIHNlIGFncmVnYSwgbm8gc2UgcmV2aXNhIHVuYSBwb3IgdW5hKSB5IGVsIGBFbnRpdHlSZWZgXG4gKiBxdWUgbGUgcGFzYSBlbCBjb25zdW1lciAoZWouIGVsIGV2ZW50byBkZSBiaW5nbyBkdWXDsW8gZGUgbGEgZW5jdWVzdGEpLlxuICpcbiAqIENhZGEgcHJlZ3VudGEgc2UgZWRpdGEgY29uIGB2YWwtZmllbGQtc2NoZW1hLWVkaXRvcmAsIGVsIG1pc21vIGVkaXRvciBxdWUgdXNhXG4gKiBlbCBjaGVja291dCBkZSBiaW5nbyDigJQgZGUgYWjDrSBxdWUgdW5hIHByZWd1bnRhIHRlbmdhIHRpcG8sIHBsYWNlaG9sZGVyLCBub3RhXG4gKiB5IG9wY2lvbmVzLCBubyBzb2xvIHRleHRvLiBMYSB2MSBkZSBlc3RlIGNvbXBvbmVudGUgdGVuw61hIHN1IHByb3BpbyBlZGl0b3JcbiAqIHBvYnJlIChkb3MgdGlwb3MsIHNpbiBvcGNpb25lcyk7IGxhIEZhc2UgNSBkZWwgQURSLTA5MiBsbyByZWVtcGxhesOzIHBvciBlbFxuICogb3JnYW5pc20gY29tcGFydGlkbyBlbiB2ZXogZGUgbWVqb3JhcmxvIHBvciBkdXBsaWNhZG8uXG4gKlxuICogRWwgY2F0w6Fsb2dvIHF1ZSBvZnJlY2Ugc2FsZSBkZSBgU1VSVkVZX1FVRVNUSU9OX1RZUEVTYCDigJQgYWNvdGFkbyBhIGxvIHF1ZVxuICogYHZhbC1zdXJ2ZXktcmVzcG9uc2VgIHNhYmUgcmVuZGVyaXphciwgbm8gYSBsbyBxdWUgZWwgZWRpdG9yIHNhYmUgZWRpdGFyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc3VydmV5LWJ1aWxkZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgVGV4dElucHV0Q29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBGb3JtRmllbGRDb21wb25lbnQsXG4gICAgRmllbGRTY2hlbWFFZGl0b3JDb21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyXCI+XG4gICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3RpdGxlTGFiZWwnKVwiPlxuICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogdGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgndGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VidGl0bGVMYWJlbCcpXCI+XG4gICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiBzdWJ0aXRsZUNvbnRyb2wsIHBsYWNlaG9sZGVyOiB0KCdzdWJ0aXRsZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9uc1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWxcIj57eyB0KCdxdWVzdGlvbnNMYWJlbCcpIH19PC9zcGFuPlxuXG4gICAgICAgIEBpZiAoIXF1ZXN0aW9ucygpLmxlbmd0aCkge1xuICAgICAgICAgIDxwIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2VtcHR5XCI+e3sgdCgnbm9RdWVzdGlvbnMnKSB9fTwvcD5cbiAgICAgICAgfVxuXG4gICAgICAgIEBmb3IgKHJvdyBvZiBxdWVzdGlvbnMoKTsgdHJhY2sgcm93LmlkOyBsZXQgaSA9ICRpbmRleDsgbGV0IGZpcnN0ID0gJGZpcnN0OyBsZXQgbGFzdCA9ICRsYXN0KSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93LWhlYWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctdGV4dFwiPlxuICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sgcm93LmxhYmVsIHx8IHQoJ3VudGl0bGVkUXVlc3Rpb24nKSB9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHR5cGVMYWJlbChyb3cudHlwZSkgfX17eyByb3cucmVxdWlyZWQgPyAnIMK3ICcgKyB0KCdyZXF1aXJlZFRhZycpIDogJycgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvdy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLXVwLScgKyByb3cuaWQsICdhcnJvdy11cC1vdXRsaW5lJywgdCgnbW92ZVVwJyksIGZpcnN0KVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJtb3ZlKGksIC0xKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtZG93bi0nICsgcm93LmlkLCAnYXJyb3ctZG93bi1vdXRsaW5lJywgdCgnbW92ZURvd24nKSwgbGFzdClcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwibW92ZShpLCAxKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtY29weS0nICsgcm93LmlkLCAnY29weS1vdXRsaW5lJywgdCgnZHVwbGljYXRlUXVlc3Rpb24nKSlcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiZHVwbGljYXRlKHJvdylcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLWVkaXQtJyArIHJvdy5pZCwgJ2NyZWF0ZS1vdXRsaW5lJywgdCgnZWRpdFF1ZXN0aW9uJykpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZUVkaXQocm93KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtcmVtb3ZlLScgKyByb3cuaWQsICd0cmFzaC1vdXRsaW5lJywgdCgncmVtb3ZlUXVlc3Rpb24nKSwgZmFsc2UsICdkYW5nZXInKVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJyZW1vdmVRdWVzdGlvbihyb3cpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBAaWYgKGVkaXRpbmdJZCgpID09PSByb3cuaWQpIHtcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctZWRpdG9yXCI+XG4gICAgICAgICAgICAgICAgPHZhbC1maWVsZC1zY2hlbWEtZWRpdG9yXG4gICAgICAgICAgICAgICAgICAjZWRpdG9yXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiZWRpdG9yUHJvcHMocm93KVwiXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlZCk9XCJkcmFmdFF1ZXN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgKHNhdmUpPVwiYXBwbHlRdWVzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICB0b2tlbjogJ3EtZG9uZS0nICsgcm93LmlkLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0KCdkb25lRWRpdGluZycpLFxuICAgICAgICAgICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgICAgICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwiZWRpdG9yLnN1Ym1pdCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItYWRkLXF1ZXN0aW9uJyxcbiAgICAgICAgICAgIHRleHQ6IHQoJ2FkZFF1ZXN0aW9uJyksXG4gICAgICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICBpY29uOiB7IG5hbWU6ICdhZGQtb3V0bGluZScsIHNsb3Q6ICdzdGFydCcgfSxcbiAgICAgICAgICB9XCJcbiAgICAgICAgICAob25DbGljayk9XCJhZGRRdWVzdGlvbigpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKHZhbGlkYXRpb25FcnJvcigpKSB7XG4gICAgICAgIDxwIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2Vycm9yXCI+e3sgdmFsaWRhdGlvbkVycm9yKCkgfX08L3A+XG4gICAgICB9XG5cbiAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci1zYXZlJyxcbiAgICAgICAgICB0ZXh0OiB0KCdzYXZlJyksXG4gICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgIHN0YXRlOiBzYXZpbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJyxcbiAgICAgICAgfVwiXG4gICAgICAgIChvbkNsaWNrKT1cInNhdmUoKVwiXG4gICAgICAvPlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxNnB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucy1sYWJlbCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wNGVtO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2VtcHR5IHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3JvdyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdmFsLXJhZGl1cy1tZCwgMTJweCk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICB9XG4gICAgICAvKiBNb2JpbGUtZmlyc3Q6IGVsIHRleHRvIGRlIGxhIHByZWd1bnRhIHkgc3VzIGFjY2lvbmVzIGFwaWxhZG9zLiBFbiBmaWxhXG4gICAgICAgICBmaWphLCBjaW5jbyBib3RvbmVzIGxlIGNvbWVuIGVsIGFuY2hvIGFsIHRleHRvIHkgbG8gcGFydGVuIGVuIG11Y2hhc1xuICAgICAgICAgbMOtbmVhcyBhbmdvc3RhcyDigJQganVzdG8gZW4gZWwgdmlld3BvcnQgZG9uZGUgbcOhcyBzZSB1c2EuICovXG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1oZWFkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAycHg7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93LXRleHQgc3Ryb25nIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHNwYW4ge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogNHB4O1xuICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1lZGl0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fZXJyb3Ige1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFuZ2VyKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIH1cbiAgICAgIEBtZWRpYSAobWluLXdpZHRoOiA1NzZweCkge1xuICAgICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy1oZWFkIHtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgICAgfVxuICAgICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VydmV5QnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBTdXJ2ZXlCdWlsZGVyTWV0YWRhdGEgPSB7fTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNhdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxTdXJ2ZXlCdWlsZGVyU2F2ZUV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdHMgPSBpbmplY3QoUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcblxuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgcXVlc3Rpb25zID0gc2lnbmFsPEVkaXRhYmxlRmllbGREZWZbXT4oW10pO1xuICByZWFkb25seSBlZGl0aW5nSWQgPSBzaWduYWwoJycpO1xuICByZWFkb25seSB2YWxpZGF0aW9uRXJyb3IgPSBzaWduYWwoJycpO1xuICByZWFkb25seSBzYXZpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShOQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhOQU1FU1BBQ0UsIFNVUlZFWV9CVUlMREVSX0kxOE4pO1xuICAgIH1cbiAgICAvLyBFbCBub21icmUgZGVsIHRpcG8gZGUgY2FkYSBwcmVndW50YSBzZSBtdWVzdHJhIGVuIGxhIGZpbGEgY29sYXBzYWRhLCBxdWVcbiAgICAvLyBkaWJ1amEgZXN0ZSBjb21wb25lbnRlIHkgbm8gZWwgZWRpdG9yIOKAlCBzaSBuYWRpZSBtb250w7MgdW4gZWRpdG9yIHRvZGF2w61hLFxuICAgIC8vIGVsIG5hbWVzcGFjZSBubyBleGlzdGlyw61hIHkgbGEgZmlsYSBtb3N0cmFyw61hIGxhIGNsYXZlIGNydWRhLlxuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShFRElUT1JfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoRURJVE9SX05BTUVTUEFDRSwgRklFTERfU0NIRU1BX0VESVRPUl9JMThOKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMucHJvcHMudHlwZUlkKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNmZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVxdWVzdHMuZ2V0UmVxdWVzdFR5cGUodGhpcy5wcm9wcy50eXBlSWQpKTtcbiAgICAgIHRoaXMudGl0bGVDb250cm9sLnNldFZhbHVlKGNmZy5sYWJlbCk7XG4gICAgICB0aGlzLnN1YnRpdGxlQ29udHJvbC5zZXRWYWx1ZShjZmcuc3VidGl0bGUgPz8gJycpO1xuICAgICAgdGhpcy5xdWVzdGlvbnMuc2V0KFsuLi5jZmcuZmllbGRTY2hlbWFdLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAoZiA9PiB0aGlzLnJvd0Zyb21GaWVsZChmKSkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5sb2FkJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdsb2FkRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICB0eXBlTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChgdHlwZSR7dHlwZX1gLCBFRElUT1JfTkFNRVNQQUNFKTtcbiAgfVxuXG4gIHF1ZXN0aW9uVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uVHlwZXM/Lmxlbmd0aCA/IHRoaXMucHJvcHMucXVlc3Rpb25UeXBlcyA6IFNVUlZFWV9RVUVTVElPTl9UWVBFUztcbiAgfVxuXG4gIGVkaXRvclByb3BzKHJvdzogRWRpdGFibGVGaWVsZERlZik6IEZpZWxkU2NoZW1hRWRpdG9yTWV0YWRhdGEge1xuICAgIHJldHVybiB7IG1vZGU6ICdlZGl0JywgZmllbGQ6IHJvdywgYWxsb3dlZFR5cGVzOiB0aGlzLnF1ZXN0aW9uVHlwZXMoKSB9O1xuICB9XG5cbiAgaWNvbkFjdGlvbihcbiAgICB0b2tlbjogc3RyaW5nLFxuICAgIGljb246IHN0cmluZyxcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGRpc2FibGVkID0gZmFsc2UsXG4gICAgY29sb3I6IENvbG9yID0gJ2RhcmsnXG4gICk6IEJ1dHRvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW4sXG4gICAgICB0ZXh0OiAnJyxcbiAgICAgIGFyaWFMYWJlbDogbGFiZWwsXG4gICAgICBjb2xvcixcbiAgICAgIGZpbGw6ICdjbGVhcicsXG4gICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiBkaXNhYmxlZCA/IENvbXBvbmVudFN0YXRlcy5ESVNBQkxFRCA6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgaWNvbjogeyBuYW1lOiBpY29uLCBzbG90OiAnaWNvbi1vbmx5JyB9LFxuICAgIH07XG4gIH1cblxuICBhZGRRdWVzdGlvbigpOiB2b2lkIHtcbiAgICBjb25zdCByb3c6IEVkaXRhYmxlRmllbGREZWYgPSB7XG4gICAgICBpZDogYHJvdy0ke3Jvd1VpZCsrfWAsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIGxhYmVsOiAnJyxcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogJycsXG4gICAgICBoaW50VGV4dDogJycsXG4gICAgICB0eXBlOiB0aGlzLnF1ZXN0aW9uVHlwZXMoKVswXSxcbiAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gWy4uLnJvd3MsIHJvd10pO1xuICAgIC8vIFVuYSBwcmVndW50YSByZWNpw6luIGFncmVnYWRhIGVzdMOhIHZhY8OtYTogYWJyaXJsYSBlcyBlbCDDum5pY28gcGFzb1xuICAgIC8vIHNpZ3VpZW50ZSBwb3NpYmxlLCB5IGRlamFybGEgY2VycmFkYSBsYSBoYXLDrWEgdmVyIGNvbW8gdW5hIGZpbGEgcm90YS5cbiAgICB0aGlzLmVkaXRpbmdJZC5zZXQocm93LmlkKTtcbiAgfVxuXG4gIHRvZ2dsZUVkaXQocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0aW5nSWQudXBkYXRlKGN1cnJlbnQgPT4gKGN1cnJlbnQgPT09IHJvdy5pZCA/ICcnIDogcm93LmlkKSk7XG4gIH1cblxuICByZW1vdmVRdWVzdGlvbihyb3c6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiByb3dzLmZpbHRlcihyID0+IHIuaWQgIT09IHJvdy5pZCkpO1xuICAgIGlmICh0aGlzLmVkaXRpbmdJZCgpID09PSByb3cuaWQpIHRoaXMuZWRpdGluZ0lkLnNldCgnJyk7XG4gIH1cblxuICBkdXBsaWNhdGUocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgY29uc3QgY29weTogRWRpdGFibGVGaWVsZERlZiA9IHtcbiAgICAgIC4uLnJvdyxcbiAgICAgIGlkOiBgcm93LSR7cm93VWlkKyt9YCxcbiAgICAgIC8vIFNpbiB0b2tlbiBwcm9waW8gbGEgY29waWEgcGlzYXLDrWEgbGFzIHJlc3B1ZXN0YXMgZGVsIG9yaWdpbmFsOiBkb3NcbiAgICAgIC8vIGNhbXBvcyBjb24gZWwgbWlzbW8gYG5hbWVgIHNvbiBlbCBtaXNtbyBjYW1wbyBwYXJhIGVsIGJhY2tlbmQuXG4gICAgICBuYW1lOiB0aGlzLmZvcm1CdWlsZGVyLnVuaXF1ZUZpZWxkTmFtZShyb3cubmFtZSB8fCByb3cubGFiZWwsIHRoaXMucXVlc3Rpb25zKCkpLFxuICAgICAgb3B0aW9uczogcm93Lm9wdGlvbnMgPyByb3cub3B0aW9ucy5tYXAobyA9PiAoeyAuLi5vIH0pKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gcm93cy5maW5kSW5kZXgociA9PiByLmlkID09PSByb3cuaWQpO1xuICAgICAgcmV0dXJuIFsuLi5yb3dzLnNsaWNlKDAsIGluZGV4ICsgMSksIGNvcHksIC4uLnJvd3Muc2xpY2UoaW5kZXggKyAxKV07XG4gICAgfSk7XG4gIH1cblxuICBtb3ZlKGluZGV4OiBudW1iZXIsIGRlbHRhOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBpbmRleCArIGRlbHRhO1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHtcbiAgICAgIGlmICh0YXJnZXQgPCAwIHx8IHRhcmdldCA+PSByb3dzLmxlbmd0aCkgcmV0dXJuIHJvd3M7XG4gICAgICBjb25zdCBuZXh0ID0gWy4uLnJvd3NdO1xuICAgICAgW25leHRbaW5kZXhdLCBuZXh0W3RhcmdldF1dID0gW25leHRbdGFyZ2V0XSwgbmV4dFtpbmRleF1dO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR3VhcmRhIGxvIHF1ZSBzZSBlc3TDoSBlc2NyaWJpZW5kbywgc2luIGNlcnJhciBlbCBlZGl0b3IgbmkgdmFsaWRhci5cbiAgICpcbiAgICogU2luIGVzdG8sIGxvIHRpcGVhZG8gc29sbyBleGlzdMOtYSBkZW50cm8gZGVsIGVkaXRvciBoYXN0YSBxdWUgYWxndWllblxuICAgKiB0b2NhYmEgXCJMaXN0b1wiOiBsYSBmaWxhIHNlZ3XDrWEgZGljaWVuZG8gXCJQcmVndW50YSBzaW4gdGV4dG9cIiB5LCBwZW9yLFxuICAgKiBcIkd1YXJkYXIgZW5jdWVzdGFcIiBmYWxsYWJhIGNvbiBcInRvZGFzIGxhcyBwcmVndW50YXMgbmVjZXNpdGFuIHRleHRvXCIgc29icmVcbiAgICogdW5hIHByZWd1bnRhIHF1ZSBlbiBwYW50YWxsYSBjbGFyYW1lbnRlIHRlbsOtYSB0ZXh0by4gVG9jYXIgXCJMaXN0b1wiIGVyYSB1blxuICAgKiBwYXNvIG9ibGlnYXRvcmlvIHF1ZSBubyBzZSB2ZcOtYSBwb3IgbmluZ8O6biBsYWRvLlxuICAgKi9cbiAgZHJhZnRRdWVzdGlvbihmaWVsZDogRWRpdGFibGVGaWVsZERlZik6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHJvd3MubWFwKHIgPT4gKHIuaWQgPT09IGZpZWxkLmlkID8geyAuLi5yLCAuLi5maWVsZCB9IDogcikpKTtcbiAgICBpZiAodGhpcy52YWxpZGF0aW9uRXJyb3IoKSkgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcbiAgfVxuXG4gIGFwcGx5UXVlc3Rpb24oZmllbGQ6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PlxuICAgICAgcm93cy5tYXAociA9PlxuICAgICAgICByLmlkID09PSBmaWVsZC5pZFxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgICAgbmFtZTogdGhpcy5mb3JtQnVpbGRlci51bmlxdWVGaWVsZE5hbWUoXG4gICAgICAgICAgICAgICAgZmllbGQubmFtZSB8fCBmaWVsZC5sYWJlbCxcbiAgICAgICAgICAgICAgICByb3dzLmZpbHRlcihvID0+IG8uaWQgIT09IHIuaWQpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiByXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLmVkaXRpbmdJZC5zZXQoJycpO1xuICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCgnJyk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmluZygpKSByZXR1cm47XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcblxuICAgIGNvbnN0IHRpdGxlID0gdGhpcy50aXRsZUNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHRoaXMudGl0bGVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCh0aGlzLnQoJ25vVGl0bGUnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgcm93cyA9IHRoaXMucXVlc3Rpb25zKCk7XG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnbm9RdWVzdGlvbnMnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChyb3dzLnNvbWUociA9PiAhci5sYWJlbC50cmltKCkpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdlbXB0eVF1ZXN0aW9uTGFiZWwnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEVsIGVkaXRvciB5YSBsbyB2YWxpZGEgYWwgY2VycmFyIGNhZGEgcHJlZ3VudGEsIHBlcm8gdW5hIHByZWd1bnRhIGFiaWVydGFcbiAgICAvLyAobyBjYXJnYWRhIGRlIHVuYSBlbmN1ZXN0YSB2aWVqYSkgcHVlZGUgbGxlZ2FyIGFjw6Egc2luIG9wY2lvbmVzLlxuICAgIGlmIChyb3dzLnNvbWUociA9PiBGSUVMRF9UWVBFU19XSVRIX09QVElPTlMuaW5jbHVkZXMoci50eXBlKSAmJiAhci5vcHRpb25zPy5sZW5ndGgpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdtaXNzaW5nT3B0aW9ucycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNhdmluZy5zZXQodHJ1ZSk7XG5cbiAgICBjb25zdCBmaWVsZFNjaGVtYTogRmllbGRTY2hlbWFEZWZbXSA9IFtdO1xuICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKHJvdy5uYW1lIHx8IHJvdy5sYWJlbCwgZmllbGRTY2hlbWEpO1xuICAgICAgZmllbGRTY2hlbWEucHVzaChcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jcmVhdGVGaWVsZFNjaGVtYShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbGFiZWw6IHJvdy5sYWJlbC50cmltKCksXG4gICAgICAgICAgICB0eXBlOiByb3cudHlwZSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiByb3cucmVxdWlyZWQsXG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQ6IHJvdy5wbGFjZWhvbGRlclRleHQsXG4gICAgICAgICAgICBoaW50VGV4dDogcm93LmhpbnRUZXh0LFxuICAgICAgICAgICAgb3B0aW9uczogcm93Lm9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZUlkID1cbiAgICAgIHRoaXMucHJvcHMudHlwZUlkID8/IGAke3RoaXMucHJvcHMudHlwZVByZWZpeCA/PyBERUZBVUxUX1RZUEVfUFJFRklYfToke3RoaXMuZm9ybUJ1aWxkZXIudG9Ub2tlbih0aXRsZSl9YDtcbiAgICBjb25zdCBzdWJ0aXRsZSA9IHRoaXMuc3VidGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBsYWJlbDogdGl0bGUsXG4gICAgICBzdWJ0aXRsZSxcbiAgICAgIGVudGl0eVJlZjogdGhpcy5wcm9wcy5lbnRpdHlSZWYsXG4gICAgICBza2lwUmV2aWV3OiB0cnVlLFxuICAgICAgZmllbGRTY2hlbWEsXG4gICAgICBhbGxvd0Fub255bW91czogdGhpcy5wcm9wcy5hbGxvd0Fub255bW91cyA/PyB0cnVlLFxuICAgICAgdmlzaWJpbGl0eTogdGhpcy5wcm9wcy52aXNpYmlsaXR5ID8/ICgnUFVCTElDJyBhcyBjb25zdCksXG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGwkID0gdGhpcy5wcm9wcy50eXBlSWRcbiAgICAgID8gdGhpcy5yZXF1ZXN0cy51cGRhdGVSZXF1ZXN0VHlwZSh0aGlzLnByb3BzLnR5cGVJZCwgcGF5bG9hZClcbiAgICAgIDogdGhpcy5yZXF1ZXN0cy5jcmVhdGVSZXF1ZXN0VHlwZSh7IC4uLnBheWxvYWQsIHR5cGVJZCB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB0eXBlQ29uZmlnID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oY2FsbCQpO1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2F2ZWQuZW1pdCh7IHR5cGVDb25maWcgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLnNhdmluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5zYXZlJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdzYXZlRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJvd0Zyb21GaWVsZChmOiBGaWVsZFNjaGVtYURlZik6IEVkaXRhYmxlRmllbGREZWYge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYHJvdy0ke3Jvd1VpZCsrfWAsXG4gICAgICBuYW1lOiBmLm5hbWUsXG4gICAgICBsYWJlbDogZi5sYWJlbCA/PyAnJyxcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogZi5wbGFjZWhvbGRlclRleHQgPz8gJycsXG4gICAgICBoaW50VGV4dDogZi5oaW50VGV4dCA/PyAnJyxcbiAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgIHJlcXVpcmVkOiAhIWYucmVxdWlyZWQsXG4gICAgICBvcHRpb25zOiBmLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxufVxuIl19