valtech-components 4.0.1002 → 4.0.1004

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.
@@ -62,9 +62,16 @@ export class SurveyBuilderComponent {
62
62
  this.successImageControl = new FormControl('', { nonNullable: true });
63
63
  this.questions = signal([]);
64
64
  this.editingId = signal('');
65
+ this.wizardStep = signal(0);
65
66
  this.validationError = signal('');
66
67
  this.saving = signal(false);
67
68
  this.uploadingImage = signal('');
69
+ this.wizardSteps = [
70
+ { id: 'start', labelKey: 'stepStart' },
71
+ { id: 'questions', labelKey: 'stepQuestions' },
72
+ { id: 'close', labelKey: 'stepClose' },
73
+ { id: 'review', labelKey: 'stepReview' },
74
+ ];
68
75
  this.allowedImageTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif'];
69
76
  this.maxImageBytes = 10 * 1024 * 1024;
70
77
  if (!this.i18n.hasNamespace(NAMESPACE)) {
@@ -109,6 +116,75 @@ export class SurveyBuilderComponent {
109
116
  questionTypes() {
110
117
  return this.props.questionTypes?.length ? this.props.questionTypes : SURVEY_QUESTION_TYPES;
111
118
  }
119
+ isWizard() {
120
+ return this.props.layout === 'wizard';
121
+ }
122
+ showWizardSection(step) {
123
+ return this.isWizard() && this.wizardStep() === step;
124
+ }
125
+ goToStep(step) {
126
+ if (!this.isWizard())
127
+ return;
128
+ if (step <= this.wizardStep()) {
129
+ this.validationError.set('');
130
+ this.wizardStep.set(step);
131
+ return;
132
+ }
133
+ while (this.wizardStep() < step) {
134
+ if (!this.validateWizardStep(this.wizardStep()))
135
+ return;
136
+ this.wizardStep.update(current => current + 1);
137
+ }
138
+ }
139
+ nextStep() {
140
+ if (!this.validateWizardStep(this.wizardStep()))
141
+ return;
142
+ this.wizardStep.update(step => Math.min(step + 1, this.wizardSteps.length - 1));
143
+ }
144
+ previousStep() {
145
+ this.validationError.set('');
146
+ this.wizardStep.update(step => Math.max(step - 1, 0));
147
+ }
148
+ wizardBackProps() {
149
+ return {
150
+ token: 'survey-builder-wizard-back',
151
+ text: this.t('previous'),
152
+ color: 'dark',
153
+ fill: 'outline',
154
+ shape: 'round',
155
+ size: 'default',
156
+ type: 'button',
157
+ state: ComponentStates.ENABLED,
158
+ };
159
+ }
160
+ wizardNextProps() {
161
+ return {
162
+ token: 'survey-builder-wizard-next',
163
+ text: this.t('next'),
164
+ color: 'dark',
165
+ fill: 'solid',
166
+ shape: 'round',
167
+ size: 'default',
168
+ type: 'button',
169
+ state: ComponentStates.ENABLED,
170
+ };
171
+ }
172
+ saveProps() {
173
+ return {
174
+ token: 'survey-builder-save',
175
+ text: this.t('save'),
176
+ color: 'dark',
177
+ fill: 'solid',
178
+ shape: 'round',
179
+ size: 'large',
180
+ expand: this.isWizard() ? undefined : 'block',
181
+ type: 'button',
182
+ state: this.saving() ? ComponentStates.WORKING : ComponentStates.ENABLED,
183
+ };
184
+ }
185
+ interpolate(template, values) {
186
+ return Object.entries(values).reduce((text, [key, value]) => text.replaceAll(`{${key}}`, String(value)), template);
187
+ }
112
188
  editorProps(row) {
113
189
  return { mode: 'edit', field: row, allowedTypes: this.questionTypes() };
114
190
  }
@@ -244,27 +320,10 @@ export class SurveyBuilderComponent {
244
320
  if (this.saving())
245
321
  return;
246
322
  this.validationError.set('');
247
- const title = this.titleControl.value.trim();
248
- if (!title) {
249
- this.titleControl.markAsTouched();
250
- this.validationError.set(this.t('noTitle'));
323
+ if (!this.validateWizardStep(0) || !this.validateWizardStep(1))
251
324
  return;
252
- }
325
+ const title = this.titleControl.value.trim();
253
326
  const rows = this.questions();
254
- if (!rows.length) {
255
- this.validationError.set(this.t('noQuestions'));
256
- return;
257
- }
258
- if (rows.some(r => !r.label.trim())) {
259
- this.validationError.set(this.t('emptyQuestionLabel'));
260
- return;
261
- }
262
- // El editor ya lo valida al cerrar cada pregunta, pero una pregunta abierta
263
- // (o cargada de una encuesta vieja) puede llegar acá sin opciones.
264
- if (rows.some(r => FIELD_TYPES_WITH_OPTIONS.includes(r.type) && !r.options?.length)) {
265
- this.validationError.set(this.t('missingOptions'));
266
- return;
267
- }
268
327
  const fieldSchema = [];
269
328
  rows.forEach((row, index) => {
270
329
  const name = this.formBuilder.uniqueFieldName(row.name || row.label, fieldSchema);
@@ -338,6 +397,35 @@ export class SurveyBuilderComponent {
338
397
  };
339
398
  return Object.values(presentation).some(Boolean) ? presentation : undefined;
340
399
  }
400
+ validateWizardStep(step) {
401
+ this.validationError.set('');
402
+ if (step === 0) {
403
+ if (!this.titleControl.value.trim()) {
404
+ this.titleControl.markAsTouched();
405
+ this.validationError.set(this.t('noTitle'));
406
+ return false;
407
+ }
408
+ return true;
409
+ }
410
+ if (step === 1) {
411
+ const rows = this.questions();
412
+ if (!rows.length) {
413
+ this.validationError.set(this.t('noQuestions'));
414
+ return false;
415
+ }
416
+ if (rows.some(r => !r.label.trim())) {
417
+ this.validationError.set(this.t('emptyQuestionLabel'));
418
+ return false;
419
+ }
420
+ // El editor ya lo valida al cerrar cada pregunta, pero una pregunta abierta
421
+ // (o cargada de una encuesta vieja) puede llegar acá sin opciones.
422
+ if (rows.some(r => FIELD_TYPES_WITH_OPTIONS.includes(r.type) && !r.options?.length)) {
423
+ this.validationError.set(this.t('missingOptions'));
424
+ return false;
425
+ }
426
+ }
427
+ return true;
428
+ }
341
429
  rowFromField(f) {
342
430
  return {
343
431
  id: `row-${rowUid++}`,
@@ -353,15 +441,81 @@ export class SurveyBuilderComponent {
353
441
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
354
442
  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", draft: "draft" }, ngImport: i0, template: `
355
443
  <div class="survey-builder">
356
- <val-form-field [label]="t('titleLabel')">
357
- <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
358
- </val-form-field>
359
- <val-form-field [label]="t('subtitleLabel')">
360
- <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
361
- </val-form-field>
444
+ @if (isWizard()) {
445
+ <nav class="survey-builder__steps" aria-label="Survey builder steps">
446
+ @for (step of wizardSteps; track step.id; let i = $index) {
447
+ <button
448
+ type="button"
449
+ class="survey-builder__step"
450
+ [class.survey-builder__step--active]="wizardStep() === i"
451
+ [attr.aria-current]="wizardStep() === i ? 'step' : null"
452
+ (click)="goToStep(i)"
453
+ >
454
+ <span>{{ i + 1 }}</span>
455
+ {{ t(step.labelKey) }}
456
+ </button>
457
+ }
458
+ </nav>
459
+ }
362
460
 
363
- <div class="survey-builder__presentation">
364
- <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
461
+ @if (!isWizard()) {
462
+ <val-form-field [label]="t('titleLabel')">
463
+ <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
464
+ </val-form-field>
465
+ <val-form-field [label]="t('subtitleLabel')">
466
+ <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
467
+ </val-form-field>
468
+ }
469
+
470
+ @if (showWizardSection(0)) {
471
+ <section class="survey-builder__section">
472
+ <val-form-field [label]="t('titleLabel')">
473
+ <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
474
+ </val-form-field>
475
+ <val-form-field [label]="t('subtitleLabel')">
476
+ <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
477
+ </val-form-field>
478
+ <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
479
+ <div class="survey-builder__image-field">
480
+ <val-form-field [label]="t('headerImageLabel')">
481
+ <val-text-input [props]="{ control: headerImageControl, placeholder: t('headerImagePlaceholder') }" />
482
+ </val-form-field>
483
+ @if (headerImageControl.value) {
484
+ <div class="survey-builder__image-preview">
485
+ <img [src]="headerImageControl.value" alt="" />
486
+ <button
487
+ type="button"
488
+ class="survey-builder__image-clear"
489
+ [attr.aria-label]="t('imageRemove')"
490
+ (click)="clearPresentationImage('header')"
491
+ >
492
+ <ion-icon name="trash-outline" aria-hidden="true" />
493
+ </button>
494
+ </div>
495
+ }
496
+ @if (props.presentationImageUpload) {
497
+ <label class="survey-builder__image-upload" [class.survey-builder__image-upload--loading]="uploadingImage() === 'header'">
498
+ @if (uploadingImage() === 'header') {
499
+ <ion-spinner name="crescent" />
500
+ } @else {
501
+ <ion-icon name="cloud-upload-outline" aria-hidden="true" />
502
+ }
503
+ <span>{{ headerImageControl.value ? t('imageChange') : t('imageUpload') }}</span>
504
+ <input
505
+ type="file"
506
+ accept="image/jpeg,image/png,image/webp,image/gif,.jpg,.jpeg,.png,.webp,.gif"
507
+ [disabled]="uploadingImage() === 'header'"
508
+ (change)="onPresentationFileSelected('header', $event)"
509
+ />
510
+ </label>
511
+ }
512
+ </div>
513
+ </section>
514
+ }
515
+
516
+ @if (!isWizard()) {
517
+ <div class="survey-builder__presentation">
518
+ <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
365
519
  <div class="survey-builder__image-field">
366
520
  <val-form-field [label]="t('headerImageLabel')">
367
521
  <val-text-input [props]="{ control: headerImageControl, placeholder: t('headerImagePlaceholder') }" />
@@ -436,8 +590,56 @@ export class SurveyBuilderComponent {
436
590
  </label>
437
591
  }
438
592
  </div>
439
- </div>
593
+ </div>
594
+ }
595
+
596
+ @if (showWizardSection(2)) {
597
+ <section class="survey-builder__section">
598
+ <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
599
+ <val-form-field [label]="t('successTitleLabel')">
600
+ <val-text-input [props]="{ control: successTitleControl, placeholder: t('successTitlePlaceholder') }" />
601
+ </val-form-field>
602
+ <val-form-field [label]="t('successMessageLabel')">
603
+ <val-text-input [props]="{ control: successMessageControl, placeholder: t('successMessagePlaceholder') }" />
604
+ </val-form-field>
605
+ <div class="survey-builder__image-field">
606
+ <val-form-field [label]="t('successImageLabel')">
607
+ <val-text-input [props]="{ control: successImageControl, placeholder: t('successImagePlaceholder') }" />
608
+ </val-form-field>
609
+ @if (successImageControl.value) {
610
+ <div class="survey-builder__image-preview">
611
+ <img [src]="successImageControl.value" alt="" />
612
+ <button
613
+ type="button"
614
+ class="survey-builder__image-clear"
615
+ [attr.aria-label]="t('imageRemove')"
616
+ (click)="clearPresentationImage('success')"
617
+ >
618
+ <ion-icon name="trash-outline" aria-hidden="true" />
619
+ </button>
620
+ </div>
621
+ }
622
+ @if (props.presentationImageUpload) {
623
+ <label class="survey-builder__image-upload" [class.survey-builder__image-upload--loading]="uploadingImage() === 'success'">
624
+ @if (uploadingImage() === 'success') {
625
+ <ion-spinner name="crescent" />
626
+ } @else {
627
+ <ion-icon name="cloud-upload-outline" aria-hidden="true" />
628
+ }
629
+ <span>{{ successImageControl.value ? t('imageChange') : t('imageUpload') }}</span>
630
+ <input
631
+ type="file"
632
+ accept="image/jpeg,image/png,image/webp,image/gif,.jpg,.jpeg,.png,.webp,.gif"
633
+ [disabled]="uploadingImage() === 'success'"
634
+ (change)="onPresentationFileSelected('success', $event)"
635
+ />
636
+ </label>
637
+ }
638
+ </div>
639
+ </section>
640
+ }
440
641
 
642
+ @if (showWizardSection(1)) {
441
643
  <div class="survey-builder__questions">
442
644
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
443
645
 
@@ -517,27 +719,41 @@ export class SurveyBuilderComponent {
517
719
  (onClick)="addQuestion()"
518
720
  />
519
721
  </div>
722
+ }
723
+
724
+ @if (showWizardSection(3)) {
725
+ <section class="survey-builder__review">
726
+ <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
727
+ <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
728
+ <span>{{ subtitleControl.value || t('reviewNoSubtitle') }}</span>
729
+ <span>{{ interpolate(t('reviewQuestionsCount'), { count: questions().length }) }}</span>
730
+ @if (headerImageControl.value) {
731
+ <span>{{ t('reviewHeaderImage') }}</span>
732
+ }
733
+ <span>{{ successImageControl.value ? t('reviewSuccessImage') : t('reviewDefaultClose') }}</span>
734
+ </section>
735
+ }
520
736
 
521
737
  @if (validationError()) {
522
738
  <p class="survey-builder__error">{{ validationError() }}</p>
523
739
  }
524
740
 
525
- <val-button
526
- [props]="{
527
- token: 'survey-builder-save',
528
- text: t('save'),
529
- color: 'dark',
530
- fill: 'solid',
531
- shape: 'round',
532
- size: 'large',
533
- expand: 'block',
534
- type: 'button',
535
- state: saving() ? 'WORKING' : 'ENABLED',
536
- }"
537
- (onClick)="save()"
538
- />
741
+ @if (isWizard()) {
742
+ <div class="survey-builder__wizard-actions">
743
+ @if (wizardStep() > 0) {
744
+ <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
745
+ }
746
+ @if (wizardStep() < wizardSteps.length - 1) {
747
+ <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
748
+ } @else {
749
+ <val-button [props]="saveProps()" (onClick)="save()" />
750
+ }
751
+ </div>
752
+ } @else {
753
+ <val-button [props]="saveProps()" (onClick)="save()" />
754
+ }
539
755
  </div>
540
- `, 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__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-border-color, rgba(0, 0, 0, .16));border-radius:20px;color:var(--ion-color-medium-shade, #6b6675);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { 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"] }] }); }
756
+ `, 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__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{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__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.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: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { 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"] }] }); }
541
757
  }
542
758
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyBuilderComponent, decorators: [{
543
759
  type: Component,
@@ -552,15 +768,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
552
768
  FieldSchemaEditorComponent,
553
769
  ], template: `
554
770
  <div class="survey-builder">
555
- <val-form-field [label]="t('titleLabel')">
556
- <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
557
- </val-form-field>
558
- <val-form-field [label]="t('subtitleLabel')">
559
- <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
560
- </val-form-field>
771
+ @if (isWizard()) {
772
+ <nav class="survey-builder__steps" aria-label="Survey builder steps">
773
+ @for (step of wizardSteps; track step.id; let i = $index) {
774
+ <button
775
+ type="button"
776
+ class="survey-builder__step"
777
+ [class.survey-builder__step--active]="wizardStep() === i"
778
+ [attr.aria-current]="wizardStep() === i ? 'step' : null"
779
+ (click)="goToStep(i)"
780
+ >
781
+ <span>{{ i + 1 }}</span>
782
+ {{ t(step.labelKey) }}
783
+ </button>
784
+ }
785
+ </nav>
786
+ }
787
+
788
+ @if (!isWizard()) {
789
+ <val-form-field [label]="t('titleLabel')">
790
+ <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
791
+ </val-form-field>
792
+ <val-form-field [label]="t('subtitleLabel')">
793
+ <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
794
+ </val-form-field>
795
+ }
561
796
 
562
- <div class="survey-builder__presentation">
563
- <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
797
+ @if (showWizardSection(0)) {
798
+ <section class="survey-builder__section">
799
+ <val-form-field [label]="t('titleLabel')">
800
+ <val-text-input [props]="{ control: titleControl, placeholder: t('titlePlaceholder') }" />
801
+ </val-form-field>
802
+ <val-form-field [label]="t('subtitleLabel')">
803
+ <val-text-input [props]="{ control: subtitleControl, placeholder: t('subtitlePlaceholder') }" />
804
+ </val-form-field>
805
+ <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
806
+ <div class="survey-builder__image-field">
807
+ <val-form-field [label]="t('headerImageLabel')">
808
+ <val-text-input [props]="{ control: headerImageControl, placeholder: t('headerImagePlaceholder') }" />
809
+ </val-form-field>
810
+ @if (headerImageControl.value) {
811
+ <div class="survey-builder__image-preview">
812
+ <img [src]="headerImageControl.value" alt="" />
813
+ <button
814
+ type="button"
815
+ class="survey-builder__image-clear"
816
+ [attr.aria-label]="t('imageRemove')"
817
+ (click)="clearPresentationImage('header')"
818
+ >
819
+ <ion-icon name="trash-outline" aria-hidden="true" />
820
+ </button>
821
+ </div>
822
+ }
823
+ @if (props.presentationImageUpload) {
824
+ <label class="survey-builder__image-upload" [class.survey-builder__image-upload--loading]="uploadingImage() === 'header'">
825
+ @if (uploadingImage() === 'header') {
826
+ <ion-spinner name="crescent" />
827
+ } @else {
828
+ <ion-icon name="cloud-upload-outline" aria-hidden="true" />
829
+ }
830
+ <span>{{ headerImageControl.value ? t('imageChange') : t('imageUpload') }}</span>
831
+ <input
832
+ type="file"
833
+ accept="image/jpeg,image/png,image/webp,image/gif,.jpg,.jpeg,.png,.webp,.gif"
834
+ [disabled]="uploadingImage() === 'header'"
835
+ (change)="onPresentationFileSelected('header', $event)"
836
+ />
837
+ </label>
838
+ }
839
+ </div>
840
+ </section>
841
+ }
842
+
843
+ @if (!isWizard()) {
844
+ <div class="survey-builder__presentation">
845
+ <span class="survey-builder__questions-label">{{ t('presentationLabel') }}</span>
564
846
  <div class="survey-builder__image-field">
565
847
  <val-form-field [label]="t('headerImageLabel')">
566
848
  <val-text-input [props]="{ control: headerImageControl, placeholder: t('headerImagePlaceholder') }" />
@@ -635,8 +917,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
635
917
  </label>
636
918
  }
637
919
  </div>
638
- </div>
920
+ </div>
921
+ }
922
+
923
+ @if (showWizardSection(2)) {
924
+ <section class="survey-builder__section">
925
+ <span class="survey-builder__questions-label">{{ t('stepClose') }}</span>
926
+ <val-form-field [label]="t('successTitleLabel')">
927
+ <val-text-input [props]="{ control: successTitleControl, placeholder: t('successTitlePlaceholder') }" />
928
+ </val-form-field>
929
+ <val-form-field [label]="t('successMessageLabel')">
930
+ <val-text-input [props]="{ control: successMessageControl, placeholder: t('successMessagePlaceholder') }" />
931
+ </val-form-field>
932
+ <div class="survey-builder__image-field">
933
+ <val-form-field [label]="t('successImageLabel')">
934
+ <val-text-input [props]="{ control: successImageControl, placeholder: t('successImagePlaceholder') }" />
935
+ </val-form-field>
936
+ @if (successImageControl.value) {
937
+ <div class="survey-builder__image-preview">
938
+ <img [src]="successImageControl.value" alt="" />
939
+ <button
940
+ type="button"
941
+ class="survey-builder__image-clear"
942
+ [attr.aria-label]="t('imageRemove')"
943
+ (click)="clearPresentationImage('success')"
944
+ >
945
+ <ion-icon name="trash-outline" aria-hidden="true" />
946
+ </button>
947
+ </div>
948
+ }
949
+ @if (props.presentationImageUpload) {
950
+ <label class="survey-builder__image-upload" [class.survey-builder__image-upload--loading]="uploadingImage() === 'success'">
951
+ @if (uploadingImage() === 'success') {
952
+ <ion-spinner name="crescent" />
953
+ } @else {
954
+ <ion-icon name="cloud-upload-outline" aria-hidden="true" />
955
+ }
956
+ <span>{{ successImageControl.value ? t('imageChange') : t('imageUpload') }}</span>
957
+ <input
958
+ type="file"
959
+ accept="image/jpeg,image/png,image/webp,image/gif,.jpg,.jpeg,.png,.webp,.gif"
960
+ [disabled]="uploadingImage() === 'success'"
961
+ (change)="onPresentationFileSelected('success', $event)"
962
+ />
963
+ </label>
964
+ }
965
+ </div>
966
+ </section>
967
+ }
639
968
 
969
+ @if (showWizardSection(1)) {
640
970
  <div class="survey-builder__questions">
641
971
  <span class="survey-builder__questions-label">{{ t('questionsLabel') }}</span>
642
972
 
@@ -716,27 +1046,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
716
1046
  (onClick)="addQuestion()"
717
1047
  />
718
1048
  </div>
1049
+ }
1050
+
1051
+ @if (showWizardSection(3)) {
1052
+ <section class="survey-builder__review">
1053
+ <span class="survey-builder__questions-label">{{ t('reviewTitle') }}</span>
1054
+ <strong>{{ titleControl.value || t('untitledQuestion') }}</strong>
1055
+ <span>{{ subtitleControl.value || t('reviewNoSubtitle') }}</span>
1056
+ <span>{{ interpolate(t('reviewQuestionsCount'), { count: questions().length }) }}</span>
1057
+ @if (headerImageControl.value) {
1058
+ <span>{{ t('reviewHeaderImage') }}</span>
1059
+ }
1060
+ <span>{{ successImageControl.value ? t('reviewSuccessImage') : t('reviewDefaultClose') }}</span>
1061
+ </section>
1062
+ }
719
1063
 
720
1064
  @if (validationError()) {
721
1065
  <p class="survey-builder__error">{{ validationError() }}</p>
722
1066
  }
723
1067
 
724
- <val-button
725
- [props]="{
726
- token: 'survey-builder-save',
727
- text: t('save'),
728
- color: 'dark',
729
- fill: 'solid',
730
- shape: 'round',
731
- size: 'large',
732
- expand: 'block',
733
- type: 'button',
734
- state: saving() ? 'WORKING' : 'ENABLED',
735
- }"
736
- (onClick)="save()"
737
- />
1068
+ @if (isWizard()) {
1069
+ <div class="survey-builder__wizard-actions">
1070
+ @if (wizardStep() > 0) {
1071
+ <val-button [props]="wizardBackProps()" (onClick)="previousStep()" />
1072
+ }
1073
+ @if (wizardStep() < wizardSteps.length - 1) {
1074
+ <val-button [props]="wizardNextProps()" (onClick)="nextStep()" />
1075
+ } @else {
1076
+ <val-button [props]="saveProps()" (onClick)="save()" />
1077
+ }
1078
+ </div>
1079
+ } @else {
1080
+ <val-button [props]="saveProps()" (onClick)="save()" />
1081
+ }
738
1082
  </div>
739
- `, 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__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-border-color, rgba(0, 0, 0, .16));border-radius:20px;color:var(--ion-color-medium-shade, #6b6675);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.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"] }]
1083
+ `, 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__presentation{display:flex;flex-direction:column;gap:12px;padding-top:4px}.survey-builder__section,.survey-builder__review{display:flex;flex-direction:column;gap:12px}.survey-builder__steps{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin-bottom:12px}.survey-builder__step{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .12));border-radius:8px;background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium-shade, #6b6675);font-size:.8125rem;font-weight:700;cursor:pointer}.survey-builder__step span{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:999px;background:var(--ion-color-light, #f4f5f8);color:inherit;font-size:.75rem}.survey-builder__step--active{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__wizard-actions{display:flex;justify-content:flex-end;gap:8px}.survey-builder__review{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__review strong{color:var(--ion-text-color, #000)}.survey-builder__review span:not(.survey-builder__questions-label){color:var(--ion-color-medium, #92949c);font-size:.875rem}.survey-builder__image-field{display:flex;flex-direction:column;gap:10px}.survey-builder__image-preview{position:relative;width:100%}.survey-builder__image-preview img{display:block;width:100%;aspect-ratio:16 / 9;object-fit:contain;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;background:var(--ion-color-light, #f4f5f8)}.survey-builder__image-clear{position:absolute;top:8px;right:8px;display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;border:0;border-radius:999px;background:#0009;color:#fff;cursor:pointer}.survey-builder__image-upload{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:10px 18px;border:2px dashed var(--ion-color-dark, #2f2c3a);border-radius:20px;color:var(--ion-color-dark, #2f2c3a);font-size:.875rem;font-weight:600;cursor:pointer}.survey-builder__image-upload:hover{border-color:var(--ion-color-primary);color:var(--ion-color-primary)}.survey-builder__image-upload--loading{opacity:.7;cursor:default}.survey-builder__image-upload ion-spinner{width:16px;height:16px}.survey-builder__image-upload input{display:none}.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"] }]
740
1084
  }], ctorParameters: () => [], propDecorators: { props: [{
741
1085
  type: Input
742
1086
  }], saved: [{
@@ -744,4 +1088,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
744
1088
  }], draft: [{
745
1089
  type: Output
746
1090
  }] } });
747
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFFcEcsT0FBTyxFQUFrQixlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFB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Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBMVCx1dEZBbk1DLFlBQVksOEJBQ1osbUJBQW1CLCtCQUNuQixPQUFPLDJKQUNQLFVBQVUseUdBQ1Ysa0JBQWtCLHdGQUNsQixlQUFlLDBHQUNmLGtCQUFrQiw4RUFDbEIsMEJBQTBCOzs0RkEwVmpCLHNCQUFzQjtrQkFyV2xDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsT0FBTzt3QkFDUCxVQUFVO3dCQUNWLGtCQUFrQjt3QkFDbEIsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLDBCQUEwQjtxQkFDM0IsWUFDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMExUO3dEQStKUSxLQUFLO3NCQUFiLEtBQUs7Z0JBQ2EsS0FBSztzQkFBdkIsTUFBTTtnQkFPWSxLQUFLO3NCQUF2QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbkljb24sIElvblNwaW5uZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2xvdWRVcGxvYWRPdXRsaW5lLCB0cmFzaE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEZvcm1CdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3JlcXVlc3QtZm9ybS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYsIFJlcXVlc3RUeXBlUHJlc2VudGF0aW9uIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvdHlwZXMnO1xuaW1wb3J0IHsgQnV0dG9uTWV0YWRhdGEsIENvbXBvbmVudFN0YXRlcyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB0eXBlIHsgQ29sb3IgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBWYWx0ZWNoRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL3ZhbHRlY2gtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBUZXh0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdGV4dC1pbnB1dC90ZXh0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBGSUVMRF9UWVBFU19XSVRIX09QVElPTlMsXG4gIEZpZWxkU2NoZW1hRWRpdG9yQ29tcG9uZW50LFxufSBmcm9tICcuLi9maWVsZC1zY2hlbWEtZWRpdG9yL2ZpZWxkLXNjaGVtYS1lZGl0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IEZJRUxEX1NDSEVNQV9FRElUT1JfSTE4TiB9IGZyb20gJy4uL2ZpZWxkLXNjaGVtYS1lZGl0b3IvZmllbGQtc2NoZW1hLWVkaXRvci5pMThuJztcbmltcG9ydCB7IEVkaXRhYmxlRmllbGREZWYsIEZpZWxkU2NoZW1hRWRpdG9yTWV0YWRhdGEgfSBmcm9tICcuLi9maWVsZC1zY2hlbWEtZWRpdG9yL3R5cGVzJztcbmltcG9ydCB7XG4gIFN1cnZleUJ1aWxkZXJNZXRhZGF0YSxcbiAgU3VydmV5QnVpbGRlclNhdmVFdmVudCxcbiAgU3VydmV5RHJhZnRFdmVudCxcbiAgU1VSVkVZX1FVRVNUSU9OX1RZUEVTLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNVUlZFWV9CVUlMREVSX0kxOE4gfSBmcm9tICcuL3N1cnZleS1idWlsZGVyLmkxOG4nO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnU3VydmV5QnVpbGRlcic7XG5jb25zdCBFRElUT1JfTkFNRVNQQUNFID0gJ0ZpZWxkU2NoZW1hRWRpdG9yJztcbmNvbnN0IERFRkFVTFRfVFlQRV9QUkVGSVggPSAnc3VydmV5JztcblxubGV0IHJvd1VpZCA9IDA7XG5cbi8qKlxuICogdmFsLXN1cnZleS1idWlsZGVyXG4gKlxuICogQXV0b3LDrWEgZGUgdW5hIGVuY3Vlc3RhOiB0w610dWxvLCBzdWJ0w610dWxvLCBwcmVndW50YXMg4oCUIGFybWEgbyBhY3R1YWxpemEgdW5cbiAqIGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcIjxwcmVmaXg+OjxzbHVnPlwiYCAoQURSLTA5MiksIGBza2lwUmV2aWV3OlxuICogdHJ1ZWAgKGNhZGEgcmVzcHVlc3RhIHNlIGFncmVnYSwgbm8gc2UgcmV2aXNhIHVuYSBwb3IgdW5hKSB5IGVsIGBFbnRpdHlSZWZgXG4gKiBxdWUgbGUgcGFzYSBlbCBjb25zdW1lciAoZWouIGVsIGV2ZW50byBkZSBiaW5nbyBkdWXDsW8gZGUgbGEgZW5jdWVzdGEpLlxuICpcbiAqIENhZGEgcHJlZ3VudGEgc2UgZWRpdGEgY29uIGB2YWwtZmllbGQtc2NoZW1hLWVkaXRvcmAsIGVsIG1pc21vIGVkaXRvciBxdWUgdXNhXG4gKiBlbCBjaGVja291dCBkZSBiaW5nbyDigJQgZGUgYWjDrSBxdWUgdW5hIHByZWd1bnRhIHRlbmdhIHRpcG8sIHBsYWNlaG9sZGVyLCBub3RhXG4gKiB5IG9wY2lvbmVzLCBubyBzb2xvIHRleHRvLiBMYSB2MSBkZSBlc3RlIGNvbXBvbmVudGUgdGVuw61hIHN1IHByb3BpbyBlZGl0b3JcbiAqIHBvYnJlIChkb3MgdGlwb3MsIHNpbiBvcGNpb25lcyk7IGxhIEZhc2UgNSBkZWwgQURSLTA5MiBsbyByZWVtcGxhesOzIHBvciBlbFxuICogb3JnYW5pc20gY29tcGFydGlkbyBlbiB2ZXogZGUgbWVqb3JhcmxvIHBvciBkdXBsaWNhZG8uXG4gKlxuICogRWwgY2F0w6Fsb2dvIHF1ZSBvZnJlY2Ugc2FsZSBkZSBgU1VSVkVZX1FVRVNUSU9OX1RZUEVTYCDigJQgYWNvdGFkbyBhIGxvIHF1ZVxuICogYHZhbC1zdXJ2ZXktcmVzcG9uc2VgIHNhYmUgcmVuZGVyaXphciwgbm8gYSBsbyBxdWUgZWwgZWRpdG9yIHNhYmUgZWRpdGFyLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc3VydmV5LWJ1aWxkZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgSW9uSWNvbixcbiAgICBJb25TcGlubmVyLFxuICAgIFRleHRJbnB1dENvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgRm9ybUZpZWxkQ29tcG9uZW50LFxuICAgIEZpZWxkU2NoZW1hRWRpdG9yQ29tcG9uZW50LFxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlclwiPlxuICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJ0KCd0aXRsZUxhYmVsJylcIj5cbiAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHRpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3RpdGxlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3N1YnRpdGxlTGFiZWwnKVwiPlxuICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VidGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnc3VidGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgPC92YWwtZm9ybS1maWVsZD5cblxuICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19wcmVzZW50YXRpb25cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsXCI+e3sgdCgncHJlc2VudGF0aW9uTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19pbWFnZS1maWVsZFwiPlxuICAgICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnaGVhZGVySW1hZ2VMYWJlbCcpXCI+XG4gICAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogaGVhZGVySW1hZ2VDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnaGVhZGVySW1hZ2VQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgICAgQGlmIChoZWFkZXJJbWFnZUNvbnRyb2wudmFsdWUpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtcHJldmlld1wiPlxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaGVhZGVySW1hZ2VDb250cm9sLnZhbHVlXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLWNsZWFyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2ltYWdlUmVtb3ZlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclByZXNlbnRhdGlvbkltYWdlKCdoZWFkZXInKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHByb3BzLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkXCIgW2NsYXNzLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQtLWxvYWRpbmddPVwidXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ2hlYWRlcidcIj5cbiAgICAgICAgICAgICAgQGlmICh1cGxvYWRpbmdJbWFnZSgpID09PSAnaGVhZGVyJykge1xuICAgICAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIiAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLXVwbG9hZC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3Bhbj57eyBoZWFkZXJJbWFnZUNvbnRyb2wudmFsdWUgPyB0KCdpbWFnZUNoYW5nZScpIDogdCgnaW1hZ2VVcGxvYWQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlL2pwZWcsaW1hZ2UvcG5nLGltYWdlL3dlYnAsaW1hZ2UvZ2lmLC5qcGcsLmpwZWcsLnBuZywud2VicCwuZ2lmXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ2hlYWRlcidcIlxuICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25QcmVzZW50YXRpb25GaWxlU2VsZWN0ZWQoJ2hlYWRlcicsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3N1Y2Nlc3NUaXRsZUxhYmVsJylcIj5cbiAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VjY2Vzc1RpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1Y2Nlc3NUaXRsZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VjY2Vzc01lc3NhZ2VMYWJlbCcpXCI+XG4gICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1Y2Nlc3NNZXNzYWdlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1Y2Nlc3NNZXNzYWdlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19pbWFnZS1maWVsZFwiPlxuICAgICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VjY2Vzc0ltYWdlTGFiZWwnKVwiPlxuICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1Y2Nlc3NJbWFnZUNvbnRyb2wsIHBsYWNlaG9sZGVyOiB0KCdzdWNjZXNzSW1hZ2VQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgICAgQGlmIChzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInN1Y2Nlc3NJbWFnZUNvbnRyb2wudmFsdWVcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtY2xlYXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnaW1hZ2VSZW1vdmUnKVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyUHJlc2VudGF0aW9uSW1hZ2UoJ3N1Y2Nlc3MnKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHByb3BzLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkXCIgW2NsYXNzLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQtLWxvYWRpbmddPVwidXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ3N1Y2Nlc3MnXCI+XG4gICAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgPGlvbi1zcGlubmVyIG5hbWU9XCJjcmVzY2VudFwiIC8+XG4gICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvdWQtdXBsb2FkLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDxzcGFuPnt7IHN1Y2Nlc3NJbWFnZUNvbnRyb2wudmFsdWUgPyB0KCdpbWFnZUNoYW5nZScpIDogdCgnaW1hZ2VVcGxvYWQnKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgIGFjY2VwdD1cImltYWdlL2pwZWcsaW1hZ2UvcG5nLGltYWdlL3dlYnAsaW1hZ2UvZ2lmLC5qcGcsLmpwZWcsLnBuZywud2VicCwuZ2lmXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ3N1Y2Nlc3MnXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUHJlc2VudGF0aW9uRmlsZVNlbGVjdGVkKCdzdWNjZXNzJywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19xdWVzdGlvbnNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsXCI+e3sgdCgncXVlc3Rpb25zTGFiZWwnKSB9fTwvc3Bhbj5cblxuICAgICAgICBAaWYgKCFxdWVzdGlvbnMoKS5sZW5ndGgpIHtcbiAgICAgICAgICA8cCBjbGFzcz1cInN1cnZleS1idWlsZGVyX19lbXB0eVwiPnt7IHQoJ25vUXVlc3Rpb25zJykgfX08L3A+XG4gICAgICAgIH1cblxuICAgICAgICBAZm9yIChyb3cgb2YgcXVlc3Rpb25zKCk7IHRyYWNrIHJvdy5pZDsgbGV0IGkgPSAkaW5kZXg7IGxldCBmaXJzdCA9ICRmaXJzdDsgbGV0IGxhc3QgPSAkbGFzdCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvdy1oZWFkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93LXRleHRcIj5cbiAgICAgICAgICAgICAgICA8c3Ryb25nPnt7IHJvdy5sYWJlbCB8fCB0KCd1bnRpdGxlZFF1ZXN0aW9uJykgfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyB0eXBlTGFiZWwocm93LnR5cGUpIH19e3sgcm93LnJlcXVpcmVkID8gJyDCtyAnICsgdCgncmVxdWlyZWRUYWcnKSA6ICcnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiaWNvbkFjdGlvbigncS11cC0nICsgcm93LmlkLCAnYXJyb3ctdXAtb3V0bGluZScsIHQoJ21vdmVVcCcpLCBmaXJzdClcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwibW92ZShpLCAtMSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLWRvd24tJyArIHJvdy5pZCwgJ2Fycm93LWRvd24tb3V0bGluZScsIHQoJ21vdmVEb3duJyksIGxhc3QpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm1vdmUoaSwgMSlcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLWNvcHktJyArIHJvdy5pZCwgJ2NvcHktb3V0bGluZScsIHQoJ2R1cGxpY2F0ZVF1ZXN0aW9uJykpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImR1cGxpY2F0ZShyb3cpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiaWNvbkFjdGlvbigncS1lZGl0LScgKyByb3cuaWQsICdjcmVhdGUtb3V0bGluZScsIHQoJ2VkaXRRdWVzdGlvbicpKVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJ0b2dnbGVFZGl0KHJvdylcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJpY29uQWN0aW9uKCdxLXJlbW92ZS0nICsgcm93LmlkLCAndHJhc2gtb3V0bGluZScsIHQoJ3JlbW92ZVF1ZXN0aW9uJyksIGZhbHNlLCAnZGFuZ2VyJylcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVtb3ZlUXVlc3Rpb24ocm93KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgQGlmIChlZGl0aW5nSWQoKSA9PT0gcm93LmlkKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93LWVkaXRvclwiPlxuICAgICAgICAgICAgICAgIDx2YWwtZmllbGQtc2NoZW1hLWVkaXRvclxuICAgICAgICAgICAgICAgICAgI2VkaXRvclxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImVkaXRvclByb3BzKHJvdylcIlxuICAgICAgICAgICAgICAgICAgKGNoYW5nZWQpPVwiZHJhZnRRdWVzdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgIChzYXZlKT1cImFwcGx5UXVlc3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgdG9rZW46ICdxLWRvbmUtJyArIHJvdy5pZCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogdCgnZG9uZUVkaXRpbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICAgICAgICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICAgICAgICAgICAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAnRU5BQkxFRCcsXG4gICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cImVkaXRvci5zdWJtaXQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICB0b2tlbjogJ3N1cnZleS1idWlsZGVyLWFkZC1xdWVzdGlvbicsXG4gICAgICAgICAgICB0ZXh0OiB0KCdhZGRRdWVzdGlvbicpLFxuICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgIGZpbGw6ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgc2l6ZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICBzdGF0ZTogJ0VOQUJMRUQnLFxuICAgICAgICAgICAgaWNvbjogeyBuYW1lOiAnYWRkLW91dGxpbmUnLCBzbG90OiAnc3RhcnQnIH0sXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgKG9uQ2xpY2spPVwiYWRkUXVlc3Rpb24oKVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgQGlmICh2YWxpZGF0aW9uRXJyb3IoKSkge1xuICAgICAgICA8cCBjbGFzcz1cInN1cnZleS1idWlsZGVyX19lcnJvclwiPnt7IHZhbGlkYXRpb25FcnJvcigpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICA8dmFsLWJ1dHRvblxuICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgIHRva2VuOiAnc3VydmV5LWJ1aWxkZXItc2F2ZScsXG4gICAgICAgICAgdGV4dDogdCgnc2F2ZScpLFxuICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgZmlsbDogJ3NvbGlkJyxcbiAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICBzaXplOiAnbGFyZ2UnLFxuICAgICAgICAgIGV4cGFuZDogJ2Jsb2NrJyxcbiAgICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgICBzdGF0ZTogc2F2aW5nKCkgPyAnV09SS0lORycgOiAnRU5BQkxFRCcsXG4gICAgICAgIH1cIlxuICAgICAgICAob25DbGljayk9XCJzYXZlKClcIlxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19wcmVzZW50YXRpb24ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmctdG9wOiA0cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLWZpZWxkIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS1wcmV2aWV3IHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtcHJldmlldyBpbWcge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGFzcGVjdC1yYXRpbzogMTYgLyA5O1xuICAgICAgICBvYmplY3QtZml0OiBjb250YWluO1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMSkpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLWNsZWFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDhweDtcbiAgICAgICAgcmlnaHQ6IDhweDtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICB3aWR0aDogMzJweDtcbiAgICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQ0cHg7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMThweDtcbiAgICAgICAgYm9yZGVyOiAycHggZGFzaGVkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xNikpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bS1zaGFkZSwgIzZiNjY3NSk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZC0tbG9hZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDAuNztcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQgaW9uLXNwaW5uZXIge1xuICAgICAgICB3aWR0aDogMTZweDtcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQgaW5wdXQge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19lbXB0eSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXZhbC1yYWRpdXMtbWQsIDEycHgpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1pb24tYmFja2dyb3VuZC1jb2xvciwgI2ZmZikpO1xuICAgICAgfVxuICAgICAgLyogTW9iaWxlLWZpcnN0OiBlbCB0ZXh0byBkZSBsYSBwcmVndW50YSB5IHN1cyBhY2Npb25lcyBhcGlsYWRvcy4gRW4gZmlsYVxuICAgICAgICAgZmlqYSwgY2luY28gYm90b25lcyBsZSBjb21lbiBlbCBhbmNobyBhbCB0ZXh0byB5IGxvIHBhcnRlbiBlbiBtdWNoYXNcbiAgICAgICAgIGzDrW5lYXMgYW5nb3N0YXMg4oCUIGp1c3RvIGVuIGVsIHZpZXdwb3J0IGRvbmRlIG3DoXMgc2UgdXNhLiAqL1xuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctaGVhZCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHN0cm9uZyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvciwgIzAwMCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCBzcGFuIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93LWFjdGlvbnMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctZWRpdG9yIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBwYWRkaW5nLXRvcDogMTJweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2Vycm9yIHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhbmdlcik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICB9XG4gICAgICBAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHtcbiAgICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctaGVhZCB7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIH1cbiAgICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFN1cnZleUJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9wczogU3VydmV5QnVpbGRlck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSByZWFkb25seSBzYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U3VydmV5QnVpbGRlclNhdmVFdmVudD4oKTtcbiAgLyoqXG4gICAqIEVtaXRlIGxvIGVzY3JpdG8sIHlhIHZhbGlkYWRvLCBTSU4gZ3VhcmRhcmxvLiBTb2xvIGNvbiBgcHJvcHMucGVyc2lzdDpcbiAgICogZmFsc2VgIOKAlCB2ZXIgZWwgY29tZW50YXJpbyBkZSBlc2UgY2FtcG86IGN1YW5kbyBsYSBhcHAgdGllbmUgZW5kcG9pbnRcbiAgICogcHJvcGlvLCBndWFyZGFyIGRlc2RlIGFjw6Egc2Ugc2FsdGEgbGEgdmFsaWRhY2nDs24gZGUgbGEgZW50aWRhZCBkdWXDsWEgeSBlbFxuICAgKiBwZXJtaXNvIGRlIGxhIHZlcnRpY2FsLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRyYWZ0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdXJ2ZXlEcmFmdEV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdHMgPSBpbmplY3QoUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcblxuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVySW1hZ2VDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICByZWFkb25seSBzdWNjZXNzVGl0bGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICByZWFkb25seSBzdWNjZXNzTWVzc2FnZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1Y2Nlc3NJbWFnZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHF1ZXN0aW9ucyA9IHNpZ25hbDxFZGl0YWJsZUZpZWxkRGVmW10+KFtdKTtcbiAgcmVhZG9ubHkgZWRpdGluZ0lkID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdXBsb2FkaW5nSW1hZ2UgPSBzaWduYWw8J2hlYWRlcicgfCAnc3VjY2VzcycgfCAnJz4oJycpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYWxsb3dlZEltYWdlVHlwZXMgPSBbJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvcG5nJywgJ2ltYWdlL3dlYnAnLCAnaW1hZ2UvZ2lmJ107XG4gIHByaXZhdGUgcmVhZG9ubHkgbWF4SW1hZ2VCeXRlcyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKE5BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKE5BTUVTUEFDRSwgU1VSVkVZX0JVSUxERVJfSTE4Tik7XG4gICAgfVxuICAgIC8vIEVsIG5vbWJyZSBkZWwgdGlwbyBkZSBjYWRhIHByZWd1bnRhIHNlIG11ZXN0cmEgZW4gbGEgZmlsYSBjb2xhcHNhZGEsIHF1ZVxuICAgIC8vIGRpYnVqYSBlc3RlIGNvbXBvbmVudGUgeSBubyBlbCBlZGl0b3Ig4oCUIHNpIG5hZGllIG1vbnTDsyB1biBlZGl0b3IgdG9kYXbDrWEsXG4gICAgLy8gZWwgbmFtZXNwYWNlIG5vIGV4aXN0aXLDrWEgeSBsYSBmaWxhIG1vc3RyYXLDrWEgbGEgY2xhdmUgY3J1ZGEuXG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKEVESVRPUl9OQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhFRElUT1JfTkFNRVNQQUNFLCBGSUVMRF9TQ0hFTUFfRURJVE9SX0kxOE4pO1xuICAgIH1cbiAgICBhZGRJY29ucyh7IGNsb3VkVXBsb2FkT3V0bGluZSwgdHJhc2hPdXRsaW5lIH0pO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gU2VtYnJhZG8gZGlyZWN0bzogbGEgYXBwIHlhIHRlbsOtYSBsYSBlbmN1ZXN0YSwgbm8gaGFjZSBmYWx0YSBsZWVybGEuXG4gICAgaWYgKHRoaXMucHJvcHMuaW5pdGlhbCkge1xuICAgICAgdGhpcy5oeWRyYXRlKFxuICAgICAgICB0aGlzLnByb3BzLmluaXRpYWwubGFiZWwsXG4gICAgICAgIHRoaXMucHJvcHMuaW5pdGlhbC5zdWJ0aXRsZSxcbiAgICAgICAgdGhpcy5wcm9wcy5pbml0aWFsLnF1ZXN0aW9ucyxcbiAgICAgICAgdGhpcy5wcm9wcy5pbml0aWFsLnByZXNlbnRhdGlvblxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb3BzLnR5cGVJZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFJlcXVlc3RUeXBlKHRoaXMucHJvcHMudHlwZUlkKSk7XG4gICAgICB0aGlzLmh5ZHJhdGUoY2ZnLmxhYmVsLCBjZmcuc3VidGl0bGUgPz8gJycsIGNmZy5maWVsZFNjaGVtYSwgY2ZnLnByZXNlbnRhdGlvbik7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmVycm9ycy5oYW5kbGUoZXJyLCB7XG4gICAgICAgIGNvbnRleHQ6ICdzdXJ2ZXlCdWlsZGVyLmxvYWQnLFxuICAgICAgICBmYWxsYmFja0tleTogJ2xvYWRFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgTkFNRVNQQUNFKTtcbiAgfVxuXG4gIHR5cGVMYWJlbCh0eXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGB0eXBlJHt0eXBlfWAsIEVESVRPUl9OQU1FU1BBQ0UpO1xuICB9XG5cbiAgcXVlc3Rpb25UeXBlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMucXVlc3Rpb25UeXBlcz8ubGVuZ3RoID8gdGhpcy5wcm9wcy5xdWVzdGlvblR5cGVzIDogU1VSVkVZX1FVRVNUSU9OX1RZUEVTO1xuICB9XG5cbiAgZWRpdG9yUHJvcHMocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogRmllbGRTY2hlbWFFZGl0b3JNZXRhZGF0YSB7XG4gICAgcmV0dXJuIHsgbW9kZTogJ2VkaXQnLCBmaWVsZDogcm93LCBhbGxvd2VkVHlwZXM6IHRoaXMucXVlc3Rpb25UeXBlcygpIH07XG4gIH1cblxuICBpY29uQWN0aW9uKFxuICAgIHRva2VuOiBzdHJpbmcsXG4gICAgaWNvbjogc3RyaW5nLFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBjb2xvcjogQ29sb3IgPSAnZGFyaydcbiAgKTogQnV0dG9uTWV0YWRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbixcbiAgICAgIHRleHQ6ICcnLFxuICAgICAgYXJpYUxhYmVsOiBsYWJlbCxcbiAgICAgIGNvbG9yLFxuICAgICAgZmlsbDogJ2NsZWFyJyxcbiAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgc3RhdGU6IGRpc2FibGVkID8gQ29tcG9uZW50U3RhdGVzLkRJU0FCTEVEIDogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICBpY29uOiB7IG5hbWU6IGljb24sIHNsb3Q6ICdpY29uLW9ubHknIH0sXG4gICAgfTtcbiAgfVxuXG4gIGFkZFF1ZXN0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHJvdzogRWRpdGFibGVGaWVsZERlZiA9IHtcbiAgICAgIGlkOiBgcm93LSR7cm93VWlkKyt9YCxcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgcGxhY2Vob2xkZXJUZXh0OiAnJyxcbiAgICAgIGhpbnRUZXh0OiAnJyxcbiAgICAgIHR5cGU6IHRoaXMucXVlc3Rpb25UeXBlcygpWzBdLFxuICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiBbLi4ucm93cywgcm93XSk7XG4gICAgLy8gVW5hIHByZWd1bnRhIHJlY2nDqW4gYWdyZWdhZGEgZXN0w6EgdmFjw61hOiBhYnJpcmxhIGVzIGVsIMO6bmljbyBwYXNvXG4gICAgLy8gc2lndWllbnRlIHBvc2libGUsIHkgZGVqYXJsYSBjZXJyYWRhIGxhIGhhcsOtYSB2ZXIgY29tbyB1bmEgZmlsYSByb3RhLlxuICAgIHRoaXMuZWRpdGluZ0lkLnNldChyb3cuaWQpO1xuICB9XG5cbiAgdG9nZ2xlRWRpdChyb3c6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRpbmdJZC51cGRhdGUoY3VycmVudCA9PiAoY3VycmVudCA9PT0gcm93LmlkID8gJycgOiByb3cuaWQpKTtcbiAgfVxuXG4gIHJlbW92ZVF1ZXN0aW9uKHJvdzogRWRpdGFibGVGaWVsZERlZik6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IHJvd3MuZmlsdGVyKHIgPT4gci5pZCAhPT0gcm93LmlkKSk7XG4gICAgaWYgKHRoaXMuZWRpdGluZ0lkKCkgPT09IHJvdy5pZCkgdGhpcy5lZGl0aW5nSWQuc2V0KCcnKTtcbiAgfVxuXG4gIGR1cGxpY2F0ZShyb3c6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICBjb25zdCBjb3B5OiBFZGl0YWJsZUZpZWxkRGVmID0ge1xuICAgICAgLi4ucm93LFxuICAgICAgaWQ6IGByb3ctJHtyb3dVaWQrK31gLFxuICAgICAgLy8gU2luIHRva2VuIHByb3BpbyBsYSBjb3BpYSBwaXNhcsOtYSBsYXMgcmVzcHVlc3RhcyBkZWwgb3JpZ2luYWw6IGRvc1xuICAgICAgLy8gY2FtcG9zIGNvbiBlbCBtaXNtbyBgbmFtZWAgc29uIGVsIG1pc21vIGNhbXBvIHBhcmEgZWwgYmFja2VuZC5cbiAgICAgIG5hbWU6IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKHJvdy5uYW1lIHx8IHJvdy5sYWJlbCwgdGhpcy5xdWVzdGlvbnMoKSksXG4gICAgICBvcHRpb25zOiByb3cub3B0aW9ucyA/IHJvdy5vcHRpb25zLm1hcChvID0+ICh7IC4uLm8gfSkpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIuaWQgPT09IHJvdy5pZCk7XG4gICAgICByZXR1cm4gWy4uLnJvd3Muc2xpY2UoMCwgaW5kZXggKyAxKSwgY29weSwgLi4ucm93cy5zbGljZShpbmRleCArIDEpXTtcbiAgICB9KTtcbiAgfVxuXG4gIG1vdmUoaW5kZXg6IG51bWJlciwgZGVsdGE6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGluZGV4ICsgZGVsdGE7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4ge1xuICAgICAgaWYgKHRhcmdldCA8IDAgfHwgdGFyZ2V0ID49IHJvd3MubGVuZ3RoKSByZXR1cm4gcm93cztcbiAgICAgIGNvbnN0IG5leHQgPSBbLi4ucm93c107XG4gICAgICBbbmV4dFtpbmRleF0sIG5leHRbdGFyZ2V0XV0gPSBbbmV4dFt0YXJnZXRdLCBuZXh0W2luZGV4XV07XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHdWFyZGEgbG8gcXVlIHNlIGVzdMOhIGVzY3JpYmllbmRvLCBzaW4gY2VycmFyIGVsIGVkaXRvciBuaSB2YWxpZGFyLlxuICAgKlxuICAgKiBTaW4gZXN0bywgbG8gdGlwZWFkbyBzb2xvIGV4aXN0w61hIGRlbnRybyBkZWwgZWRpdG9yIGhhc3RhIHF1ZSBhbGd1aWVuXG4gICAqIHRvY2FiYSBcIkxpc3RvXCI6IGxhIGZpbGEgc2VndcOtYSBkaWNpZW5kbyBcIlByZWd1bnRhIHNpbiB0ZXh0b1wiIHksIHBlb3IsXG4gICAqIFwiR3VhcmRhciBlbmN1ZXN0YVwiIGZhbGxhYmEgY29uIFwidG9kYXMgbGFzIHByZWd1bnRhcyBuZWNlc2l0YW4gdGV4dG9cIiBzb2JyZVxuICAgKiB1bmEgcHJlZ3VudGEgcXVlIGVuIHBhbnRhbGxhIGNsYXJhbWVudGUgdGVuw61hIHRleHRvLiBUb2NhciBcIkxpc3RvXCIgZXJhIHVuXG4gICAqIHBhc28gb2JsaWdhdG9yaW8gcXVlIG5vIHNlIHZlw61hIHBvciBuaW5nw7puIGxhZG8uXG4gICAqL1xuICBkcmFmdFF1ZXN0aW9uKGZpZWxkOiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gcm93cy5tYXAociA9PiAoci5pZCA9PT0gZmllbGQuaWQgPyB7IC4uLnIsIC4uLmZpZWxkIH0gOiByKSkpO1xuICAgIGlmICh0aGlzLnZhbGlkYXRpb25FcnJvcigpKSB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQoJycpO1xuICB9XG5cbiAgYXBwbHlRdWVzdGlvbihmaWVsZDogRWRpdGFibGVGaWVsZERlZik6IHZvaWQge1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+XG4gICAgICByb3dzLm1hcChyID0+XG4gICAgICAgIHIuaWQgPT09IGZpZWxkLmlkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLmZpZWxkLFxuICAgICAgICAgICAgICBuYW1lOiB0aGlzLmZvcm1CdWlsZGVyLnVuaXF1ZUZpZWxkTmFtZShcbiAgICAgICAgICAgICAgICBmaWVsZC5uYW1lIHx8IGZpZWxkLmxhYmVsLFxuICAgICAgICAgICAgICAgIHJvd3MuZmlsdGVyKG8gPT4gby5pZCAhPT0gci5pZClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHJcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuZWRpdGluZ0lkLnNldCgnJyk7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcbiAgfVxuXG4gIGFzeW5jIG9uUHJlc2VudGF0aW9uRmlsZVNlbGVjdGVkKHNsb3Q6ICdoZWFkZXInIHwgJ3N1Y2Nlc3MnLCBldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGZpbGUgPSBpbnB1dC5maWxlcz8uWzBdO1xuICAgIGlucHV0LnZhbHVlID0gJyc7XG4gICAgaWYgKCFmaWxlIHx8ICF0aGlzLnByb3BzLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkIHx8IHRoaXMudXBsb2FkaW5nSW1hZ2UoKSkgcmV0dXJuO1xuXG4gICAgaWYgKGZpbGUudHlwZSAmJiAhdGhpcy5hbGxvd2VkSW1hZ2VUeXBlcy5pbmNsdWRlcyhmaWxlLnR5cGUpKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdpbWFnZVR5cGVFcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGZpbGUuc2l6ZSA+IHRoaXMubWF4SW1hZ2VCeXRlcykge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnaW1hZ2VTaXplRXJyb3InKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQoc2xvdCk7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5wcm9wcy5wcmVzZW50YXRpb25JbWFnZVVwbG9hZChzbG90LCBmaWxlKTtcbiAgICAgIGlmIChzbG90ID09PSAnaGVhZGVyJykge1xuICAgICAgICB0aGlzLmhlYWRlckltYWdlQ29udHJvbC5zZXRWYWx1ZSh1cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdWNjZXNzSW1hZ2VDb250cm9sLnNldFZhbHVlKHVybCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmVycm9ycy5oYW5kbGUoZXJyLCB7XG4gICAgICAgIGNvbnRleHQ6IGBzdXJ2ZXlCdWlsZGVyLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkIHNsb3Q9JHtzbG90fWAsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnaW1hZ2VVcGxvYWRFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnVwbG9hZGluZ0ltYWdlLnNldCgnJyk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJQcmVzZW50YXRpb25JbWFnZShzbG90OiAnaGVhZGVyJyB8ICdzdWNjZXNzJyk6IHZvaWQge1xuICAgIGlmIChzbG90ID09PSAnaGVhZGVyJykge1xuICAgICAgdGhpcy5oZWFkZXJJbWFnZUNvbnRyb2wuc2V0VmFsdWUoJycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN1Y2Nlc3NJbWFnZUNvbnRyb2wuc2V0VmFsdWUoJycpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zYXZpbmcoKSkgcmV0dXJuO1xuICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCgnJyk7XG5cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMudGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIXRpdGxlKSB7XG4gICAgICB0aGlzLnRpdGxlQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdub1RpdGxlJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnF1ZXN0aW9ucygpO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCh0aGlzLnQoJ25vUXVlc3Rpb25zJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocm93cy5zb21lKHIgPT4gIXIubGFiZWwudHJpbSgpKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnZW1wdHlRdWVzdGlvbkxhYmVsJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBFbCBlZGl0b3IgeWEgbG8gdmFsaWRhIGFsIGNlcnJhciBjYWRhIHByZWd1bnRhLCBwZXJvIHVuYSBwcmVndW50YSBhYmllcnRhXG4gICAgLy8gKG8gY2FyZ2FkYSBkZSB1bmEgZW5jdWVzdGEgdmllamEpIHB1ZWRlIGxsZWdhciBhY8OhIHNpbiBvcGNpb25lcy5cbiAgICBpZiAocm93cy5zb21lKHIgPT4gRklFTERfVFlQRVNfV0lUSF9PUFRJT05TLmluY2x1ZGVzKHIudHlwZSkgJiYgIXIub3B0aW9ucz8ubGVuZ3RoKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnbWlzc2luZ09wdGlvbnMnKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZmllbGRTY2hlbWE6IEZpZWxkU2NoZW1hRGVmW10gPSBbXTtcbiAgICByb3dzLmZvckVhY2goKHJvdywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZvcm1CdWlsZGVyLnVuaXF1ZUZpZWxkTmFtZShyb3cubmFtZSB8fCByb3cubGFiZWwsIGZpZWxkU2NoZW1hKTtcbiAgICAgIGZpZWxkU2NoZW1hLnB1c2goXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY3JlYXRlRmllbGRTY2hlbWEoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGxhYmVsOiByb3cubGFiZWwudHJpbSgpLFxuICAgICAgICAgICAgdHlwZTogcm93LnR5cGUsXG4gICAgICAgICAgICByZXF1aXJlZDogcm93LnJlcXVpcmVkLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXJUZXh0OiByb3cucGxhY2Vob2xkZXJUZXh0LFxuICAgICAgICAgICAgaGludFRleHQ6IHJvdy5oaW50VGV4dCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHJvdy5vcHRpb25zLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5kZXhcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHN1YnRpdGxlID0gdGhpcy5zdWJ0aXRsZUNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgIGNvbnN0IHByZXNlbnRhdGlvbiA9IHRoaXMucHJlc2VudGF0aW9uUGF5bG9hZCgpO1xuXG4gICAgLy8gTGEgYXBwIGd1YXJkYTogYWPDoSBzb2xvIHNlIHZhbGlkYSB5IHNlIGVudHJlZ2EgbG8gZXNjcml0by5cbiAgICBpZiAodGhpcy5wcm9wcy5wZXJzaXN0ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5kcmFmdC5lbWl0KHsgbGFiZWw6IHRpdGxlLCBzdWJ0aXRsZSwgcHJlc2VudGF0aW9uLCBxdWVzdGlvbnM6IGZpZWxkU2NoZW1hIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2F2aW5nLnNldCh0cnVlKTtcblxuICAgIC8vIGB0eXBlSWRgIGRlcml2YWRvIGRlbCB0w610dWxvOiBzaXJ2ZSBwYXJhIHVuIHRpcG8gZGUgc29saWNpdHVkIGRlXG4gICAgLy8gcGxhdGFmb3JtYSwgZG9uZGUgZWwgdMOtdHVsbyBFUyBsYSBpZGVudGlkYWQuIFBhcmEgdW5hIGVuY3Vlc3RhIGF0YWRhIGFcbiAgICAvLyB1bmEgZW50aWRhZCBOTyBhbGNhbnphIOKAlCBkb3MgZXZlbnRvcyBjb24gZWwgbWlzbW8gdMOtdHVsbyBjb2xpc2lvbmFyw61hbiBlblxuICAgIC8vIGVsIG1pc21vIHRpcG8geSBjb21wYXJ0aXLDrWFuIHJlc3B1ZXN0YXMuIFBvciBlc28gdW5hIHZlcnRpY2FsIHVzYSBzdVxuICAgIC8vIGVuZHBvaW50IChgcGVyc2lzdDogZmFsc2VgKSB5IGFybWEgZWwgaWQgY29uIGxhIGVudGlkYWQgYWRlbnRyby5cbiAgICBjb25zdCB0eXBlSWQgPVxuICAgICAgdGhpcy5wcm9wcy50eXBlSWQgPz8gYCR7dGhpcy5wcm9wcy50eXBlUHJlZml4ID8/IERFRkFVTFRfVFlQRV9QUkVGSVh9OiR7dGhpcy5mb3JtQnVpbGRlci50b1Rva2VuKHRpdGxlKX1gO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIGxhYmVsOiB0aXRsZSxcbiAgICAgIHN1YnRpdGxlLFxuICAgICAgcHJlc2VudGF0aW9uLFxuICAgICAgZW50aXR5UmVmOiB0aGlzLnByb3BzLmVudGl0eVJlZixcbiAgICAgIHNraXBSZXZpZXc6IHRydWUsXG4gICAgICBza2lwU3VibWl0dGVySWRlbnRpdHk6IHRydWUsXG4gICAgICBmaWVsZFNjaGVtYSxcbiAgICAgIGFsbG93QW5vbnltb3VzOiB0aGlzLnByb3BzLmFsbG93QW5vbnltb3VzID8/IHRydWUsXG4gICAgICB2aXNpYmlsaXR5OiB0aGlzLnByb3BzLnZpc2liaWxpdHkgPz8gKCdQVUJMSUMnIGFzIGNvbnN0KSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2FsbCQgPSB0aGlzLnByb3BzLnR5cGVJZFxuICAgICAgPyB0aGlzLnJlcXVlc3RzLnVwZGF0ZVJlcXVlc3RUeXBlKHRoaXMucHJvcHMudHlwZUlkLCBwYXlsb2FkKVxuICAgICAgOiB0aGlzLnJlcXVlc3RzLmNyZWF0ZVJlcXVlc3RUeXBlKHsgLi4ucGF5bG9hZCwgdHlwZUlkIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHR5cGVDb25maWcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShjYWxsJCk7XG4gICAgICB0aGlzLnNhdmluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5zYXZlZC5lbWl0KHsgdHlwZUNvbmZpZyB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc2F2aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmVycm9ycy5oYW5kbGUoZXJyLCB7XG4gICAgICAgIGNvbnRleHQ6ICdzdXJ2ZXlCdWlsZGVyLnNhdmUnLFxuICAgICAgICBmYWxsYmFja0tleTogJ3NhdmVFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaHlkcmF0ZShcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIHN1YnRpdGxlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25zOiBGaWVsZFNjaGVtYURlZltdLFxuICAgIHByZXNlbnRhdGlvbj86IFJlcXVlc3RUeXBlUHJlc2VudGF0aW9uXG4gICk6IHZvaWQge1xuICAgIHRoaXMudGl0bGVDb250cm9sLnNldFZhbHVlKGxhYmVsID8/ICcnKTtcbiAgICB0aGlzLnN1YnRpdGxlQ29udHJvbC5zZXRWYWx1ZShzdWJ0aXRsZSA/PyAnJyk7XG4gICAgdGhpcy5oZWFkZXJJbWFnZUNvbnRyb2wuc2V0VmFsdWUocHJlc2VudGF0aW9uPy5oZWFkZXJJbWFnZVVybCA/PyAnJyk7XG4gICAgdGhpcy5zdWNjZXNzVGl0bGVDb250cm9sLnNldFZhbHVlKHByZXNlbnRhdGlvbj8uc3VjY2Vzc1RpdGxlID8/ICcnKTtcbiAgICB0aGlzLnN1Y2Nlc3NNZXNzYWdlQ29udHJvbC5zZXRWYWx1ZShwcmVzZW50YXRpb24/LnN1Y2Nlc3NNZXNzYWdlID8/ICcnKTtcbiAgICB0aGlzLnN1Y2Nlc3NJbWFnZUNvbnRyb2wuc2V0VmFsdWUocHJlc2VudGF0aW9uPy5zdWNjZXNzSW1hZ2VVcmwgPz8gJycpO1xuICAgIHRoaXMucXVlc3Rpb25zLnNldChbLi4uKHF1ZXN0aW9ucyA/PyBbXSldLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKS5tYXAoZiA9PiB0aGlzLnJvd0Zyb21GaWVsZChmKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVzZW50YXRpb25QYXlsb2FkKCk6IFJlcXVlc3RUeXBlUHJlc2VudGF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBwcmVzZW50YXRpb24gPSB7XG4gICAgICBoZWFkZXJJbWFnZVVybDogdGhpcy5oZWFkZXJJbWFnZUNvbnRyb2wudmFsdWUudHJpbSgpLFxuICAgICAgc3VjY2Vzc1RpdGxlOiB0aGlzLnN1Y2Nlc3NUaXRsZUNvbnRyb2wudmFsdWUudHJpbSgpLFxuICAgICAgc3VjY2Vzc01lc3NhZ2U6IHRoaXMuc3VjY2Vzc01lc3NhZ2VDb250cm9sLnZhbHVlLnRyaW0oKSxcbiAgICAgIHN1Y2Nlc3NJbWFnZVVybDogdGhpcy5zdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlLnRyaW0oKSxcbiAgICB9O1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHByZXNlbnRhdGlvbikuc29tZShCb29sZWFuKSA/IHByZXNlbnRhdGlvbiA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgcm93RnJvbUZpZWxkKGY6IEZpZWxkU2NoZW1hRGVmKTogRWRpdGFibGVGaWVsZERlZiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBgcm93LSR7cm93VWlkKyt9YCxcbiAgICAgIG5hbWU6IGYubmFtZSxcbiAgICAgIGxhYmVsOiBmLmxhYmVsID8/ICcnLFxuICAgICAgcGxhY2Vob2xkZXJUZXh0OiBmLnBsYWNlaG9sZGVyVGV4dCA/PyAnJyxcbiAgICAgIGhpbnRUZXh0OiBmLmhpbnRUZXh0ID8/ICcnLFxuICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgcmVxdWlyZWQ6ICEhZi5yZXF1aXJlZCxcbiAgICAgIG9wdGlvbnM6IGYub3B0aW9ucyxcbiAgICB9O1xuICB9XG59XG4iXX0=
1091
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LWJ1aWxkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9zdXJ2ZXktYnVpbGRlci9zdXJ2ZXktYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFFcEcsT0FBTyxFQUFrQixlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBUVDt3REEyTlEsS0FBSztzQkFBYixLQUFLO2dCQUNhLEtBQUs7c0JBQXZCLE1BQU07Z0JBT1ksS0FBSztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25JY29uLCBJb25TcGlubmVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNsb3VkVXBsb2FkT3V0bGluZSwgdHJhc2hPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LWZvcm0tYnVpbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZpZWxkU2NoZW1hRGVmLCBSZXF1ZXN0VHlwZVByZXNlbnRhdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3R5cGVzJztcbmltcG9ydCB7IEJ1dHRvbk1ldGFkYXRhLCBDb21wb25lbnRTdGF0ZXMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7IENvbG9yIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgVmFsdGVjaEVycm9yU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy92YWx0ZWNoLWVycm9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGV4dElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RleHQtaW5wdXQvdGV4dC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRm9ybUZpZWxkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2Zvcm0tZmllbGQvZm9ybS1maWVsZC5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgRklFTERfVFlQRVNfV0lUSF9PUFRJT05TLFxuICBGaWVsZFNjaGVtYUVkaXRvckNvbXBvbmVudCxcbn0gZnJvbSAnLi4vZmllbGQtc2NoZW1hLWVkaXRvci9maWVsZC1zY2hlbWEtZWRpdG9yLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGSUVMRF9TQ0hFTUFfRURJVE9SX0kxOE4gfSBmcm9tICcuLi9maWVsZC1zY2hlbWEtZWRpdG9yL2ZpZWxkLXNjaGVtYS1lZGl0b3IuaTE4bic7XG5pbXBvcnQgeyBFZGl0YWJsZUZpZWxkRGVmLCBGaWVsZFNjaGVtYUVkaXRvck1ldGFkYXRhIH0gZnJvbSAnLi4vZmllbGQtc2NoZW1hLWVkaXRvci90eXBlcyc7XG5pbXBvcnQge1xuICBTdXJ2ZXlCdWlsZGVyTWV0YWRhdGEsXG4gIFN1cnZleUJ1aWxkZXJTYXZlRXZlbnQsXG4gIFN1cnZleURyYWZ0RXZlbnQsXG4gIFNVUlZFWV9RVUVTVElPTl9UWVBFUyxcbn0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTVVJWRVlfQlVJTERFUl9JMThOIH0gZnJvbSAnLi9zdXJ2ZXktYnVpbGRlci5pMThuJztcblxuY29uc3QgTkFNRVNQQUNFID0gJ1N1cnZleUJ1aWxkZXInO1xuY29uc3QgRURJVE9SX05BTUVTUEFDRSA9ICdGaWVsZFNjaGVtYUVkaXRvcic7XG5jb25zdCBERUZBVUxUX1RZUEVfUFJFRklYID0gJ3N1cnZleSc7XG5cbmxldCByb3dVaWQgPSAwO1xuXG4vKipcbiAqIHZhbC1zdXJ2ZXktYnVpbGRlclxuICpcbiAqIEF1dG9yw61hIGRlIHVuYSBlbmN1ZXN0YTogdMOtdHVsbywgc3VidMOtdHVsbywgcHJlZ3VudGFzIOKAlCBhcm1hIG8gYWN0dWFsaXphIHVuXG4gKiBgUmVxdWVzdFR5cGVDb25maWdgIGNvbiBgVHlwZTogXCI8cHJlZml4Pjo8c2x1Zz5cImAgKEFEUi0wOTIpLCBgc2tpcFJldmlldzpcbiAqIHRydWVgIChjYWRhIHJlc3B1ZXN0YSBzZSBhZ3JlZ2EsIG5vIHNlIHJldmlzYSB1bmEgcG9yIHVuYSkgeSBlbCBgRW50aXR5UmVmYFxuICogcXVlIGxlIHBhc2EgZWwgY29uc3VtZXIgKGVqLiBlbCBldmVudG8gZGUgYmluZ28gZHVlw7FvIGRlIGxhIGVuY3Vlc3RhKS5cbiAqXG4gKiBDYWRhIHByZWd1bnRhIHNlIGVkaXRhIGNvbiBgdmFsLWZpZWxkLXNjaGVtYS1lZGl0b3JgLCBlbCBtaXNtbyBlZGl0b3IgcXVlIHVzYVxuICogZWwgY2hlY2tvdXQgZGUgYmluZ28g4oCUIGRlIGFow60gcXVlIHVuYSBwcmVndW50YSB0ZW5nYSB0aXBvLCBwbGFjZWhvbGRlciwgbm90YVxuICogeSBvcGNpb25lcywgbm8gc29sbyB0ZXh0by4gTGEgdjEgZGUgZXN0ZSBjb21wb25lbnRlIHRlbsOtYSBzdSBwcm9waW8gZWRpdG9yXG4gKiBwb2JyZSAoZG9zIHRpcG9zLCBzaW4gb3BjaW9uZXMpOyBsYSBGYXNlIDUgZGVsIEFEUi0wOTIgbG8gcmVlbXBsYXrDsyBwb3IgZWxcbiAqIG9yZ2FuaXNtIGNvbXBhcnRpZG8gZW4gdmV6IGRlIG1lam9yYXJsbyBwb3IgZHVwbGljYWRvLlxuICpcbiAqIEVsIGNhdMOhbG9nbyBxdWUgb2ZyZWNlIHNhbGUgZGUgYFNVUlZFWV9RVUVTVElPTl9UWVBFU2Ag4oCUIGFjb3RhZG8gYSBsbyBxdWVcbiAqIGB2YWwtc3VydmV5LXJlc3BvbnNlYCBzYWJlIHJlbmRlcml6YXIsIG5vIGEgbG8gcXVlIGVsIGVkaXRvciBzYWJlIGVkaXRhci5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXN1cnZleS1idWlsZGVyJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIElvbkljb24sXG4gICAgSW9uU3Bpbm5lcixcbiAgICBUZXh0SW5wdXRDb21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50LFxuICAgIEZvcm1GaWVsZENvbXBvbmVudCxcbiAgICBGaWVsZFNjaGVtYUVkaXRvckNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJcIj5cbiAgICAgIEBpZiAoaXNXaXphcmQoKSkge1xuICAgICAgICA8bmF2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3N0ZXBzXCIgYXJpYS1sYWJlbD1cIlN1cnZleSBidWlsZGVyIHN0ZXBzXCI+XG4gICAgICAgICAgQGZvciAoc3RlcCBvZiB3aXphcmRTdGVwczsgdHJhY2sgc3RlcC5pZDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3N0ZXBcIlxuICAgICAgICAgICAgICBbY2xhc3Muc3VydmV5LWJ1aWxkZXJfX3N0ZXAtLWFjdGl2ZV09XCJ3aXphcmRTdGVwKCkgPT09IGlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWN1cnJlbnRdPVwid2l6YXJkU3RlcCgpID09PSBpID8gJ3N0ZXAnIDogbnVsbFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJnb1RvU3RlcChpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuPnt7IGkgKyAxIH19PC9zcGFuPlxuICAgICAgICAgICAgICB7eyB0KHN0ZXAubGFiZWxLZXkpIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbmF2PlxuICAgICAgfVxuXG4gICAgICBAaWYgKCFpc1dpemFyZCgpKSB7XG4gICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgndGl0bGVMYWJlbCcpXCI+XG4gICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHRpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3RpdGxlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJ0KCdzdWJ0aXRsZUxhYmVsJylcIj5cbiAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VidGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnc3VidGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgfVxuXG4gICAgICBAaWYgKHNob3dXaXphcmRTZWN0aW9uKDApKSB7XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3NlY3Rpb25cIj5cbiAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3RpdGxlTGFiZWwnKVwiPlxuICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHRpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3RpdGxlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VidGl0bGVMYWJlbCcpXCI+XG4gICAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VidGl0bGVDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnc3VidGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsXCI+e3sgdCgncHJlc2VudGF0aW9uTGFiZWwnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLWZpZWxkXCI+XG4gICAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ2hlYWRlckltYWdlTGFiZWwnKVwiPlxuICAgICAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogaGVhZGVySW1hZ2VDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnaGVhZGVySW1hZ2VQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIEBpZiAoaGVhZGVySW1hZ2VDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtcHJldmlld1wiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJoZWFkZXJJbWFnZUNvbnRyb2wudmFsdWVcIiBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtY2xlYXJcIlxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdpbWFnZVJlbW92ZScpXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclByZXNlbnRhdGlvbkltYWdlKCdoZWFkZXInKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBAaWYgKHByb3BzLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkKSB7XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWRcIiBbY2xhc3Muc3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZC0tbG9hZGluZ109XCJ1cGxvYWRpbmdJbWFnZSgpID09PSAnaGVhZGVyJ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIiAvPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG91ZC11cGxvYWQtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IGhlYWRlckltYWdlQ29udHJvbC52YWx1ZSA/IHQoJ2ltYWdlQ2hhbmdlJykgOiB0KCdpbWFnZVVwbG9hZCcpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgICAgICAgICAgYWNjZXB0PVwiaW1hZ2UvanBlZyxpbWFnZS9wbmcsaW1hZ2Uvd2VicCxpbWFnZS9naWYsLmpwZywuanBlZywucG5nLC53ZWJwLC5naWZcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdoZWFkZXInXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25QcmVzZW50YXRpb25GaWxlU2VsZWN0ZWQoJ2hlYWRlcicsICRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cblxuICAgICAgQGlmICghaXNXaXphcmQoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3ByZXNlbnRhdGlvblwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucy1sYWJlbFwiPnt7IHQoJ3ByZXNlbnRhdGlvbkxhYmVsJykgfX08L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtZmllbGRcIj5cbiAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ2hlYWRlckltYWdlTGFiZWwnKVwiPlxuICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IGhlYWRlckltYWdlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ2hlYWRlckltYWdlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICAgIEBpZiAoaGVhZGVySW1hZ2VDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLXByZXZpZXdcIj5cbiAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImhlYWRlckltYWdlQ29udHJvbC52YWx1ZVwiIGFsdD1cIlwiIC8+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInN1cnZleS1idWlsZGVyX19pbWFnZS1jbGVhclwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdpbWFnZVJlbW92ZScpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJQcmVzZW50YXRpb25JbWFnZSgnaGVhZGVyJylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChwcm9wcy5wcmVzZW50YXRpb25JbWFnZVVwbG9hZCkge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZFwiIFtjbGFzcy5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkLS1sb2FkaW5nXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdoZWFkZXInXCI+XG4gICAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ2hlYWRlcicpIHtcbiAgICAgICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCIgLz5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG91ZC11cGxvYWQtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPHNwYW4+e3sgaGVhZGVySW1hZ2VDb250cm9sLnZhbHVlID8gdCgnaW1hZ2VDaGFuZ2UnKSA6IHQoJ2ltYWdlVXBsb2FkJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS9qcGVnLGltYWdlL3BuZyxpbWFnZS93ZWJwLGltYWdlL2dpZiwuanBnLC5qcGVnLC5wbmcsLndlYnAsLmdpZlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdoZWFkZXInXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uUHJlc2VudGF0aW9uRmlsZVNlbGVjdGVkKCdoZWFkZXInLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJ0KCdzdWNjZXNzVGl0bGVMYWJlbCcpXCI+XG4gICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1Y2Nlc3NUaXRsZUNvbnRyb2wsIHBsYWNlaG9sZGVyOiB0KCdzdWNjZXNzVGl0bGVQbGFjZWhvbGRlcicpIH1cIiAvPlxuICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3N1Y2Nlc3NNZXNzYWdlTGFiZWwnKVwiPlxuICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiBzdWNjZXNzTWVzc2FnZUNvbnRyb2wsIHBsYWNlaG9sZGVyOiB0KCdzdWNjZXNzTWVzc2FnZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtZmllbGRcIj5cbiAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3N1Y2Nlc3NJbWFnZUxhYmVsJylcIj5cbiAgICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dCBbcHJvcHNdPVwieyBjb250cm9sOiBzdWNjZXNzSW1hZ2VDb250cm9sLCBwbGFjZWhvbGRlcjogdCgnc3VjY2Vzc0ltYWdlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICAgIEBpZiAoc3VjY2Vzc0ltYWdlQ29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19pbWFnZS1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLWNsZWFyXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2ltYWdlUmVtb3ZlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhclByZXNlbnRhdGlvbkltYWdlKCdzdWNjZXNzJylcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgQGlmIChwcm9wcy5wcmVzZW50YXRpb25JbWFnZVVwbG9hZCkge1xuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZFwiIFtjbGFzcy5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkLS1sb2FkaW5nXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgICBAaWYgKHVwbG9hZGluZ0ltYWdlKCkgPT09ICdzdWNjZXNzJykge1xuICAgICAgICAgICAgICAgIDxpb24tc3Bpbm5lciBuYW1lPVwiY3Jlc2NlbnRcIiAvPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3VkLXVwbG9hZC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8c3Bhbj57eyBzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlID8gdCgnaW1hZ2VDaGFuZ2UnKSA6IHQoJ2ltYWdlVXBsb2FkJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS9qcGVnLGltYWdlL3BuZyxpbWFnZS93ZWJwLGltYWdlL2dpZiwuanBnLC5qcGVnLC5wbmcsLndlYnAsLmdpZlwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdzdWNjZXNzJ1wiXG4gICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvblByZXNlbnRhdGlvbkZpbGVTZWxlY3RlZCgnc3VjY2VzcycsICRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChzaG93V2l6YXJkU2VjdGlvbigyKSkge1xuICAgICAgICA8c2VjdGlvbiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19zZWN0aW9uXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsXCI+e3sgdCgnc3RlcENsb3NlJykgfX08L3NwYW4+XG4gICAgICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJ0KCdzdWNjZXNzVGl0bGVMYWJlbCcpXCI+XG4gICAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VjY2Vzc1RpdGxlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1Y2Nlc3NUaXRsZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInQoJ3N1Y2Nlc3NNZXNzYWdlTGFiZWwnKVwiPlxuICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0IFtwcm9wc109XCJ7IGNvbnRyb2w6IHN1Y2Nlc3NNZXNzYWdlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1Y2Nlc3NNZXNzYWdlUGxhY2Vob2xkZXInKSB9XCIgLz5cbiAgICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtZmllbGRcIj5cbiAgICAgICAgICAgIDx2YWwtZm9ybS1maWVsZCBbbGFiZWxdPVwidCgnc3VjY2Vzc0ltYWdlTGFiZWwnKVwiPlxuICAgICAgICAgICAgICA8dmFsLXRleHQtaW5wdXQgW3Byb3BzXT1cInsgY29udHJvbDogc3VjY2Vzc0ltYWdlQ29udHJvbCwgcGxhY2Vob2xkZXI6IHQoJ3N1Y2Nlc3NJbWFnZVBsYWNlaG9sZGVyJykgfVwiIC8+XG4gICAgICAgICAgICA8L3ZhbC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgQGlmIChzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9faW1hZ2UtcHJldmlld1wiPlxuICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlXCIgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnaW1hZ2VSZW1vdmUnKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJQcmVzZW50YXRpb25JbWFnZSgnc3VjY2VzcycpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInRyYXNoLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBpZiAocHJvcHMucHJlc2VudGF0aW9uSW1hZ2VVcGxvYWQpIHtcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZFwiIFtjbGFzcy5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkLS1sb2FkaW5nXT1cInVwbG9hZGluZ0ltYWdlKCkgPT09ICdzdWNjZXNzJ1wiPlxuICAgICAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImNyZXNjZW50XCIgLz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2xvdWQtdXBsb2FkLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyBzdWNjZXNzSW1hZ2VDb250cm9sLnZhbHVlID8gdCgnaW1hZ2VDaGFuZ2UnKSA6IHQoJ2ltYWdlVXBsb2FkJykgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICBhY2NlcHQ9XCJpbWFnZS9qcGVnLGltYWdlL3BuZyxpbWFnZS93ZWJwLGltYWdlL2dpZiwuanBnLC5qcGVnLC5wbmcsLndlYnAsLmdpZlwiXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKSA9PT0gJ3N1Y2Nlc3MnXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25QcmVzZW50YXRpb25GaWxlU2VsZWN0ZWQoJ3N1Y2Nlc3MnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1dpemFyZFNlY3Rpb24oMSkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucy1sYWJlbFwiPnt7IHQoJ3F1ZXN0aW9uc0xhYmVsJykgfX08L3NwYW4+XG5cbiAgICAgICAgQGlmICghcXVlc3Rpb25zKCkubGVuZ3RoKSB7XG4gICAgICAgICAgPHAgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fZW1wdHlcIj57eyB0KCdub1F1ZXN0aW9ucycpIH19PC9wPlxuICAgICAgICB9XG5cbiAgICAgICAgQGZvciAocm93IG9mIHF1ZXN0aW9ucygpOyB0cmFjayByb3cuaWQ7IGxldCBpID0gJGluZGV4OyBsZXQgZmlyc3QgPSAkZmlyc3Q7IGxldCBsYXN0ID0gJGxhc3QpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX19yb3ctaGVhZFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0XCI+XG4gICAgICAgICAgICAgICAgPHN0cm9uZz57eyByb3cubGFiZWwgfHwgdCgndW50aXRsZWRRdWVzdGlvbicpIH19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgdHlwZUxhYmVsKHJvdy50eXBlKSB9fXt7IHJvdy5yZXF1aXJlZCA/ICcgwrcgJyArIHQoJ3JlcXVpcmVkVGFnJykgOiAnJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcm93LWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtdXAtJyArIHJvdy5pZCwgJ2Fycm93LXVwLW91dGxpbmUnLCB0KCdtb3ZlVXAnKSwgZmlyc3QpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm1vdmUoaSwgLTEpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiaWNvbkFjdGlvbigncS1kb3duLScgKyByb3cuaWQsICdhcnJvdy1kb3duLW91dGxpbmUnLCB0KCdtb3ZlRG93bicpLCBsYXN0KVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJtb3ZlKGksIDEpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiaWNvbkFjdGlvbigncS1jb3B5LScgKyByb3cuaWQsICdjb3B5LW91dGxpbmUnLCB0KCdkdXBsaWNhdGVRdWVzdGlvbicpKVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJkdXBsaWNhdGUocm93KVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cImljb25BY3Rpb24oJ3EtZWRpdC0nICsgcm93LmlkLCAnY3JlYXRlLW91dGxpbmUnLCB0KCdlZGl0UXVlc3Rpb24nKSlcIlxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlRWRpdChyb3cpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDx2YWwtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBbcHJvcHNdPVwiaWNvbkFjdGlvbigncS1yZW1vdmUtJyArIHJvdy5pZCwgJ3RyYXNoLW91dGxpbmUnLCB0KCdyZW1vdmVRdWVzdGlvbicpLCBmYWxzZSwgJ2RhbmdlcicpXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInJlbW92ZVF1ZXN0aW9uKHJvdylcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIEBpZiAoZWRpdGluZ0lkKCkgPT09IHJvdy5pZCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LWJ1aWxkZXJfX3Jvdy1lZGl0b3JcIj5cbiAgICAgICAgICAgICAgICA8dmFsLWZpZWxkLXNjaGVtYS1lZGl0b3JcbiAgICAgICAgICAgICAgICAgICNlZGl0b3JcbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJlZGl0b3JQcm9wcyhyb3cpXCJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2VkKT1cImRyYWZ0UXVlc3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAoc2F2ZSk9XCJhcHBseVF1ZXN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICAgIHRva2VuOiAncS1kb25lLScgKyByb3cuaWQsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHQoJ2RvbmVFZGl0aW5nJyksXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICAgICAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogJ0VOQUJMRUQnLFxuICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJlZGl0b3Iuc3VibWl0KClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPHZhbC1idXR0b25cbiAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci1hZGQtcXVlc3Rpb24nLFxuICAgICAgICAgICAgdGV4dDogdCgnYWRkUXVlc3Rpb24nKSxcbiAgICAgICAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICAgICAgICBmaWxsOiAnb3V0bGluZScsXG4gICAgICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgIHR5cGU6ICdidXR0b24nLFxuICAgICAgICAgICAgc3RhdGU6ICdFTkFCTEVEJyxcbiAgICAgICAgICAgIGljb246IHsgbmFtZTogJ2FkZC1vdXRsaW5lJywgc2xvdDogJ3N0YXJ0JyB9LFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvbkNsaWNrKT1cImFkZFF1ZXN0aW9uKClcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAoc2hvd1dpemFyZFNlY3Rpb24oMykpIHtcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcmV2aWV3XCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktYnVpbGRlcl9fcXVlc3Rpb25zLWxhYmVsXCI+e3sgdCgncmV2aWV3VGl0bGUnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8c3Ryb25nPnt7IHRpdGxlQ29udHJvbC52YWx1ZSB8fCB0KCd1bnRpdGxlZFF1ZXN0aW9uJykgfX08L3N0cm9uZz5cbiAgICAgICAgICA8c3Bhbj57eyBzdWJ0aXRsZUNvbnRyb2wudmFsdWUgfHwgdCgncmV2aWV3Tm9TdWJ0aXRsZScpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnt7IGludGVycG9sYXRlKHQoJ3Jldmlld1F1ZXN0aW9uc0NvdW50JyksIHsgY291bnQ6IHF1ZXN0aW9ucygpLmxlbmd0aCB9KSB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKGhlYWRlckltYWdlQ29udHJvbC52YWx1ZSkge1xuICAgICAgICAgICAgPHNwYW4+e3sgdCgncmV2aWV3SGVhZGVySW1hZ2UnKSB9fTwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHNwYW4+e3sgc3VjY2Vzc0ltYWdlQ29udHJvbC52YWx1ZSA/IHQoJ3Jldmlld1N1Y2Nlc3NJbWFnZScpIDogdCgncmV2aWV3RGVmYXVsdENsb3NlJykgfX08L3NwYW4+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIH1cblxuICAgICAgQGlmICh2YWxpZGF0aW9uRXJyb3IoKSkge1xuICAgICAgICA8cCBjbGFzcz1cInN1cnZleS1idWlsZGVyX19lcnJvclwiPnt7IHZhbGlkYXRpb25FcnJvcigpIH19PC9wPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGlzV2l6YXJkKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1idWlsZGVyX193aXphcmQtYWN0aW9uc1wiPlxuICAgICAgICAgIEBpZiAod2l6YXJkU3RlcCgpID4gMCkge1xuICAgICAgICAgICAgPHZhbC1idXR0b24gW3Byb3BzXT1cIndpemFyZEJhY2tQcm9wcygpXCIgKG9uQ2xpY2spPVwicHJldmlvdXNTdGVwKClcIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAaWYgKHdpemFyZFN0ZXAoKSA8IHdpemFyZFN0ZXBzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIDx2YWwtYnV0dG9uIFtwcm9wc109XCJ3aXphcmROZXh0UHJvcHMoKVwiIChvbkNsaWNrKT1cIm5leHRTdGVwKClcIiAvPlxuICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHZhbC1idXR0b24gW3Byb3BzXT1cInNhdmVQcm9wcygpXCIgKG9uQ2xpY2spPVwic2F2ZSgpXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtYnV0dG9uIFtwcm9wc109XCJzYXZlUHJvcHMoKVwiIChvbkNsaWNrKT1cInNhdmUoKVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3F1ZXN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcHJlc2VudGF0aW9uIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBwYWRkaW5nLXRvcDogNHB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19zZWN0aW9uLFxuICAgICAgLnN1cnZleS1idWlsZGVyX19yZXZpZXcge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3N0ZXBzIHtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoNCwgbWlubWF4KDAsIDFmcikpO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fc3RlcCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA2cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQwcHg7XG4gICAgICAgIHBhZGRpbmc6IDhweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEyKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNhcmQtYmFja2dyb3VuZCwgdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IsICNmZmYpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0tc2hhZGUsICM2YjY2NzUpO1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19zdGVwIHNwYW4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQsICNmNGY1ZjgpO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcbiAgICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19zdGVwLS1hY3RpdmUge1xuICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fd2l6YXJkLWFjdGlvbnMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcmV2aWV3IHtcbiAgICAgICAgcGFkZGluZzogMTJweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdmFsLXJhZGl1cy1tZCwgMTJweCk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3JldmlldyBzdHJvbmcge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLXRleHQtY29sb3IsICMwMDApO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yZXZpZXcgc3Bhbjpub3QoLnN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWwpIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS1maWVsZCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTBweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtcHJldmlldyB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLXByZXZpZXcgaW1nIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBhc3BlY3QtcmF0aW86IDE2IC8gOTtcbiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjEpKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQsICNmNGY1ZjgpO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS1jbGVhciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiA4cHg7XG4gICAgICAgIHJpZ2h0OiA4cHg7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDMycHg7XG4gICAgICAgIGhlaWdodDogMzJweDtcbiAgICAgICAgYm9yZGVyOiAwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTlweDtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBtaW4taGVpZ2h0OiA0NHB4O1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDE4cHg7XG4gICAgICAgIGJvcmRlcjogMnB4IGRhc2hlZCB2YXIoLS1pb24tY29sb3ItZGFyaywgIzJmMmMzYSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItZGFyaywgIzJmMmMzYSk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9faW1hZ2UtdXBsb2FkOmhvdmVyIHtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2ltYWdlLXVwbG9hZC0tbG9hZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDAuNztcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQgaW9uLXNwaW5uZXIge1xuICAgICAgICB3aWR0aDogMTZweDtcbiAgICAgICAgaGVpZ2h0OiAxNnB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19pbWFnZS11cGxvYWQgaW5wdXQge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19xdWVzdGlvbnMtbGFiZWwge1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDRlbTtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19lbXB0eSB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3cge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDEycHg7XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXZhbC1yYWRpdXMtbWQsIDEycHgpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCB2YXIoLS1pb24tYmFja2dyb3VuZC1jb2xvciwgI2ZmZikpO1xuICAgICAgfVxuICAgICAgLyogTW9iaWxlLWZpcnN0OiBlbCB0ZXh0byBkZSBsYSBwcmVndW50YSB5IHN1cyBhY2Npb25lcyBhcGlsYWRvcy4gRW4gZmlsYVxuICAgICAgICAgZmlqYSwgY2luY28gYm90b25lcyBsZSBjb21lbiBlbCBhbmNobyBhbCB0ZXh0byB5IGxvIHBhcnRlbiBlbiBtdWNoYXNcbiAgICAgICAgIGzDrW5lYXMgYW5nb3N0YXMg4oCUIGp1c3RvIGVuIGVsIHZpZXdwb3J0IGRvbmRlIG3DoXMgc2UgdXNhLiAqL1xuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctaGVhZCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX3Jvdy10ZXh0IHN0cm9uZyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvciwgIzAwMCk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC45Mzc1cmVtO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCBzcGFuIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktYnVpbGRlcl9fcm93LWFjdGlvbnMge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctZWRpdG9yIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICBwYWRkaW5nLXRvcDogMTJweDtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LWJ1aWxkZXJfX2Vycm9yIHtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhbmdlcik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICB9XG4gICAgICBAbWVkaWEgKG1pbi13aWR0aDogNTc2cHgpIHtcbiAgICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctaGVhZCB7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIH1cbiAgICAgICAgLnN1cnZleS1idWlsZGVyX19yb3ctdGV4dCB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFN1cnZleUJ1aWxkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9wczogU3VydmV5QnVpbGRlck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSByZWFkb25seSBzYXZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8U3VydmV5QnVpbGRlclNhdmVFdmVudD4oKTtcbiAgLyoqXG4gICAqIEVtaXRlIGxvIGVzY3JpdG8sIHlhIHZhbGlkYWRvLCBTSU4gZ3VhcmRhcmxvLiBTb2xvIGNvbiBgcHJvcHMucGVyc2lzdDpcbiAgICogZmFsc2VgIOKAlCB2ZXIgZWwgY29tZW50YXJpbyBkZSBlc2UgY2FtcG86IGN1YW5kbyBsYSBhcHAgdGllbmUgZW5kcG9pbnRcbiAgICogcHJvcGlvLCBndWFyZGFyIGRlc2RlIGFjw6Egc2Ugc2FsdGEgbGEgdmFsaWRhY2nDs24gZGUgbGEgZW50aWRhZCBkdWXDsWEgeSBlbFxuICAgKiBwZXJtaXNvIGRlIGxhIHZlcnRpY2FsLlxuICAgKi9cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGRyYWZ0ID0gbmV3IEV2ZW50RW1pdHRlcjxTdXJ2ZXlEcmFmdEV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaTE4biA9IGluamVjdChJMThuU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVxdWVzdHMgPSBpbmplY3QoUmVxdWVzdFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGZvcm1CdWlsZGVyID0gaW5qZWN0KFJlcXVlc3RGb3JtQnVpbGRlclNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9ycyA9IGluamVjdChWYWx0ZWNoRXJyb3JTZXJ2aWNlKTtcblxuICByZWFkb25seSB0aXRsZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1YnRpdGxlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcmVhZG9ubHkgaGVhZGVySW1hZ2VDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICByZWFkb25seSBzdWNjZXNzVGl0bGVDb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICByZWFkb25seSBzdWNjZXNzTWVzc2FnZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHN1Y2Nlc3NJbWFnZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IHF1ZXN0aW9ucyA9IHNpZ25hbDxFZGl0YWJsZUZpZWxkRGVmW10+KFtdKTtcbiAgcmVhZG9ubHkgZWRpdGluZ0lkID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgd2l6YXJkU3RlcCA9IHNpZ25hbCgwKTtcbiAgcmVhZG9ubHkgdmFsaWRhdGlvbkVycm9yID0gc2lnbmFsKCcnKTtcbiAgcmVhZG9ubHkgc2F2aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgdXBsb2FkaW5nSW1hZ2UgPSBzaWduYWw8J2hlYWRlcicgfCAnc3VjY2VzcycgfCAnJz4oJycpO1xuXG4gIHJlYWRvbmx5IHdpemFyZFN0ZXBzID0gW1xuICAgIHsgaWQ6ICdzdGFydCcsIGxhYmVsS2V5OiAnc3RlcFN0YXJ0JyB9LFxuICAgIHsgaWQ6ICdxdWVzdGlvbnMnLCBsYWJlbEtleTogJ3N0ZXBRdWVzdGlvbnMnIH0sXG4gICAgeyBpZDogJ2Nsb3NlJywgbGFiZWxLZXk6ICdzdGVwQ2xvc2UnIH0sXG4gICAgeyBpZDogJ3JldmlldycsIGxhYmVsS2V5OiAnc3RlcFJldmlldycgfSxcbiAgXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGFsbG93ZWRJbWFnZVR5cGVzID0gWydpbWFnZS9qcGVnJywgJ2ltYWdlL3BuZycsICdpbWFnZS93ZWJwJywgJ2ltYWdlL2dpZiddO1xuICBwcml2YXRlIHJlYWRvbmx5IG1heEltYWdlQnl0ZXMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShOQU1FU1BBQ0UpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cyhOQU1FU1BBQ0UsIFNVUlZFWV9CVUlMREVSX0kxOE4pO1xuICAgIH1cbiAgICAvLyBFbCBub21icmUgZGVsIHRpcG8gZGUgY2FkYSBwcmVndW50YSBzZSBtdWVzdHJhIGVuIGxhIGZpbGEgY29sYXBzYWRhLCBxdWVcbiAgICAvLyBkaWJ1amEgZXN0ZSBjb21wb25lbnRlIHkgbm8gZWwgZWRpdG9yIOKAlCBzaSBuYWRpZSBtb250w7MgdW4gZWRpdG9yIHRvZGF2w61hLFxuICAgIC8vIGVsIG5hbWVzcGFjZSBubyBleGlzdGlyw61hIHkgbGEgZmlsYSBtb3N0cmFyw61hIGxhIGNsYXZlIGNydWRhLlxuICAgIGlmICghdGhpcy5pMThuLmhhc05hbWVzcGFjZShFRElUT1JfTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoRURJVE9SX05BTUVTUEFDRSwgRklFTERfU0NIRU1BX0VESVRPUl9JMThOKTtcbiAgICB9XG4gICAgYWRkSWNvbnMoeyBjbG91ZFVwbG9hZE91dGxpbmUsIHRyYXNoT3V0bGluZSB9KTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFNlbWJyYWRvIGRpcmVjdG86IGxhIGFwcCB5YSB0ZW7DrWEgbGEgZW5jdWVzdGEsIG5vIGhhY2UgZmFsdGEgbGVlcmxhLlxuICAgIGlmICh0aGlzLnByb3BzLmluaXRpYWwpIHtcbiAgICAgIHRoaXMuaHlkcmF0ZShcbiAgICAgICAgdGhpcy5wcm9wcy5pbml0aWFsLmxhYmVsLFxuICAgICAgICB0aGlzLnByb3BzLmluaXRpYWwuc3VidGl0bGUsXG4gICAgICAgIHRoaXMucHJvcHMuaW5pdGlhbC5xdWVzdGlvbnMsXG4gICAgICAgIHRoaXMucHJvcHMuaW5pdGlhbC5wcmVzZW50YXRpb25cbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5wcm9wcy50eXBlSWQpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2ZnID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5yZXF1ZXN0cy5nZXRSZXF1ZXN0VHlwZSh0aGlzLnByb3BzLnR5cGVJZCkpO1xuICAgICAgdGhpcy5oeWRyYXRlKGNmZy5sYWJlbCwgY2ZnLnN1YnRpdGxlID8/ICcnLCBjZmcuZmllbGRTY2hlbWEsIGNmZy5wcmVzZW50YXRpb24pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5lcnJvcnMuaGFuZGxlKGVyciwge1xuICAgICAgICBjb250ZXh0OiAnc3VydmV5QnVpbGRlci5sb2FkJyxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdsb2FkRXJyb3InLFxuICAgICAgICBpMThuTmFtZXNwYWNlOiBOQU1FU1BBQ0UsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cblxuICB0eXBlTGFiZWwodHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB0aGlzLmkxOG4udChgdHlwZSR7dHlwZX1gLCBFRElUT1JfTkFNRVNQQUNFKTtcbiAgfVxuXG4gIHF1ZXN0aW9uVHlwZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnF1ZXN0aW9uVHlwZXM/Lmxlbmd0aCA/IHRoaXMucHJvcHMucXVlc3Rpb25UeXBlcyA6IFNVUlZFWV9RVUVTVElPTl9UWVBFUztcbiAgfVxuXG4gIGlzV2l6YXJkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmxheW91dCA9PT0gJ3dpemFyZCc7XG4gIH1cblxuICBzaG93V2l6YXJkU2VjdGlvbihzdGVwOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1dpemFyZCgpICYmIHRoaXMud2l6YXJkU3RlcCgpID09PSBzdGVwO1xuICB9XG5cbiAgZ29Ub1N0ZXAoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzV2l6YXJkKCkpIHJldHVybjtcbiAgICBpZiAoc3RlcCA8PSB0aGlzLndpemFyZFN0ZXAoKSkge1xuICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcbiAgICAgIHRoaXMud2l6YXJkU3RlcC5zZXQoc3RlcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlICh0aGlzLndpemFyZFN0ZXAoKSA8IHN0ZXApIHtcbiAgICAgIGlmICghdGhpcy52YWxpZGF0ZVdpemFyZFN0ZXAodGhpcy53aXphcmRTdGVwKCkpKSByZXR1cm47XG4gICAgICB0aGlzLndpemFyZFN0ZXAudXBkYXRlKGN1cnJlbnQgPT4gY3VycmVudCArIDEpO1xuICAgIH1cbiAgfVxuXG4gIG5leHRTdGVwKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52YWxpZGF0ZVdpemFyZFN0ZXAodGhpcy53aXphcmRTdGVwKCkpKSByZXR1cm47XG4gICAgdGhpcy53aXphcmRTdGVwLnVwZGF0ZShzdGVwID0+IE1hdGgubWluKHN0ZXAgKyAxLCB0aGlzLndpemFyZFN0ZXBzLmxlbmd0aCAtIDEpKTtcbiAgfVxuXG4gIHByZXZpb3VzU3RlcCgpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQoJycpO1xuICAgIHRoaXMud2l6YXJkU3RlcC51cGRhdGUoc3RlcCA9PiBNYXRoLm1heChzdGVwIC0gMSwgMCkpO1xuICB9XG5cbiAgd2l6YXJkQmFja1Byb3BzKCk6IEJ1dHRvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci13aXphcmQtYmFjaycsXG4gICAgICB0ZXh0OiB0aGlzLnQoJ3ByZXZpb3VzJyksXG4gICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgZmlsbDogJ291dGxpbmUnLFxuICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgd2l6YXJkTmV4dFByb3BzKCk6IEJ1dHRvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci13aXphcmQtbmV4dCcsXG4gICAgICB0ZXh0OiB0aGlzLnQoJ25leHQnKSxcbiAgICAgIGNvbG9yOiAnZGFyaycsXG4gICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgc2F2ZVByb3BzKCk6IEJ1dHRvbk1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9rZW46ICdzdXJ2ZXktYnVpbGRlci1zYXZlJyxcbiAgICAgIHRleHQ6IHRoaXMudCgnc2F2ZScpLFxuICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgIGZpbGw6ICdzb2xpZCcsXG4gICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgIHNpemU6ICdsYXJnZScsXG4gICAgICBleHBhbmQ6IHRoaXMuaXNXaXphcmQoKSA/IHVuZGVmaW5lZCA6ICdibG9jaycsXG4gICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgIHN0YXRlOiB0aGlzLnNhdmluZygpID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgaW50ZXJwb2xhdGUodGVtcGxhdGU6IHN0cmluZywgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+KTogc3RyaW5nIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWVzKS5yZWR1Y2UoXG4gICAgICAodGV4dCwgW2tleSwgdmFsdWVdKSA9PiB0ZXh0LnJlcGxhY2VBbGwoYHske2tleX19YCwgU3RyaW5nKHZhbHVlKSksXG4gICAgICB0ZW1wbGF0ZVxuICAgICk7XG4gIH1cblxuICBlZGl0b3JQcm9wcyhyb3c6IEVkaXRhYmxlRmllbGREZWYpOiBGaWVsZFNjaGVtYUVkaXRvck1ldGFkYXRhIHtcbiAgICByZXR1cm4geyBtb2RlOiAnZWRpdCcsIGZpZWxkOiByb3csIGFsbG93ZWRUeXBlczogdGhpcy5xdWVzdGlvblR5cGVzKCkgfTtcbiAgfVxuXG4gIGljb25BY3Rpb24oXG4gICAgdG9rZW46IHN0cmluZyxcbiAgICBpY29uOiBzdHJpbmcsXG4gICAgbGFiZWw6IHN0cmluZyxcbiAgICBkaXNhYmxlZCA9IGZhbHNlLFxuICAgIGNvbG9yOiBDb2xvciA9ICdkYXJrJ1xuICApOiBCdXR0b25NZXRhZGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuLFxuICAgICAgdGV4dDogJycsXG4gICAgICBhcmlhTGFiZWw6IGxhYmVsLFxuICAgICAgY29sb3IsXG4gICAgICBmaWxsOiAnY2xlYXInLFxuICAgICAgc2hhcGU6ICdyb3VuZCcsXG4gICAgICBzaXplOiAnc21hbGwnLFxuICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICBzdGF0ZTogZGlzYWJsZWQgPyBDb21wb25lbnRTdGF0ZXMuRElTQUJMRUQgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgIGljb246IHsgbmFtZTogaWNvbiwgc2xvdDogJ2ljb24tb25seScgfSxcbiAgICB9O1xuICB9XG5cbiAgYWRkUXVlc3Rpb24oKTogdm9pZCB7XG4gICAgY29uc3Qgcm93OiBFZGl0YWJsZUZpZWxkRGVmID0ge1xuICAgICAgaWQ6IGByb3ctJHtyb3dVaWQrK31gLFxuICAgICAgbmFtZTogJycsXG4gICAgICBsYWJlbDogJycsXG4gICAgICBwbGFjZWhvbGRlclRleHQ6ICcnLFxuICAgICAgaGludFRleHQ6ICcnLFxuICAgICAgdHlwZTogdGhpcy5xdWVzdGlvblR5cGVzKClbMF0sXG4gICAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICB9O1xuICAgIHRoaXMucXVlc3Rpb25zLnVwZGF0ZShyb3dzID0+IFsuLi5yb3dzLCByb3ddKTtcbiAgICAvLyBVbmEgcHJlZ3VudGEgcmVjacOpbiBhZ3JlZ2FkYSBlc3TDoSB2YWPDrWE6IGFicmlybGEgZXMgZWwgw7puaWNvIHBhc29cbiAgICAvLyBzaWd1aWVudGUgcG9zaWJsZSwgeSBkZWphcmxhIGNlcnJhZGEgbGEgaGFyw61hIHZlciBjb21vIHVuYSBmaWxhIHJvdGEuXG4gICAgdGhpcy5lZGl0aW5nSWQuc2V0KHJvdy5pZCk7XG4gIH1cblxuICB0b2dnbGVFZGl0KHJvdzogRWRpdGFibGVGaWVsZERlZik6IHZvaWQge1xuICAgIHRoaXMuZWRpdGluZ0lkLnVwZGF0ZShjdXJyZW50ID0+IChjdXJyZW50ID09PSByb3cuaWQgPyAnJyA6IHJvdy5pZCkpO1xuICB9XG5cbiAgcmVtb3ZlUXVlc3Rpb24ocm93OiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT4gcm93cy5maWx0ZXIociA9PiByLmlkICE9PSByb3cuaWQpKTtcbiAgICBpZiAodGhpcy5lZGl0aW5nSWQoKSA9PT0gcm93LmlkKSB0aGlzLmVkaXRpbmdJZC5zZXQoJycpO1xuICB9XG5cbiAgZHVwbGljYXRlKHJvdzogRWRpdGFibGVGaWVsZERlZik6IHZvaWQge1xuICAgIGNvbnN0IGNvcHk6IEVkaXRhYmxlRmllbGREZWYgPSB7XG4gICAgICAuLi5yb3csXG4gICAgICBpZDogYHJvdy0ke3Jvd1VpZCsrfWAsXG4gICAgICAvLyBTaW4gdG9rZW4gcHJvcGlvIGxhIGNvcGlhIHBpc2Fyw61hIGxhcyByZXNwdWVzdGFzIGRlbCBvcmlnaW5hbDogZG9zXG4gICAgICAvLyBjYW1wb3MgY29uIGVsIG1pc21vIGBuYW1lYCBzb24gZWwgbWlzbW8gY2FtcG8gcGFyYSBlbCBiYWNrZW5kLlxuICAgICAgbmFtZTogdGhpcy5mb3JtQnVpbGRlci51bmlxdWVGaWVsZE5hbWUocm93Lm5hbWUgfHwgcm93LmxhYmVsLCB0aGlzLnF1ZXN0aW9ucygpKSxcbiAgICAgIG9wdGlvbnM6IHJvdy5vcHRpb25zID8gcm93Lm9wdGlvbnMubWFwKG8gPT4gKHsgLi4ubyB9KSkgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5pZCA9PT0gcm93LmlkKTtcbiAgICAgIHJldHVybiBbLi4ucm93cy5zbGljZSgwLCBpbmRleCArIDEpLCBjb3B5LCAuLi5yb3dzLnNsaWNlKGluZGV4ICsgMSldO1xuICAgIH0pO1xuICB9XG5cbiAgbW92ZShpbmRleDogbnVtYmVyLCBkZWx0YTogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gaW5kZXggKyBkZWx0YTtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiB7XG4gICAgICBpZiAodGFyZ2V0IDwgMCB8fCB0YXJnZXQgPj0gcm93cy5sZW5ndGgpIHJldHVybiByb3dzO1xuICAgICAgY29uc3QgbmV4dCA9IFsuLi5yb3dzXTtcbiAgICAgIFtuZXh0W2luZGV4XSwgbmV4dFt0YXJnZXRdXSA9IFtuZXh0W3RhcmdldF0sIG5leHRbaW5kZXhdXTtcbiAgICAgIHJldHVybiBuZXh0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEd1YXJkYSBsbyBxdWUgc2UgZXN0w6EgZXNjcmliaWVuZG8sIHNpbiBjZXJyYXIgZWwgZWRpdG9yIG5pIHZhbGlkYXIuXG4gICAqXG4gICAqIFNpbiBlc3RvLCBsbyB0aXBlYWRvIHNvbG8gZXhpc3TDrWEgZGVudHJvIGRlbCBlZGl0b3IgaGFzdGEgcXVlIGFsZ3VpZW5cbiAgICogdG9jYWJhIFwiTGlzdG9cIjogbGEgZmlsYSBzZWd1w61hIGRpY2llbmRvIFwiUHJlZ3VudGEgc2luIHRleHRvXCIgeSwgcGVvcixcbiAgICogXCJHdWFyZGFyIGVuY3Vlc3RhXCIgZmFsbGFiYSBjb24gXCJ0b2RhcyBsYXMgcHJlZ3VudGFzIG5lY2VzaXRhbiB0ZXh0b1wiIHNvYnJlXG4gICAqIHVuYSBwcmVndW50YSBxdWUgZW4gcGFudGFsbGEgY2xhcmFtZW50ZSB0ZW7DrWEgdGV4dG8uIFRvY2FyIFwiTGlzdG9cIiBlcmEgdW5cbiAgICogcGFzbyBvYmxpZ2F0b3JpbyBxdWUgbm8gc2UgdmXDrWEgcG9yIG5pbmfDum4gbGFkby5cbiAgICovXG4gIGRyYWZ0UXVlc3Rpb24oZmllbGQ6IEVkaXRhYmxlRmllbGREZWYpOiB2b2lkIHtcbiAgICB0aGlzLnF1ZXN0aW9ucy51cGRhdGUocm93cyA9PiByb3dzLm1hcChyID0+IChyLmlkID09PSBmaWVsZC5pZCA/IHsgLi4uciwgLi4uZmllbGQgfSA6IHIpKSk7XG4gICAgaWYgKHRoaXMudmFsaWRhdGlvbkVycm9yKCkpIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCgnJyk7XG4gIH1cblxuICBhcHBseVF1ZXN0aW9uKGZpZWxkOiBFZGl0YWJsZUZpZWxkRGVmKTogdm9pZCB7XG4gICAgdGhpcy5xdWVzdGlvbnMudXBkYXRlKHJvd3MgPT5cbiAgICAgIHJvd3MubWFwKHIgPT5cbiAgICAgICAgci5pZCA9PT0gZmllbGQuaWRcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICAgIG5hbWU6IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKFxuICAgICAgICAgICAgICAgIGZpZWxkLm5hbWUgfHwgZmllbGQubGFiZWwsXG4gICAgICAgICAgICAgICAgcm93cy5maWx0ZXIobyA9PiBvLmlkICE9PSByLmlkKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogclxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5lZGl0aW5nSWQuc2V0KCcnKTtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQoJycpO1xuICB9XG5cbiAgYXN5bmMgb25QcmVzZW50YXRpb25GaWxlU2VsZWN0ZWQoc2xvdDogJ2hlYWRlcicgfCAnc3VjY2VzcycsIGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICBpZiAoIWZpbGUgfHwgIXRoaXMucHJvcHMucHJlc2VudGF0aW9uSW1hZ2VVcGxvYWQgfHwgdGhpcy51cGxvYWRpbmdJbWFnZSgpKSByZXR1cm47XG5cbiAgICBpZiAoZmlsZS50eXBlICYmICF0aGlzLmFsbG93ZWRJbWFnZVR5cGVzLmluY2x1ZGVzKGZpbGUudHlwZSkpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbkVycm9yLnNldCh0aGlzLnQoJ2ltYWdlVHlwZUVycm9yJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZmlsZS5zaXplID4gdGhpcy5tYXhJbWFnZUJ5dGVzKSB7XG4gICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdpbWFnZVNpemVFcnJvcicpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnVwbG9hZGluZ0ltYWdlLnNldChzbG90KTtcbiAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQoJycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLnByb3BzLnByZXNlbnRhdGlvbkltYWdlVXBsb2FkKHNsb3QsIGZpbGUpO1xuICAgICAgaWYgKHNsb3QgPT09ICdoZWFkZXInKSB7XG4gICAgICAgIHRoaXMuaGVhZGVySW1hZ2VDb250cm9sLnNldFZhbHVlKHVybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN1Y2Nlc3NJbWFnZUNvbnRyb2wuc2V0VmFsdWUodXJsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogYHN1cnZleUJ1aWxkZXIucHJlc2VudGF0aW9uSW1hZ2VVcGxvYWQgc2xvdD0ke3Nsb3R9YCxcbiAgICAgICAgZmFsbGJhY2tLZXk6ICdpbWFnZVVwbG9hZEVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogTkFNRVNQQUNFLFxuICAgICAgfSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMudXBsb2FkaW5nSW1hZ2Uuc2V0KCcnKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclByZXNlbnRhdGlvbkltYWdlKHNsb3Q6ICdoZWFkZXInIHwgJ3N1Y2Nlc3MnKTogdm9pZCB7XG4gICAgaWYgKHNsb3QgPT09ICdoZWFkZXInKSB7XG4gICAgICB0aGlzLmhlYWRlckltYWdlQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3VjY2Vzc0ltYWdlQ29udHJvbC5zZXRWYWx1ZSgnJyk7XG4gIH1cblxuICBhc3luYyBzYXZlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNhdmluZygpKSByZXR1cm47XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcblxuICAgIGlmICghdGhpcy52YWxpZGF0ZVdpemFyZFN0ZXAoMCkgfHwgIXRoaXMudmFsaWRhdGVXaXphcmRTdGVwKDEpKSByZXR1cm47XG5cbiAgICBjb25zdCB0aXRsZSA9IHRoaXMudGl0bGVDb250cm9sLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCByb3dzID0gdGhpcy5xdWVzdGlvbnMoKTtcbiAgICBjb25zdCBmaWVsZFNjaGVtYTogRmllbGRTY2hlbWFEZWZbXSA9IFtdO1xuICAgIHJvd3MuZm9yRWFjaCgocm93LCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZm9ybUJ1aWxkZXIudW5pcXVlRmllbGROYW1lKHJvdy5uYW1lIHx8IHJvdy5sYWJlbCwgZmllbGRTY2hlbWEpO1xuICAgICAgZmllbGRTY2hlbWEucHVzaChcbiAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jcmVhdGVGaWVsZFNjaGVtYShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbGFiZWw6IHJvdy5sYWJlbC50cmltKCksXG4gICAgICAgICAgICB0eXBlOiByb3cudHlwZSxcbiAgICAgICAgICAgIHJlcXVpcmVkOiByb3cucmVxdWlyZWQsXG4gICAgICAgICAgICBwbGFjZWhvbGRlclRleHQ6IHJvdy5wbGFjZWhvbGRlclRleHQsXG4gICAgICAgICAgICBoaW50VGV4dDogcm93LmhpbnRUZXh0LFxuICAgICAgICAgICAgb3B0aW9uczogcm93Lm9wdGlvbnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3VidGl0bGUgPSB0aGlzLnN1YnRpdGxlQ29udHJvbC52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgcHJlc2VudGF0aW9uID0gdGhpcy5wcmVzZW50YXRpb25QYXlsb2FkKCk7XG5cbiAgICAvLyBMYSBhcHAgZ3VhcmRhOiBhY8OhIHNvbG8gc2UgdmFsaWRhIHkgc2UgZW50cmVnYSBsbyBlc2NyaXRvLlxuICAgIGlmICh0aGlzLnByb3BzLnBlcnNpc3QgPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmRyYWZ0LmVtaXQoeyBsYWJlbDogdGl0bGUsIHN1YnRpdGxlLCBwcmVzZW50YXRpb24sIHF1ZXN0aW9uczogZmllbGRTY2hlbWEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zYXZpbmcuc2V0KHRydWUpO1xuXG4gICAgLy8gYHR5cGVJZGAgZGVyaXZhZG8gZGVsIHTDrXR1bG86IHNpcnZlIHBhcmEgdW4gdGlwbyBkZSBzb2xpY2l0dWQgZGVcbiAgICAvLyBwbGF0YWZvcm1hLCBkb25kZSBlbCB0w610dWxvIEVTIGxhIGlkZW50aWRhZC4gUGFyYSB1bmEgZW5jdWVzdGEgYXRhZGEgYVxuICAgIC8vIHVuYSBlbnRpZGFkIE5PIGFsY2FuemEg4oCUIGRvcyBldmVudG9zIGNvbiBlbCBtaXNtbyB0w610dWxvIGNvbGlzaW9uYXLDrWFuIGVuXG4gICAgLy8gZWwgbWlzbW8gdGlwbyB5IGNvbXBhcnRpcsOtYW4gcmVzcHVlc3Rhcy4gUG9yIGVzbyB1bmEgdmVydGljYWwgdXNhIHN1XG4gICAgLy8gZW5kcG9pbnQgKGBwZXJzaXN0OiBmYWxzZWApIHkgYXJtYSBlbCBpZCBjb24gbGEgZW50aWRhZCBhZGVudHJvLlxuICAgIGNvbnN0IHR5cGVJZCA9XG4gICAgICB0aGlzLnByb3BzLnR5cGVJZCA/PyBgJHt0aGlzLnByb3BzLnR5cGVQcmVmaXggPz8gREVGQVVMVF9UWVBFX1BSRUZJWH06JHt0aGlzLmZvcm1CdWlsZGVyLnRvVG9rZW4odGl0bGUpfWA7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbGFiZWw6IHRpdGxlLFxuICAgICAgc3VidGl0bGUsXG4gICAgICBwcmVzZW50YXRpb24sXG4gICAgICBlbnRpdHlSZWY6IHRoaXMucHJvcHMuZW50aXR5UmVmLFxuICAgICAgc2tpcFJldmlldzogdHJ1ZSxcbiAgICAgIHNraXBTdWJtaXR0ZXJJZGVudGl0eTogdHJ1ZSxcbiAgICAgIGZpZWxkU2NoZW1hLFxuICAgICAgYWxsb3dBbm9ueW1vdXM6IHRoaXMucHJvcHMuYWxsb3dBbm9ueW1vdXMgPz8gdHJ1ZSxcbiAgICAgIHZpc2liaWxpdHk6IHRoaXMucHJvcHMudmlzaWJpbGl0eSA/PyAoJ1BVQkxJQycgYXMgY29uc3QpLFxuICAgIH07XG5cbiAgICBjb25zdCBjYWxsJCA9IHRoaXMucHJvcHMudHlwZUlkXG4gICAgICA/IHRoaXMucmVxdWVzdHMudXBkYXRlUmVxdWVzdFR5cGUodGhpcy5wcm9wcy50eXBlSWQsIHBheWxvYWQpXG4gICAgICA6IHRoaXMucmVxdWVzdHMuY3JlYXRlUmVxdWVzdFR5cGUoeyAuLi5wYXlsb2FkLCB0eXBlSWQgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdHlwZUNvbmZpZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKGNhbGwkKTtcbiAgICAgIHRoaXMuc2F2aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLnNhdmVkLmVtaXQoeyB0eXBlQ29uZmlnIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zYXZpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuZXJyb3JzLmhhbmRsZShlcnIsIHtcbiAgICAgICAgY29udGV4dDogJ3N1cnZleUJ1aWxkZXIuc2F2ZScsXG4gICAgICAgIGZhbGxiYWNrS2V5OiAnc2F2ZUVycm9yJyxcbiAgICAgICAgaTE4bk5hbWVzcGFjZTogTkFNRVNQQUNFLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoeWRyYXRlKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgc3VidGl0bGU6IHN0cmluZyxcbiAgICBxdWVzdGlvbnM6IEZpZWxkU2NoZW1hRGVmW10sXG4gICAgcHJlc2VudGF0aW9uPzogUmVxdWVzdFR5cGVQcmVzZW50YXRpb25cbiAgKTogdm9pZCB7XG4gICAgdGhpcy50aXRsZUNvbnRyb2wuc2V0VmFsdWUobGFiZWwgPz8gJycpO1xuICAgIHRoaXMuc3VidGl0bGVDb250cm9sLnNldFZhbHVlKHN1YnRpdGxlID8/ICcnKTtcbiAgICB0aGlzLmhlYWRlckltYWdlQ29udHJvbC5zZXRWYWx1ZShwcmVzZW50YXRpb24/LmhlYWRlckltYWdlVXJsID8/ICcnKTtcbiAgICB0aGlzLnN1Y2Nlc3NUaXRsZUNvbnRyb2wuc2V0VmFsdWUocHJlc2VudGF0aW9uPy5zdWNjZXNzVGl0bGUgPz8gJycpO1xuICAgIHRoaXMuc3VjY2Vzc01lc3NhZ2VDb250cm9sLnNldFZhbHVlKHByZXNlbnRhdGlvbj8uc3VjY2Vzc01lc3NhZ2UgPz8gJycpO1xuICAgIHRoaXMuc3VjY2Vzc0ltYWdlQ29udHJvbC5zZXRWYWx1ZShwcmVzZW50YXRpb24/LnN1Y2Nlc3NJbWFnZVVybCA/PyAnJyk7XG4gICAgdGhpcy5xdWVzdGlvbnMuc2V0KFsuLi4ocXVlc3Rpb25zID8/IFtdKV0uc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpLm1hcChmID0+IHRoaXMucm93RnJvbUZpZWxkKGYpKSk7XG4gIH1cblxuICBwcml2YXRlIHByZXNlbnRhdGlvblBheWxvYWQoKTogUmVxdWVzdFR5cGVQcmVzZW50YXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHByZXNlbnRhdGlvbiA9IHtcbiAgICAgIGhlYWRlckltYWdlVXJsOiB0aGlzLmhlYWRlckltYWdlQ29udHJvbC52YWx1ZS50cmltKCksXG4gICAgICBzdWNjZXNzVGl0bGU6IHRoaXMuc3VjY2Vzc1RpdGxlQ29udHJvbC52YWx1ZS50cmltKCksXG4gICAgICBzdWNjZXNzTWVzc2FnZTogdGhpcy5zdWNjZXNzTWVzc2FnZUNvbnRyb2wudmFsdWUudHJpbSgpLFxuICAgICAgc3VjY2Vzc0ltYWdlVXJsOiB0aGlzLnN1Y2Nlc3NJbWFnZUNvbnRyb2wudmFsdWUudHJpbSgpLFxuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocHJlc2VudGF0aW9uKS5zb21lKEJvb2xlYW4pID8gcHJlc2VudGF0aW9uIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVdpemFyZFN0ZXAoc3RlcDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KCcnKTtcbiAgICBpZiAoc3RlcCA9PT0gMCkge1xuICAgICAgaWYgKCF0aGlzLnRpdGxlQ29udHJvbC52YWx1ZS50cmltKCkpIHtcbiAgICAgICAgdGhpcy50aXRsZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdub1RpdGxlJykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHN0ZXAgPT09IDEpIHtcbiAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnF1ZXN0aW9ucygpO1xuICAgICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnZhbGlkYXRpb25FcnJvci5zZXQodGhpcy50KCdub1F1ZXN0aW9ucycpKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHJvd3Muc29tZShyID0+ICFyLmxhYmVsLnRyaW0oKSkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnZW1wdHlRdWVzdGlvbkxhYmVsJykpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvLyBFbCBlZGl0b3IgeWEgbG8gdmFsaWRhIGFsIGNlcnJhciBjYWRhIHByZWd1bnRhLCBwZXJvIHVuYSBwcmVndW50YSBhYmllcnRhXG4gICAgICAvLyAobyBjYXJnYWRhIGRlIHVuYSBlbmN1ZXN0YSB2aWVqYSkgcHVlZGUgbGxlZ2FyIGFjw6Egc2luIG9wY2lvbmVzLlxuICAgICAgaWYgKHJvd3Muc29tZShyID0+IEZJRUxEX1RZUEVTX1dJVEhfT1BUSU9OUy5pbmNsdWRlcyhyLnR5cGUpICYmICFyLm9wdGlvbnM/Lmxlbmd0aCkpIHtcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uRXJyb3Iuc2V0KHRoaXMudCgnbWlzc2luZ09wdGlvbnMnKSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJvd0Zyb21GaWVsZChmOiBGaWVsZFNjaGVtYURlZik6IEVkaXRhYmxlRmllbGREZWYge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogYHJvdy0ke3Jvd1VpZCsrfWAsXG4gICAgICBuYW1lOiBmLm5hbWUsXG4gICAgICBsYWJlbDogZi5sYWJlbCA/PyAnJyxcbiAgICAgIHBsYWNlaG9sZGVyVGV4dDogZi5wbGFjZWhvbGRlclRleHQgPz8gJycsXG4gICAgICBoaW50VGV4dDogZi5oaW50VGV4dCA/PyAnJyxcbiAgICAgIHR5cGU6IGYudHlwZSxcbiAgICAgIHJlcXVpcmVkOiAhIWYucmVxdWlyZWQsXG4gICAgICBvcHRpb25zOiBmLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxufVxuIl19